{
  "openapi": "3.1.0",
  "info": {
    "title": "Astera Public Content API",
    "version": "1.0.0",
    "summary": "Read-only JSON access to Astera product, page, review, and FAQ content.",
    "description": "A static, read-only JSON API that exposes the machine-readable content behind get.astera.com:\nproducts and capabilities, the full public page map with titles and descriptions, published\nthird-party customer reviews, and product FAQs.\n\nIt exists so AI agents and automated clients can consume Astera content without scraping HTML.\n\nNo authentication or API key is required. No API key is required. The API is static JSON served from a CDN. Please keep automated clients under 60 requests per minute per IP and cache responses for at least 5 minutes.\n\nEvery successful response uses the same envelope (`apiVersion`, `generatedAt`, `documentation`,\n`count` for collections, and `data`). Every error uses the `ErrorEnvelope` shape with a stable\n`error.code`, HTTP `error.status`, human-readable `error.message`, and an actionable `error.hint`.",
    "contact": {
      "name": "Astera",
      "email": "sales@astera.com",
      "url": "https://get.astera.com/developers"
    },
    "license": {
      "name": "Astera Content Terms",
      "url": "https://www.astera.com/terms-and-conditions"
    },
    "termsOfService": "https://www.astera.com/terms-and-conditions"
  },
  "servers": [
    {
      "url": "https://get.astera.com/api/v1",
      "description": "Production"
    }
  ],
  "externalDocs": {
    "description": "Developer portal",
    "url": "https://get.astera.com/developers"
  },
  "tags": [
    {
      "name": "Products",
      "description": "Astera products and their capabilities."
    },
    {
      "name": "Content",
      "description": "Pages, reviews, FAQs, and the error contract."
    }
  ],
  "paths": {
    "/index.json": {
      "get": {
        "operationId": "getApiIndex",
        "summary": "API index",
        "description": "Returns the API root document: version, generation timestamp, documentation links, fair-use guidance, and the absolute URL of every collection in this API. Start here when discovering the API programmatically.\n\nRead-only endpoint. No authentication required. No API key is required. The API is static JSON served from a CDN. Please keep automated clients under 60 requests per minute per IP and cache responses for at least 5 minutes.",
        "tags": [
          "Content"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful response.",
            "headers": {
              "Content-Type": {
                "schema": {
                  "type": "string"
                },
                "description": "Always application/json."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/ResponseEnvelope"
                    },
                    {
                      "type": "object",
                      "required": [
                        "data"
                      ],
                      "properties": {
                        "data": {
                          "$ref": "#/components/schemas/ApiIndex"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "A path or query parameter was missing or not one of the allowed values.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "apiVersion": "1.0.0",
                  "error": {
                    "code": "invalid_parameter",
                    "status": 400,
                    "message": "A path or query parameter was missing or not one of the allowed values.",
                    "hint": "Allowed values for enumerated parameters are listed in the OpenAPI spec at /openapi.json.",
                    "documentation": "https://get.astera.com/developers"
                  }
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "apiVersion": "1.0.0",
                  "error": {
                    "code": "not_found",
                    "status": 404,
                    "message": "The requested resource does not exist.",
                    "hint": "Check the path against /api/v1/index.json or the OpenAPI spec at /openapi.json. Resource paths always end in .json.",
                    "documentation": "https://get.astera.com/developers"
                  }
                }
              }
            }
          },
          "405": {
            "description": "The API is read-only; only GET and HEAD are supported.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "apiVersion": "1.0.0",
                  "error": {
                    "code": "unsupported_method",
                    "status": 405,
                    "message": "The API is read-only; only GET and HEAD are supported.",
                    "hint": "Retry the request with GET. There are no write endpoints on this API.",
                    "documentation": "https://get.astera.com/developers"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Too many requests from this client.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "apiVersion": "1.0.0",
                  "error": {
                    "code": "rate_limited",
                    "status": 429,
                    "message": "Too many requests from this client.",
                    "hint": "Back off and retry after 60 seconds, and cache responses for at least 5 minutes.",
                    "documentation": "https://get.astera.com/developers"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/products.json": {
      "get": {
        "operationId": "listProducts",
        "summary": "List products",
        "description": "Returns every Astera product with its identifier, category, summary, canonical marketing URL, supported deployment models, capability list, target industries, and notable integrations.\n\nRead-only endpoint. No authentication required. No API key is required. The API is static JSON served from a CDN. Please keep automated clients under 60 requests per minute per IP and cache responses for at least 5 minutes.",
        "tags": [
          "Products"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful response.",
            "headers": {
              "Content-Type": {
                "schema": {
                  "type": "string"
                },
                "description": "Always application/json."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/ResponseEnvelope"
                    },
                    {
                      "type": "object",
                      "required": [
                        "data"
                      ],
                      "properties": {
                        "data": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Product"
                          }
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "A path or query parameter was missing or not one of the allowed values.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "apiVersion": "1.0.0",
                  "error": {
                    "code": "invalid_parameter",
                    "status": 400,
                    "message": "A path or query parameter was missing or not one of the allowed values.",
                    "hint": "Allowed values for enumerated parameters are listed in the OpenAPI spec at /openapi.json.",
                    "documentation": "https://get.astera.com/developers"
                  }
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "apiVersion": "1.0.0",
                  "error": {
                    "code": "not_found",
                    "status": 404,
                    "message": "The requested resource does not exist.",
                    "hint": "Check the path against /api/v1/index.json or the OpenAPI spec at /openapi.json. Resource paths always end in .json.",
                    "documentation": "https://get.astera.com/developers"
                  }
                }
              }
            }
          },
          "405": {
            "description": "The API is read-only; only GET and HEAD are supported.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "apiVersion": "1.0.0",
                  "error": {
                    "code": "unsupported_method",
                    "status": 405,
                    "message": "The API is read-only; only GET and HEAD are supported.",
                    "hint": "Retry the request with GET. There are no write endpoints on this API.",
                    "documentation": "https://get.astera.com/developers"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Too many requests from this client.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "apiVersion": "1.0.0",
                  "error": {
                    "code": "rate_limited",
                    "status": 429,
                    "message": "Too many requests from this client.",
                    "hint": "Back off and retry after 60 seconds, and cache responses for at least 5 minutes.",
                    "documentation": "https://get.astera.com/developers"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/products/{productId}.json": {
      "get": {
        "operationId": "getProduct",
        "summary": "Get a single product",
        "description": "Returns one product by identifier, including its full description, capability list with canonical URLs, deployment models, industries, and integrations.\n\nRead-only endpoint. No authentication required. No API key is required. The API is static JSON served from a CDN. Please keep automated clients under 60 requests per minute per IP and cache responses for at least 5 minutes.",
        "tags": [
          "Products"
        ],
        "parameters": [
          {
            "name": "productId",
            "in": "path",
            "required": true,
            "description": "Product identifier.",
            "schema": {
              "type": "string",
              "enum": [
                "centerprise",
                "reportminer",
                "ediconnect"
              ]
            },
            "example": "centerprise"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response.",
            "headers": {
              "Content-Type": {
                "schema": {
                  "type": "string"
                },
                "description": "Always application/json."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/ResponseEnvelope"
                    },
                    {
                      "type": "object",
                      "required": [
                        "data"
                      ],
                      "properties": {
                        "data": {
                          "$ref": "#/components/schemas/Product"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "A path or query parameter was missing or not one of the allowed values.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "apiVersion": "1.0.0",
                  "error": {
                    "code": "invalid_parameter",
                    "status": 400,
                    "message": "A path or query parameter was missing or not one of the allowed values.",
                    "hint": "Allowed values for enumerated parameters are listed in the OpenAPI spec at /openapi.json.",
                    "documentation": "https://get.astera.com/developers"
                  }
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "apiVersion": "1.0.0",
                  "error": {
                    "code": "not_found",
                    "status": 404,
                    "message": "The requested resource does not exist.",
                    "hint": "Check the path against /api/v1/index.json or the OpenAPI spec at /openapi.json. Resource paths always end in .json.",
                    "documentation": "https://get.astera.com/developers"
                  }
                }
              }
            }
          },
          "405": {
            "description": "The API is read-only; only GET and HEAD are supported.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "apiVersion": "1.0.0",
                  "error": {
                    "code": "unsupported_method",
                    "status": 405,
                    "message": "The API is read-only; only GET and HEAD are supported.",
                    "hint": "Retry the request with GET. There are no write endpoints on this API.",
                    "documentation": "https://get.astera.com/developers"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Too many requests from this client.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "apiVersion": "1.0.0",
                  "error": {
                    "code": "rate_limited",
                    "status": 429,
                    "message": "Too many requests from this client.",
                    "hint": "Back off and retry after 60 seconds, and cache responses for at least 5 minutes.",
                    "documentation": "https://get.astera.com/developers"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/pages.json": {
      "get": {
        "operationId": "listPages",
        "summary": "List public pages",
        "description": "Returns every indexable public page on get.astera.com with its path, canonical URL, title, description, owning product, and page type. Use this as a machine-readable content map instead of crawling the site.\n\nRead-only endpoint. No authentication required. No API key is required. The API is static JSON served from a CDN. Please keep automated clients under 60 requests per minute per IP and cache responses for at least 5 minutes.",
        "tags": [
          "Content"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful response.",
            "headers": {
              "Content-Type": {
                "schema": {
                  "type": "string"
                },
                "description": "Always application/json."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/ResponseEnvelope"
                    },
                    {
                      "type": "object",
                      "required": [
                        "data"
                      ],
                      "properties": {
                        "data": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Page"
                          }
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "A path or query parameter was missing or not one of the allowed values.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "apiVersion": "1.0.0",
                  "error": {
                    "code": "invalid_parameter",
                    "status": 400,
                    "message": "A path or query parameter was missing or not one of the allowed values.",
                    "hint": "Allowed values for enumerated parameters are listed in the OpenAPI spec at /openapi.json.",
                    "documentation": "https://get.astera.com/developers"
                  }
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "apiVersion": "1.0.0",
                  "error": {
                    "code": "not_found",
                    "status": 404,
                    "message": "The requested resource does not exist.",
                    "hint": "Check the path against /api/v1/index.json or the OpenAPI spec at /openapi.json. Resource paths always end in .json.",
                    "documentation": "https://get.astera.com/developers"
                  }
                }
              }
            }
          },
          "405": {
            "description": "The API is read-only; only GET and HEAD are supported.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "apiVersion": "1.0.0",
                  "error": {
                    "code": "unsupported_method",
                    "status": 405,
                    "message": "The API is read-only; only GET and HEAD are supported.",
                    "hint": "Retry the request with GET. There are no write endpoints on this API.",
                    "documentation": "https://get.astera.com/developers"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Too many requests from this client.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "apiVersion": "1.0.0",
                  "error": {
                    "code": "rate_limited",
                    "status": 429,
                    "message": "Too many requests from this client.",
                    "hint": "Back off and retry after 60 seconds, and cache responses for at least 5 minutes.",
                    "documentation": "https://get.astera.com/developers"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/reviews.json": {
      "get": {
        "operationId": "listReviews",
        "summary": "List customer reviews",
        "description": "Returns published third-party customer reviews with reviewer role, company, industry, product, review source, and a link to the original review on Capterra, G2, or TrustRadius.\n\nRead-only endpoint. No authentication required. No API key is required. The API is static JSON served from a CDN. Please keep automated clients under 60 requests per minute per IP and cache responses for at least 5 minutes.",
        "tags": [
          "Content"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful response.",
            "headers": {
              "Content-Type": {
                "schema": {
                  "type": "string"
                },
                "description": "Always application/json."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/ResponseEnvelope"
                    },
                    {
                      "type": "object",
                      "required": [
                        "data"
                      ],
                      "properties": {
                        "data": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Review"
                          }
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "A path or query parameter was missing or not one of the allowed values.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "apiVersion": "1.0.0",
                  "error": {
                    "code": "invalid_parameter",
                    "status": 400,
                    "message": "A path or query parameter was missing or not one of the allowed values.",
                    "hint": "Allowed values for enumerated parameters are listed in the OpenAPI spec at /openapi.json.",
                    "documentation": "https://get.astera.com/developers"
                  }
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "apiVersion": "1.0.0",
                  "error": {
                    "code": "not_found",
                    "status": 404,
                    "message": "The requested resource does not exist.",
                    "hint": "Check the path against /api/v1/index.json or the OpenAPI spec at /openapi.json. Resource paths always end in .json.",
                    "documentation": "https://get.astera.com/developers"
                  }
                }
              }
            }
          },
          "405": {
            "description": "The API is read-only; only GET and HEAD are supported.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "apiVersion": "1.0.0",
                  "error": {
                    "code": "unsupported_method",
                    "status": 405,
                    "message": "The API is read-only; only GET and HEAD are supported.",
                    "hint": "Retry the request with GET. There are no write endpoints on this API.",
                    "documentation": "https://get.astera.com/developers"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Too many requests from this client.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "apiVersion": "1.0.0",
                  "error": {
                    "code": "rate_limited",
                    "status": 429,
                    "message": "Too many requests from this client.",
                    "hint": "Back off and retry after 60 seconds, and cache responses for at least 5 minutes.",
                    "documentation": "https://get.astera.com/developers"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/faqs.json": {
      "get": {
        "operationId": "listFaqs",
        "summary": "List product FAQs",
        "description": "Returns frequently asked questions and canonical answers for each product, with a link to the page the answer is published on.\n\nRead-only endpoint. No authentication required. No API key is required. The API is static JSON served from a CDN. Please keep automated clients under 60 requests per minute per IP and cache responses for at least 5 minutes.",
        "tags": [
          "Content"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful response.",
            "headers": {
              "Content-Type": {
                "schema": {
                  "type": "string"
                },
                "description": "Always application/json."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/ResponseEnvelope"
                    },
                    {
                      "type": "object",
                      "required": [
                        "data"
                      ],
                      "properties": {
                        "data": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Faq"
                          }
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "A path or query parameter was missing or not one of the allowed values.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "apiVersion": "1.0.0",
                  "error": {
                    "code": "invalid_parameter",
                    "status": 400,
                    "message": "A path or query parameter was missing or not one of the allowed values.",
                    "hint": "Allowed values for enumerated parameters are listed in the OpenAPI spec at /openapi.json.",
                    "documentation": "https://get.astera.com/developers"
                  }
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "apiVersion": "1.0.0",
                  "error": {
                    "code": "not_found",
                    "status": 404,
                    "message": "The requested resource does not exist.",
                    "hint": "Check the path against /api/v1/index.json or the OpenAPI spec at /openapi.json. Resource paths always end in .json.",
                    "documentation": "https://get.astera.com/developers"
                  }
                }
              }
            }
          },
          "405": {
            "description": "The API is read-only; only GET and HEAD are supported.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "apiVersion": "1.0.0",
                  "error": {
                    "code": "unsupported_method",
                    "status": 405,
                    "message": "The API is read-only; only GET and HEAD are supported.",
                    "hint": "Retry the request with GET. There are no write endpoints on this API.",
                    "documentation": "https://get.astera.com/developers"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Too many requests from this client.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "apiVersion": "1.0.0",
                  "error": {
                    "code": "rate_limited",
                    "status": 429,
                    "message": "Too many requests from this client.",
                    "hint": "Back off and retry after 60 seconds, and cache responses for at least 5 minutes.",
                    "documentation": "https://get.astera.com/developers"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/errors.json": {
      "get": {
        "operationId": "listErrorCodes",
        "summary": "List error codes",
        "description": "Returns the full error contract for this API: every error code, the HTTP status it is returned with, a human-readable message, and a resolution hint.\n\nRead-only endpoint. No authentication required. No API key is required. The API is static JSON served from a CDN. Please keep automated clients under 60 requests per minute per IP and cache responses for at least 5 minutes.",
        "tags": [
          "Content"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful response.",
            "headers": {
              "Content-Type": {
                "schema": {
                  "type": "string"
                },
                "description": "Always application/json."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/ResponseEnvelope"
                    },
                    {
                      "type": "object",
                      "required": [
                        "data"
                      ],
                      "properties": {
                        "data": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/ErrorCode"
                          }
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "A path or query parameter was missing or not one of the allowed values.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "apiVersion": "1.0.0",
                  "error": {
                    "code": "invalid_parameter",
                    "status": 400,
                    "message": "A path or query parameter was missing or not one of the allowed values.",
                    "hint": "Allowed values for enumerated parameters are listed in the OpenAPI spec at /openapi.json.",
                    "documentation": "https://get.astera.com/developers"
                  }
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "apiVersion": "1.0.0",
                  "error": {
                    "code": "not_found",
                    "status": 404,
                    "message": "The requested resource does not exist.",
                    "hint": "Check the path against /api/v1/index.json or the OpenAPI spec at /openapi.json. Resource paths always end in .json.",
                    "documentation": "https://get.astera.com/developers"
                  }
                }
              }
            }
          },
          "405": {
            "description": "The API is read-only; only GET and HEAD are supported.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "apiVersion": "1.0.0",
                  "error": {
                    "code": "unsupported_method",
                    "status": 405,
                    "message": "The API is read-only; only GET and HEAD are supported.",
                    "hint": "Retry the request with GET. There are no write endpoints on this API.",
                    "documentation": "https://get.astera.com/developers"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Too many requests from this client.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "apiVersion": "1.0.0",
                  "error": {
                    "code": "rate_limited",
                    "status": 429,
                    "message": "Too many requests from this client.",
                    "hint": "Back off and retry after 60 seconds, and cache responses for at least 5 minutes.",
                    "documentation": "https://get.astera.com/developers"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/404.json": {
      "get": {
        "operationId": "getNotFoundExample",
        "summary": "Canonical not-found payload",
        "description": "Returns the canonical JSON body used for missing resources on this API, so clients can be tested against the exact error envelope without provoking a real failure.\n\nRead-only endpoint. No authentication required. No API key is required. The API is static JSON served from a CDN. Please keep automated clients under 60 requests per minute per IP and cache responses for at least 5 minutes.",
        "tags": [
          "Content"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful response.",
            "headers": {
              "Content-Type": {
                "schema": {
                  "type": "string"
                },
                "description": "Always application/json."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/ResponseEnvelope"
                    },
                    {
                      "type": "object",
                      "required": [
                        "data"
                      ],
                      "properties": {
                        "data": {
                          "$ref": "#/components/schemas/ErrorEnvelope"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "A path or query parameter was missing or not one of the allowed values.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "apiVersion": "1.0.0",
                  "error": {
                    "code": "invalid_parameter",
                    "status": 400,
                    "message": "A path or query parameter was missing or not one of the allowed values.",
                    "hint": "Allowed values for enumerated parameters are listed in the OpenAPI spec at /openapi.json.",
                    "documentation": "https://get.astera.com/developers"
                  }
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "apiVersion": "1.0.0",
                  "error": {
                    "code": "not_found",
                    "status": 404,
                    "message": "The requested resource does not exist.",
                    "hint": "Check the path against /api/v1/index.json or the OpenAPI spec at /openapi.json. Resource paths always end in .json.",
                    "documentation": "https://get.astera.com/developers"
                  }
                }
              }
            }
          },
          "405": {
            "description": "The API is read-only; only GET and HEAD are supported.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "apiVersion": "1.0.0",
                  "error": {
                    "code": "unsupported_method",
                    "status": 405,
                    "message": "The API is read-only; only GET and HEAD are supported.",
                    "hint": "Retry the request with GET. There are no write endpoints on this API.",
                    "documentation": "https://get.astera.com/developers"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Too many requests from this client.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "apiVersion": "1.0.0",
                  "error": {
                    "code": "rate_limited",
                    "status": 429,
                    "message": "Too many requests from this client.",
                    "hint": "Back off and retry after 60 seconds, and cache responses for at least 5 minutes.",
                    "documentation": "https://get.astera.com/developers"
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "ResponseEnvelope": {
        "type": "object",
        "description": "Common wrapper returned by every successful request.",
        "required": [
          "apiVersion",
          "generatedAt",
          "data"
        ],
        "properties": {
          "apiVersion": {
            "type": "string",
            "description": "Semantic version of this API.",
            "example": "1.0.0"
          },
          "generatedAt": {
            "type": "string",
            "format": "date-time",
            "description": "UTC timestamp of the build that produced this document."
          },
          "documentation": {
            "type": "string",
            "format": "uri",
            "description": "Developer portal URL."
          },
          "count": {
            "type": "integer",
            "description": "Number of items in `data` (collections only).",
            "minimum": 0
          },
          "data": {
            "description": "Payload: a single object or an array of objects."
          }
        }
      },
      "ErrorEnvelope": {
        "type": "object",
        "description": "Structured error body returned for every failed request.",
        "required": [
          "apiVersion",
          "error"
        ],
        "properties": {
          "apiVersion": {
            "type": "string",
            "example": "1.0.0"
          },
          "error": {
            "type": "object",
            "required": [
              "code",
              "status",
              "message",
              "hint"
            ],
            "properties": {
              "code": {
                "type": "string",
                "description": "Stable machine-readable error code.",
                "enum": [
                  "not_found",
                  "invalid_parameter",
                  "unsupported_method",
                  "rate_limited"
                ]
              },
              "status": {
                "type": "integer",
                "description": "HTTP status code.",
                "example": 404
              },
              "message": {
                "type": "string",
                "description": "Human-readable explanation."
              },
              "hint": {
                "type": "string",
                "description": "How to resolve the error."
              },
              "documentation": {
                "type": "string",
                "format": "uri",
                "description": "Developer portal URL."
              }
            }
          }
        }
      },
      "ApiIndex": {
        "type": "object",
        "description": "API root document listing every available collection.",
        "required": [
          "name",
          "version",
          "endpoints"
        ],
        "properties": {
          "name": {
            "type": "string",
            "example": "Astera Public Content API"
          },
          "version": {
            "type": "string",
            "example": "1.0.0"
          },
          "description": {
            "type": "string"
          },
          "documentation": {
            "type": "string",
            "format": "uri"
          },
          "openapi": {
            "type": "string",
            "format": "uri"
          },
          "rateLimit": {
            "type": "string",
            "description": "Fair-use guidance for automated clients."
          },
          "authentication": {
            "type": "string",
            "example": "none"
          },
          "endpoints": {
            "type": "array",
            "description": "Every endpoint in this API.",
            "items": {
              "type": "object",
              "required": [
                "operationId",
                "method",
                "url"
              ],
              "properties": {
                "operationId": {
                  "type": "string"
                },
                "method": {
                  "type": "string",
                  "enum": [
                    "GET"
                  ]
                },
                "path": {
                  "type": "string"
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                },
                "summary": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "Capability": {
        "type": "object",
        "description": "A single product capability with its canonical page.",
        "required": [
          "id",
          "name",
          "summary",
          "url"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "data-integration"
          },
          "name": {
            "type": "string",
            "example": "Data integration"
          },
          "summary": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "Product": {
        "type": "object",
        "description": "An Astera product.",
        "required": [
          "id",
          "name",
          "category",
          "summary",
          "url"
        ],
        "properties": {
          "id": {
            "type": "string",
            "enum": [
              "centerprise",
              "reportminer",
              "ediconnect"
            ],
            "example": "centerprise"
          },
          "name": {
            "type": "string",
            "example": "Astera Centerprise"
          },
          "category": {
            "type": "string",
            "example": "Data integration and warehousing platform"
          },
          "summary": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "deployment": {
            "type": "array",
            "description": "Supported deployment models.",
            "items": {
              "type": "string",
              "enum": [
                "on-premises",
                "cloud",
                "hybrid"
              ]
            }
          },
          "capabilities": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Capability"
            }
          },
          "industries": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "integrations": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "Page": {
        "type": "object",
        "description": "A public, indexable page on get.astera.com.",
        "required": [
          "path",
          "url",
          "title"
        ],
        "properties": {
          "path": {
            "type": "string",
            "example": "/centerprise/data-integration"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "product": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "centerprise",
              "reportminer",
              "ediconnect",
              null
            ]
          },
          "type": {
            "type": "string",
            "description": "Content type of the page.",
            "enum": [
              "home",
              "product",
              "solution",
              "industry",
              "reviews",
              "webinar",
              "article",
              "whitepaper",
              "resource",
              "contact",
              "page"
            ]
          }
        }
      },
      "Review": {
        "type": "object",
        "description": "A published third-party customer review.",
        "required": [
          "id",
          "reviewer",
          "company",
          "product",
          "source",
          "quote"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "review-1"
          },
          "reviewer": {
            "type": "string"
          },
          "role": {
            "type": "string"
          },
          "company": {
            "type": "string"
          },
          "industry": {
            "type": "string"
          },
          "product": {
            "type": "string",
            "enum": [
              "centerprise",
              "reportminer",
              "ediconnect"
            ]
          },
          "source": {
            "type": "string",
            "enum": [
              "g2",
              "capterra",
              "trustradius"
            ]
          },
          "quote": {
            "type": "string"
          },
          "sourceUrl": {
            "type": "string",
            "format": "uri",
            "description": "Link to the original review."
          }
        }
      },
      "Faq": {
        "type": "object",
        "description": "A frequently asked question and its canonical answer.",
        "required": [
          "id",
          "product",
          "question",
          "answer"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "product": {
            "type": "string",
            "enum": [
              "centerprise",
              "reportminer",
              "ediconnect"
            ]
          },
          "question": {
            "type": "string"
          },
          "answer": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "ErrorCode": {
        "type": "object",
        "description": "One entry in the documented error contract.",
        "required": [
          "code",
          "status",
          "message",
          "hint"
        ],
        "properties": {
          "code": {
            "type": "string",
            "enum": [
              "not_found",
              "invalid_parameter",
              "unsupported_method",
              "rate_limited"
            ]
          },
          "status": {
            "type": "integer"
          },
          "message": {
            "type": "string"
          },
          "hint": {
            "type": "string"
          }
        }
      }
    }
  }
}
