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
Derived by API Evangelist Built from the contracts Zyte publishes. Zyte did not publish this file.
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

Work with this as data

Every overlay here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for openapi overlays

4 MCP tools reach this
  • find_overlaysBrowse and filter every overlay in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This overlay
curl "https://apis.io/api/v1/overlays/zyte-zyte-api-overlay"
All openapi overlays
curl "https://apis.io/api/v1/overlays?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.