{
 "openapi": "3.1.0",
 "info": {
  "title": "Arcadium Data API",
  "version": "1.3.0",
  "description": "One API over the Arcadium Data datasets: jobs from employer job boards, company hiring profiles and signals, posted-pay bands and the EU pay-transparency tracker, forward hotel-rate curves, Shopify stores and apps, review panels, and company watchlists. Company-level and aggregate data only; no personal data. Without a key you get 10 requests/minute and 100/day per IP and pages of up to 10 rows. Send a key as \"Authorization: Bearer <key>\" or \"X-API-Key: <key>\"; plans: GET /v1/plans. Free key: POST /v1/account/signup (email link, shown once); upgrade: POST /v1/account/checkout (Stripe). Errors are {\"error\": code, \"message\": text}. Rate-limit headers: x-ratelimit-remaining, x-ratelimit-reset, x-quota-limit, x-quota-remaining. Versioning: /v1 only ever gains routes, optional parameters and fields; ignore unknown fields and tolerate unknown enum values. Deprecated routes send Deprecation and Sunset headers and keep answering until the sunset date."
 },
 "servers": [
  {
   "url": "https://api.arcadiumdata.io"
  }
 ],
 "tags": [
  {
   "name": "Jobs"
  },
  {
   "name": "Companies"
  },
  {
   "name": "Pulse"
  },
  {
   "name": "Pay"
  },
  {
   "name": "Hotels"
  },
  {
   "name": "Shops"
  },
  {
   "name": "Tenders"
  },
  {
   "name": "Reviews"
  },
  {
   "name": "Watchlists"
  },
  {
   "name": "Account"
  }
 ],
 "paths": {
  "/v1/jobs": {
   "get": {
    "operationId": "searchJobs",
    "tags": [
     "Jobs"
    ],
    "summary": "Search open jobs",
    "description": "Open jobs read from employer job boards (ATS), newest first seen first. Cursor pagination: pass `nextCursor` back as `cursor`. With `isco`, a page may hold fewer than `limit` jobs while `nextCursor` is set (the ISCO group is mapped from the title, so the scan is bounded).",
    "parameters": [
     {
      "name": "q",
      "in": "query",
      "required": false,
      "description": "Full-text search over title and description (web syntax: \"data engineer\" -senior).",
      "schema": {
       "type": "string",
       "minLength": 2,
       "maxLength": 200
      }
     },
     {
      "name": "country",
      "in": "query",
      "required": false,
      "description": "Job located in any of these countries (ISO 3166-1 alpha-2).",
      "example": "DE,FR",
      "schema": {
       "type": "string",
       "maxLength": 320
      }
     },
     {
      "name": "ats",
      "in": "query",
      "required": false,
      "description": "Only jobs read from these source systems.",
      "example": "greenhouse,workday",
      "schema": {
       "type": "string",
       "maxLength": 160
      }
     },
     {
      "name": "remote",
      "in": "query",
      "required": false,
      "description": "true = fully remote only, false = on-site or hybrid only.",
      "schema": {
       "type": "string",
       "enum": [
        "true",
        "false"
       ]
      }
     },
     {
      "name": "domain",
      "in": "query",
      "required": false,
      "description": "Employer website domain, e.g. stripe.com.",
      "schema": {
       "type": "string",
       "minLength": 4,
       "maxLength": 253
      }
     },
     {
      "name": "postedSince",
      "in": "query",
      "required": false,
      "description": "Posted by the employer on or after this day.",
      "schema": {
       "type": "string",
       "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
      }
     },
     {
      "name": "isco",
      "in": "query",
      "required": false,
      "description": "ISCO-08 sub-major groups (2 digits) mapped from the title, e.g. 25 = ICT professionals.",
      "example": "25,21",
      "schema": {
       "type": "string",
       "maxLength": 160
      }
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "description": "Jobs per page (anonymous: at most 10).",
      "schema": {
       "default": 25,
       "type": "integer",
       "minimum": 1,
       "maximum": 100
      }
     },
     {
      "name": "cursor",
      "in": "query",
      "required": false,
      "description": "`nextCursor` of the previous page.",
      "schema": {
       "type": "string",
       "maxLength": 200
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/JobsPage"
        }
       }
      }
     },
     "400": {
      "description": "Invalid input (error code names the parameter, e.g. invalid_country).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "401": {
      "description": "Unknown API key, or a key is required.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "403": {
      "description": "Key revoked or expired, or a plan limit.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Not found.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Rate limit or monthly quota reached (see Retry-After).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "security": [
     {},
     {
      "bearer": []
     },
     {
      "apiKey": []
     }
    ]
   }
  },
  "/v1/jobs/{id}": {
   "get": {
    "operationId": "getJob",
    "tags": [
     "Jobs"
    ],
    "summary": "One job with its description",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "description": "Job id from a search result.",
      "schema": {
       "type": "string",
       "pattern": "^[a-z0-9]{2,20}___.{1,200}$"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/JobDetail"
        }
       }
      }
     },
     "400": {
      "description": "Invalid input (error code names the parameter, e.g. invalid_country).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "401": {
      "description": "Unknown API key, or a key is required.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "403": {
      "description": "Key revoked or expired, or a plan limit.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Not found.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Rate limit or monthly quota reached (see Retry-After).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "security": [
     {},
     {
      "bearer": []
     },
     {
      "apiKey": []
     }
    ]
   }
  },
  "/v1/companies/{domain}": {
   "get": {
    "operationId": "getCompanyProfile",
    "tags": [
     "Companies"
    ],
    "summary": "Company profile: job boards, open jobs, hiring signals, tech, events, Shopify store",
    "parameters": [
     {
      "name": "domain",
      "in": "path",
      "required": true,
      "description": "Company website domain or URL, e.g. stripe.com.",
      "schema": {
       "type": "string",
       "minLength": 4,
       "maxLength": 253
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/CompanyProfile"
        }
       }
      }
     },
     "400": {
      "description": "Invalid input (error code names the parameter, e.g. invalid_country).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "401": {
      "description": "Unknown API key, or a key is required.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "403": {
      "description": "Key revoked or expired, or a plan limit.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Not found.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Rate limit or monthly quota reached (see Retry-After).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "security": [
     {},
     {
      "bearer": []
     },
     {
      "apiKey": []
     }
    ]
   }
  },
  "/v1/companies/{domain}/history": {
   "get": {
    "operationId": "getCompanyHiringHistory",
    "tags": [
     "Companies"
    ],
    "summary": "Point-in-time hiring history 2023 onwards (open jobs per crawl, from the public web archive)",
    "description": "One row per job board per Common Crawl crawl since February 2023, with capture time (`observedAt`), the date the crawl was published (`availableAt`) and a coverage flag; `months` sums the boards per crawl. Boards of the same listed company (ticker) are included, also boards that no longer exist. Sparse by nature: missing crawls stay missing.",
    "parameters": [
     {
      "name": "domain",
      "in": "path",
      "required": true,
      "description": "Company website domain or URL, e.g. stripe.com.",
      "schema": {
       "type": "string",
       "minLength": 4,
       "maxLength": 253
      }
     },
     {
      "name": "from",
      "in": "query",
      "required": false,
      "description": "First month (YYYY-MM-DD, compared with the month start).",
      "schema": {
       "type": "string",
       "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
      }
     },
     {
      "name": "to",
      "in": "query",
      "required": false,
      "description": "Last month (YYYY-MM-DD).",
      "schema": {
       "type": "string",
       "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/CompanyHistory"
        }
       }
      }
     },
     "400": {
      "description": "Invalid input (error code names the parameter, e.g. invalid_country).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "401": {
      "description": "Unknown API key, or a key is required.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "403": {
      "description": "Key revoked or expired, or a plan limit.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Not found.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Rate limit or monthly quota reached (see Retry-After).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "security": [
     {},
     {
      "bearer": []
     },
     {
      "apiKey": []
     }
    ]
   }
  },
  "/v1/companies/{domain}/pulse": {
   "get": {
    "operationId": "getCompanyPulse",
    "tags": [
     "Pulse"
    ],
    "summary": "Company Pulse: dated change events of one company from every dataset (last 90 days)",
    "description": "Hiring up/down vs 7- and 28-day baselines, new country, new function, ATS switch, first job ad with posted pay, tools added/removed in job ads, Shopify app installs/removals, review velocity and rating moves, public contract awards. Each event has `occurredAt` (when it happened) and `observedAt` (when we first had the data, never rewritten): filter on `observedAt` for point-in-time backtests. History starts 2026-10-21; events on a baseline under 28 days are `provisional`. The 0-100 score is off until 60 days of history (2026-12-20).",
    "parameters": [
     {
      "name": "domain",
      "in": "path",
      "required": true,
      "description": "Company website domain or URL, e.g. stripe.com.",
      "schema": {
       "type": "string",
       "minLength": 4,
       "maxLength": 253
      }
     },
     {
      "name": "since",
      "in": "query",
      "required": false,
      "description": "Events on or after this day; default and earliest: 90 days ago (history starts 2026-10-21).",
      "schema": {
       "type": "string",
       "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
      }
     },
     {
      "name": "types",
      "in": "query",
      "required": false,
      "description": "Event types, any of: hiring_up, hiring_down, new_country, new_function, ats_switch, pay_first_seen, review_velocity, rating_change, shop_app_installed, shop_app_removed, tech_added, tech_removed, tender_awarded.",
      "example": "hiring_up,new_country",
      "schema": {
       "type": "string",
       "maxLength": 400
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/CompanyPulse"
        }
       }
      }
     },
     "400": {
      "description": "Invalid input (error code names the parameter, e.g. invalid_country).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "401": {
      "description": "Unknown API key, or a key is required.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "403": {
      "description": "Key revoked or expired, or a plan limit.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Not found.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Rate limit or monthly quota reached (see Retry-After).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "security": [
     {},
     {
      "bearer": []
     },
     {
      "apiKey": []
     }
    ]
   }
  },
  "/v1/pulse/events": {
   "get": {
    "operationId": "listPulseEvents",
    "tags": [
     "Pulse"
    ],
    "summary": "Company Pulse feed: events of every company, filtered by day, country and type",
    "description": "Newest first (occurredAt, then observedAt, then id). Cursor pagination: pass `nextCursor` back as `cursor` with the same filters. `since` at most 90 days back.",
    "parameters": [
     {
      "name": "since",
      "in": "query",
      "required": false,
      "description": "Events on or after this day; default 7 days ago, earliest 90 days ago.",
      "schema": {
       "type": "string",
       "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
      }
     },
     {
      "name": "until",
      "in": "query",
      "required": false,
      "description": "Events on or before this day; default today.",
      "schema": {
       "type": "string",
       "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
      }
     },
     {
      "name": "country",
      "in": "query",
      "required": false,
      "description": "Only events in these countries (ISO 3166-1 alpha-2).",
      "example": "DE,SE",
      "schema": {
       "type": "string",
       "maxLength": 480
      }
     },
     {
      "name": "types",
      "in": "query",
      "required": false,
      "description": "Event types, any of: hiring_up, hiring_down, new_country, new_function, ats_switch, pay_first_seen, review_velocity, rating_change, shop_app_installed, shop_app_removed, tech_added, tech_removed, tender_awarded.",
      "example": "hiring_up,new_country",
      "schema": {
       "type": "string",
       "maxLength": 400
      }
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "description": "Events per page, 1-500 (capped by your plan).",
      "schema": {
       "default": 100,
       "type": "integer",
       "minimum": 1,
       "maximum": 500
      }
     },
     {
      "name": "cursor",
      "in": "query",
      "required": false,
      "description": "`nextCursor` of the previous page.",
      "schema": {
       "type": "string",
       "maxLength": 300
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/PulseEventsPage"
        }
       }
      }
     },
     "400": {
      "description": "Invalid input (error code names the parameter, e.g. invalid_country).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "401": {
      "description": "Unknown API key, or a key is required.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "403": {
      "description": "Key revoked or expired, or a plan limit.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Not found.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Rate limit or monthly quota reached (see Retry-After).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "security": [
     {},
     {
      "bearer": []
     },
     {
      "apiKey": []
     }
    ]
   }
  },
  "/v1/pay/bands": {
   "get": {
    "operationId": "getPayBands",
    "tags": [
     "Pay"
    ],
    "summary": "Posted-pay bands (p25 / median / p75, EUR) per country and ISCO-08 group",
    "description": "Weekly cells from open job ads that state pay; cells under 10 postings or 3 employers are suppressed.",
    "parameters": [
     {
      "name": "country",
      "in": "query",
      "required": false,
      "description": "Countries (ISO alpha-2).",
      "example": "DE,NL",
      "schema": {
       "type": "string",
       "maxLength": 640
      }
     },
     {
      "name": "isco",
      "in": "query",
      "required": false,
      "description": "ISCO-08 sub-major groups, or ALL for every posting of the country.",
      "example": "25,ALL",
      "schema": {
       "type": "string",
       "maxLength": 320
      }
     },
     {
      "name": "week",
      "in": "query",
      "required": false,
      "description": "ISO week (YYYY-Www); default the latest.",
      "schema": {
       "type": "string",
       "pattern": "^\\d{4}-W\\d{2}$"
      }
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "description": "Rows, 1-2000.",
      "schema": {
       "default": 500,
       "type": "integer",
       "minimum": 1,
       "maximum": 2000
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/PayBands"
        }
       }
      }
     },
     "400": {
      "description": "Invalid input (error code names the parameter, e.g. invalid_country).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "401": {
      "description": "Unknown API key, or a key is required.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "403": {
      "description": "Key revoked or expired, or a plan limit.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Not found.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Rate limit or monthly quota reached (see Retry-After).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "security": [
     {},
     {
      "bearer": []
     },
     {
      "apiKey": []
     }
    ]
   }
  },
  "/v1/pay/transparency": {
   "get": {
    "operationId": "getPayTransparency",
    "tags": [
     "Pay"
    ],
    "summary": "Pay-transparency adoption: share of job ads stating pay, per country and day",
    "description": "With the EU Pay Transparency Directive status of each member state. Newest day first.",
    "parameters": [
     {
      "name": "country",
      "in": "query",
      "required": false,
      "description": "Countries (ISO alpha-2).",
      "example": "DE,FR",
      "schema": {
       "type": "string",
       "maxLength": 640
      }
     },
     {
      "name": "sizeBand",
      "in": "query",
      "required": false,
      "description": "Employer size proxy (open jobs of the employer that day), or all.",
      "schema": {
       "default": "all",
       "type": "string",
       "enum": [
        "all",
        "1-9",
        "10-49",
        "50-249",
        "250+"
       ]
      }
     },
     {
      "name": "since",
      "in": "query",
      "required": false,
      "description": "First day; default the first tracked day.",
      "schema": {
       "type": "string",
       "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
      }
     },
     {
      "name": "until",
      "in": "query",
      "required": false,
      "description": "Last day; default today.",
      "schema": {
       "type": "string",
       "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
      }
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "description": "Rows, 1-5000.",
      "schema": {
       "default": 1000,
       "type": "integer",
       "minimum": 1,
       "maximum": 5000
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/PayTransparency"
        }
       }
      }
     },
     "400": {
      "description": "Invalid input (error code names the parameter, e.g. invalid_country).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "401": {
      "description": "Unknown API key, or a key is required.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "403": {
      "description": "Key revoked or expired, or a plan limit.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Not found.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Rate limit or monthly quota reached (see Retry-After).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "security": [
     {},
     {
      "bearer": []
     },
     {
      "apiKey": []
     }
    ]
   }
  },
  "/v1/hotels/rate-curve": {
   "get": {
    "operationId": "listRateCurveCities",
    "tags": [
     "Hotels"
    ],
    "summary": "Cities with a forward hotel-rate curve",
    "parameters": [],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/RateCurveCities"
        }
       }
      }
     },
     "400": {
      "description": "Invalid input (error code names the parameter, e.g. invalid_country).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "401": {
      "description": "Unknown API key, or a key is required.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "403": {
      "description": "Key revoked or expired, or a plan limit.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Not found.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Rate limit or monthly quota reached (see Retry-After).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "security": [
     {},
     {
      "bearer": []
     },
     {
      "apiKey": []
     }
    ]
   }
  },
  "/v1/hotels/rate-curve/{city}": {
   "get": {
    "operationId": "getRateCurve",
    "tags": [
     "Hotels"
    ],
    "summary": "Forward hotel-rate curve and demand index of a city (next 90 nights)",
    "parameters": [
     {
      "name": "city",
      "in": "path",
      "required": true,
      "description": "City slug from GET /v1/hotels/rate-curve, e.g. barcelona.",
      "schema": {
       "type": "string",
       "pattern": "^[a-z0-9-]{2,60}$"
      }
     },
     {
      "name": "snapshot",
      "in": "query",
      "required": false,
      "description": "Snapshot day; default the latest.",
      "schema": {
       "type": "string",
       "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
      }
     },
     {
      "name": "from",
      "in": "query",
      "required": false,
      "description": "First check-in night.",
      "schema": {
       "type": "string",
       "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
      }
     },
     {
      "name": "to",
      "in": "query",
      "required": false,
      "description": "Last check-in night.",
      "schema": {
       "type": "string",
       "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/RateCurve"
        }
       }
      }
     },
     "400": {
      "description": "Invalid input (error code names the parameter, e.g. invalid_country).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "401": {
      "description": "Unknown API key, or a key is required.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "403": {
      "description": "Key revoked or expired, or a plan limit.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Not found.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Rate limit or monthly quota reached (see Retry-After).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "security": [
     {},
     {
      "bearer": []
     },
     {
      "apiKey": []
     }
    ]
   }
  },
  "/v1/shops/{domain}": {
   "get": {
    "operationId": "getShop",
    "tags": [
     "Shops"
    ],
    "summary": "Shopify store profile on a domain",
    "parameters": [
     {
      "name": "domain",
      "in": "path",
      "required": true,
      "description": "Company website domain or URL, e.g. stripe.com.",
      "schema": {
       "type": "string",
       "minLength": 4,
       "maxLength": 253
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Shop"
        }
       }
      }
     },
     "400": {
      "description": "Invalid input (error code names the parameter, e.g. invalid_country).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "401": {
      "description": "Unknown API key, or a key is required.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "403": {
      "description": "Key revoked or expired, or a plan limit.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Not found.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Rate limit or monthly quota reached (see Retry-After).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "security": [
     {},
     {
      "bearer": []
     },
     {
      "apiKey": []
     }
    ]
   }
  },
  "/v1/shops/{domain}/apps": {
   "get": {
    "operationId": "getShopApps",
    "tags": [
     "Shops"
    ],
    "summary": "Apps detected on a Shopify store, with installs and uninstalls",
    "parameters": [
     {
      "name": "domain",
      "in": "path",
      "required": true,
      "description": "Company website domain or URL, e.g. stripe.com.",
      "schema": {
       "type": "string",
       "minLength": 4,
       "maxLength": 253
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/ShopApps"
        }
       }
      }
     },
     "400": {
      "description": "Invalid input (error code names the parameter, e.g. invalid_country).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "401": {
      "description": "Unknown API key, or a key is required.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "403": {
      "description": "Key revoked or expired, or a plan limit.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Not found.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Rate limit or monthly quota reached (see Retry-After).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "security": [
     {},
     {
      "bearer": []
     },
     {
      "apiKey": []
     }
    ]
   }
  },
  "/v1/tenders": {
   "get": {
    "operationId": "searchTenders",
    "tags": [
     "Tenders"
    ],
    "summary": "Search public tenders and contract awards (EU TED, UK Find a Tender, FR/DE/PL/BG national boards)",
    "description": "Official procurement notices from open-data APIs (TED, UK Find a Tender, and the national boards of France, Germany, Poland and Bulgaria for notices below the EU thresholds; national copies of TED notices are listed once), normalised: buyer organisation, country and NUTS region, CPV codes, values in EUR, deadline, winning organisations. Newest published first; cursor pagination. `openOn=<today>` lists calls still open. Buyers and winners are organisations; contact persons are never included and winner names that could be a private person are withheld.",
    "parameters": [
     {
      "name": "q",
      "in": "query",
      "required": false,
      "description": "Words in the title (English and original), buyer or winner names (web syntax: \"road works\" -bridge).",
      "schema": {
       "type": "string",
       "minLength": 2,
       "maxLength": 200
      }
     },
     {
      "name": "country",
      "in": "query",
      "required": false,
      "description": "Buyer in any of these countries (ISO 3166-1 alpha-2).",
      "example": "DE,PL",
      "schema": {
       "type": "string",
       "maxLength": 480
      }
     },
     {
      "name": "cpv",
      "in": "query",
      "required": false,
      "description": "CPV prefixes, 2-8 digits: 2 = division (72 = IT services), 8 = one code.",
      "example": "72,48000000",
      "schema": {
       "type": "string",
       "maxLength": 320
      }
     },
     {
      "name": "kind",
      "in": "query",
      "required": false,
      "description": "Notice kinds: planning, competition (open call), award, modification, cancellation, other.",
      "example": "competition",
      "schema": {
       "type": "string",
       "maxLength": 96
      }
     },
     {
      "name": "source",
      "in": "query",
      "required": false,
      "description": "ted = EU Tenders Electronic Daily, fts = UK Find a Tender; national boards (notices below the EU thresholds): boamp = France, bund = Germany, bzp = Poland, eop = Bulgaria.",
      "example": "ted",
      "schema": {
       "type": "string",
       "maxLength": 96
      }
     },
     {
      "name": "publishedSince",
      "in": "query",
      "required": false,
      "description": "Published on or after this day.",
      "schema": {
       "type": "string",
       "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
      }
     },
     {
      "name": "publishedUntil",
      "in": "query",
      "required": false,
      "description": "Published on or before this day.",
      "schema": {
       "type": "string",
       "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
      }
     },
     {
      "name": "openOn",
      "in": "query",
      "required": false,
      "description": "Only calls for tenders still open on this day (deadline on or after it), e.g. today.",
      "schema": {
       "type": "string",
       "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
      }
     },
     {
      "name": "minValueEur",
      "in": "query",
      "required": false,
      "description": "Awarded value, else estimated value, at least this (EUR).",
      "schema": {
       "type": "number",
       "minimum": 0
      }
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "description": "Notices per page (anonymous: at most 10).",
      "schema": {
       "default": 25,
       "type": "integer",
       "minimum": 1,
       "maximum": 100
      }
     },
     {
      "name": "cursor",
      "in": "query",
      "required": false,
      "description": "`nextCursor` of the previous page.",
      "schema": {
       "type": "string",
       "maxLength": 200
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/TendersPage"
        }
       }
      }
     },
     "400": {
      "description": "Invalid input (error code names the parameter, e.g. invalid_country).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "401": {
      "description": "Unknown API key, or a key is required.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "403": {
      "description": "Key revoked or expired, or a plan limit.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Not found.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Rate limit or monthly quota reached (see Retry-After).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "security": [
     {},
     {
      "bearer": []
     },
     {
      "apiKey": []
     }
    ]
   }
  },
  "/v1/watchlists": {
   "post": {
    "operationId": "createWatchlist",
    "tags": [
     "Watchlists"
    ],
    "summary": "Track a list of companies (needs an API key)",
    "description": "Billed per tracked company per month above the plan allowance (GET /v1/plans).",
    "parameters": [],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/WatchlistCreate"
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Watchlist"
        }
       }
      }
     },
     "400": {
      "description": "Invalid input (error code names the parameter, e.g. invalid_country).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "401": {
      "description": "Unknown API key, or a key is required.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "403": {
      "description": "Key revoked or expired, or a plan limit.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Not found.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Rate limit or monthly quota reached (see Retry-After).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "security": [
     {
      "bearer": []
     },
     {
      "apiKey": []
     }
    ]
   },
   "get": {
    "operationId": "listWatchlists",
    "tags": [
     "Watchlists"
    ],
    "summary": "Your watchlists",
    "parameters": [],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Watchlists"
        }
       }
      }
     },
     "400": {
      "description": "Invalid input (error code names the parameter, e.g. invalid_country).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "401": {
      "description": "Unknown API key, or a key is required.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "403": {
      "description": "Key revoked or expired, or a plan limit.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Not found.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Rate limit or monthly quota reached (see Retry-After).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "security": [
     {
      "bearer": []
     },
     {
      "apiKey": []
     }
    ]
   }
  },
  "/v1/watchlists/{id}": {
   "get": {
    "operationId": "getWatchlist",
    "tags": [
     "Watchlists"
    ],
    "summary": "One watchlist with its domains",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "description": "Watchlist id from POST /v1/watchlists.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 9007199254740991
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Watchlist"
        }
       }
      }
     },
     "400": {
      "description": "Invalid input (error code names the parameter, e.g. invalid_country).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "401": {
      "description": "Unknown API key, or a key is required.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "403": {
      "description": "Key revoked or expired, or a plan limit.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Not found.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Rate limit or monthly quota reached (see Retry-After).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "security": [
     {
      "bearer": []
     },
     {
      "apiKey": []
     }
    ]
   },
   "delete": {
    "operationId": "deleteWatchlist",
    "tags": [
     "Watchlists"
    ],
    "summary": "Stop tracking a watchlist",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "description": "Watchlist id from POST /v1/watchlists.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 9007199254740991
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Deleted"
        }
       }
      }
     },
     "400": {
      "description": "Invalid input (error code names the parameter, e.g. invalid_country).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "401": {
      "description": "Unknown API key, or a key is required.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "403": {
      "description": "Key revoked or expired, or a plan limit.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Not found.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Rate limit or monthly quota reached (see Retry-After).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "security": [
     {
      "bearer": []
     },
     {
      "apiKey": []
     }
    ]
   }
  },
  "/v1/watchlists/{id}/changes": {
   "get": {
    "operationId": "getWatchlistChanges",
    "tags": [
     "Watchlists"
    ],
    "summary": "Company Pulse events and the latest hiring signals of the tracked companies",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "description": "Watchlist id from POST /v1/watchlists.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 9007199254740991
      }
     },
     {
      "name": "since",
      "in": "query",
      "required": false,
      "description": "Changes on or after this day; default 7 days ago, earliest 90 days ago.",
      "schema": {
       "type": "string",
       "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
      }
     },
     {
      "name": "types",
      "in": "query",
      "required": false,
      "description": "Event types, any of: hiring_up, hiring_down, new_country, new_function, ats_switch, pay_first_seen, review_velocity, rating_change, shop_app_installed, shop_app_removed, tech_added, tech_removed, tender_awarded.",
      "example": "hiring_up,new_country",
      "schema": {
       "type": "string",
       "maxLength": 400
      }
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "description": "Events, 1-5000.",
      "schema": {
       "default": 1000,
       "type": "integer",
       "minimum": 1,
       "maximum": 5000
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/WatchlistChanges"
        }
       }
      }
     },
     "400": {
      "description": "Invalid input (error code names the parameter, e.g. invalid_country).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "401": {
      "description": "Unknown API key, or a key is required.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "403": {
      "description": "Key revoked or expired, or a plan limit.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Not found.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Rate limit or monthly quota reached (see Retry-After).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "security": [
     {
      "bearer": []
     },
     {
      "apiKey": []
     }
    ]
   }
  },
  "/v1/plans": {
   "get": {
    "operationId": "listPlans",
    "tags": [
     "Account"
    ],
    "summary": "Plans, limits and prices",
    "parameters": [],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Plans"
        }
       }
      }
     },
     "400": {
      "description": "Invalid input (error code names the parameter, e.g. invalid_country).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Not found.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "security": []
   }
  },
  "/v1/me": {
   "get": {
    "operationId": "getMe",
    "tags": [
     "Account"
    ],
    "summary": "Your tier, plan, quota and usage",
    "description": "With a key: plan, calls used and left this month, when the quota resets, and the self-serve account (billing status). Free: not counted against the quota and answers at the quota too.",
    "parameters": [],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Me"
        }
       }
      }
     },
     "400": {
      "description": "Invalid input (error code names the parameter, e.g. invalid_country).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "401": {
      "description": "Unknown API key, or a key is required.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "403": {
      "description": "Key revoked or expired, or a plan limit.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Not found.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Rate limit or monthly quota reached (see Retry-After).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "security": [
     {},
     {
      "bearer": []
     },
     {
      "apiKey": []
     }
    ]
   }
  },
  "/v1/account/signup": {
   "post": {
    "operationId": "signup",
    "tags": [
     "Account"
    ],
    "summary": "Sign up: email a one-time link that shows a free API key",
    "description": "Double opt-in. Send a work email, your company domain and acceptTerms: true; we email a link that works once for 24 hours and shows the key (Free plan). Disposable inboxes are refused. The answer is the same for new and existing addresses; an existing account gets a new key and its old one stops working. Limited to 5 requests an hour per IP.",
    "parameters": [],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/SignupRequest"
       }
      }
     }
    },
    "responses": {
     "202": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/SignupAccepted"
        }
       }
      }
     },
     "400": {
      "description": "Invalid input (error code names the parameter, e.g. invalid_country).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Not found.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "security": []
   }
  },
  "/v1/account/verify": {
   "post": {
    "operationId": "verifySignup",
    "tags": [
     "Account"
    ],
    "summary": "Redeem the emailed link: returns the API key (once)",
    "description": "The site page behind the link calls this with the token from the URL fragment. The key is in this answer only: we keep its hash.",
    "parameters": [],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/VerifyRequest"
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/NewApiKey"
        }
       }
      }
     },
     "400": {
      "description": "Invalid input (error code names the parameter, e.g. invalid_country).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Not found.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "security": []
   }
  },
  "/v1/account/checkout": {
   "post": {
    "operationId": "createCheckout",
    "tags": [
     "Account"
    ],
    "summary": "Upgrade: a Stripe Checkout link for Starter, Pro or Business",
    "description": "Monthly or yearly (annualDiscount off, GET /v1/plans). Open the returned url in a browser; when the payment succeeds the plan of this key changes within a minute, same key. An account that already pays gets a billing-portal link (mode \"portal\") to change plan there. Not metered: works at the quota and with an expired trial key.",
    "parameters": [],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/CheckoutRequest"
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/CheckoutSession"
        }
       }
      }
     },
     "400": {
      "description": "Invalid input (error code names the parameter, e.g. invalid_country).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "401": {
      "description": "Unknown API key, or a key is required.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "403": {
      "description": "Key revoked or expired, or a plan limit.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Not found.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Rate limit or monthly quota reached (see Retry-After).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "security": [
     {
      "bearer": []
     },
     {
      "apiKey": []
     }
    ]
   }
  },
  "/v1/account/portal": {
   "get": {
    "operationId": "getBillingPortal",
    "tags": [
     "Account"
    ],
    "summary": "Billing portal link: invoices, card, plan change, cancel",
    "parameters": [],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/PortalSession"
        }
       }
      }
     },
     "400": {
      "description": "Invalid input (error code names the parameter, e.g. invalid_country).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "401": {
      "description": "Unknown API key, or a key is required.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "403": {
      "description": "Key revoked or expired, or a plan limit.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Not found.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Rate limit or monthly quota reached (see Retry-After).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "security": [
     {
      "bearer": []
     },
     {
      "apiKey": []
     }
    ]
   }
  },
  "/v1/coverage": {
   "post": {
    "operationId": "checkCoverage",
    "tags": [
     "Companies"
    ],
    "summary": "Which of up to 50 company domains have a known public job board",
    "x-arcadium-legacy": true,
    "parameters": [],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/CoverageRequest"
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/CoverageResponse"
        }
       }
      }
     },
     "400": {
      "description": "Invalid input (error code names the parameter, e.g. invalid_country).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "401": {
      "description": "Unknown API key, or a key is required.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "403": {
      "description": "Key revoked or expired, or a plan limit.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Not found.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Rate limit or monthly quota reached (see Retry-After).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "security": [
     {},
     {
      "bearer": []
     },
     {
      "apiKey": []
     }
    ]
   }
  },
  "/v1/company/{domain}": {
   "get": {
    "operationId": "getCompanyBoard",
    "tags": [
     "Companies"
    ],
    "summary": "Primary job board and open-jobs snapshot of a company (prefer /v1/companies/{domain})",
    "x-arcadium-legacy": true,
    "parameters": [
     {
      "name": "domain",
      "in": "path",
      "required": true,
      "description": "Company website domain or URL, e.g. stripe.com.",
      "schema": {
       "type": "string",
       "minLength": 4,
       "maxLength": 253
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/CoverageResult"
        }
       }
      }
     },
     "400": {
      "description": "Invalid input (error code names the parameter, e.g. invalid_country).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "401": {
      "description": "Unknown API key, or a key is required.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "403": {
      "description": "Key revoked or expired, or a plan limit.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Not found.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Rate limit or monthly quota reached (see Retry-After).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "security": [
     {},
     {
      "bearer": []
     },
     {
      "apiKey": []
     }
    ]
   }
  },
  "/v1/company/{domain}/signals": {
   "get": {
    "operationId": "getCompanySignals",
    "tags": [
     "Companies"
    ],
    "summary": "Latest daily hiring signals of a company",
    "x-arcadium-legacy": true,
    "parameters": [
     {
      "name": "domain",
      "in": "path",
      "required": true,
      "description": "Company website domain or URL, e.g. stripe.com.",
      "schema": {
       "type": "string",
       "minLength": 4,
       "maxLength": 253
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/CompanySignals"
        }
       }
      }
     },
     "400": {
      "description": "Invalid input (error code names the parameter, e.g. invalid_country).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "401": {
      "description": "Unknown API key, or a key is required.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "403": {
      "description": "Key revoked or expired, or a plan limit.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Not found.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Rate limit or monthly quota reached (see Retry-After).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "security": [
     {},
     {
      "bearer": []
     },
     {
      "apiKey": []
     }
    ]
   }
  },
  "/v1/events": {
   "get": {
    "operationId": "listHiringEvents",
    "tags": [
     "Companies"
    ],
    "summary": "Hiring events feed (market entry, ATS switch, surge, freeze, new department)",
    "x-arcadium-legacy": true,
    "parameters": [
     {
      "name": "type",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string",
       "enum": [
        "market_entry",
        "ats_switch",
        "hiring_surge",
        "hiring_freeze",
        "new_department"
       ]
      }
     },
     {
      "name": "since",
      "in": "query",
      "required": false,
      "description": "Events on or after this day.",
      "schema": {
       "type": "string",
       "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
      }
     },
     {
      "name": "country",
      "in": "query",
      "required": false,
      "description": "ISO alpha-2.",
      "schema": {
       "type": "string",
       "pattern": "^[A-Za-z]{2}$"
      }
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "description": "1-500, default 100.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 500
      }
     },
     {
      "name": "provisional",
      "in": "query",
      "required": false,
      "description": "false = hide events from under 28 days of history.",
      "schema": {
       "type": "string",
       "enum": [
        "false"
       ]
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/EventsResponse"
        }
       }
      }
     },
     "400": {
      "description": "Invalid input (error code names the parameter, e.g. invalid_country).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "401": {
      "description": "Unknown API key, or a key is required.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "403": {
      "description": "Key revoked or expired, or a plan limit.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Not found.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Rate limit or monthly quota reached (see Retry-After).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "security": [
     {},
     {
      "bearer": []
     },
     {
      "apiKey": []
     }
    ]
   }
  },
  "/v1/reviews/snapshot": {
   "get": {
    "operationId": "getReviewSnapshot",
    "tags": [
     "Reviews"
    ],
    "summary": "Rating trajectory of tracked review listings",
    "x-arcadium-legacy": true,
    "parameters": [
     {
      "name": "q",
      "in": "query",
      "required": true,
      "description": "Listing URL, id or name.",
      "schema": {
       "type": "string",
       "minLength": 2,
       "maxLength": 300
      }
     },
     {
      "name": "platform",
      "in": "query",
      "required": false,
      "description": "googlemaps, booking, tripadvisor, capterra, appstore, googleplay.",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "days",
      "in": "query",
      "required": false,
      "description": "Days of history.",
      "schema": {
       "type": "integer",
       "minimum": 7,
       "maximum": 365
      }
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "description": "Listings, 1-5.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 5
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/ReviewSnapshotResponse"
        }
       }
      }
     },
     "400": {
      "description": "Invalid input (error code names the parameter, e.g. invalid_country).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "401": {
      "description": "Unknown API key, or a key is required.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "403": {
      "description": "Key revoked or expired, or a plan limit.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Not found.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Rate limit or monthly quota reached (see Retry-After).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "security": [
     {},
     {
      "bearer": []
     },
     {
      "apiKey": []
     }
    ]
   }
  },
  "/v1/reviews/panel": {
   "get": {
    "operationId": "getReviewPanel",
    "tags": [
     "Reviews"
    ],
    "summary": "Daily review velocity panel by ticker or name (derived metrics only)",
    "x-arcadium-legacy": true,
    "parameters": [
     {
      "name": "ticker",
      "in": "query",
      "required": false,
      "description": "Comma list of up to 20 tickers, e.g. DUOL,SPOT.",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "q",
      "in": "query",
      "required": false,
      "description": "Subject or name.",
      "schema": {
       "type": "string",
       "minLength": 2,
       "maxLength": 100
      }
     },
     {
      "name": "platform",
      "in": "query",
      "required": false,
      "description": "Review platform.",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "since",
      "in": "query",
      "required": false,
      "description": "First day.",
      "schema": {
       "type": "string",
       "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
      }
     },
     {
      "name": "until",
      "in": "query",
      "required": false,
      "description": "Last day.",
      "schema": {
       "type": "string",
       "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
      }
     },
     {
      "name": "rollup",
      "in": "query",
      "required": false,
      "description": "One row per ticker and day.",
      "schema": {
       "type": "string",
       "enum": [
        "ticker"
       ]
      }
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "description": "Rows, 1-2000.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 2000
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/ReviewPanelResponse"
        }
       }
      }
     },
     "400": {
      "description": "Invalid input (error code names the parameter, e.g. invalid_country).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "401": {
      "description": "Unknown API key, or a key is required.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "403": {
      "description": "Key revoked or expired, or a plan limit.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Not found.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Rate limit or monthly quota reached (see Retry-After).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    },
    "security": [
     {},
     {
      "bearer": []
     },
     {
      "apiKey": []
     }
    ]
   }
  }
 },
 "components": {
  "schemas": {
   "Error": {
    "$id": "#/components/schemas/Error",
    "type": "object",
    "properties": {
     "error": {
      "type": "string",
      "description": "Stable machine-readable code, e.g. invalid_country, not_found, rate_limited."
     },
     "message": {
      "type": "string",
      "description": "Human-readable explanation."
     }
    },
    "required": [
     "error",
     "message"
    ],
    "additionalProperties": false
   },
   "Salary": {
    "$id": "#/components/schemas/Salary",
    "type": "object",
    "properties": {
     "min": {
      "type": [
       "number",
       "null"
      ]
     },
     "max": {
      "type": [
       "number",
       "null"
      ]
     },
     "currency": {
      "description": "ISO 4217.",
      "type": [
       "string",
       "null"
      ]
     },
     "period": {
      "description": "year, month, week, day or hour.",
      "type": [
       "string",
       "null"
      ]
     }
    },
    "required": [
     "min",
     "max",
     "currency",
     "period"
    ],
    "additionalProperties": false
   },
   "Job": {
    "$id": "#/components/schemas/Job",
    "type": "object",
    "properties": {
     "id": {
      "type": "string",
      "description": "Stable job id `<ats>___<native id>`."
     },
     "title": {
      "type": "string"
     },
     "company": {
      "description": "Employer display name.",
      "type": [
       "string",
       "null"
      ]
     },
     "companyDomain": {
      "description": "Employer website domain (null when not matched with confidence).",
      "type": [
       "string",
       "null"
      ]
     },
     "ats": {
      "type": "string",
      "description": "Source system the job was read from."
     },
     "countries": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "ISO 3166-1 alpha-2, primary first."
     },
     "locations": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "remote": {
      "description": "true = fully remote, false = on-site or hybrid, null = not stated.",
      "type": [
       "boolean",
       "null"
      ]
     },
     "employmentType": {
      "type": [
       "string",
       "null"
      ]
     },
     "seniority": {
      "type": [
       "string",
       "null"
      ]
     },
     "departments": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "salary": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Salary"
       },
       {
        "type": "null"
       }
      ],
      "description": "Posted pay range; null when the posting states none."
     },
     "iscoGroup": {
      "description": "ISCO-08 sub-major group from the title; null when unmapped.",
      "type": [
       "string",
       "null"
      ]
     },
     "iscoLabel": {
      "type": [
       "string",
       "null"
      ]
     },
     "postedAt": {
      "description": "Posting date stated by the employer.",
      "type": [
       "string",
       "null"
      ]
     },
     "firstSeenAt": {
      "type": "string",
      "description": "When we first saw the job; never moves."
     },
     "closedAt": {
      "description": "When the job left the board; null while open.",
      "type": [
       "string",
       "null"
      ]
     },
     "url": {
      "type": "string",
      "description": "Public job posting URL."
     }
    },
    "required": [
     "id",
     "title",
     "company",
     "companyDomain",
     "ats",
     "countries",
     "locations",
     "remote",
     "employmentType",
     "seniority",
     "departments",
     "salary",
     "iscoGroup",
     "iscoLabel",
     "postedAt",
     "firstSeenAt",
     "closedAt",
     "url"
    ],
    "additionalProperties": false
   },
   "JobDetail": {
    "$id": "#/components/schemas/JobDetail",
    "type": "object",
    "properties": {
     "id": {
      "type": "string",
      "description": "Stable job id `<ats>___<native id>`."
     },
     "title": {
      "type": "string"
     },
     "company": {
      "description": "Employer display name.",
      "type": [
       "string",
       "null"
      ]
     },
     "companyDomain": {
      "description": "Employer website domain (null when not matched with confidence).",
      "type": [
       "string",
       "null"
      ]
     },
     "ats": {
      "type": "string",
      "description": "Source system the job was read from."
     },
     "countries": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "ISO 3166-1 alpha-2, primary first."
     },
     "locations": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "remote": {
      "description": "true = fully remote, false = on-site or hybrid, null = not stated.",
      "type": [
       "boolean",
       "null"
      ]
     },
     "employmentType": {
      "type": [
       "string",
       "null"
      ]
     },
     "seniority": {
      "type": [
       "string",
       "null"
      ]
     },
     "departments": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "salary": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Salary"
       },
       {
        "type": "null"
       }
      ],
      "description": "Posted pay range; null when the posting states none."
     },
     "iscoGroup": {
      "description": "ISCO-08 sub-major group from the title; null when unmapped.",
      "type": [
       "string",
       "null"
      ]
     },
     "iscoLabel": {
      "type": [
       "string",
       "null"
      ]
     },
     "postedAt": {
      "description": "Posting date stated by the employer.",
      "type": [
       "string",
       "null"
      ]
     },
     "firstSeenAt": {
      "type": "string",
      "description": "When we first saw the job; never moves."
     },
     "closedAt": {
      "description": "When the job left the board; null while open.",
      "type": [
       "string",
       "null"
      ]
     },
     "url": {
      "type": "string",
      "description": "Public job posting URL."
     },
     "status": {
      "type": "string",
      "enum": [
       "open",
       "closed"
      ]
     },
     "description": {
      "description": "Plain text; emails, phone numbers and personal profile links removed.",
      "type": [
       "string",
       "null"
      ]
     }
    },
    "required": [
     "id",
     "title",
     "company",
     "companyDomain",
     "ats",
     "countries",
     "locations",
     "remote",
     "employmentType",
     "seniority",
     "departments",
     "salary",
     "iscoGroup",
     "iscoLabel",
     "postedAt",
     "firstSeenAt",
     "closedAt",
     "url",
     "status",
     "description"
    ],
    "additionalProperties": false
   },
   "JobsPage": {
    "$id": "#/components/schemas/JobsPage",
    "type": "object",
    "properties": {
     "count": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
     },
     "nextCursor": {
      "description": "Pass as `cursor` for the next page; null = last page.",
      "type": [
       "string",
       "null"
      ]
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Job"
      }
     }
    },
    "required": [
     "count",
     "nextCursor",
     "data"
    ],
    "additionalProperties": false
   },
   "Shop": {
    "$id": "#/components/schemas/Shop",
    "type": "object",
    "properties": {
     "domain": {
      "type": "string"
     },
     "myshopifyDomain": {
      "type": "string"
     },
     "name": {
      "description": "Store name (null when withheld because it looks like a personal name).",
      "type": [
       "string",
       "null"
      ]
     },
     "description": {
      "type": [
       "string",
       "null"
      ]
     },
     "country": {
      "type": [
       "string",
       "null"
      ]
     },
     "currency": {
      "type": [
       "string",
       "null"
      ]
     },
     "shipsToCount": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
     },
     "productCount": {
      "anyOf": [
       {
        "type": "integer",
        "minimum": -9007199254740991,
        "maximum": 9007199254740991
       },
       {
        "type": "null"
       }
      ]
     },
     "productCountCapped": {
      "type": "boolean"
     },
     "collectionCount": {
      "anyOf": [
       {
        "type": "integer",
        "minimum": -9007199254740991,
        "maximum": 9007199254740991
       },
       {
        "type": "null"
       }
      ]
     },
     "status": {
      "type": "string"
     },
     "theme": {
      "type": [
       "string",
       "null"
      ]
     },
     "headless": {
      "type": [
       "boolean",
       "null"
      ]
     },
     "shopPayInstallments": {
      "type": [
       "boolean",
       "null"
      ]
     },
     "ucpVersion": {
      "description": "Universal Commerce Protocol version the store advertises.",
      "type": [
       "string",
       "null"
      ]
     },
     "latestProductPublishedAt": {
      "type": [
       "string",
       "null"
      ]
     },
     "firstSeenAt": {
      "type": "string"
     },
     "checkedAt": {
      "type": "string"
     },
     "activeApps": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Apps detected as installed now (see /v1/shops/{domain}/apps)."
     }
    },
    "required": [
     "domain",
     "myshopifyDomain",
     "name",
     "description",
     "country",
     "currency",
     "shipsToCount",
     "productCount",
     "productCountCapped",
     "collectionCount",
     "status",
     "theme",
     "headless",
     "shopPayInstallments",
     "ucpVersion",
     "latestProductPublishedAt",
     "firstSeenAt",
     "checkedAt",
     "activeApps"
    ],
    "additionalProperties": false
   },
   "CompanyEvent": {
    "$id": "#/components/schemas/CompanyEvent",
    "type": "object",
    "properties": {
     "type": {
      "type": "string",
      "description": "market_entry, ats_switch, hiring_surge, hiring_freeze or new_department."
     },
     "day": {
      "type": "string"
     },
     "country": {
      "type": [
       "string",
       "null"
      ]
     },
     "provisional": {
      "type": "boolean"
     },
     "details": {
      "type": "object",
      "propertyNames": {
       "type": "string"
      },
      "additionalProperties": {}
     }
    },
    "required": [
     "type",
     "day",
     "country",
     "provisional",
     "details"
    ],
    "additionalProperties": false
   },
   "CompanyProfile": {
    "$id": "#/components/schemas/CompanyProfile",
    "type": "object",
    "properties": {
     "domain": {
      "type": "string"
     },
     "name": {
      "type": [
       "string",
       "null"
      ]
     },
     "hiring": {
      "anyOf": [
       {
        "type": "object",
        "properties": {
         "ats": {
          "type": [
           "string",
           "null"
          ]
         },
         "boardUrl": {
          "type": [
           "string",
           "null"
          ]
         },
         "openJobs": {
          "anyOf": [
           {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991
           },
           {
            "type": "null"
           }
          ]
         },
         "jobsPostedLast30Days": {
          "anyOf": [
           {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991
           },
           {
            "type": "null"
           }
          ]
         },
         "remoteShare": {
          "type": [
           "number",
           "null"
          ]
         },
         "payShare": {
          "type": [
           "number",
           "null"
          ]
         },
         "topDepartments": {
          "type": "array",
          "items": {
           "type": "object",
           "properties": {
            "name": {
             "type": "string"
            },
            "share": {
             "type": "number"
            }
           },
           "required": [
            "name",
            "share"
           ],
           "additionalProperties": false
          }
         },
         "topCountries": {
          "type": "array",
          "items": {
           "type": "object",
           "properties": {
            "name": {
             "type": "string"
            },
            "share": {
             "type": "number"
            }
           },
           "required": [
            "name",
            "share"
           ],
           "additionalProperties": false
          }
         },
         "matchConfidence": {
          "type": [
           "string",
           "null"
          ]
         },
         "lastSeen": {
          "type": [
           "string",
           "null"
          ]
         }
        },
        "required": [
         "ats",
         "boardUrl",
         "openJobs",
         "jobsPostedLast30Days",
         "remoteShare",
         "payShare",
         "topDepartments",
         "topCountries",
         "matchConfidence",
         "lastSeen"
        ],
        "additionalProperties": false
       },
       {
        "type": "null"
       }
      ],
      "description": "Primary public job board and a snapshot of its open jobs."
     },
     "boards": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "ats": {
         "type": "string"
        },
        "token": {
         "type": "string"
        },
        "boardUrl": {
         "type": [
          "string",
          "null"
         ]
        },
        "openJobs": {
         "type": "integer",
         "minimum": -9007199254740991,
         "maximum": 9007199254740991
        },
        "lastCrawlAt": {
         "type": [
          "string",
          "null"
         ]
        }
       },
       "required": [
        "ats",
        "token",
        "boardUrl",
        "openJobs",
        "lastCrawlAt"
       ],
       "additionalProperties": false
      },
      "description": "Every job board we track for the company."
     },
     "signals": {
      "anyOf": [
       {
        "type": "object",
        "properties": {
         "asOf": {
          "type": "string"
         },
         "provisional": {
          "type": "boolean",
          "description": "true = under 28 days of history; change values are early estimates."
         },
         "historyDays": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
         },
         "openJobs": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
         },
         "netChange7d": {
          "type": [
           "number",
           "null"
          ]
         },
         "netChange30d": {
          "type": [
           "number",
           "null"
          ]
         },
         "change7dPct": {
          "type": [
           "number",
           "null"
          ]
         },
         "openings7d": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
         },
         "openings30d": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
         },
         "closures7d": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
         },
         "closures30d": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
         },
         "countries": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
         },
         "cities": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
         },
         "newCountries30d": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
         },
         "newCities30d": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
         },
         "remoteShare": {
          "type": [
           "number",
           "null"
          ]
         },
         "payShare": {
          "type": [
           "number",
           "null"
          ]
         },
         "ghostShare": {
          "type": [
           "number",
           "null"
          ]
         },
         "departmentMix": {
          "type": "array",
          "items": {
           "type": "object",
           "properties": {
            "name": {
             "type": "string"
            },
            "share": {
             "type": "number"
            }
           },
           "required": [
            "name",
            "share"
           ],
           "additionalProperties": false
          }
         },
         "topCountries": {
          "type": "array",
          "items": {
           "type": "object",
           "properties": {
            "name": {
             "type": "string"
            },
            "share": {
             "type": "number"
            }
           },
           "required": [
            "name",
            "share"
           ],
           "additionalProperties": false
          }
         }
        },
        "required": [
         "asOf",
         "provisional",
         "historyDays",
         "openJobs",
         "netChange7d",
         "netChange30d",
         "change7dPct",
         "openings7d",
         "openings30d",
         "closures7d",
         "closures30d",
         "countries",
         "cities",
         "newCountries30d",
         "newCities30d",
         "remoteShare",
         "payShare",
         "ghostShare",
         "departmentMix",
         "topCountries"
        ],
        "additionalProperties": false
       },
       {
        "type": "null"
       }
      ],
      "description": "Daily hiring signals (null until the company has a signals row)."
     },
     "tech": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "tool": {
         "type": "string"
        },
        "category": {
         "type": "string"
        },
        "jobs": {
         "type": "integer",
         "minimum": -9007199254740991,
         "maximum": 9007199254740991
        },
        "firstSeen": {
         "type": "string"
        }
       },
       "required": [
        "tool",
        "category",
        "jobs",
        "firstSeen"
       ],
       "additionalProperties": false
      },
      "description": "Tools named in the company’s job ads, most mentioned first."
     },
     "events": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/CompanyEvent"
      },
      "description": "Last 20 detected hiring events, newest first."
     },
     "shop": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Shop"
       },
       {
        "type": "null"
       }
      ],
      "description": "Shopify store on this domain, if any."
     }
    },
    "required": [
     "domain",
     "name",
     "hiring",
     "boards",
     "signals",
     "tech",
     "events",
     "shop"
    ],
    "additionalProperties": false
   },
   "ShopApp": {
    "$id": "#/components/schemas/ShopApp",
    "type": "object",
    "properties": {
     "app": {
      "type": "string",
      "description": "App slug from our fingerprint dictionary, e.g. klaviyo."
     },
     "confidence": {
      "type": "string",
      "enum": [
       "high",
       "medium"
      ]
     },
     "installed": {
      "type": "boolean"
     },
     "firstSeen": {
      "type": "string"
     },
     "lastSeen": {
      "type": "string"
     },
     "removedOn": {
      "type": [
       "string",
       "null"
      ]
     }
    },
    "required": [
     "app",
     "confidence",
     "installed",
     "firstSeen",
     "lastSeen",
     "removedOn"
    ],
    "additionalProperties": false
   },
   "ShopApps": {
    "$id": "#/components/schemas/ShopApps",
    "type": "object",
    "properties": {
     "domain": {
      "type": "string"
     },
     "myshopifyDomain": {
      "type": "string"
     },
     "count": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/ShopApp"
      }
     },
     "events": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "app": {
         "type": "string"
        },
        "event": {
         "type": "string",
         "enum": [
          "install",
          "uninstall"
         ]
        },
        "day": {
         "type": "string"
        }
       },
       "required": [
        "app",
        "event",
        "day"
       ],
       "additionalProperties": false
      },
      "description": "Installs and uninstalls detected between daily scans, newest first (last 50)."
     }
    },
    "required": [
     "domain",
     "myshopifyDomain",
     "count",
     "data",
     "events"
    ],
    "additionalProperties": false
   },
   "HistoryBoardRow": {
    "$id": "#/components/schemas/HistoryBoardRow",
    "type": "object",
    "properties": {
     "boardKey": {
      "type": "string",
      "description": "`<ats>:<token>` or `workday:<host>/<site>`."
     },
     "ats": {
      "type": "string"
     },
     "crawlId": {
      "type": "string",
      "description": "Common Crawl crawl id, e.g. CC-MAIN-2025-38."
     },
     "month": {
      "type": "string",
      "description": "Nominal month of the crawl (first day)."
     },
     "observedAt": {
      "description": "Capture time of the archived record (as-of).",
      "type": [
       "string",
       "null"
      ]
     },
     "availableAt": {
      "description": "Publication date of the crawl: first day the value was knowable.",
      "type": [
       "string",
       "null"
      ]
     },
     "openJobs": {
      "anyOf": [
       {
        "type": "integer",
        "minimum": -9007199254740991,
        "maximum": 9007199254740991
       },
       {
        "type": "null"
       }
      ],
      "description": "Board total at capture time; null when not recoverable."
     },
     "openJobsMethod": {
      "type": [
       "string",
       "null"
      ]
     },
     "openJobsComplete": {
      "description": "false = lower bound (one page, filtered view, careers links).",
      "type": [
       "boolean",
       "null"
      ]
     },
     "lifecycleOpenLb": {
      "anyOf": [
       {
        "type": "integer",
        "minimum": -9007199254740991,
        "maximum": 9007199254740991
       },
       {
        "type": "null"
       }
      ],
      "description": "Job ids open between first and last capture (revised as later crawls arrive; a trend index)."
     },
     "newJobIds": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Job ids first captured in this crawl."
     },
     "coverageFlag": {
      "type": "string",
      "enum": [
       "list",
       "redirect",
       "job_pages_only",
       "none"
      ],
      "description": "What the archive held for the board in that crawl: its job list, only a redirect, only job pages, nothing."
     }
    },
    "required": [
     "boardKey",
     "ats",
     "crawlId",
     "month",
     "observedAt",
     "availableAt",
     "openJobs",
     "openJobsMethod",
     "openJobsComplete",
     "lifecycleOpenLb",
     "newJobIds",
     "coverageFlag"
    ],
    "additionalProperties": false
   },
   "HistoryMonth": {
    "$id": "#/components/schemas/HistoryMonth",
    "type": "object",
    "properties": {
     "month": {
      "type": "string"
     },
     "crawlId": {
      "type": "string"
     },
     "availableAt": {
      "type": [
       "string",
       "null"
      ]
     },
     "openJobs": {
      "anyOf": [
       {
        "type": "integer",
        "minimum": -9007199254740991,
        "maximum": 9007199254740991
       },
       {
        "type": "null"
       }
      ],
      "description": "Sum of the board totals reported in that crawl."
     },
     "boardsReporting": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
     },
     "boardsWithData": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Boards with any capture in that crawl."
     },
     "complete": {
      "type": "boolean",
      "description": "Every board with data reported a complete total."
     },
     "lifecycleOpenLb": {
      "anyOf": [
       {
        "type": "integer",
        "minimum": -9007199254740991,
        "maximum": 9007199254740991
       },
       {
        "type": "null"
       }
      ]
     },
     "newJobIds": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
     }
    },
    "required": [
     "month",
     "crawlId",
     "availableAt",
     "openJobs",
     "boardsReporting",
     "boardsWithData",
     "complete",
     "lifecycleOpenLb",
     "newJobIds"
    ],
    "additionalProperties": false
   },
   "CompanyHistory": {
    "$id": "#/components/schemas/CompanyHistory",
    "type": "object",
    "properties": {
     "domain": {
      "type": "string"
     },
     "source": {
      "type": "string",
      "const": "commoncrawl"
     },
     "note": {
      "type": "string"
     },
     "tickers": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "ticker": {
         "type": "string"
        },
        "exchange": {
         "type": [
          "string",
          "null"
         ]
        },
        "figi": {
         "type": [
          "string",
          "null"
         ]
        }
       },
       "required": [
        "ticker",
        "exchange",
        "figi"
       ],
       "additionalProperties": false
      }
     },
     "boards": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "boardKey": {
         "type": "string"
        },
        "ats": {
         "type": "string"
        },
        "token": {
         "type": "string"
        },
        "liveNow": {
         "type": "boolean"
        },
        "tickerMethod": {
         "type": [
          "string",
          "null"
         ]
        }
       },
       "required": [
        "boardKey",
        "ats",
        "token",
        "liveNow",
        "tickerMethod"
       ],
       "additionalProperties": false
      }
     },
     "months": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/HistoryMonth"
      },
      "description": "One row per crawl, oldest first; gaps are left as gaps."
     },
     "count": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/HistoryBoardRow"
      }
     }
    },
    "required": [
     "domain",
     "source",
     "note",
     "tickers",
     "boards",
     "months",
     "count",
     "data"
    ],
    "additionalProperties": false
   },
   "PayBand": {
    "$id": "#/components/schemas/PayBand",
    "type": "object",
    "properties": {
     "week": {
      "type": "string"
     },
     "asOf": {
      "type": "string"
     },
     "country": {
      "type": "string"
     },
     "iscoGroup": {
      "type": "string"
     },
     "iscoLabel": {
      "type": "string"
     },
     "n": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Open postings with pay in the cell."
     },
     "nEmployers": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
     },
     "p25Eur": {
      "type": "number"
     },
     "medianEur": {
      "type": "number"
     },
     "p75Eur": {
      "type": "number"
     },
     "localCurrency": {
      "type": "string"
     },
     "medianLocal": {
      "type": "number"
     },
     "hourlyShare": {
      "type": "number"
     }
    },
    "required": [
     "week",
     "asOf",
     "country",
     "iscoGroup",
     "iscoLabel",
     "n",
     "nEmployers",
     "p25Eur",
     "medianEur",
     "p75Eur",
     "localCurrency",
     "medianLocal",
     "hourlyShare"
    ],
    "additionalProperties": false
   },
   "PayBands": {
    "$id": "#/components/schemas/PayBands",
    "type": "object",
    "properties": {
     "count": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
     },
     "week": {
      "type": [
       "string",
       "null"
      ]
     },
     "minCellPostings": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Cells under this many postings are suppressed."
     },
     "minCellEmployers": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Cells under this many employers are suppressed."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/PayBand"
      }
     }
    },
    "required": [
     "count",
     "week",
     "minCellPostings",
     "minCellEmployers",
     "data"
    ],
    "additionalProperties": false
   },
   "PayTransparencyRow": {
    "$id": "#/components/schemas/PayTransparencyRow",
    "type": "object",
    "properties": {
     "day": {
      "type": "string"
     },
     "country": {
      "type": "string"
     },
     "countryName": {
      "type": [
       "string",
       "null"
      ]
     },
     "sizeBand": {
      "type": "string"
     },
     "openJobs": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
     },
     "jobsWithPay": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
     },
     "payShare": {
      "type": "number"
     },
     "employers": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
     },
     "employersWithPay": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
     },
     "employerPayShare": {
      "type": "number"
     },
     "directiveStatus": {
      "description": "EU Pay Transparency Directive transposition status.",
      "type": [
       "string",
       "null"
      ]
     },
     "directiveInForce": {
      "type": [
       "string",
       "null"
      ]
     },
     "panelPayShare": {
      "description": "Pay share over a fixed panel of employers (trend-safe).",
      "type": [
       "number",
       "null"
      ]
     }
    },
    "required": [
     "day",
     "country",
     "countryName",
     "sizeBand",
     "openJobs",
     "jobsWithPay",
     "payShare",
     "employers",
     "employersWithPay",
     "employerPayShare",
     "directiveStatus",
     "directiveInForce",
     "panelPayShare"
    ],
    "additionalProperties": false
   },
   "PayTransparency": {
    "$id": "#/components/schemas/PayTransparency",
    "type": "object",
    "properties": {
     "count": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/PayTransparencyRow"
      }
     }
    },
    "required": [
     "count",
     "data"
    ],
    "additionalProperties": false
   },
   "RateCurveCities": {
    "$id": "#/components/schemas/RateCurveCities",
    "type": "object",
    "properties": {
     "count": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
     },
     "data": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "city": {
         "type": "string"
        },
        "country": {
         "type": "string"
        },
        "currency": {
         "type": "string"
        },
        "latestSnapshot": {
         "type": "string"
        },
        "snapshots": {
         "type": "integer",
         "minimum": -9007199254740991,
         "maximum": 9007199254740991
        },
        "nights": {
         "type": "integer",
         "minimum": -9007199254740991,
         "maximum": 9007199254740991
        }
       },
       "required": [
        "city",
        "country",
        "currency",
        "latestSnapshot",
        "snapshots",
        "nights"
       ],
       "additionalProperties": false
      }
     }
    },
    "required": [
     "count",
     "data"
    ],
    "additionalProperties": false
   },
   "RateCurveNight": {
    "$id": "#/components/schemas/RateCurveNight",
    "type": "object",
    "properties": {
     "checkIn": {
      "type": "string"
     },
     "daysAhead": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
     },
     "weekday": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "0 = Sunday."
     },
     "rate": {
      "description": "Headline rate of the night (see basis).",
      "type": [
       "number",
       "null"
      ]
     },
     "basis": {
      "description": "Which median `rate` is (panel or page).",
      "type": [
       "string",
       "null"
      ]
     },
     "medianPanel": {
      "type": [
       "number",
       "null"
      ]
     },
     "medianPage": {
      "type": [
       "number",
       "null"
      ]
     },
     "median3star": {
      "type": [
       "number",
       "null"
      ]
     },
     "median4star": {
      "type": [
       "number",
       "null"
      ]
     },
     "median5star": {
      "type": [
       "number",
       "null"
      ]
     },
     "cityMedian": {
      "type": [
       "number",
       "null"
      ]
     },
     "demandIndex": {
      "description": "100 = the city median night.",
      "type": [
       "number",
       "null"
      ]
     },
     "weekdayIndex": {
      "type": [
       "number",
       "null"
      ]
     },
     "localIndex": {
      "description": "vs the nights within ±14 days (season-adjusted).",
      "type": [
       "number",
       "null"
      ]
     },
     "demandFlag": {
      "description": "spike, elevated, normal or soft.",
      "type": [
       "string",
       "null"
      ]
     },
     "pickup1dPct": {
      "type": [
       "number",
       "null"
      ]
     },
     "pickup7dPct": {
      "type": [
       "number",
       "null"
      ]
     },
     "pickupFlag": {
      "description": "rising, falling or flat.",
      "type": [
       "string",
       "null"
      ]
     },
     "panelSize": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
     },
     "panelPriced": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
     }
    },
    "required": [
     "checkIn",
     "daysAhead",
     "weekday",
     "rate",
     "basis",
     "medianPanel",
     "medianPage",
     "median3star",
     "median4star",
     "median5star",
     "cityMedian",
     "demandIndex",
     "weekdayIndex",
     "localIndex",
     "demandFlag",
     "pickup1dPct",
     "pickup7dPct",
     "pickupFlag",
     "panelSize",
     "panelPriced"
    ],
    "additionalProperties": false
   },
   "RateCurve": {
    "$id": "#/components/schemas/RateCurve",
    "type": "object",
    "properties": {
     "city": {
      "type": "string"
     },
     "country": {
      "type": "string"
     },
     "currency": {
      "type": "string"
     },
     "snapshotOn": {
      "type": "string"
     },
     "count": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/RateCurveNight"
      }
     }
    },
    "required": [
     "city",
     "country",
     "currency",
     "snapshotOn",
     "count",
     "data"
    ],
    "additionalProperties": false
   },
   "Plan": {
    "$id": "#/components/schemas/Plan",
    "type": "object",
    "properties": {
     "id": {
      "type": "string"
     },
     "label": {
      "type": "string"
     },
     "priceEurPerMonth": {
      "type": [
       "number",
       "null"
      ]
     },
     "priceEurPerYear": {
      "description": "Annual price (annualDiscount off 12 months); null = monthly or not sold.",
      "type": [
       "number",
       "null"
      ]
     },
     "selfServe": {
      "type": "boolean",
      "description": "Bought online: POST /v1/account/signup, then POST /v1/account/checkout."
     },
     "overageEligible": {
      "type": "boolean",
      "description": "May run past the quota when overage.mode is \"soft\"."
     },
     "requestsPerMinute": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
     },
     "requestsPerDay": {
      "anyOf": [
       {
        "type": "integer",
        "minimum": -9007199254740991,
        "maximum": 9007199254740991
       },
       {
        "type": "null"
       }
      ]
     },
     "monthlyQuota": {
      "anyOf": [
       {
        "type": "integer",
        "minimum": -9007199254740991,
        "maximum": 9007199254740991
       },
       {
        "type": "null"
       }
      ]
     },
     "maxPageSize": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
     },
     "trialDays": {
      "anyOf": [
       {
        "type": "integer",
        "minimum": -9007199254740991,
        "maximum": 9007199254740991
       },
       {
        "type": "null"
       }
      ]
     },
     "trackedCompaniesIncluded": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Watchlist companies included in the plan."
     }
    },
    "required": [
     "id",
     "label",
     "priceEurPerMonth",
     "priceEurPerYear",
     "selfServe",
     "overageEligible",
     "requestsPerMinute",
     "requestsPerDay",
     "monthlyQuota",
     "maxPageSize",
     "trialDays",
     "trackedCompaniesIncluded"
    ],
    "additionalProperties": false
   },
   "OveragePolicy": {
    "$id": "#/components/schemas/OveragePolicy",
    "type": "object",
    "properties": {
     "mode": {
      "type": "string",
      "enum": [
       "hard_stop",
       "soft"
      ],
      "description": "hard_stop: 429 quota_exceeded at the quota. soft: paid plans continue up to the cap."
     },
     "eurPer1000Calls": {
      "type": "number",
      "description": "Price of overage calls (soft mode)."
     },
     "maxShareOfQuota": {
      "type": "number",
      "description": "Overage cap as a share of the quota (1 = up to twice the quota)."
     }
    },
    "required": [
     "mode",
     "eurPer1000Calls",
     "maxShareOfQuota"
    ],
    "additionalProperties": false
   },
   "Plans": {
    "$id": "#/components/schemas/Plans",
    "type": "object",
    "properties": {
     "count": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
     },
     "currency": {
      "type": "string",
      "const": "EUR"
     },
     "watchlist": {
      "type": "object",
      "properties": {
       "eurPerTrackedCompanyMonth": {
        "type": "number",
        "description": "Price of each tracked company above the plan allowance."
       }
      },
      "required": [
       "eurPerTrackedCompanyMonth"
      ],
      "additionalProperties": false
     },
     "annualDiscount": {
      "type": "number",
      "description": "Share off the monthly price when billed yearly, e.g. 0.15."
     },
     "overage": {
      "$ref": "#/components/schemas/OveragePolicy"
     },
     "signup": {
      "type": "string",
      "description": "Route that issues a free key: POST it with email and companyDomain."
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Plan"
      }
     }
    },
    "required": [
     "count",
     "currency",
     "watchlist",
     "annualDiscount",
     "overage",
     "signup",
     "data"
    ],
    "additionalProperties": false
   },
   "AccountInfo": {
    "$id": "#/components/schemas/AccountInfo",
    "type": "object",
    "properties": {
     "companyDomain": {
      "type": "string"
     },
     "emailVerified": {
      "type": "boolean"
     },
     "billingInterval": {
      "anyOf": [
       {
        "type": "string",
        "enum": [
         "month",
         "year"
        ]
       },
       {
        "type": "null"
       }
      ]
     },
     "subscriptionStatus": {
      "description": "Stripe subscription status (active, past_due, canceled, ...); null = never subscribed.",
      "type": [
       "string",
       "null"
      ]
     },
     "currentPeriodEnd": {
      "description": "End of the paid period (ISO time).",
      "type": [
       "string",
       "null"
      ]
     },
     "cancelAtPeriodEnd": {
      "type": "boolean"
     },
     "paymentFailed": {
      "type": "boolean",
      "description": "The last invoice failed; update the card via GET /v1/account/portal."
     }
    },
    "required": [
     "companyDomain",
     "emailVerified",
     "billingInterval",
     "subscriptionStatus",
     "currentPeriodEnd",
     "cancelAtPeriodEnd",
     "paymentFailed"
    ],
    "additionalProperties": false
   },
   "Me": {
    "$id": "#/components/schemas/Me",
    "type": "object",
    "properties": {
     "tier": {
      "type": "string",
      "enum": [
       "anonymous",
       "key",
       "service"
      ]
     },
     "plan": {
      "type": "string"
     },
     "keyName": {
      "type": [
       "string",
       "null"
      ]
     },
     "monthlyQuota": {
      "anyOf": [
       {
        "type": "integer",
        "minimum": -9007199254740991,
        "maximum": 9007199254740991
       },
       {
        "type": "null"
       }
      ]
     },
     "usedThisMonth": {
      "anyOf": [
       {
        "type": "integer",
        "minimum": -9007199254740991,
        "maximum": 9007199254740991
       },
       {
        "type": "null"
       }
      ]
     },
     "trackedCompanies": {
      "anyOf": [
       {
        "type": "integer",
        "minimum": -9007199254740991,
        "maximum": 9007199254740991
       },
       {
        "type": "null"
       }
      ]
     },
     "trackedCompaniesIncluded": {
      "anyOf": [
       {
        "type": "integer",
        "minimum": -9007199254740991,
        "maximum": 9007199254740991
       },
       {
        "type": "null"
       }
      ]
     },
     "expiresAt": {
      "type": [
       "string",
       "null"
      ]
     },
     "remainingThisMonth": {
      "anyOf": [
       {
        "type": "integer",
        "minimum": -9007199254740991,
        "maximum": 9007199254740991
       },
       {
        "type": "null"
       }
      ],
      "description": "Calls left before the quota; null = no quota."
     },
     "overageThisMonth": {
      "anyOf": [
       {
        "type": "integer",
        "minimum": -9007199254740991,
        "maximum": 9007199254740991
       },
       {
        "type": "null"
       }
      ],
      "description": "Calls past the quota this month (soft overage only)."
     },
     "quotaResetsAt": {
      "description": "Start of the next quota month (ISO time, UTC).",
      "type": [
       "string",
       "null"
      ]
     },
     "requestsPerMinute": {
      "anyOf": [
       {
        "type": "integer",
        "minimum": -9007199254740991,
        "maximum": 9007199254740991
       },
       {
        "type": "null"
       }
      ]
     },
     "account": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/AccountInfo"
       },
       {
        "type": "null"
       }
      ],
      "description": "Self-serve account of the key; null for anonymous or hand-issued keys."
     }
    },
    "required": [
     "tier",
     "plan",
     "keyName",
     "monthlyQuota",
     "usedThisMonth",
     "trackedCompanies",
     "trackedCompaniesIncluded",
     "expiresAt",
     "remainingThisMonth",
     "overageThisMonth",
     "quotaResetsAt",
     "requestsPerMinute",
     "account"
    ],
    "additionalProperties": false
   },
   "SignupRequest": {
    "$id": "#/components/schemas/SignupRequest",
    "type": "object",
    "properties": {
     "email": {
      "type": "string",
      "maxLength": 254,
      "description": "Your work email. The sign-in link goes here; we store it for billing only."
     },
     "companyDomain": {
      "type": "string",
      "maxLength": 300,
      "description": "Your company website domain, e.g. acme.com."
     },
     "acceptTerms": {
      "type": "boolean",
      "const": true,
      "description": "You accept the terms at https://arcadiumdata.io/legal/#terms."
     }
    },
    "required": [
     "email",
     "companyDomain",
     "acceptTerms"
    ],
    "additionalProperties": false
   },
   "SignupAccepted": {
    "$id": "#/components/schemas/SignupAccepted",
    "type": "object",
    "properties": {
     "status": {
      "type": "string",
      "const": "check_email"
     },
     "message": {
      "type": "string"
     },
     "expiresInHours": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
     }
    },
    "required": [
     "status",
     "message",
     "expiresInHours"
    ],
    "additionalProperties": false
   },
   "VerifyRequest": {
    "$id": "#/components/schemas/VerifyRequest",
    "type": "object",
    "properties": {
     "token": {
      "type": "string",
      "maxLength": 200,
      "description": "The token from the emailed link (after #token=)."
     }
    },
    "required": [
     "token"
    ],
    "additionalProperties": false
   },
   "NewApiKey": {
    "$id": "#/components/schemas/NewApiKey",
    "type": "object",
    "properties": {
     "apiKey": {
      "type": "string",
      "description": "The key. Shown once: we store only its hash."
     },
     "keyPrefix": {
      "type": "string"
     },
     "plan": {
      "type": "string"
     },
     "monthlyQuota": {
      "anyOf": [
       {
        "type": "integer",
        "minimum": -9007199254740991,
        "maximum": 9007199254740991
       },
       {
        "type": "null"
       }
      ]
     },
     "companyDomain": {
      "type": "string"
     },
     "accountCreated": {
      "type": "boolean",
      "description": "false = an existing account got a new key; its old keys were revoked."
     },
     "replacedKeys": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
     },
     "shownOnce": {
      "type": "boolean",
      "const": true
     }
    },
    "required": [
     "apiKey",
     "keyPrefix",
     "plan",
     "monthlyQuota",
     "companyDomain",
     "accountCreated",
     "replacedKeys",
     "shownOnce"
    ],
    "additionalProperties": false
   },
   "CheckoutRequest": {
    "$id": "#/components/schemas/CheckoutRequest",
    "type": "object",
    "properties": {
     "plan": {
      "type": "string",
      "enum": [
       "starter",
       "pro",
       "business"
      ]
     },
     "interval": {
      "default": "month",
      "description": "year = annual billing at annualDiscount off.",
      "type": "string",
      "enum": [
       "month",
       "year"
      ]
     }
    },
    "required": [
     "plan",
     "interval"
    ],
    "additionalProperties": false
   },
   "CheckoutSession": {
    "$id": "#/components/schemas/CheckoutSession",
    "type": "object",
    "properties": {
     "mode": {
      "type": "string",
      "enum": [
       "checkout",
       "portal"
      ],
      "description": "portal = the account already has a subscription; change the plan in the billing portal."
     },
     "url": {
      "type": "string",
      "description": "Open this Stripe page in a browser."
     },
     "expiresAt": {
      "type": [
       "string",
       "null"
      ]
     },
     "plan": {
      "type": "string"
     },
     "interval": {
      "type": "string",
      "enum": [
       "month",
       "year"
      ]
     },
     "priceEur": {
      "type": "number",
      "description": "Price of the plan for the interval, before VAT."
     }
    },
    "required": [
     "mode",
     "url",
     "expiresAt",
     "plan",
     "interval",
     "priceEur"
    ],
    "additionalProperties": false
   },
   "PortalSession": {
    "$id": "#/components/schemas/PortalSession",
    "type": "object",
    "properties": {
     "url": {
      "type": "string",
      "description": "Stripe Customer Portal: invoices, card, plan change, cancel."
     }
    },
    "required": [
     "url"
    ],
    "additionalProperties": false
   },
   "PulseEvent": {
    "$id": "#/components/schemas/PulseEvent",
    "type": "object",
    "properties": {
     "id": {
      "type": "string",
      "description": "Stable id: the same change always has the same id."
     },
     "type": {
      "type": "string",
      "enum": [
       "hiring_up",
       "hiring_down",
       "new_country",
       "new_function",
       "ats_switch",
       "pay_first_seen",
       "review_velocity",
       "rating_change",
       "shop_app_installed",
       "shop_app_removed",
       "tech_added",
       "tech_removed",
       "tender_awarded"
      ]
     },
     "domain": {
      "type": "string",
      "description": "Company key: the registrable website domain."
     },
     "occurredAt": {
      "type": "string",
      "description": "Day the change happened as the source shows it (YYYY-MM-DD)."
     },
     "observedAt": {
      "type": "string",
      "description": "When our pipeline first had the data that shows it (ISO 8601 UTC, never rewritten)."
     },
     "country": {
      "description": "ISO alpha-2 the event is about, else the company main country.",
      "type": [
       "string",
       "null"
      ]
     },
     "provisional": {
      "type": "boolean",
      "description": "true while the baseline behind the event is shorter than the rule wants."
     },
     "source": {
      "type": "string",
      "enum": [
       "jobs",
       "jobs_pay",
       "job_ads_tech",
       "shopify_scan",
       "reviews_panel",
       "tenders"
      ]
     },
     "evidence": {
      "type": "object",
      "propertyNames": {
       "type": "string"
      },
      "additionalProperties": {},
      "description": "Numbers and labels the event rests on; never a person."
     }
    },
    "required": [
     "id",
     "type",
     "domain",
     "occurredAt",
     "observedAt",
     "country",
     "provisional",
     "source",
     "evidence"
    ],
    "additionalProperties": false
   },
   "PulseSources": {
    "$id": "#/components/schemas/PulseSources",
    "type": "object",
    "properties": {
     "jobs": {
      "type": "boolean"
     },
     "jobs_pay": {
      "type": "boolean"
     },
     "job_ads_tech": {
      "type": "boolean"
     },
     "shopify_scan": {
      "type": "boolean"
     },
     "reviews_panel": {
      "type": "boolean"
     },
     "tenders": {
      "type": "boolean"
     }
    },
    "required": [
     "jobs",
     "jobs_pay",
     "job_ads_tech",
     "shopify_scan",
     "reviews_panel",
     "tenders"
    ],
    "additionalProperties": false,
    "description": "Sources this host reads (false = not available here)."
   },
   "PulseScore": {
    "$id": "#/components/schemas/PulseScore",
    "type": "object",
    "properties": {
     "enabled": {
      "type": "boolean"
     },
     "availableFrom": {
      "type": "string",
      "description": "First day the score can be on (60 days of history)."
     },
     "score": {
      "anyOf": [
       {
        "type": "integer",
        "minimum": 0,
        "maximum": 100
       },
       {
        "type": "null"
       }
      ],
      "description": "0-100, 50 = no change; null while off."
     },
     "components": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "name": {
         "type": "string"
        },
        "points": {
         "type": "number"
        },
        "max": {
         "type": "number"
        },
        "events": {
         "type": "array",
         "items": {
          "type": "string"
         },
         "description": "Ids of the events behind the points."
        }
       },
       "required": [
        "name",
        "points",
        "max",
        "events"
       ],
       "additionalProperties": false
      },
      "description": "Explainable parts; empty while off."
     },
     "topEvents": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "id": {
         "type": "string"
        },
        "type": {
         "type": "string"
        },
        "occurredAt": {
         "type": "string"
        },
        "points": {
         "type": "number"
        }
       },
       "required": [
        "id",
        "type",
        "occurredAt",
        "points"
       ],
       "additionalProperties": false
      }
     },
     "method": {
      "type": "string"
     }
    },
    "required": [
     "enabled",
     "availableFrom",
     "score",
     "components",
     "topEvents",
     "method"
    ],
    "additionalProperties": false
   },
   "CompanyPulse": {
    "$id": "#/components/schemas/CompanyPulse",
    "type": "object",
    "properties": {
     "domain": {
      "type": "string"
     },
     "asOf": {
      "type": "string"
     },
     "since": {
      "type": "string"
     },
     "historySince": {
      "type": "string",
      "description": "First day we collected data (nothing earlier exists)."
     },
     "sources": {
      "$ref": "#/components/schemas/PulseSources"
     },
     "count": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/PulseEvent"
      },
      "description": "Newest first."
     },
     "score": {
      "$ref": "#/components/schemas/PulseScore"
     }
    },
    "required": [
     "domain",
     "asOf",
     "since",
     "historySince",
     "sources",
     "count",
     "data",
     "score"
    ],
    "additionalProperties": false
   },
   "PulseEventsPage": {
    "$id": "#/components/schemas/PulseEventsPage",
    "type": "object",
    "properties": {
     "count": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
     },
     "since": {
      "type": "string"
     },
     "until": {
      "type": "string"
     },
     "nextCursor": {
      "description": "Pass as `cursor` for the next page; null = last page.",
      "type": [
       "string",
       "null"
      ]
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/PulseEvent"
      }
     }
    },
    "required": [
     "count",
     "since",
     "until",
     "nextCursor",
     "data"
    ],
    "additionalProperties": false
   },
   "WatchlistCreate": {
    "$id": "#/components/schemas/WatchlistCreate",
    "type": "object",
    "properties": {
     "name": {
      "description": "Your label for the list.",
      "type": "string",
      "minLength": 1,
      "maxLength": 100
     },
     "domains": {
      "minItems": 1,
      "maxItems": 10000,
      "type": "array",
      "items": {
       "type": "string",
       "maxLength": 300
      },
      "description": "Company website domains or URLs to track."
     }
    },
    "required": [
     "domains"
    ],
    "additionalProperties": false
   },
   "Watchlist": {
    "$id": "#/components/schemas/Watchlist",
    "type": "object",
    "properties": {
     "id": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
     },
     "name": {
      "type": [
       "string",
       "null"
      ]
     },
     "companies": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Tracked companies (each counts toward the plan allowance)."
     },
     "createdAt": {
      "type": "string"
     },
     "domains": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "rejected": {
      "description": "Inputs that are not a company domain (not tracked).",
      "type": "array",
      "items": {
       "type": "string"
      }
     }
    },
    "required": [
     "id",
     "name",
     "companies",
     "createdAt"
    ],
    "additionalProperties": false
   },
   "Watchlists": {
    "$id": "#/components/schemas/Watchlists",
    "type": "object",
    "properties": {
     "count": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Watchlist"
      }
     }
    },
    "required": [
     "count",
     "data"
    ],
    "additionalProperties": false
   },
   "WatchlistChanges": {
    "$id": "#/components/schemas/WatchlistChanges",
    "type": "object",
    "properties": {
     "id": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
     },
     "since": {
      "type": "string"
     },
     "count": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
     },
     "data": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "id": {
         "type": "string",
         "description": "Stable id: the same change always has the same id."
        },
        "type": {
         "type": "string",
         "enum": [
          "hiring_up",
          "hiring_down",
          "new_country",
          "new_function",
          "ats_switch",
          "pay_first_seen",
          "review_velocity",
          "rating_change",
          "shop_app_installed",
          "shop_app_removed",
          "tech_added",
          "tech_removed",
          "tender_awarded"
         ]
        },
        "domain": {
         "type": "string",
         "description": "Company key: the registrable website domain."
        },
        "occurredAt": {
         "type": "string",
         "description": "Day the change happened as the source shows it (YYYY-MM-DD)."
        },
        "observedAt": {
         "type": "string",
         "description": "When our pipeline first had the data that shows it (ISO 8601 UTC, never rewritten)."
        },
        "country": {
         "description": "ISO alpha-2 the event is about, else the company main country.",
         "type": [
          "string",
          "null"
         ]
        },
        "provisional": {
         "type": "boolean",
         "description": "true while the baseline behind the event is shorter than the rule wants."
        },
        "source": {
         "type": "string",
         "enum": [
          "jobs",
          "jobs_pay",
          "job_ads_tech",
          "shopify_scan",
          "reviews_panel",
          "tenders"
         ]
        },
        "evidence": {
         "type": "object",
         "propertyNames": {
          "type": "string"
         },
         "additionalProperties": {},
         "description": "Numbers and labels the event rests on; never a person."
        },
        "name": {
         "type": [
          "string",
          "null"
         ]
        }
       },
       "required": [
        "id",
        "type",
        "domain",
        "occurredAt",
        "observedAt",
        "country",
        "provisional",
        "source",
        "evidence",
        "name"
       ],
       "additionalProperties": false
      },
      "description": "Company Pulse events of the tracked companies (every source), newest first."
     },
     "companies": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "domain": {
         "type": "string"
        },
        "name": {
         "type": [
          "string",
          "null"
         ]
        },
        "found": {
         "type": "boolean",
         "description": "false = no signals for this domain yet."
        },
        "asOf": {
         "type": [
          "string",
          "null"
         ]
        },
        "openJobs": {
         "anyOf": [
          {
           "type": "integer",
           "minimum": -9007199254740991,
           "maximum": 9007199254740991
          },
          {
           "type": "null"
          }
         ]
        },
        "netChange7d": {
         "type": [
          "number",
          "null"
         ]
        },
        "netChange30d": {
         "type": [
          "number",
          "null"
         ]
        }
       },
       "required": [
        "domain",
        "name",
        "found",
        "asOf",
        "openJobs",
        "netChange7d",
        "netChange30d"
       ],
       "additionalProperties": false
      },
      "description": "Latest daily signal row of every tracked company."
     }
    },
    "required": [
     "id",
     "since",
     "count",
     "data",
     "companies"
    ],
    "additionalProperties": false
   },
   "TenderValue": {
    "$id": "#/components/schemas/TenderValue",
    "type": "object",
    "properties": {
     "amount": {
      "type": "number"
     },
     "currency": {
      "type": "string",
      "description": "ISO 4217."
     },
     "eur": {
      "description": "In EUR at the fixed monthly ECB reference rate.",
      "type": [
       "number",
       "null"
      ]
     }
    },
    "required": [
     "amount",
     "currency",
     "eur"
    ],
    "additionalProperties": false
   },
   "Tender": {
    "$id": "#/components/schemas/Tender",
    "type": "object",
    "properties": {
     "id": {
      "type": "string",
      "description": "Stable id `<source>:<native id>`, e.g. ted:730004-2026."
     },
     "source": {
      "type": "string",
      "enum": [
       "ted",
       "fts",
       "boamp",
       "bund",
       "bzp",
       "eop"
      ],
      "description": "ted, fts, or a national board: boamp (FR), bund (DE), bzp (PL), eop (BG)."
     },
     "kind": {
      "type": "string",
      "enum": [
       "planning",
       "competition",
       "award",
       "modification",
       "cancellation",
       "other"
      ]
     },
     "noticeType": {
      "description": "Notice type as published (eForms cn-standard, OCDS tags).",
      "type": [
       "string",
       "null"
      ]
     },
     "procedureId": {
      "description": "Joins a call for tenders to its award notice.",
      "type": [
       "string",
       "null"
      ]
     },
     "title": {
      "type": "string",
      "description": "English title when the source has one, else the original."
     },
     "titleOriginal": {
      "type": [
       "string",
       "null"
      ]
     },
     "language": {
      "description": "ISO 639-1.",
      "type": [
       "string",
       "null"
      ]
     },
     "buyer": {
      "type": "object",
      "properties": {
       "name": {
        "description": "Contracting authority (an organisation).",
        "type": [
         "string",
         "null"
        ]
       },
       "country": {
        "description": "ISO 3166-1 alpha-2.",
        "type": [
         "string",
         "null"
        ]
       },
       "nuts": {
        "description": "NUTS 3 / ITL 3 region code.",
        "type": [
         "string",
         "null"
        ]
       },
       "city": {
        "type": [
         "string",
         "null"
        ]
       },
       "type": {
        "description": "Buyer legal type as published.",
        "type": [
         "string",
         "null"
        ]
       }
      },
      "required": [
       "name",
       "country",
       "nuts",
       "city",
       "type"
      ],
      "additionalProperties": false
     },
     "cpvCodes": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "CPV 2008 codes, 8 digits, main first."
     },
     "cpvDivision": {
      "type": [
       "string",
       "null"
      ]
     },
     "cpvDivisionLabel": {
      "type": [
       "string",
       "null"
      ]
     },
     "contractNature": {
      "description": "works, supplies or services.",
      "type": [
       "string",
       "null"
      ]
     },
     "procedureType": {
      "type": [
       "string",
       "null"
      ]
     },
     "estimatedValue": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/TenderValue"
       },
       {
        "type": "null"
       }
      ],
      "description": "Estimated value as published."
     },
     "awardValue": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/TenderValue"
       },
       {
        "type": "null"
       }
      ],
      "description": "Awarded value (award and modification notices)."
     },
     "winners": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Winning organisations."
     },
     "winnerCountries": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "winnersWithheld": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Winner names left out because they could name a private person (sole traders)."
     },
     "publishedOn": {
      "type": "string",
      "description": "Publication day."
     },
     "deadlineOn": {
      "description": "Earliest deadline for tenders or requests to participate.",
      "type": [
       "string",
       "null"
      ]
     },
     "url": {
      "type": "string",
      "description": "Official notice page."
     }
    },
    "required": [
     "id",
     "source",
     "kind",
     "noticeType",
     "procedureId",
     "title",
     "titleOriginal",
     "language",
     "buyer",
     "cpvCodes",
     "cpvDivision",
     "cpvDivisionLabel",
     "contractNature",
     "procedureType",
     "estimatedValue",
     "awardValue",
     "winners",
     "winnerCountries",
     "winnersWithheld",
     "publishedOn",
     "deadlineOn",
     "url"
    ],
    "additionalProperties": false
   },
   "TendersPage": {
    "$id": "#/components/schemas/TendersPage",
    "type": "object",
    "properties": {
     "count": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
     },
     "nextCursor": {
      "description": "Pass as `cursor` for the next page; null = last page.",
      "type": [
       "string",
       "null"
      ]
     },
     "data": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Tender"
      }
     }
    },
    "required": [
     "count",
     "nextCursor",
     "data"
    ],
    "additionalProperties": false
   },
   "Deleted": {
    "$id": "#/components/schemas/Deleted",
    "type": "object",
    "properties": {
     "deleted": {
      "type": "boolean"
     }
    },
    "required": [
     "deleted"
    ],
    "additionalProperties": false
   },
   "CoverageRequest": {
    "$id": "#/components/schemas/CoverageRequest",
    "type": "object",
    "properties": {
     "domains": {
      "minItems": 1,
      "maxItems": 50,
      "type": "array",
      "items": {
       "type": "string"
      }
     }
    },
    "required": [
     "domains"
    ],
    "additionalProperties": false
   },
   "CoverageResponse": {
    "$id": "#/components/schemas/CoverageResponse",
    "type": "object",
    "properties": {},
    "additionalProperties": {},
    "description": "{ checked, found, results: [{ input, domain, found, ats, boardUrl, openJobs, ... }] }"
   },
   "CoverageResult": {
    "$id": "#/components/schemas/CoverageResult",
    "type": "object",
    "properties": {},
    "additionalProperties": {},
    "description": "One coverage result."
   },
   "CompanySignals": {
    "$id": "#/components/schemas/CompanySignals",
    "type": "object",
    "properties": {},
    "additionalProperties": {},
    "description": "Signals with techStack and recentEvents."
   },
   "EventsResponse": {
    "$id": "#/components/schemas/EventsResponse",
    "type": "object",
    "properties": {},
    "additionalProperties": {},
    "description": "{ count, filter, events }"
   },
   "ReviewSnapshotResponse": {
    "$id": "#/components/schemas/ReviewSnapshotResponse",
    "type": "object",
    "properties": {},
    "additionalProperties": {},
    "description": "{ count, query, matches }"
   },
   "ReviewPanelResponse": {
    "$id": "#/components/schemas/ReviewPanelResponse",
    "type": "object",
    "properties": {},
    "additionalProperties": {},
    "description": "{ count, query, rows }"
   }
  },
  "securitySchemes": {
   "bearer": {
    "type": "http",
    "scheme": "bearer",
    "description": "API key (ak_live_...)."
   },
   "apiKey": {
    "type": "apiKey",
    "in": "header",
    "name": "X-API-Key"
   }
  }
 }
}
