IAB Tech Lab · Schema

Deal

A confirmed deal booked from a quote (Deals API v1.0 book phase). ID minting: ``deal_id`` is seller-issued.

CompanyAdvertisingAdTechStandardsProgrammaticReal-Time BiddingConsentPrivacyVideo AdsAgentic AdvertisingNon-Profit

Properties

Name Type Description
activation_instructions object
buyer_tier object
consent_context object Privacy consent signals riding with the deal (FD-10).
created_at string
deal_id string Seller-issued deal identifier.
deal_type object
expires_at object Acceptance window for a proposed deal.
linear_tv object Linear TV details carried over from the booked quote (FD-6).
media_type object
openrtb_params object
pricing object
product object
quote_id object Seller-issued id of the quote this deal booked.
rate_card_id object Seller-issued id of the private rate card this deal books against, when the pair has one (FD-9). Never embedded, only referenced.
seller_id object Registry-issued id of the selling agent.
status object
supply_chain object OpenRTB supply chain (schain) for transparency (EP-10.3); optional so pre-schain deals still validate.
terms object
View JSON Schema on GitHub

JSON Schema

iab-tech-lab-agentic-primitive-deal.json Raw ↑
{
  "$defs": {
    "AccessTier": {
      "description": "Access tier for tiered pricing, derived from revealed buyer identity.\n\n- ``public``: no identity \u2014 price ranges only\n- ``seat``: authenticated DSP (demand-side platform) seat\n- ``agency``: agency identity revealed\n- ``advertiser``: advertiser identity revealed (best rates)",
      "enum": [
        "public",
        "seat",
        "agency",
        "advertiser"
      ],
      "title": "AccessTier",
      "type": "string"
    },
    "CancellationTerms": {
      "description": "Structured cancellation window for linear TV deals.",
      "properties": {
        "cancellable_pct": {
          "description": "Portion of the deal that can be cancelled (0.0-1.0).",
          "maximum": 1.0,
          "minimum": 0.0,
          "title": "Cancellable Pct",
          "type": "number"
        },
        "deadline": {
          "anyOf": [
            {
              "format": "date",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Absolute deadline for cancellation.",
          "title": "Deadline"
        },
        "force_majeure": {
          "default": true,
          "description": "Whether force majeure exceptions apply.",
          "title": "Force Majeure",
          "type": "boolean"
        },
        "notice_days": {
          "description": "Days of notice required before cancellation.",
          "title": "Notice Days",
          "type": "integer"
        }
      },
      "required": [
        "notice_days",
        "cancellable_pct"
      ],
      "title": "CancellationTerms",
      "type": "object"
    },
    "ConsentContext": {
      "description": "Privacy consent signals that travel with a deal (flagged decision FD-10).\n\nFull build-out (EP-10.4) of the EP-1.2 placeholder: the three\ninteroperable consent-string carriers \u2014 GPP (Global Privacy Platform)\nwith its applicable section ids, TCF (Transparency & Consent Framework)\nwith the ``gdpr_applies`` gate, and the US Privacy (``us_privacy``)\nstring \u2014 plus the SGP (SafeGuard Privacy / IAB Diligence Platform)\n``diligence_status``. Field names from the EP-1.2 placeholder are kept\nunchanged for backward compatibility; the build-out is purely additive.\nIt travels with the Deal, Quote, and Order. Strings are carried opaque:\nno decoding/vendor-list validation is claimed (see the conformance\nstandards registry).",
      "properties": {
        "applicable_regimes": {
          "description": "Privacy regime identifiers in scope (e.g. 'GDPR', 'CCPA').",
          "items": {
            "type": "string"
          },
          "title": "Applicable Regimes",
          "type": "array"
        },
        "diligence_status": {
          "$ref": "#/$defs/DiligenceStatus",
          "default": "unknown",
          "description": "Counterparty diligence status (SGP = SafeGuard Privacy / IAB Diligence Platform)."
        },
        "gdpr_applies": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Whether GDPR (EU General Data Protection Regulation) applies to this context; None when undetermined. Gates interpretation of the TCF string.",
          "title": "Gdpr Applies"
        },
        "gpp_section_ids": {
          "description": "GPP section ids present in the string.",
          "items": {
            "type": "integer"
          },
          "title": "Gpp Section Ids",
          "type": "array"
        },
        "gpp_string": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "GPP (Global Privacy Platform) consent string.",
          "title": "Gpp String"
        },
        "tcf_string": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "TCF (Transparency & Consent Framework) TC string, when GDPR applies.",
          "title": "Tcf String"
        },
        "us_privacy": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "US Privacy (CCPA) string, e.g. '1YNN'; superseded by GPP where present.",
          "title": "Us Privacy"
        },
        "verified_at": {
          "anyOf": [
            {
              "format": "date-time",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Timezone-aware timestamp of the last diligence verification, if any.",
          "title": "Verified At"
        }
      },
      "title": "ConsentContext",
      "type": "object"
    },
    "DealStatus": {
      "description": "ONE deal status vocabulary, unioned from the four competing sets.\n\nSources: buyer ``DealResponse.status`` (proposed/active/rejected/\nexpired/completed), seller ``DealBookingStatus`` (proposed/active/\nexpired/cancelled), buyer ``BuyerDealStatus`` (quoted/negotiating/\naccepted/booking/booked/delivering/... + linear TV extensions).\n\nRecorded aliases (retired values, NOT valid on the wire):\n``delivering`` -> ``active``; ``booking`` -> ``booked``;\n``quoted`` -> represented by QuoteStatus, not a deal state;\n``partially_canceled`` -> ``partially_cancelled``.",
      "enum": [
        "proposed",
        "negotiating",
        "accepted",
        "booked",
        "active",
        "makegood_pending",
        "partially_cancelled",
        "completed",
        "rejected",
        "failed",
        "cancelled",
        "expired"
      ],
      "title": "DealStatus",
      "type": "string"
    },
    "DealType": {
      "description": "Programmatic deal types. The short wire encoding is canonical.\n\n- ``PG`` = Programmatic Guaranteed: fixed price, guaranteed impressions\n- ``PD`` = Preferred Deal: fixed price, non-guaranteed first look\n- ``PA`` = Private Auction: auction with floor price, invited buyers\n\nMapping from the seller repo's retired long-form encoding\n(``models/core.py``): ``programmaticguaranteed`` -> ``PG``,\n``preferreddeal`` -> ``PD``, ``privateauction`` -> ``PA``. The\nlong-form strings are NOT valid wire values.",
      "enum": [
        "PG",
        "PD",
        "PA"
      ],
      "title": "DealType",
      "type": "string"
    },
    "DiligenceStatus": {
      "description": "Status of counterparty privacy diligence (IAB Diligence Platform).",
      "enum": [
        "unknown",
        "pending",
        "passed",
        "failed"
      ],
      "title": "DiligenceStatus",
      "type": "string"
    },
    "LinearTVQuoteDetails": {
      "description": "Linear-TV-specific quote details (seller-populated).\n\nNested under ``Quote.linear_tv`` when ``media_type == \"linear_tv\"``.",
      "properties": {
        "audience_estimate": {
          "additionalProperties": true,
          "description": "Audience estimates; expected keys \"demo\", \"universe\", \"impressions_equiv\".",
          "title": "Audience Estimate",
          "type": "object"
        },
        "cancellation_terms": {
          "anyOf": [
            {
              "$ref": "#/$defs/CancellationTerms"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "cpp": {
          "$ref": "#/$defs/Money",
          "description": "CPP (cost per point) offered by the seller."
        },
        "dayparts": {
          "items": {
            "type": "string"
          },
          "title": "Dayparts",
          "type": "array"
        },
        "estimated_grps": {
          "description": "Estimated GRPs (gross rating points).",
          "title": "Estimated Grps",
          "type": "number"
        },
        "estimated_rating": {
          "title": "Estimated Rating",
          "type": "number"
        },
        "makegood_policy": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Makegood policy: \"standard\" (audience deficiency unit), \"negotiated\", or \"none\".",
          "title": "Makegood Policy"
        },
        "measurement_currency": {
          "title": "Measurement Currency",
          "type": "string"
        },
        "networks": {
          "items": {
            "type": "string"
          },
          "title": "Networks",
          "type": "array"
        },
        "spot_length": {
          "title": "Spot Length",
          "type": "integer"
        },
        "spots_per_week": {
          "title": "Spots Per Week",
          "type": "integer"
        },
        "target_demo": {
          "title": "Target Demo",
          "type": "string"
        },
        "total_spots": {
          "title": "Total Spots",
          "type": "integer"
        }
      },
      "required": [
        "target_demo",
        "estimated_grps",
        "estimated_rating",
        "cpp",
        "dayparts",
        "networks",
        "spots_per_week",
        "total_spots",
        "spot_length",
        "measurement_currency"
      ],
      "title": "LinearTVQuoteDetails",
      "type": "object"
    },
    "MediaType": {
      "description": "Media type discriminator carried on quotes and deals.\n\nSellers that do not support ``linear_tv`` MUST return a structured\nrejection rather than silently mispricing (flagged decision FD-6);\nthe field exists on the shared schema so that rejection can be\nstructural.",
      "enum": [
        "digital",
        "ctv",
        "linear_tv"
      ],
      "title": "MediaType",
      "type": "string"
    },
    "Money": {
      "description": "Exact money amount in integer micros (flagged decision FD-11).\n\n``1_000_000`` micros = 1 currency unit \u2014 the ad-industry convention\n(Google Ad Manager, among others, prices in micros). Float is BANNED on\nthe wire for money: IEEE 754 floating point is non-deterministic for\nmoney math (``0.1 + 0.2 != 0.3``, and repeated CPM \u2014 cost per mille \u2014\narithmetic accumulates error), and the two source repos used ``float``\nend-to-end; that defect must not be fossilized into the spec. Every\nprice, rate, budget, and offer in the shared contract is a ``Money``.\n\n``amount_micros`` is a strict integer: float inputs are rejected at\nvalidation time rather than silently truncated.",
      "properties": {
        "amount_micros": {
          "description": "Amount in micros; 1,000,000 micros = 1 currency unit.",
          "title": "Amount Micros",
          "type": "integer"
        },
        "currency": {
          "default": "USD",
          "description": "ISO 4217 alpha-3 currency code.",
          "pattern": "^[A-Z]{3}$",
          "title": "Currency",
          "type": "string"
        }
      },
      "required": [
        "amount_micros"
      ],
      "title": "Money",
      "type": "object"
    },
    "OpenRTBParams": {
      "description": "OpenRTB (Open Real-Time Bidding) deal parameters for DSP\n(demand-side platform) activation.",
      "properties": {
        "at": {
          "default": 3,
          "description": "Auction type (3 = fixed price).",
          "title": "At",
          "type": "integer"
        },
        "bidfloor": {
          "$ref": "#/$defs/Money",
          "description": "Bid floor (exact micros; FD-11). Adapters translate to the raw OpenRTB float `bidfloor`/`bidfloorcur` encoding at the DSP edge."
        },
        "id": {
          "description": "Deal id as it appears in the OpenRTB bid stream.",
          "title": "Id",
          "type": "string"
        },
        "wadomain": {
          "description": "Allowed advertiser domains.",
          "items": {
            "type": "string"
          },
          "title": "Wadomain",
          "type": "array"
        },
        "wseat": {
          "description": "Allowed buyer seats.",
          "items": {
            "type": "string"
          },
          "title": "Wseat",
          "type": "array"
        }
      },
      "required": [
        "id",
        "bidfloor"
      ],
      "title": "OpenRTBParams",
      "type": "object"
    },
    "PricingModel": {
      "description": "Unit of pricing. Union of the buyer's ``RateType`` and the seller's\n``PricingModel`` plus the linear TV additions.\n\n- ``cpm``: cost per mille (thousand impressions)\n- ``cpmv``: cost per thousand viewable impressions\n- ``cpv``: cost per view\n- ``cpc``: cost per click\n- ``cpcv``: cost per completed view\n- ``cpd``: cost per day\n- ``cpp``: cost per (gross rating) point \u2014 linear TV\n- ``flat_fee``: flat fee (buyer repo's ``FlatRate`` maps here)\n- ``unit_rate``: per-unit rate\n- ``hybrid``: mixed CPM/CPP pricing \u2014 linear TV",
      "enum": [
        "cpm",
        "cpmv",
        "cpv",
        "cpc",
        "cpcv",
        "cpd",
        "cpp",
        "flat_fee",
        "unit_rate",
        "hybrid"
      ],
      "title": "PricingModel",
      "type": "string"
    },
    "PricingType": {
      "description": "How a price signal should be interpreted.\n\n- ``fixed``: price is set by the seller, use as-is\n- ``floor``: minimum price; negotiation expected above this level\n- ``on_request``: no price available; buyer must negotiate before any\n  pricing exists (pricing fields are None \u2014 buyers must never fabricate\n  a price for on_request inventory)",
      "enum": [
        "fixed",
        "floor",
        "on_request"
      ],
      "title": "PricingType",
      "type": "string"
    },
    "ProductRef": {
      "description": "Lightweight product summary embedded in quotes and deals.",
      "properties": {
        "inventory_type": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Inventory Type"
        },
        "name": {
          "title": "Name",
          "type": "string"
        },
        "product_id": {
          "description": "Seller-issued product identifier.",
          "title": "Product Id",
          "type": "string"
        }
      },
      "required": [
        "product_id",
        "name"
      ],
      "title": "ProductRef",
      "type": "object"
    },
    "QuotePricing": {
      "description": "Pricing breakdown on a quote or deal.\n\n``base_cpm``/``final_cpm`` are optional to support\n``pricing_type=on_request`` \u2014 when the seller has not provided pricing,\nthese fields are None. CPM = cost per mille (thousand impressions);\nCPP = cost per point (linear TV).",
      "properties": {
        "base_cpm": {
          "anyOf": [
            {
              "$ref": "#/$defs/Money"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "base_cpp": {
          "anyOf": [
            {
              "$ref": "#/$defs/Money"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Linear TV base CPP; None for digital/CTV."
        },
        "final_cpm": {
          "anyOf": [
            {
              "$ref": "#/$defs/Money"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "final_cpp": {
          "anyOf": [
            {
              "$ref": "#/$defs/Money"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Linear TV final CPP; None for digital/CTV."
        },
        "pricing_model": {
          "$ref": "#/$defs/PricingModel",
          "default": "cpm"
        },
        "pricing_type": {
          "$ref": "#/$defs/PricingType",
          "default": "fixed"
        },
        "rationale": {
          "default": "",
          "title": "Rationale",
          "type": "string"
        },
        "tier_discount_pct": {
          "default": 0.0,
          "title": "Tier Discount Pct",
          "type": "number"
        },
        "volume_discount_pct": {
          "default": 0.0,
          "title": "Volume Discount Pct",
          "type": "number"
        }
      },
      "title": "QuotePricing",
      "type": "object"
    },
    "QuoteTerms": {
      "description": "Volume, flight, and guarantee terms on a quote or deal.",
      "properties": {
        "flight_end": {
          "anyOf": [
            {
              "format": "date",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Flight End"
        },
        "flight_start": {
          "anyOf": [
            {
              "format": "date",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Flight Start"
        },
        "grps": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Linear TV volume in GRPs (gross rating points).",
          "title": "Grps"
        },
        "guaranteed": {
          "default": false,
          "title": "Guaranteed",
          "type": "boolean"
        },
        "guaranteed_grps": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Guaranteed Grps"
        },
        "impressions": {
          "anyOf": [
            {
              "minimum": 0,
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Impressions"
        },
        "target_demo": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Linear TV target demographic.",
          "title": "Target Demo"
        }
      },
      "title": "QuoteTerms",
      "type": "object"
    },
    "SupplyChain": {
      "description": "OpenRTB SupplyChain object (``schain``): the ordered node path.\n\n``complete`` is the OpenRTB 0/1 flag: 1 means every node from the\ninitial impression to the final bidder is present (no undisclosed\nhops). Nodes are ordered from the first seller to the entity making the\nrequest. Carried optionally on the :class:`Deal` for transparency.",
      "properties": {
        "complete": {
          "default": 1,
          "description": "OpenRTB 0/1: 1 = all nodes in the path are disclosed.",
          "maximum": 1,
          "minimum": 0,
          "title": "Complete",
          "type": "integer"
        },
        "ext": {
          "anyOf": [
            {
              "additionalProperties": true,
              "type": "object"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Extension slot.",
          "title": "Ext"
        },
        "nodes": {
          "description": "Supply path, ordered first-seller -> requesting-entity.",
          "items": {
            "$ref": "#/$defs/SupplyChainNode"
          },
          "title": "Nodes",
          "type": "array"
        },
        "ver": {
          "default": "1.0",
          "description": "SupplyChain object version (OpenRTB ``ver``).",
          "title": "Ver",
          "type": "string"
        }
      },
      "title": "SupplyChain",
      "type": "object"
    },
    "SupplyChainNode": {
      "description": "One hop in the OpenRTB supply chain (``schain`` node).\n\nField names are the OpenRTB SupplyChainNode names verbatim. ``asi`` is\nthe advertising system identifier (the canonical domain of the system\nthe node operates in, e.g. ``\"exchange.example.com\"``); ``sid`` is the\nseller id **within that system** and matches a ``seller_id`` in that\nsystem's sellers.json.",
      "properties": {
        "asi": {
          "description": "Advertising system identifier (canonical domain of the system).",
          "title": "Asi",
          "type": "string"
        },
        "domain": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Business domain of the entity represented by this node.",
          "title": "Domain"
        },
        "ext": {
          "anyOf": [
            {
              "additionalProperties": true,
              "type": "object"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Extension slot.",
          "title": "Ext"
        },
        "hp": {
          "default": 1,
          "description": "Handled-payment flag (OpenRTB 0/1): 1 = node is paid for this inventory.",
          "maximum": 1,
          "minimum": 0,
          "title": "Hp",
          "type": "integer"
        },
        "name": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Business name of the entity represented by this node.",
          "title": "Name"
        },
        "rid": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Request id issued by the seller (OpenRTB ``rid``), when present.",
          "title": "Rid"
        },
        "sid": {
          "description": "Seller id within the ``asi`` system; matches its sellers.json seller_id.",
          "title": "Sid",
          "type": "string"
        }
      },
      "required": [
        "asi",
        "sid"
      ],
      "title": "SupplyChainNode",
      "type": "object"
    }
  },
  "description": "A confirmed deal booked from a quote (Deals API v1.0 book phase).\n\nID minting: ``deal_id`` is seller-issued.",
  "properties": {
    "activation_instructions": {
      "additionalProperties": {
        "type": "string"
      },
      "title": "Activation Instructions",
      "type": "object"
    },
    "buyer_tier": {
      "$ref": "#/$defs/AccessTier",
      "default": "public"
    },
    "consent_context": {
      "anyOf": [
        {
          "$ref": "#/$defs/ConsentContext"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Privacy consent signals riding with the deal (FD-10)."
    },
    "created_at": {
      "format": "date-time",
      "title": "Created At",
      "type": "string"
    },
    "deal_id": {
      "description": "Seller-issued deal identifier.",
      "title": "Deal Id",
      "type": "string"
    },
    "deal_type": {
      "$ref": "#/$defs/DealType"
    },
    "expires_at": {
      "anyOf": [
        {
          "format": "date-time",
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Acceptance window for a proposed deal.",
      "title": "Expires At"
    },
    "linear_tv": {
      "anyOf": [
        {
          "$ref": "#/$defs/LinearTVQuoteDetails"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Linear TV details carried over from the booked quote (FD-6)."
    },
    "media_type": {
      "$ref": "#/$defs/MediaType",
      "default": "digital"
    },
    "openrtb_params": {
      "anyOf": [
        {
          "$ref": "#/$defs/OpenRTBParams"
        },
        {
          "type": "null"
        }
      ],
      "default": null
    },
    "pricing": {
      "$ref": "#/$defs/QuotePricing"
    },
    "product": {
      "$ref": "#/$defs/ProductRef"
    },
    "quote_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Seller-issued id of the quote this deal booked.",
      "title": "Quote Id"
    },
    "rate_card_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Seller-issued id of the private rate card this deal books against, when the pair has one (FD-9). Never embedded, only referenced.",
      "title": "Rate Card Id"
    },
    "seller_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Registry-issued id of the selling agent.",
      "title": "Seller Id"
    },
    "status": {
      "$ref": "#/$defs/DealStatus",
      "default": "proposed"
    },
    "supply_chain": {
      "anyOf": [
        {
          "$ref": "#/$defs/SupplyChain"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "OpenRTB supply chain (schain) for transparency (EP-10.3); optional so pre-schain deals still validate."
    },
    "terms": {
      "$ref": "#/$defs/QuoteTerms"
    }
  },
  "required": [
    "deal_id",
    "deal_type",
    "product",
    "pricing",
    "terms"
  ],
  "title": "Deal",
  "type": "object"
}

Work with this as data

Every JSON Schema 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 schemas

4 MCP tools reach this
  • find_json_schemasBrowse and filter every JSON Schema 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 JSON Schema
curl "https://apis.io/api/v1/json-schemas/iab-tech-lab-agentic-primitive-deal"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

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.