{
  "openapi": "3.1.0",
  "info": {
    "version": "1.2.0",
    "title": "Offers for Contents API",
    "description": "Get relevant offers for web pages, inline text, images and video with a live Content Assistant placement. Submit content and viewer context; if pending, wait and repeat the same request with current viewer context."
  },
  "servers": [
    {
      "url": "/",
      "description": "API origin: https://api.aon.pro or https://plugin.aon.pro, not the documentation site."
    }
  ],
  "security": [
    {
      "PlacementId": []
    }
  ],
  "paths": {
    "/v1/content/offers": {
      "post": {
        "operationId": "queryContentOffers",
        "parameters": [
          {
            "$ref": "#/components/parameters/AcceptLanguage"
          },
          {
            "name": "x-aon-user-pseudo-id",
            "in": "header",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Optional pseudonymous viewer ID; not echoed in the response."
          },
          {
            "name": "x-aon-consent",
            "in": "header",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Optional viewer consent: personalization=granted|denied;jurisdiction=<code>;age=<value>."
          }
        ],
        "requestBody": {
          "required": true,
          "x-max-bytes": 2097152,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OffersInput"
              },
              "examples": {
                "web": {
                  "value": {
                    "source": {
                      "type": "web",
                      "uri": "https://publisher.example/article"
                    },
                    "language": "en",
                    "context": {
                      "user_profile": {
                        "country": "US"
                      }
                    },
                    "client": {
                      "user_agent": "PublisherApp/1.0"
                    }
                  }
                },
                "inline": {
                  "value": {
                    "source": {
                      "type": "inline",
                      "uri": "myapp://articles/123",
                      "contents": [
                        {
                          "type": "text",
                          "text": "Original article text."
                        }
                      ]
                    },
                    "language": "en"
                  }
                },
                "image": {
                  "value": {
                    "source": {
                      "type": "image",
                      "uri": "https://cdn.example.com/a.jpg"
                    },
                    "language": "en"
                  }
                },
                "video": {
                  "value": {
                    "source": {
                      "type": "video",
                      "uri": "https://cdn.example.com/a.mp4"
                    },
                    "language": "en"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/OffersReady"
          },
          "202": {
            "$ref": "#/components/responses/OffersPending"
          },
          "400": {
            "$ref": "#/components/responses/OffersError",
            "description": "INVALID_JSON, UNSUPPORTED_MEDIA_TYPE or VALIDATION_ERROR: check the request. CONTENT_ANALYSIS_FAILED: the content could not be processed. Use application/json and check the documented fields. For CONTENT_ANALYSIS_FAILED, inspect extra.reason, retryable and retry_at before submitting again."
          },
          "403": {
            "$ref": "#/components/responses/OffersError",
            "description": "PLACEMENT_REJECTED: the placement is not permitted. RESULT_REVOKED: the result is no longer available. Use a live Content Assistant placement. Stop using a revoked result."
          },
          "404": {
            "$ref": "#/components/responses/OffersError",
            "description": "RESULT_EXPIRED or NOT_FOUND: no available result was found. Check the content source. Do not treat an expired result as a pending response."
          },
          "405": {
            "$ref": "#/components/responses/OffersMethodNotAllowed",
            "description": "METHOD_NOT_ALLOWED: this endpoint requires POST. Use POST and check the Allow response header."
          },
          "413": {
            "$ref": "#/components/responses/OffersError",
            "description": "PAYLOAD_TOO_LARGE: the request exceeds the allowed size. Keep the JSON body within 2 MiB and the combined decoded inline text within 256 KiB."
          },
          "429": {
            "$ref": "#/components/responses/OffersLimited",
            "description": "RATE_LIMITED: the request cannot be served yet. Wait for Retry-After or extra.retry_after_seconds, then retry with backoff and jitter. This is separate from pending-response polling."
          },
          "500": {
            "$ref": "#/components/responses/OffersError",
            "description": "CONTENT_ANALYSIS_FAILED, OFFER_QUERY_TIMEOUT, SERVICE_UNAVAILABLE, INTERNAL_ERROR or RESULT_TOO_LARGE: the request could not be completed. For CONTENT_ANALYSIS_FAILED, follow extra.retryable and retry_at. RESULT_TOO_LARGE means the response exceeds 2 MiB; it is not silently truncated. Otherwise retry with backoff if appropriate. Keep X-Request-Id for support."
          }
        },
        "summary": "Get offers for content",
        "description": "Submit content and current viewer context. HTTP 202 means pending: wait poll_after_ms and repeat this POST with the same source and language. HTTP 200 means ready, including empty matches or offers. Available matches may be returned even when some matching attempts fail; results do not promise exhaustive inventory or stable ranking. Keep each offer_instance_id and action unchanged. The response is limited to 2 MiB; oversized results return RESULT_TOO_LARGE, not truncated offers."
      }
    }
  },
  "components": {
    "securitySchemes": {
      "PlacementId": {
        "type": "apiKey",
        "in": "header",
        "name": "X-AON-Placement-Id",
        "description": "Send the public ID of a live Content Assistant placement in X-AON-Placement-Id exactly once on every request. Use 1–64 ASCII letters, digits, underscores or hyphens. A placement_id in the body or query is not used. API keys, anonymous requests and other placement types are not supported."
      }
    },
    "parameters": {
      "AcceptLanguage": {
        "name": "Accept-Language",
        "in": "header",
        "required": false,
        "schema": {
          "type": "string"
        },
        "description": "Preferred output language when language is omitted; defaults to en."
      }
    },
    "schemas": {
      "OffersInput": {
        "type": "object",
        "required": [
          "source"
        ],
        "properties": {
          "source": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/WebSource"
              },
              {
                "$ref": "#/components/schemas/InlineSource"
              },
              {
                "$ref": "#/components/schemas/MediaSource"
              }
            ],
            "description": "Choose web, inline, image or video. Do not mix source shapes."
          },
          "language": {
            "$ref": "#/components/schemas/Language",
            "description": "Desired result language. Send it explicitly and keep it unchanged when repeating a pending request."
          },
          "context": {
            "$ref": "#/components/schemas/OfferContext",
            "description": "Current viewer and session context for offer matching."
          },
          "client": {
            "type": "object",
            "properties": {
              "user_agent": {
                "type": "string",
                "minLength": 1,
                "x-max-utf8-bytes": 2048,
                "description": "Viewer user agent. If omitted, the request's User-Agent header is used. No client IP field is supported."
              }
            },
            "not": {
              "required": [
                "ip"
              ]
            },
            "additionalProperties": true,
            "description": "Current viewer client information."
          },
          "constraints": {
            "$ref": "#/components/schemas/OfferConstraints",
            "description": "Optional filters for the returned offers."
          },
          "force_offer": {
            "type": "boolean",
            "description": "Request a fallback recommendation when normal matching finds none."
          },
          "response_options": {
            "type": "object",
            "properties": {
              "thinking_mode": {
                "type": "boolean",
                "description": "Whether offers include match reasons. If omitted, the service default applies."
              }
            },
            "additionalProperties": true,
            "description": "Options for the returned offers."
          }
        },
        "not": {
          "anyOf": [
            {
              "required": [
                "force_refresh"
              ]
            },
            {
              "required": [
                "resource_id"
              ]
            },
            {
              "required": [
                "task_id"
              ]
            },
            {
              "required": [
                "pagination"
              ]
            }
          ]
        },
        "additionalProperties": true,
        "description": "Content and optional current viewer context to match to offers."
      },
      "WebSource": {
        "type": "object",
        "required": [
          "type",
          "uri"
        ],
        "properties": {
          "type": {
            "const": "web",
            "description": "Content type: web, inline, image or video."
          },
          "uri": {
            "type": "string",
            "x-max-utf8-bytes": 8192,
            "description": "HTTP or HTTPS URL of the page, including any required query parameters."
          }
        },
        "not": {
          "anyOf": [
            {
              "required": [
                "contents"
              ]
            },
            {
              "required": [
                "media_type"
              ]
            }
          ]
        },
        "additionalProperties": true,
        "description": "A publicly accessible HTTP or HTTPS web page."
      },
      "InlineSource": {
        "type": "object",
        "required": [
          "type",
          "uri",
          "contents"
        ],
        "properties": {
          "type": {
            "const": "inline",
            "description": "Content type: web, inline, image or video."
          },
          "uri": {
            "type": "string",
            "x-max-utf8-bytes": 4096,
            "description": "Application URI, such as myapp://articles/123. This address is not fetched."
          },
          "contents": {
            "type": "array",
            "minItems": 1,
            "maxItems": 32,
            "x-max-decoded-utf8-bytes": 262144,
            "items": {
              "type": "object",
              "required": [
                "type",
                "text"
              ],
              "properties": {
                "type": {
                  "const": "text",
                  "description": "Text entry type; use text."
                },
                "text": {
                  "type": "string",
                  "description": "Original plain text, not HTML."
                }
              },
              "additionalProperties": true
            },
            "description": "Original text entries in order. At least one nonblank entry is required. Keep the text and entry boundaries unchanged when repeating a pending request."
          }
        },
        "not": {
          "required": [
            "media_type"
          ]
        },
        "additionalProperties": true,
        "description": "Plain text supplied directly. The application URI identifies the text and is not fetched."
      },
      "MediaSource": {
        "type": "object",
        "required": [
          "type",
          "uri"
        ],
        "properties": {
          "type": {
            "enum": [
              "image",
              "video"
            ],
            "description": "Content type: web, inline, image or video."
          },
          "uri": {
            "type": "string",
            "maxLength": 2000,
            "description": "HTTPS URL of the image or video. Do not include credentials, control characters or surrounding whitespace."
          }
        },
        "not": {
          "anyOf": [
            {
              "required": [
                "contents"
              ]
            },
            {
              "required": [
                "media_type"
              ]
            }
          ]
        },
        "additionalProperties": true,
        "description": "An image or video at an HTTPS URL. Set source.type to image or video; do not send media_type."
      },
      "Language": {
        "type": "string",
        "description": "BCP-47 language tag, such as en, en-GB or zh-Hant. If omitted, Accept-Language is used, then en. The request fails if the selected output language cannot be produced or verified."
      },
      "OfferContext": {
        "type": "object",
        "properties": {
          "platform": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "minLength": 1,
                "description": "Application name."
              },
              "version": {
                "type": "string",
                "minLength": 1,
                "description": "Application version."
              },
              "channel": {
                "type": "string",
                "minLength": 1,
                "description": "Application channel."
              }
            },
            "additionalProperties": true,
            "description": "Application information."
          },
          "session_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 256,
            "description": "Pseudonymous session identifier."
          },
          "conversation_id": {
            "type": [
              "string",
              "number"
            ],
            "description": "Conversation identifier."
          },
          "session": {
            "type": "object",
            "properties": {
              "previous_request_id": {
                "type": "string",
                "format": "uuid",
                "description": "Previous AON request ID."
              },
              "recent_topics": {
                "type": "array",
                "maxItems": 10,
                "items": {
                  "type": "string",
                  "minLength": 1
                },
                "description": "Up to ten recent conversation topics."
              }
            },
            "additionalProperties": true,
            "description": "Recent session context."
          },
          "user_profile": {
            "type": "object",
            "properties": {
              "country": {
                "type": "string",
                "pattern": "^[A-Z]{2}$",
                "description": "Uppercase ISO country code, such as US. Supply the viewer's country for server-side calls; otherwise country inference may use your server's region. Resolvable location_ids take precedence."
              },
              "location_ids": {
                "type": "array",
                "minItems": 1,
                "maxItems": 10,
                "uniqueItems": true,
                "items": {
                  "type": "string",
                  "pattern": "^[0-9]+$"
                },
                "description": "Canonical AON location IDs for the viewer."
              },
              "verified_age_over": {
                "type": "integer",
                "minimum": 13,
                "maximum": 120,
                "description": "Verified minimum age threshold, not an inferred or exact age."
              }
            },
            "additionalProperties": true,
            "description": "Current viewer targeting information."
          }
        },
        "additionalProperties": true,
        "description": "Optional current viewer and session information. Unknown fields are ignored."
      },
      "OfferConstraints": {
        "type": "object",
        "properties": {
          "category_ids": {
            "type": "array",
            "uniqueItems": true,
            "items": {
              "type": "string",
              "pattern": "^[a-z0-9_]+(\\.[a-z0-9_]+)*$"
            },
            "description": "Include these category IDs."
          },
          "excluded_category_ids": {
            "type": "array",
            "uniqueItems": true,
            "items": {
              "type": "string",
              "pattern": "^[a-z0-9_]+(\\.[a-z0-9_]+)*$"
            },
            "description": "Exclude these category IDs."
          },
          "offer_types": {
            "type": "array",
            "uniqueItems": true,
            "items": {
              "enum": [
                "physical_product",
                "digital_goods",
                "content",
                "online_service",
                "offline_service"
              ]
            },
            "description": "Allowed offer types."
          },
          "listing_source_names": {
            "type": "array",
            "uniqueItems": true,
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            },
            "description": "Allowed listing sources."
          }
        },
        "additionalProperties": true,
        "description": "Optional offer filters. Unsupported listing-source filters return an error rather than being silently relaxed."
      },
      "OffersReadyEnvelope": {
        "type": "object",
        "required": [
          "code",
          "message",
          "data",
          "extra"
        ],
        "properties": {
          "code": {
            "const": "SUCCESS",
            "description": "Response code. SUCCESS does not mean offers are ready; inspect data.status."
          },
          "message": {
            "type": "string",
            "description": "Human-readable explanation. Use code and data.status for application logic."
          },
          "data": {
            "$ref": "#/components/schemas/OffersReadyView",
            "description": "Ready matches or a pending status."
          },
          "extra": {
            "type": "object",
            "description": "Additional response information."
          }
        },
        "additionalProperties": false,
        "description": "HTTP 200 response: offers are ready."
      },
      "OffersReadyView": {
        "type": "object",
        "required": [
          "status",
          "source_type",
          "matches",
          "poll_after_ms"
        ],
        "properties": {
          "status": {
            "const": "ready",
            "description": "ready when matching is complete."
          },
          "source_type": {
            "enum": [
              "web",
              "inline",
              "image",
              "video"
            ],
            "description": "The submitted source.type."
          },
          "matches": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/OfferMatch"
            },
            "description": "Each entry pairs an intent and its offers with an optional video segment. Empty when no intents are found."
          },
          "poll_after_ms": {
            "type": "null",
            "description": "Null when ready; no further polling is needed."
          }
        },
        "if": {
          "properties": {
            "source_type": {
              "enum": [
                "web",
                "inline",
                "image"
              ]
            }
          }
        },
        "then": {
          "properties": {
            "matches": {
              "items": {
                "properties": {
                  "segment": {
                    "type": "null"
                  }
                }
              }
            }
          }
        },
        "additionalProperties": false,
        "description": "Ready offer matches for the submitted content."
      },
      "OfferMatch": {
        "type": "object",
        "required": [
          "segment",
          "intent",
          "offers"
        ],
        "properties": {
          "segment": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/OfferSegment"
              },
              {
                "type": "null"
              }
            ],
            "description": "Video appearance interval, or null for web, inline text, images and videos without known segments. Repeated video appearances have separate matches."
          },
          "intent": {
            "type": "string",
            "minLength": 1,
            "description": "Product or commercial intent identified in the content."
          },
          "offers": {
            "type": "array",
            "maxItems": 20,
            "items": {
              "$ref": "#/components/schemas/PublicOffer"
            },
            "description": "Up to twenty complete public Offer objects for this intent. An empty array means no offers are available. Offers are deduplicated within an intent, not across unrelated matches."
          }
        },
        "additionalProperties": false,
        "description": "An intent and its offers, optionally associated with a video segment."
      },
      "OfferSegment": {
        "type": "object",
        "required": [
          "start_ms",
          "end_ms"
        ],
        "properties": {
          "start_ms": {
            "type": "integer",
            "minimum": 0,
            "maximum": 600000,
            "description": "Start of the appearance, in milliseconds."
          },
          "end_ms": {
            "type": "integer",
            "minimum": 0,
            "maximum": 600000,
            "description": "End of the appearance, in milliseconds."
          }
        },
        "additionalProperties": false,
        "description": "Original video appearance interval in milliseconds. Start is no later than end; the interval is within the known video duration."
      },
      "PublicOffer": {
        "type": "object",
        "required": [
          "offer_id",
          "offer_instance_id",
          "version",
          "offer_info",
          "entity",
          "action"
        ],
        "properties": {
          "offer_id": {
            "type": "string",
            "format": "uuid",
            "description": "Canonical Offer ID."
          },
          "offer_instance_id": {
            "type": "string",
            "format": "uuid",
            "description": "Opaque ID for this served Offer. Preserve unchanged."
          },
          "version": {
            "type": "string",
            "minLength": 1,
            "description": "Offer schema version."
          },
          "content_language": {
            "type": "string",
            "description": "Language of the Offer content."
          },
          "offer_info": {
            "type": "object",
            "required": [
              "title",
              "description",
              "category"
            ],
            "properties": {
              "title": {
                "type": "string",
                "minLength": 1,
                "description": "Offer title."
              },
              "description": {
                "type": "string",
                "minLength": 1,
                "description": "Offer description."
              },
              "category": {
                "type": "object",
                "required": [
                  "id"
                ],
                "properties": {
                  "id": {
                    "type": "string",
                    "minLength": 1,
                    "description": "Canonical category ID."
                  }
                },
                "additionalProperties": true,
                "description": "Offer category."
              }
            },
            "additionalProperties": true,
            "description": "Offer details. Additional public fields may include pricing and creative assets."
          },
          "entity": {
            "type": "object",
            "required": [
              "id",
              "name"
            ],
            "properties": {
              "id": {
                "type": "string",
                "minLength": 1,
                "description": "Entity identifier."
              },
              "name": {
                "type": "string",
                "minLength": 1,
                "description": "Entity display name."
              }
            },
            "additionalProperties": true,
            "description": "Merchant or service provider."
          },
          "action": {
            "type": "object",
            "required": [
              "type",
              "payload"
            ],
            "properties": {
              "type": {
                "type": "string",
                "minLength": 1,
                "description": "Action type."
              },
              "payload": {
                "type": "object",
                "required": [
                  "url"
                ],
                "properties": {
                  "url": {
                    "type": "string",
                    "format": "uri",
                    "pattern": "^https://",
                    "description": "Tracked HTTPS destination. Preserve this URL unchanged."
                  }
                },
                "additionalProperties": true,
                "description": "Action details."
              }
            },
            "additionalProperties": true,
            "description": "Original action for this served Offer. Do not replace tracked links."
          }
        },
        "additionalProperties": true,
        "description": "Complete public AON Offer. Keep offer_instance_id and the entire action from the same record unchanged for attribution. Additional public fields may be included."
      },
      "OffersPendingEnvelope": {
        "type": "object",
        "required": [
          "code",
          "message",
          "data",
          "extra"
        ],
        "properties": {
          "code": {
            "const": "SUCCESS",
            "description": "Response code. SUCCESS does not mean offers are ready; inspect data.status."
          },
          "message": {
            "type": "string",
            "description": "Human-readable explanation. Use code and data.status for application logic."
          },
          "data": {
            "$ref": "#/components/schemas/OffersPendingView",
            "description": "Ready matches or a pending status."
          },
          "extra": {
            "type": "object",
            "description": "Additional response information."
          }
        },
        "additionalProperties": false,
        "description": "HTTP 202 response: wait and repeat the POST."
      },
      "OffersPendingView": {
        "type": "object",
        "required": [
          "status",
          "poll_after_ms"
        ],
        "properties": {
          "status": {
            "const": "pending",
            "description": "pending while the content is being prepared."
          },
          "poll_after_ms": {
            "type": "integer",
            "minimum": 1,
            "description": "Milliseconds to wait before repeating POST with the same content and language and current viewer context. Use each response's value."
          }
        },
        "additionalProperties": false,
        "description": "Content is being prepared. No matches or offers are included."
      },
      "OffersErrorEnvelope": {
        "type": "object",
        "required": [
          "code",
          "message",
          "data",
          "extra"
        ],
        "properties": {
          "code": {
            "type": "string",
            "enum": [
              "INVALID_JSON",
              "UNSUPPORTED_MEDIA_TYPE",
              "VALIDATION_ERROR",
              "PAYLOAD_TOO_LARGE",
              "PLACEMENT_REJECTED",
              "RESULT_REVOKED",
              "NOT_FOUND",
              "API_NOT_FOUND",
              "METHOD_NOT_ALLOWED",
              "RESULT_EXPIRED",
              "RATE_LIMITED",
              "SERVICE_UNAVAILABLE",
              "INTERNAL_ERROR",
              "CONTENT_ANALYSIS_FAILED",
              "OFFER_QUERY_TIMEOUT",
              "RESULT_TOO_LARGE"
            ],
            "description": "Machine-readable error code."
          },
          "message": {
            "type": "string",
            "description": "Human-readable explanation. Use code and data.status for application logic."
          },
          "data": {
            "type": "null",
            "description": "Always null for an error."
          },
          "extra": {
            "type": "object",
            "properties": {
              "retry_after_seconds": {
                "type": "integer",
                "const": 60,
                "description": "Seconds to wait before retrying a rate-limited request."
              },
              "reason": {
                "type": "string",
                "description": "Reason the content could not be processed."
              },
              "retryable": {
                "type": "boolean",
                "description": "Whether submitting again later may succeed."
              },
              "retry_at": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date-time",
                "description": "Earliest time to submit again, if provided. Not a pending-response polling interval."
              }
            },
            "additionalProperties": true,
            "description": "Additional response information."
          }
        },
        "additionalProperties": false,
        "description": "Error response. data is null and contains no matching data."
      }
    },
    "responses": {
      "OffersReady": {
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/OffersReadyEnvelope"
            },
            "example": {
              "code": "SUCCESS",
              "message": "success",
              "data": {
                "status": "ready",
                "source_type": "video",
                "matches": [
                  {
                    "segment": {
                      "start_ms": 12000,
                      "end_ms": 18500
                    },
                    "intent": "Wireless noise-cancelling headphones",
                    "offers": [
                      {
                        "offer_id": "019ad760-1234-7000-8000-000000000101",
                        "offer_instance_id": "019ad760-1234-7000-8000-000000000102",
                        "version": "3.0",
                        "content_language": "en",
                        "offer_info": {
                          "title": "Wireless noise-cancelling headphones",
                          "description": "Comfortable over-ear headphones for travel and everyday listening.",
                          "category": {
                            "id": "others"
                          },
                          "commercial": {
                            "price": {
                              "amount": "79.99",
                              "currency": "USD"
                            }
                          }
                        },
                        "entity": {
                          "id": "example-merchant",
                          "name": "Example Audio Store"
                        },
                        "action": {
                          "type": "link",
                          "payload": {
                            "url": "https://track.example/offers/headphones?offer_instance_id=019ad760-1234-7000-8000-000000000102"
                          }
                        }
                      }
                    ]
                  }
                ],
                "poll_after_ms": null
              },
              "extra": {}
            }
          }
        },
        "description": "HTTP 200: data.status is ready. Read data.matches; matches:[] and offers:[] are valid results."
      },
      "OffersPending": {
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/OffersPendingEnvelope"
            },
            "example": {
              "code": "SUCCESS",
              "message": "success",
              "data": {
                "status": "pending",
                "poll_after_ms": 2000
              },
              "extra": {}
            }
          }
        },
        "description": "HTTP 202: data.status is pending. Wait data.poll_after_ms, then repeat POST with the same content and language and current viewer context. No Location or task ID is returned."
      },
      "OffersError": {
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/OffersErrorEnvelope"
            },
            "example": {
              "code": "SERVICE_UNAVAILABLE",
              "message": "Offer service is temporarily unavailable",
              "data": null,
              "extra": {}
            }
          }
        },
        "description": "Request or content failure. data is null; inspect code and extra for error and retry details."
      },
      "OffersMethodNotAllowed": {
        "headers": {
          "Allow": {
            "schema": {
              "type": "string"
            },
            "description": "HTTP methods supported by this endpoint."
          },
          "X-Request-Id": {
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Request ID to include when contacting support."
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/OffersErrorEnvelope"
            },
            "example": {
              "code": "METHOD_NOT_ALLOWED",
              "message": "Method not allowed",
              "data": null,
              "extra": {}
            }
          }
        },
        "description": "Unsupported method. Use POST."
      },
      "OffersLimited": {
        "headers": {
          "Retry-After": {
            "schema": {
              "type": "integer",
              "const": 60
            },
            "description": "Seconds to wait before retrying."
          },
          "X-Request-Id": {
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Request ID to include when contacting support."
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/OffersErrorEnvelope"
            },
            "example": {
              "code": "RATE_LIMITED",
              "message": "Content request capacity is exhausted",
              "data": null,
              "extra": {
                "retry_after_seconds": 60
              }
            }
          }
        },
        "description": "Rate limited. Honor Retry-After or extra.retry_after_seconds before retrying."
      }
    }
  }
}
