Zyte · OpenAPI Overlay 1.0.0

API Evangelist enhancements for the Zyte API contract

9 actions 9 updates documentation extends ../openapi/zyte-zyte-api-openapi.yaml
Generated by API Evangelist Written by API Evangelist tooling for Zyte's API. It is a proposal applied on top of the contract, not a document Zyte publishes.
View Overlay File View on GitHub Overlay Specification

What the actions change

x-problem-typesx-catalogx-chargedx-retryablex-product-namex-documentationx-referencex-pricing

Targets 8

$.info
$.components.securitySchemes.BasicAuth
$.paths['/extract'].post
$.paths['/extract'].post.responses['429']
$.paths['/extract'].post.responses['503']
$.paths['/extract'].post.responses['520']
$.paths['/extract'].post.responses['521']
$.paths['/extract'].post.responses['403']

OpenAPI Overlay

Raw ↑
overlay: 1.0.0
info:
  title: API Evangelist enhancements for the Zyte API contract
  version: 1.0.0
extends: ../openapi/zyte-zyte-api-openapi.yaml
x-provenance:
  generated: '2026-08-29'
  method: generated
  source: >-
    Derived from the Zyte API OpenAPI as published at
    https://docs.zyte.com/zyte-api/usage/reference.html, plus
    errors/zyte-problem-types.yml, conventions/zyte-conventions.yml,
    authentication/zyte-authentication.yml and
    rate-limits/zyte-rate-limits.yml. The upstream spec is never mutated.
actions:
  - target: $.info
    description: >-
      Name the product and point at the canonical documentation. The published
      info block calls the API "Web Data Extraction API", which is not the name
      the docs, the console or the billing use.
    update:
      x-product-name: Zyte API
      x-documentation: https://docs.zyte.com/zyte-api/get-started.html
      x-reference: https://docs.zyte.com/zyte-api/usage/reference.html
      x-pricing: https://docs.zyte.com/zyte-api/pricing.html
      x-status-page: https://status.zyte.com/
      x-support: https://support.zyte.com/support/tickets/new
      x-spec-distribution: >-
        The contract is published only as an embedded YAML block inside the
        HTML documentation page; there is no standalone spec URL.
  - target: $.info
    description: Record the sibling contract, which the published spec does not reference.
    update:
      x-related-apis:
        - name: Zyte API Stats API
          spec: ../openapi/zyte-stats-api-openapi.yaml
          server: https://zyte-api-stats.zyte.com
          note: Uses a DIFFERENT API key (the Zyte dashboard key).
        - name: Scrapy Cloud API
          docs: https://docs.zyte.com/scrapy-cloud/usage/reference/http/index.html
          servers:
            - https://app.zyte.com/api
            - https://storage.zyte.com
          note: No machine-readable contract published. Uses a THIRD API key.
  - target: $.components.securitySchemes.BasicAuth
    description: >-
      Make the credential concrete. The published scheme says only
      http/basic, which does not tell a caller that the password must be empty
      or where the key comes from.
    update:
      description: >-
        HTTP Basic (RFC 7617). Send the Zyte API key as the username and an
        EMPTY password, i.e. Authorization: Basic base64("<API_KEY>:").
      x-credential-source: https://app.zyte.com/o/zyte-api/api-access
      x-env-var: ZYTE_API_KEY
      x-key-namespace: zyte-api
      x-not-interchangeable-with:
        - Scrapy Cloud API key (https://app.zyte.com/o/settings/apikey)
        - Zyte dashboard API key (https://app.zyte.com/o/settings)
      x-alternative-auth:
        protocol: x402
        description: >-
          The first-party zyte-api client can pay per request with an Ethereum
          key (--eth-key) instead of an account API key.
        source: https://python-zyte-api.readthedocs.io/en/stable/ref/cli.html
  - target: $.paths['/extract'].post
    description: >-
      Attach the runtime semantics an agent needs and the contract omits:
      cost, reversibility, retry policy and the trap that some failures arrive
      as HTTP 200.
    update:
      x-agentic-access:
        action-class: read
        consequence: billable
        reversible: false
        note: >-
          Creates no resource and cannot be undone, but a successful response
          is charged. The account spending limit is the only blast-radius
          control.
      x-idempotency:
        supported: false
        note: >-
          No idempotency key. Replaying the same body is safe for correctness
          (it is a fetch) but not for cost.
      x-cost-model:
        billed-on: successful responses only
        free: rate-limiting responses (429/503) and unsuccessful responses
        drivers:
          - request tier of the target website
          - request type (HTTP or browser)
          - per-feature add-ons (screenshot, extraction, custom attributes, actions, network capture)
        estimator: https://app.zyte.com/o/cost-estimator
      x-retry-policy:
        retry-on:
          - 429
          - 503
          - 520
        algorithm: exponential backoff with randomized wait
        first-wait-seconds-rate-limiting: 20-40
        max-wait-seconds-rate-limiting: 630
        do-not-retry:
          - 400
          - 401
          - 403
          - 421
          - 422
          - 451
        source: https://docs.zyte.com/zyte-api/usage/errors.html#zapi-retry
      x-rate-limit:
        standard-rpm: 3000
        enterprise-rpm: 10000
        headers-published: false
        note: >-
          No RateLimit-*/Retry-After headers are returned. Remaining budget is
          not observable at runtime.
      x-response-headers:
        - name: request-id
          description: Opaque per-request identifier; quote it in support tickets.
      x-success-is-not-always-success:
        description: >-
          THREE conditions return HTTP 200 and ARE charged, and an agent that
          treats 200 as "done" will silently accept bad data.
        conditions:
          - name: bad website response
            detect: 'read the response `statusCode` field, not the HTTP status'
          - name: browser action failure
            detect: 'inspect the response `actions[]` array for per-action outcomes'
          - name: extraction mismatch
            detect: 'check `metadata.probability` on the extracted object'
  - target: $.paths['/extract'].post.responses['429']
    description: Bind the documented problem types to the status code.
    update:
      x-problem-types:
        - /limits/over-user-limit
        - /limits/over-domain-limit
        - /limits/over-org-domain-limit
      x-charged: false
      x-catalog: ../errors/zyte-problem-types.yml
  - target: $.paths['/extract'].post.responses['503']
    description: Bind the documented problem types to the status code.
    update:
      x-problem-types:
        - /limits/over-global-limit
        - /extractor/over-global-limit
      x-charged: false
      x-catalog: ../errors/zyte-problem-types.yml
  - target: $.paths['/extract'].post.responses['520']
    description: Bind the documented problem type and its retry semantics.
    update:
      x-problem-types:
        - /download/temporary-error
      x-retryable: true
      x-catalog: ../errors/zyte-problem-types.yml
  - target: $.paths['/extract'].post.responses['521']
    description: Bind the documented problem type and Zyte's own caveat about it.
    update:
      x-problem-types:
        - /download/internal-error
      x-retryable: false
      x-caveat: >-
        Zyte documents that some 520s are misclassified as 521; if the same
        request only sometimes returns 521, treat it as 520 for that site.
      x-catalog: ../errors/zyte-problem-types.yml
  - target: $.paths['/extract'].post.responses['403']
    description: Distinguish a billing suspension from an authorization failure.
    update:
      x-problem-types:
        - /auth/account-suspended
      x-recovery: >-
        Set or raise the account spending limit; the suspension lifts
        immediately.
      x-catalog: ../errors/zyte-problem-types.yml