API reference

Every route of the Arcadium Data API v1.39.0, rendered from the OpenAPI 3.1 contract. Base URL https://api.arcadiumdata.io. Authenticate with Authorization: Bearer <key> or X-API-Key: <key>. New here? Start with the quickstart.

Jobs

GET /v1/jobs

Search open jobs

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).

Needs an API key. Try it · searchJobs

Parameters

NameInTypeDescription
qquerystringFull-text search over title and description (web syntax: "data engineer" -senior).
countryquerystringJob located in any of these countries (ISO 3166-1 alpha-2). Example: DE,FR
atsquerystringOnly jobs read from these source systems. Example: greenhouse,workday
remotequerystringtrue = fully remote only, false = on-site or hybrid only.
domainquerystringEmployer website domain, e.g. stripe.com.
postedSincequerystring (YYYY-MM-DD)Posted by the employer on or after this day.
seenSincequerystring (YYYY-MM-DD)First seen by us on or after this day (also covers jobs without a posting date; the date never moves).
iscoquerystringISCO-08 sub-major groups (2 digits) mapped from the title, e.g. 25 = ICT professionals. Example: 25,21
limitqueryintegerJobs per page (anonymous: at most 10).
cursorquerystring`nextCursor` of the previous page.

Example

curl -s "https://api.arcadiumdata.io/v1/jobs" \
  -H "Authorization: Bearer $ARCADIUM_API_KEY"

Response JobsPage

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "nextCursor": "string",
  "data": [
    {
      "id": "string",
      "title": "string",
      "company": "string",
      "companyDomain": "string",
      "ats": "string",
      "countries": [],
      "locations": [],
      "remote": true,
      "employmentType": "string",
      "seniority": "string",
      "departments": [],
      "salary": {
        "min": 1.5,
        "max": 1.5,
        "currency": "string",
        "period": "string"
      },
      "iscoGroup": "string",
      "iscoLabel": "string",
      "postedAt": "string",
      "firstSeenAt": "string",
      "closedAt": "string",
      "url": "string"
    }
  ]
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

GET /v1/jobs/remote

Search open remote jobs, direct from employers

The free remote-jobs search behind https://arcadiumdata.io/jobs/remote/: open fully-remote jobs read from employers' own job boards (one record per job, no aggregator copies), newest first seen first. `region` is europe, uk, us or worldwide (remote jobs that list no country); `days` limits to jobs first seen in the last N days; `q` is a web-style text search. Free and ungated: anonymous callers page with `nextCursor` too, within the anonymous rate limits. Company-level data only: no recruiter names, emails or phone numbers.

Works without a key (anonymous with paging, at most 50 rows); a key lifts the limits. Try it · searchRemoteJobs

Parameters

NameInTypeDescription
qquerystringFull-text search over title and description (web syntax: "data engineer" -senior).
regionquerystringeurope = EU/EEA, Switzerland, UK and neighbours; uk; us; worldwide = remote jobs that list no country. Absent = every region.
daysqueryintegerOnly jobs first seen by us in the last N days (1-90).
limitqueryintegerJobs per page (anonymous: at most 50).
cursorquerystring`nextCursor` of the previous page (works without a key on this route).

Example

curl -s "https://api.arcadiumdata.io/v1/jobs/remote"

Response JobsPage

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "nextCursor": "string",
  "data": [
    {
      "id": "string",
      "title": "string",
      "company": "string",
      "companyDomain": "string",
      "ats": "string",
      "countries": [],
      "locations": [],
      "remote": true,
      "employmentType": "string",
      "seniority": "string",
      "departments": [],
      "salary": {
        "min": 1.5,
        "max": 1.5,
        "currency": "string",
        "period": "string"
      },
      "iscoGroup": "string",
      "iscoLabel": "string",
      "postedAt": "string",
      "firstSeenAt": "string",
      "closedAt": "string",
      "url": "string"
    }
  ]
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

GET /v1/jobs/{id}

One job with its description

Works without a key (anonymous point lookup); a key lifts the limits. Try it · getJob

Parameters

NameInTypeDescription
id (required)pathstringJob id from a search result.

Example

curl -s "https://api.arcadiumdata.io/v1/jobs/siemens.com"

Response JobDetail

Shape generated from the schema; values are placeholders.

{
  "id": "string",
  "title": "string",
  "company": "string",
  "companyDomain": "string",
  "ats": "string",
  "countries": [
    "string"
  ],
  "locations": [
    "string"
  ],
  "remote": true,
  "employmentType": "string",
  "seniority": "string",
  "departments": [
    "string"
  ],
  "salary": {
    "min": 1.5,
    "max": 1.5,
    "currency": "string",
    "period": "string"
  },
  "iscoGroup": "string",
  "iscoLabel": "string",
  "postedAt": "string",
  "firstSeenAt": "string",
  "closedAt": "string",
  "url": "string",
  "status": "open",
  "description": "string"
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

Companies

GET /v1/companies/resolve

EU Company ID: domain <-> registry id / VAT / LEI, legal name, country and stored register status

Send exactly one of: `domain` (equinor.com), `name` + `country` (registered name, exact or its first whole words), or `id` (+ `type` or `country`: a registry id such as a Norwegian orgnr, French SIREN or Czech IČO, a VAT number with its prefix, or an LEI). Answers from stored data: the company id table (ids from the company’s own legal-notice page, Wikidata, GLEIF and national registers, each with sources, confidence and observedAt; only ids stated by at most 3 domains) and the national registers we hold (NO Brønnøysund, FI PRH, FR SIRENE + BODACC) for legal name, legal form and status. `found: false` (200) when nothing matches. Companies only: sole traders and natural persons are never returned. For a live check use GET /v1/companies/verify.

Works without a key (anonymous point lookup, at most 3 rows); a key lifts the limits. Try it · resolveCompany

Parameters

NameInTypeDescription
domainquerystringCompany website domain or URL, e.g. equinor.com.
namequerystringRegistered company name (exact, or the first whole words of it); needs `country`.
countryquerystringISO 3166-1 alpha-2 country, e.g. NO (GR for Greece; EL accepted).
idquerystringRegistry id, VAT number or LEI, e.g. 923609016 (with country=NO), FR40303265045, 5493001KJTIIGC8Y1R12.
typequerystringWhat `id` is; default: inferred (VAT prefix, LEI shape, else the national ids of `country`).

Example

curl -s "https://api.arcadiumdata.io/v1/companies/resolve"

Response CompanyResolve

Shape generated from the schema; values are placeholders.

{
  "query": {
    "mode": "domain",
    "domain": "string",
    "name": "string",
    "country": "string",
    "id": "string",
    "type": "string"
  },
  "found": true,
  "count": 1,
  "withheld": 1,
  "data": [
    {
      "domain": "string",
      "domainConfidence": 1.5,
      "legalName": "string",
      "country": "string",
      "legalForm": "string",
      "status": "active",
      "statusSince": "string",
      "statusSource": "string",
      "statusCheckedAt": "string",
      "vat": "string",
      "lei": "string",
      "leiStatus": {
        "entity": "string",
        "registration": "string"
      },
      "sectorCodes": [],
      "registryIds": [],
      "match": {
        "method": "domain",
        "confidence": 1.5
      }
    }
  ],
  "asOf": "string",
  "note": "string"
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

GET /v1/companies/verify

EU Company ID: live status check in the national register and EU VAT check in VIES

Send `vat` (with prefix, e.g. IE6388047V), or `id` + `country`. Live, in parallel: the national register where it is open and anonymous (NO Brønnøysund, FI PRH/YTJ, FR recherche-entreprises + stored BODACC insolvencies, CZ ARES) and the European Commission VIES service for the VAT number (given, or derived from the id). `status`: active, insolvent, restructuring, liquidation, dissolved, not_found, not_company (a sole trader or natural person: personal data, nothing else is returned) or unknown (the sources did not answer; try again). `statusBasis` says whether the status comes from the register or only from the VAT registration. Answers are cached for 24 hours (`cached`). One outbound check per call: it has its own, lower anonymous daily budget.

Works without a key (anonymous point lookup); a key lifts the limits. Try it · verifyCompany

Parameters

NameInTypeDescription
idquerystringNational company id with `country`: NO orgnr, FI Y-tunnus, FR SIREN/SIRET, CZ IČO, GB Companies House number, PL NIP, ...
countryquerystringISO 3166-1 alpha-2 country, e.g. NO (GR for Greece; EL accepted).
vatquerystringVAT number with its country prefix, e.g. IE6388047V.

Example

curl -s "https://api.arcadiumdata.io/v1/companies/verify"

Response CompanyVerify

Shape generated from the schema; values are placeholders.

{
  "query": {
    "id": "string",
    "country": "string",
    "vat": "string"
  },
  "status": "active",
  "statusBasis": "register",
  "country": "string",
  "registryId": "string",
  "vatNumber": "string",
  "since": "string",
  "legalName": "string",
  "legalForm": "string",
  "register": {
    "source": "string",
    "basis": "live",
    "sourceUrl": "string",
    "licence": "string",
    "status": "string",
    "since": "string",
    "checkedAt": "string",
    "cached": true
  },
  "vat": {
    "vatNumber": "string",
    "valid": true,
    "error": "string",
    "requestDate": "string",
    "source": "vies",
    "sourceUrl": "string",
    "licence": "string",
    "checkedAt": "string",
    "cached": true
  },
  "checkedAt": "string",
  "notes": [
    "string"
  ]
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

GET /v1/companies/{domain}

Company profile: job boards, open jobs, hiring signals, tech, events, Shopify store

Works without a key (anonymous point lookup); a key lifts the limits. Try it · getCompanyProfile

Parameters

NameInTypeDescription
domain (required)pathstringCompany website domain or URL, e.g. stripe.com.

Example

curl -s "https://api.arcadiumdata.io/v1/companies/stripe.com"

Response CompanyProfile

Shape generated from the schema; values are placeholders.

{
  "domain": "string",
  "name": "string",
  "hiring": {
    "ats": "string",
    "boardUrl": "string",
    "openJobs": 1,
    "jobsPostedLast30Days": 1,
    "remoteShare": 1.5,
    "payShare": 1.5,
    "topDepartments": [
      {
        "name": "string",
        "share": 1.5
      }
    ],
    "topCountries": [
      {
        "name": "string",
        "share": 1.5
      }
    ],
    "matchConfidence": "string",
    "lastSeen": "string"
  },
  "boards": [
    {
      "ats": "string",
      "token": "string",
      "boardUrl": "string",
      "openJobs": 1,
      "lastCrawlAt": "string"
    }
  ],
  "signals": {
    "asOf": "string",
    "provisional": true,
    "historyDays": 1,
    "openJobs": 1,
    "netChange7d": 1.5,
    "netChange30d": 1.5,
    "change7dPct": 1.5,
    "openings7d": 1,
    "openings30d": 1,
    "closures7d": 1,
    "closures30d": 1,
    "countries": 1,
    "cities": 1,
    "newCountries30d": 1,
    "newCities30d": 1,
    "remoteShare": 1.5,
    "payShare": 1.5,
    "ghostShare": 1.5,
    "departmentMix": [
      {
        "name": "string",
        "share": 1.5
      }
    ],
    "topCountries": [
      {
        "name": "string",
        "share": 1.5
      }
    ]
  },
  "tech": [
    {
      "tool": "string",
      "category": "string",
      "jobs": 1,
      "firstSeen": "string"
    }
  ],
  "events": [
    {
      "type": "string",
      "day": "string",
      "country": "string",
      "provisional": true,
      "details": {}
    }
  ],
  "shop": {
    "domain": "string",
    "myshopifyDomain": "string",
    "name": "string",
  ...

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

GET /v1/companies/{domain}/history

Point-in-time hiring history 2023 onwards (open jobs per crawl, from the public web archive)

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.

Works without a key (anonymous point lookup); a key lifts the limits. Try it · getCompanyHiringHistory

Parameters

NameInTypeDescription
domain (required)pathstringCompany website domain or URL, e.g. stripe.com.
fromquerystring (YYYY-MM-DD)First month (YYYY-MM-DD, compared with the month start).
toquerystring (YYYY-MM-DD)Last month (YYYY-MM-DD).

Example

curl -s "https://api.arcadiumdata.io/v1/companies/stripe.com/history"

Response CompanyHistory

Shape generated from the schema; values are placeholders.

{
  "domain": "string",
  "source": "commoncrawl",
  "note": "string",
  "tickers": [
    {
      "ticker": "string",
      "exchange": "string",
      "figi": "string"
    }
  ],
  "boards": [
    {
      "boardKey": "string",
      "ats": "string",
      "token": "string",
      "liveNow": true,
      "tickerMethod": "string"
    }
  ],
  "months": [
    {
      "month": "string",
      "crawlId": "string",
      "availableAt": "string",
      "openJobs": 1,
      "boardsReporting": 1,
      "boardsWithData": 1,
      "complete": true,
      "lifecycleOpenLb": 1,
      "newJobIds": 1
    }
  ],
  "count": 1,
  "data": [
    {
      "boardKey": "string",
      "ats": "string",
      "crawlId": "string",
      "month": "string",
      "observedAt": "string",
      "availableAt": "string",
      "openJobs": 1,
      "openJobsMethod": "string",
      "openJobsComplete": true,
      "lifecycleOpenLb": 1,
      "newJobIds": 1,
      "coverageFlag": "list"
    }
  ]
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

GET /v1/ats/market

ATS market share 2023 onwards: monthly share, wins and losses per vendor, plus today’s live share

Applicant-tracking-system share per Common Crawl crawl since February 2023 among the employers we observe (Greenhouse, Workday, Ashby, SmartRecruiters; Lever until 2025-10 with `series=all5`), with wins (new employers), losses (employers gone) and dated switches in/out per vendor. One segment per call: all, a `country`, or a `sizeBand`. `live` adds today’s share among the 10 ATS we crawl (Personio, Teamtailor, Recruitee, Workable, Oracle included). Coverage notes in `note`.

Works without a key (anonymous preview, at most 5 rows, one value of ats); a key lifts the limits. Try it · getAtsMarket

Parameters

NameInTypeDescription
atsquerystringOnly these ATS (comma-separated). Example: ashby,greenhouse
countryquerystringSegment: ISO alpha-2 country of the employer, `unknown`, or `ALL` (default).
sizeBandquerystringSegment by open jobs: 1-9, 10-49, 50-249, 250+, unknown, or all (default). Not combined with country.
seriesquerystringcore4 (default) = Greenhouse, Workday, Ashby, SmartRecruiters, consistent 2023 onwards; all5 adds Lever and ends 2025-10 (the archive barely captures Lever after that).
fromquerystringFirst month, YYYY-MM or YYYY-MM-DD.
toquerystringLast month, YYYY-MM or YYYY-MM-DD.

Example

curl -s "https://api.arcadiumdata.io/v1/ats/market"

Response AtsMarket

Shape generated from the schema; values are placeholders.

{
  "series": "core4",
  "country": "string",
  "sizeBand": "string",
  "note": "string",
  "coverage": {
    "leverGapFrom": "string",
    "winsCensoredUntil": "string",
    "computedAt": "string"
  },
  "count": 1,
  "data": [
    {
      "month": "string",
      "crawlId": "string",
      "ats": "string",
      "share": 1.5,
      "shareObserved": 1.5,
      "employers": 1,
      "employersObserved": 1,
      "segmentEmployers": 1,
      "wins": 1,
      "losses": 1,
      "switchesIn": 1,
      "switchesOut": 1,
      "winsCensored": true
    }
  ],
  "live": [
    {
      "ats": "string",
      "employers": 1,
      "share": 1.5
    }
  ],
  "liveEmployers": 1
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

GET /v1/ats/switches

Companies that switched ATS, dated (e.g. Lever -> Ashby), keyed by company domain

One row per company that left one ATS for another since 2023: old and new ATS, the month of the switch, the last and first capture months, how both boards were tied to the domain and a confidence. Newest first; cursor pagination. Moves away from Lever that fall into the archive gap are hidden unless `includeLeverGap=true`. Company level only: no people.

Works without a key (anonymous only with domain, at most 5 rows, no cursor); a key lifts the limits. Try it · listAtsSwitches

Parameters

NameInTypeDescription
fromAtsquerystringOld ATS, e.g. lever.
toAtsquerystringNew ATS, e.g. ashby.
from_atsquerystringAlias of fromAts.
to_atsquerystringAlias of toAts.
sincequerystringSwitches dated in or after this month, YYYY-MM or YYYY-MM-DD.
countryquerystringEmployer country, ISO alpha-2.
includeLeverGapquerystringtrue = also the low-confidence moves away from Lever that fall into the archive gap (from 2025-08).
domainquerystringOnly the switches of this company domain (the "switched ATS in the past?" lookup).
limitqueryintegerRows per page (anonymous: at most 10).
cursorquerystring`nextCursor` of the previous page.

Example

curl -s "https://api.arcadiumdata.io/v1/ats/switches?domain=stripe.com"

Response AtsSwitchesPage

Shape generated from the schema; values are placeholders.

{
  "note": "string",
  "count": 1,
  "nextCursor": "string",
  "data": [
    {
      "domain": "string",
      "fromAts": "string",
      "toAts": "string",
      "switchMonth": "string",
      "fromLastSeen": "string",
      "toFirstSeen": "string",
      "evidence": "string",
      "confidence": "high",
      "leverGap": true,
      "country": "string",
      "sizeBand": "string"
    }
  ]
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

POST /v1/coverage

Which of up to 50 company domains have a known public job board

Works without a key (anonymous point lookup); a key lifts the limits. Try it · checkCoverage

Request body CoverageRequest

{
  "domains": [
    "stripe.com",
    "spotify.com"
  ]
}

Example

curl -s -X POST "https://api.arcadiumdata.io/v1/coverage" \
  -H "Content-Type: application/json" \
  -d '{"domains":["stripe.com","spotify.com"]}'

Response CoverageResponse

Shape generated from the schema; values are placeholders.

{}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

GET /v1/company/{domain}

Primary job board and open-jobs snapshot of a company (prefer /v1/companies/{domain})

Works without a key (anonymous point lookup); a key lifts the limits. Try it · getCompanyBoard

Parameters

NameInTypeDescription
domain (required)pathstringCompany website domain or URL, e.g. stripe.com.

Example

curl -s "https://api.arcadiumdata.io/v1/company/stripe.com"

Response CoverageResult

Shape generated from the schema; values are placeholders.

{}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

GET /v1/company/{domain}/signals

Latest daily hiring signals of a company

Works without a key (anonymous point lookup); a key lifts the limits. Try it · getCompanySignals

Parameters

NameInTypeDescription
domain (required)pathstringCompany website domain or URL, e.g. stripe.com.

Example

curl -s "https://api.arcadiumdata.io/v1/company/stripe.com/signals"

Response CompanySignals

Shape generated from the schema; values are placeholders.

{}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

GET /v1/events

Hiring events feed (market entry, ATS switch, surge, freeze, new department)

Needs an API key. Try it · listHiringEvents

Parameters

NameInTypeDescription
typequerystring
sincequerystring (YYYY-MM-DD)Events on or after this day.
countryquerystringISO alpha-2.
limitqueryinteger1-500, default 100.
provisionalquerystringfalse = hide events from under 28 days of history.

Example

curl -s "https://api.arcadiumdata.io/v1/events" \
  -H "Authorization: Bearer $ARCADIUM_API_KEY"

Response EventsResponse

Shape generated from the schema; values are placeholders.

{}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

Pulse

GET /v1/companies/{domain}/pulse

Company Pulse: dated change events of one company from every dataset (last 90 days)

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).

Works without a key (anonymous point lookup); a key lifts the limits. Try it · getCompanyPulse

Parameters

NameInTypeDescription
domain (required)pathstringCompany website domain or URL, e.g. stripe.com.
sincequerystring (YYYY-MM-DD)Events on or after this day; default and earliest: 90 days ago (history starts 2026-10-21).
typesquerystringEvent 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, register_registration, register_bankruptcy, register_restructuring, register_liquidation, register_dissolution, name_change, hq_moved, capital_increase, capital_decrease, headcount_band_change, sector_change, accounts_filed, business_sale, eu_grant_won. Example: hiring_up,new_country

Example

curl -s "https://api.arcadiumdata.io/v1/companies/stripe.com/pulse"

Response CompanyPulse

Shape generated from the schema; values are placeholders.

{
  "domain": "string",
  "asOf": "string",
  "since": "string",
  "historySince": "string",
  "sources": {
    "jobs": true,
    "jobs_pay": true,
    "job_ads_tech": true,
    "shopify_scan": true,
    "reviews_panel": true,
    "tenders": true,
    "registers": true,
    "eu_grants": true
  },
  "count": 1,
  "data": [
    {
      "id": "string",
      "type": "hiring_up",
      "domain": "string",
      "occurredAt": "string",
      "observedAt": "string",
      "country": "string",
      "provisional": true,
      "source": "jobs",
      "evidence": {}
    }
  ],
  "score": {
    "enabled": true,
    "availableFrom": "string",
    "score": 0,
    "components": [
      {
        "name": "string",
        "points": 1.5,
        "max": 1.5,
        "events": []
      }
    ],
    "topEvents": [
      {
        "id": "string",
        "type": "string",
        "occurredAt": "string",
        "points": 1.5
      }
    ],
    "method": "string"
  }
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

GET /v1/pulse/events

Company Pulse feed: events of every company, filtered by day, country and type

Newest first (occurredAt, then observedAt, then id). Cursor pagination: pass `nextCursor` back as `cursor` with the same filters. `since` at most 90 days back.

Needs an API key. Try it · listPulseEvents

Parameters

NameInTypeDescription
sincequerystring (YYYY-MM-DD)Events on or after this day; default 7 days ago, earliest 90 days ago.
untilquerystring (YYYY-MM-DD)Events on or before this day; default today.
countryquerystringOnly events in these countries (ISO 3166-1 alpha-2). Example: DE,SE
typesquerystringEvent 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, register_registration, register_bankruptcy, register_restructuring, register_liquidation, register_dissolution, name_change, hq_moved, capital_increase, capital_decrease, headcount_band_change, sector_change, accounts_filed, business_sale, eu_grant_won. Example: hiring_up,new_country
limitqueryintegerEvents per page, 1-500 (capped by your plan).
cursorquerystring`nextCursor` of the previous page.

Example

curl -s "https://api.arcadiumdata.io/v1/pulse/events" \
  -H "Authorization: Bearer $ARCADIUM_API_KEY"

Response PulseEventsPage

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "since": "string",
  "until": "string",
  "nextCursor": "string",
  "data": [
    {
      "id": "string",
      "type": "hiring_up",
      "domain": "string",
      "occurredAt": "string",
      "observedAt": "string",
      "country": "string",
      "provisional": true,
      "source": "jobs",
      "evidence": {}
    }
  ]
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

Pay

GET /v1/pay/bands

Posted-pay bands (p25 / median / p75, EUR) per country and ISCO-08 group

Weekly cells from open job ads that state pay; cells under 10 postings or 3 employers are suppressed.

Works without a key (anonymous only with role or isco (one value of country, isco), at most 5 rows, no cursor); a key lifts the limits. Try it · getPayBands

Parameters

NameInTypeDescription
countryquerystringCountries (ISO alpha-2). Example: DE,NL
iscoquerystringISCO-08 sub-major groups, or ALL for every posting of the country. Example: 25,ALL
rolequerystringA job title, e.g. "data engineer": mapped to its ISCO-08 sub-major group (the same title rules as /v1/jobs `iscoGroup`) and used as `isco`.
weekquerystringISO week (YYYY-Www); default the latest.
limitqueryintegerRows, 1-2000.

Example

curl -s "https://api.arcadiumdata.io/v1/pay/bands?role=software%20engineer"

Response PayBands

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "week": "string",
  "minCellPostings": 1,
  "minCellEmployers": 1,
  "role": {
    "input": "string",
    "iscoGroup": "string",
    "iscoLabel": "string"
  },
  "data": [
    {
      "week": "string",
      "asOf": "string",
      "country": "string",
      "iscoGroup": "string",
      "iscoLabel": "string",
      "n": 1,
      "nEmployers": 1,
      "p25Eur": 1.5,
      "medianEur": 1.5,
      "p75Eur": 1.5,
      "localCurrency": "string",
      "medianLocal": 1.5,
      "hourlyShare": 1.5
    }
  ]
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

GET /v1/pay/transparency

Pay-transparency adoption: share of job ads stating pay, per country and day

With the EU Pay Transparency Directive status of each member state. Newest day first.

Works without a key (anonymous preview, at most 5 rows, one value of country); a key lifts the limits. Try it · getPayTransparency

Parameters

NameInTypeDescription
countryquerystringCountries (ISO alpha-2). Example: DE,FR
sizeBandquerystringEmployer size proxy (open jobs of the employer that day), or all.
sincequerystring (YYYY-MM-DD)First day; default the first tracked day.
untilquerystring (YYYY-MM-DD)Last day; default today.
limitqueryintegerRows, 1-5000.

Example

curl -s "https://api.arcadiumdata.io/v1/pay/transparency"

Response PayTransparency

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "data": [
    {
      "day": "string",
      "country": "string",
      "countryName": "string",
      "sizeBand": "string",
      "openJobs": 1,
      "jobsWithPay": 1,
      "payShare": 1.5,
      "employers": 1,
      "employersWithPay": 1,
      "employerPayShare": 1.5,
      "directiveStatus": "string",
      "directiveInForce": "string",
      "panelPayShare": 1.5
    }
  ]
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

Hotels

GET /v1/hotels/rate-curve

Cities with a forward hotel-rate curve

Works without a key (anonymous allowed); a key lifts the limits. Try it · listRateCurveCities

Example

curl -s "https://api.arcadiumdata.io/v1/hotels/rate-curve"

Response RateCurveCities

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "data": [
    {
      "city": "string",
      "country": "string",
      "currency": "string",
      "latestSnapshot": "string",
      "snapshots": 1,
      "nights": 1
    }
  ]
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

GET /v1/hotels/rate-curve/{city}

Forward hotel-rate curve and demand index of a city (next 90 nights)

Works without a key (anonymous point lookup, at most 14 rows); a key lifts the limits. Try it · getRateCurve

Parameters

NameInTypeDescription
city (required)pathstringCity slug from GET /v1/hotels/rate-curve, e.g. barcelona.
snapshotquerystring (YYYY-MM-DD)Snapshot day; default the latest.
fromquerystring (YYYY-MM-DD)First check-in night.
toquerystring (YYYY-MM-DD)Last check-in night.

Example

curl -s "https://api.arcadiumdata.io/v1/hotels/rate-curve/berlin"

Response RateCurve

Shape generated from the schema; values are placeholders.

{
  "city": "string",
  "country": "string",
  "currency": "string",
  "snapshotOn": "string",
  "count": 1,
  "data": [
    {
      "checkIn": "string",
      "daysAhead": 1,
      "weekday": 1,
      "rate": 1.5,
      "basis": "string",
      "medianPanel": 1.5,
      "medianPage": 1.5,
      "median3star": 1.5,
      "median4star": 1.5,
      "median5star": 1.5,
      "cityMedian": 1.5,
      "demandIndex": 1.5,
      "weekdayIndex": 1.5,
      "localIndex": 1.5,
      "demandFlag": "string",
      "pickup1dPct": 1.5,
      "pickup7dPct": 1.5,
      "pickupFlag": "string",
      "panelSize": 1,
      "panelPriced": 1
    }
  ]
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

Shops

GET /v1/shops/{domain}

Shopify store profile on a domain

Works without a key (anonymous point lookup); a key lifts the limits. Try it · getShop

Parameters

NameInTypeDescription
domain (required)pathstringCompany website domain or URL, e.g. stripe.com.

Example

curl -s "https://api.arcadiumdata.io/v1/shops/stripe.com"

Response Shop

Shape generated from the schema; values are placeholders.

{
  "domain": "string",
  "myshopifyDomain": "string",
  "name": "string",
  "description": "string",
  "country": "string",
  "currency": "string",
  "shipsToCount": 1,
  "productCount": 1,
  "productCountCapped": true,
  "collectionCount": 1,
  "status": "string",
  "theme": "string",
  "headless": true,
  "shopPayInstallments": true,
  "ucpVersion": "string",
  "latestProductPublishedAt": "string",
  "firstSeenAt": "string",
  "checkedAt": "string",
  "activeApps": 1
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

GET /v1/shops/{domain}/apps

Apps detected on a Shopify store, with installs and uninstalls

Works without a key (anonymous point lookup); a key lifts the limits. Try it · getShopApps

Parameters

NameInTypeDescription
domain (required)pathstringCompany website domain or URL, e.g. stripe.com.

Example

curl -s "https://api.arcadiumdata.io/v1/shops/stripe.com/apps"

Response ShopApps

Shape generated from the schema; values are placeholders.

{
  "domain": "string",
  "myshopifyDomain": "string",
  "count": 1,
  "data": [
    {
      "app": "string",
      "confidence": "high",
      "installed": true,
      "firstSeen": "string",
      "lastSeen": "string",
      "removedOn": "string"
    }
  ],
  "events": [
    {
      "app": "string",
      "event": "install",
      "day": "string"
    }
  ]
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

Tenders

GET /v1/tenders

Search public tenders and contract awards (EU TED, UK Find a Tender, FR/DE/PL/BG national boards)

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.

Works without a key (anonymous only with winnerDomain, at most 5 rows, no cursor); a key lifts the limits. Try it · searchTenders

Parameters

NameInTypeDescription
qquerystringWords in the title (English and original), buyer or winner names (web syntax: "road works" -bridge).
countryquerystringBuyer in any of these countries (ISO 3166-1 alpha-2). Example: DE,PL
cpvquerystringCPV prefixes, 2-8 digits: 2 = division (72 = IT services), 8 = one code. Example: 72,48000000
kindquerystringNotice kinds: planning, competition (open call), award, modification, cancellation, other. Example: competition
sourcequerystringted = EU Tenders Electronic Daily, fts = UK Find a Tender, cf = UK Contracts Finder (England, below-threshold); national boards (notices below the EU thresholds): boamp = France, bund = Germany, bzp = Poland, eop = Bulgaria. Example: ted
publishedSincequerystring (YYYY-MM-DD)Published on or after this day.
publishedUntilquerystring (YYYY-MM-DD)Published on or before this day.
openOnquerystring (YYYY-MM-DD)Only calls for tenders still open on this day (deadline on or after it), e.g. today.
minValueEurquerynumberAwarded value, else estimated value, at least this (EUR).
winnerDomainquerystringOnly notices won by this company domain (`winnerDomains`), e.g. for a company card.
sectorquerystringSector preset: defence = defence and security procurement (defence ministries, armed forces and their agencies, Directive 2009/81/EC notices, military CPV codes, police and border security equipment; purchases of civilian commodities by defence buyers, such as medicines, food, fuel, cleaning or office supplies, are not included).
limitqueryintegerNotices per page (anonymous: at most 10).
cursorquerystring`nextCursor` of the previous page.

Example

curl -s "https://api.arcadiumdata.io/v1/tenders?winnerDomain=siemens.com"

Response TendersPage

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "nextCursor": "string",
  "data": [
    {
      "id": "string",
      "source": "ted",
      "kind": "planning",
      "noticeType": "string",
      "procedureId": "string",
      "title": "string",
      "titleOriginal": "string",
      "language": "string",
      "buyer": {
        "name": "string",
        "country": "string",
        "nuts": "string",
        "city": "string",
        "type": "string"
      },
      "cpvCodes": [],
      "cpvDivision": "string",
      "cpvDivisionLabel": "string",
      "contractNature": "string",
      "procedureType": "string",
      "estimatedValue": {
        "amount": 1.5,
        "currency": "string",
        "eur": 1.5
      },
      "awardValue": {
        "amount": 1.5,
        "currency": "string",
        "eur": 1.5
      },
      "winners": [],
      "winnerCountries": [],
      "winnersWithheld": 1,
      "winnerDomains": [],
      "publishedOn": "string",
      "deadlineOn": "string",
      "url": "string"
    }
  ]
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

GET /v1/tenders/expiring

Re-tender Radar: public contracts that end in a window, with the current holder

Award notices (EU TED, UK Find a Tender) whose contract ends between `from` and `to` (default: today to 18 months on), soonest first, one row per procedure and winner set. Each row: buyer, CPV, current holders (organisations, with their website domain when the notice states one), value band (frameworks flagged: their value is a ceiling), how the end date was derived and the expected window of the follow-up call for tenders. Cursor pagination.

Works without a key (anonymous only with country or cpv (one value of country, cpv), at most 5 rows, no cursor); a key lifts the limits. Try it · listExpiringContracts

Parameters

NameInTypeDescription
countryquerystringBuyer in any of these countries (ISO 3166-1 alpha-2). Example: DE,AT
cpvquerystringCPV prefixes, 2-8 digits: 2 = division (72 = IT services), 8 = one code. Example: 72,48
fromquerystring (YYYY-MM-DD)Contracts ending on or after this day (default: today).
toquerystring (YYYY-MM-DD)Contracts ending on or before this day (default: 18 months after `from`, at most 36 months).
minValueEurquerynumberAwarded value (sane values only), else estimated value, at least this (EUR).
sectorquerystringSector preset: defence = defence and security procurement (defence ministries, armed forces and their agencies, Directive 2009/81/EC notices, military CPV codes, police and border security equipment; purchases of civilian commodities by defence buyers, such as medicines, food, fuel, cleaning or office supplies, are not included).
frameworksOnlyquerystringtrue = framework agreements only (the buyer has to set up the next one before the end).
kindquerystringUK Procurement Act 2023 notice view (UK Find a Tender), instead of award notices: pipeline = planned procurement (UK1 pipeline, UK3 planned procurement), terminated = contract termination (UK11, re-procurement soon), changed = contract change (UK10, the end date may have moved). The window (`from`/`to`) applies to the contract end the notice states; terminated and changed notices that state none use their publication day (`endOn`), and their default window starts 3 months before today. Default: awards.
limitqueryintegerContracts per page (anonymous: at most 10).
cursorquerystring`nextCursor` of the previous page.

Example

curl -s "https://api.arcadiumdata.io/v1/tenders/expiring?country=DE%2CAT"

Response ExpiringContractsPage

Shape generated from the schema; values are placeholders.

{
  "from": "string",
  "to": "string",
  "count": 1,
  "nextCursor": "string",
  "data": [
    {
      "id": "string",
      "procedureId": "string",
      "title": "string",
      "buyer": {
        "name": "string",
        "country": "string",
        "nuts": "string",
        "type": "string"
      },
      "cpvCodes": [],
      "cpvDivision": "string",
      "cpvDivisionLabel": "string",
      "contractNature": "string",
      "holders": [],
      "holdersWithheld": 1,
      "value": {
        "eur": 1.5,
        "basis": "award",
        "band": "under_100k"
      },
      "isFramework": true,
      "awardedOn": "string",
      "startOn": "string",
      "endOn": "string",
      "endBasis": "end_date",
      "durationMonths": 1.5,
      "renewalsMax": 1,
      "expectedRetender": {
        "from": "string",
        "to": "string"
      },
      "noticeCode": "string",
      "url": "string"
    }
  ]
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

GET /v1/tenders/suppliers/{id}

Contracts Intelligence: supplier profile (wins, buyers, CPVs, countries, timeline, concentration)

Every public contract award of one supplier since 2023-10 (latest 5,000), by its website domain or by the supplier key that market and expiring answers return. Buyer concentration (HHI, top-buyer share), sectors, countries, monthly timeline, contracts ending in the next 18 months and the 20 latest awards. Values leave out frameworks and implausible amounts; co-winners split a value equally.

Works without a key (anonymous point lookup, at most 5 rows); a key lifts the limits. Try it · getTenderSupplier

Parameters

NameInTypeDescription
id (required)pathstringSupplier website domain (siemens.com) or supplier key from a market or expiring answer (siemens-mobility-gmbh).

Example

curl -s "https://api.arcadiumdata.io/v1/tenders/suppliers/siemens.com"

Response SupplierProfile

Shape generated from the schema; values are placeholders.

{
  "id": "string",
  "name": "string",
  "names": [
    "string"
  ],
  "domain": "string",
  "homeCountries": [
    "string"
  ],
  "awards": 1,
  "frameworks": 1,
  "valueEur": 1.5,
  "medianValueEur": 1.5,
  "firstAwardOn": "string",
  "lastAwardOn": "string",
  "buyers": [
    {
      "key": "string",
      "name": "string",
      "country": "string",
      "awards": 1,
      "share": 1.5,
      "valueEur": 1.5
    }
  ],
  "buyerCount": 1,
  "buyerHhi": 1,
  "topBuyerShare": 1.5,
  "top3BuyerShare": 1.5,
  "cpvDivisions": [
    {
      "division": "string",
      "label": "string",
      "awards": 1,
      "share": 1.5
    }
  ],
  "buyerCountries": [
    {
      "country": "string",
      "awards": 1,
      "share": 1.5
    }
  ],
  "crossBorderShare": 1.5,
  "timeline": [
    {
      "month": "string",
      "awards": 1,
      "valueEur": 1.5
    }
  ],
  "endingNext18Months": 1,
  "recent": [
    {
      "id": "string",
      "title": "string",
      "buyerName": "string",
      "buyerCountry": "string",
      "cpvDivision": "string",
      "winners": [
        "string"
      ],
      "publishedOn": "string",
      "valueEur": 1.5,
      "isFramework": true,
      "endOn": "string",
      "url": "string"
    }
  ],
  "truncated": true,
  "asOf": "string"
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

GET /v1/tenders/markets

Contracts Intelligence: one market (country x CPV): top buyers and winners, HHI, award vs estimate

Award notices of the market in the window (default: the last 365 days): top winners and buyers, concentration (HHI of award and value shares, top-1/3/10 share), median award, awarded vs estimated value (p25/median/p75), cross-border share, repeat buyer-supplier pairs and awards per month. Give `country`, `cpv` or both.

Works without a key (anonymous preview, at most 5 rows, one value of country, cpv); a key lifts the limits. Try it · getTenderMarket

Parameters

NameInTypeDescription
countryquerystringBuyer countries (ISO alpha-2). Give country, cpv or both. Example: DE
cpvquerystringCPV prefixes, 2-8 digits. Example: 72
sincequerystring (YYYY-MM-DD)Award notices published on or after this day (default: 365 days ago).
untilquerystring (YYYY-MM-DD)Award notices published on or before this day (default: today).

Example

curl -s "https://api.arcadiumdata.io/v1/tenders/markets"

Response TendersMarket

Shape generated from the schema; values are placeholders.

{
  "country": [
    "string"
  ],
  "cpv": [
    "string"
  ],
  "since": "string",
  "until": "string",
  "awards": 1,
  "awardsWithWinner": 1,
  "awardsWithWithheldWinner": 1,
  "frameworks": 1,
  "winnerCount": 1,
  "buyerCount": 1,
  "valueEur": 1.5,
  "medianValueEur": 1.5,
  "awardToEstimate": {
    "awards": 1,
    "sameAsEstimate": 1,
    "p25": 1.5,
    "median": 1.5,
    "p75": 1.5
  },
  "crossBorder": {
    "awards": 1,
    "share": 1.5
  },
  "concentration": {
    "hhiAwards": 1,
    "hhiValue": 1,
    "level": "unconcentrated",
    "top1Share": 1.5,
    "top3Share": 1.5,
    "top10Share": 1.5
  },
  "topWinners": [
    {
      "key": "string",
      "name": "string",
      "country": "string",
      "domain": "string",
      "awards": 1,
      "share": 1.5,
      "valueEur": 1.5
    }
  ],
  "topBuyers": [
    {
      "key": "string",
      "name": "string",
      "country": "string",
      "domain": "string",
      "awards": 1,
      "share": 1.5,
      "valueEur": 1.5
    }
  ],
  "repeatPairs": [
    {
      "buyer": "string",
      "buyerCountry": "string",
      "winner": "string",
      "winnerKey": "string",
      "awards": 1
    }
  ],
  "months": [
    {
      "month": "string",
      "awards": 1
    }
  ],
  "asOf": "string"
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

GET /v1/tenders/leaders

Who wins public contracts: top winners and buyers of award notices for a CPV, keyword and country

Award notices of the current calendar month and the `months - 1` before it (default 12 months) matching at least one of `country`, `cpv` and `q`: the organisations that won most often (with total awarded value in EUR) and the buyers that awarded most, plus the 5 newest award notices. A notice with several winners counts once for each and its value is split evenly; a winner domain is only given when the notice names one winner and one website. Backs the free tool /tools/tender-winners/.

Works without a key (anonymous preview, at most 5 rows, one value of country, cpv); a key lifts the limits. Try it · getTenderLeaders

Parameters

NameInTypeDescription
qquerystringWords in the notice title, buyer or winner names.
countryquerystringBuyer countries (ISO 3166-1 alpha-2). Example: DE
cpvquerystringCPV prefixes, 2-8 digits (72 = IT services). Example: 72
monthsqueryintegerWindow in calendar months, the current one included (12 = this month and the 11 before).
sectorquerystringSector preset: defence = defence and security procurement (defence ministries, armed forces and their agencies, Directive 2009/81/EC notices, military CPV codes, police and border security equipment; purchases of civilian commodities by defence buyers, such as medicines, food, fuel, cleaning or office supplies, are not included).
limitqueryintegerRows per list (anonymous: at most 10).

Example

curl -s "https://api.arcadiumdata.io/v1/tenders/leaders"

Response TenderLeaders

Shape generated from the schema; values are placeholders.

{
  "filter": {
    "q": "string",
    "countries": [
      "string"
    ],
    "cpv": [
      "string"
    ],
    "cpvLabel": "string",
    "sector": "defence"
  },
  "since": "string",
  "until": "string",
  "awards": 1,
  "awardsWithValue": 1,
  "valueEur": 1.5,
  "winners": [
    {
      "name": "string",
      "domain": "string",
      "registryId": "string",
      "country": "string",
      "awards": 1,
      "valueEur": 1.5
    }
  ],
  "buyers": [
    {
      "name": "string",
      "domain": "string",
      "registryId": "string",
      "country": "string",
      "awards": 1,
      "valueEur": 1.5
    }
  ],
  "sample": [
    {
      "id": "string",
      "source": "ted",
      "kind": "planning",
      "noticeType": "string",
      "procedureId": "string",
      "title": "string",
      "titleOriginal": "string",
      "language": "string",
      "buyer": {
        "name": "string",
        "country": "string",
        "nuts": "string",
        "city": "string",
        "type": "string"
      },
      "cpvCodes": [],
      "cpvDivision": "string",
      "cpvDivisionLabel": "string",
      "contractNature": "string",
      "procedureType": "string",
      "estimatedValue": {
        "amount": 1.5,
        "currency": "string",
        "eur": 1.5
      },
      "awardValue": {
        "amount": 1.5,
        "currency": "string",
        "eur": 1.5
      },
      "winners": [],
      "winnerCountries": [],
      "winnersWithheld": 1,
      "winnerDomains": [],
      "publishedOn": "string",
      "deadlineOn": "string",
      "url": "string"
    }
  ],
  ...

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

Energy

GET /v1/energy/projects

Grid-connection and renewable project pipeline (DE + GB, 1 MW and up)

Wind, solar, storage, biomass and hydro units of at least 1 MW from the German Marktstammdatenregister (planned, in operation, shut down, decommissioned; Bundesland, district and municipality, grid operator, operating company with its website domain and registry id where known) and the GB NESO Transmission Entry Capacity and Embedded registers (queue entries with Gate 1/2, consent stage, connection date). Largest first. `changedSince` returns only projects whose status, capacity or dates changed in a load cycle. Companies only: natural-person operators are left out, and no coordinates or street addresses are published. Cursor pagination. Sources: Marktstammdatenregister, Bundesnetzagentur (DL-DE-BY-2.0); NESO Open Data (Supported by National Energy SO Open Data).

Works without a key (anonymous only with country or technology or region or operatorDomain (one value of country, technology), at most 10 rows, no cursor); a key lifts the limits. Try it · searchEnergyProjects

Parameters

NameInTypeDescription
countryquerystringISO 3166-1 alpha-2 country of the project: DE (Marktstammdatenregister) or GB (NESO TEC + Embedded registers).
technologyquerystringTechnology; a hybrid project matches every technology it lists.
minMwquerynumberCapacity of at least this many MW (the data holds projects of 1 MW and up).
statusquerystringplanned (scoping / in planning), permitted (consents approved), under_construction, in_operation, shut_down, decommissioned.
changedSincequerystring (YYYY-MM-DD)Only projects whose status, capacity or dates changed on or after this day (a monthly load cycle).
regionquerystringDE Bundesland, for example Bayern or Nordrhein-Westfalen.
operatorDomainquerystringWebsite domain of the operating company.
limitqueryintegerProjects per page, largest first (anonymous: at most 10).
cursorquerystring`nextCursor` of the previous page.

Example

curl -s "https://api.arcadiumdata.io/v1/energy/projects?country=DE"

Response EnergyProjectsPage

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "nextCursor": "string",
  "data": [
    {
      "id": "string",
      "source": "de_mastr",
      "country": "string",
      "name": "string",
      "technology": "string",
      "technologies": [],
      "status": "planned",
      "capacityMw": 1.5,
      "capacityChangeMw": 1.5,
      "commissioningDate": "string",
      "expectedDate": "string",
      "endDate": "string",
      "queueGate": 1,
      "region": "string",
      "district": "string",
      "municipality": "string",
      "connectionSite": "string",
      "gridOperator": "string",
      "operatorName": "string",
      "operatorDomain": "string",
      "operatorCompanyId": "string",
      "firstSeen": "string",
      "lastSeen": "string",
      "active": true,
      "changedAt": "string"
    }
  ]
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

GET /v1/energy/projects/{id}

One energy project with its change history

Works without a key (anonymous point lookup); a key lifts the limits. Try it · getEnergyProject

Parameters

NameInTypeDescription
id (required)pathstringProject id from a search result, for example de_mastr:SEE940146675093.

Example

curl -s "https://api.arcadiumdata.io/v1/energy/projects/siemens.com"

Response EnergyProjectDetail

Shape generated from the schema; values are placeholders.

{
  "id": "string",
  "source": "de_mastr",
  "country": "string",
  "name": "string",
  "technology": "string",
  "technologies": [
    "string"
  ],
  "status": "planned",
  "capacityMw": 1.5,
  "capacityChangeMw": 1.5,
  "commissioningDate": "string",
  "expectedDate": "string",
  "endDate": "string",
  "queueGate": 1,
  "region": "string",
  "district": "string",
  "municipality": "string",
  "connectionSite": "string",
  "gridOperator": "string",
  "operatorName": "string",
  "operatorDomain": "string",
  "operatorCompanyId": "string",
  "firstSeen": "string",
  "lastSeen": "string",
  "active": true,
  "changedAt": "string",
  "events": [
    {
      "day": "string",
      "type": "new_project",
      "oldValue": "string",
      "newValue": "string"
    }
  ]
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

Emissions

GET /v1/emissions/companies

Company-level emissions: EU ETS operators with LEI, website and parent (CBAM, financed emissions)

Operators (legal entities only) of the EU Emissions Trading System, largest emitter first: verified emissions and free allocation per year since 2013, the allocation gap (allowances to buy, the exposure CBAM phases in from 2026), sectors and CBAM goods sectors, installation count and the five biggest installations. Each operator is joined to its LEI, website domain and ultimate parent (GLEIF Level 2) where the EU Company ID table can prove the link; `domainMethod` says how. Filter by `domain` (operator or group: an ultimate parent domain returns its operators with `matched: parent`), `lei` (operator or ultimate parent), `country` and `sector`. Cursor pagination. Sources: European Commission Union Registry (CC BY 4.0), GLEIF (CC0); attribution: "Source: European Commission, Union Registry of the EU ETS".

Works without a key (anonymous only with domain or lei or country (one value of country, sector), at most 5 rows, no cursor); a key lifts the limits. Try it · searchEmissionsCompanies

Parameters

NameInTypeDescription
domainquerystringWebsite domain, e.g. rwe.com. Matches operators whose own domain it is and, as `matched: parent`, operators whose ultimate parent (GLEIF Level 2) it is.
leiquerystringLEI of the operator or of its ultimate parent (group view).
countryquerystringRegistry country of the operator (ISO 3166-1 alpha-2).
sectorquerystringSector group of at least one installation of the operator.
limitqueryintegerOperators per page, largest emitter first (anonymous: at most 5).
cursorquerystring`nextCursor` of the previous page.

Example

curl -s "https://api.arcadiumdata.io/v1/emissions/companies?domain=stripe.com"

Response EmissionsCompaniesPage

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "nextCursor": "string",
  "data": [
    {
      "id": "string",
      "name": "string",
      "country": "string",
      "domain": "string",
      "domainMethod": "lei",
      "parentDomain": "string",
      "lei": "string",
      "ultimateParentLei": "string",
      "companyId": "string",
      "city": "string",
      "installations": 1,
      "latestYear": 1,
      "verifiedT": 1.5,
      "freeAllocationT": 1.5,
      "allocationGapT": 1.5,
      "sectors": [],
      "cbamSectors": [],
      "matched": "operator",
      "years": [],
      "topInstallations": []
    }
  ]
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

GET /v1/emissions/installations/{id}

One EU ETS installation: yearly emissions, allocation, compliance, change history

One installation, aircraft operator or shipping company of the EU ETS (ids like `eutl:DE:975`): verified emissions and free allocation per year, Union Registry compliance code, its operator with LEI, domain and ultimate parent, change events (new installation, emissions jump or drop of 25% or more, compliance change, account closed) and, where the Industrial Emissions Portal facility states the ETS id, the facility parent company and latest pollutant releases (EEA, CC BY 4.0).

Works without a key (anonymous point lookup); a key lifts the limits. Try it · getEmissionsInstallation

Parameters

NameInTypeDescription
id (required)pathstringInstallation id from a company result, for example eutl:DE:975.

Example

curl -s "https://api.arcadiumdata.io/v1/emissions/installations/siemens.com"

Response EmissionsInstallation

Shape generated from the schema; values are placeholders.

{
  "id": "string",
  "kind": "stationary",
  "country": "string",
  "registryId": "string",
  "permitId": "string",
  "name": "string",
  "activity": "string",
  "activityCode": "string",
  "sector": "power_heat",
  "cbamSector": "cement",
  "open": true,
  "closedOn": "string",
  "firstYear": 1,
  "lastYear": 1,
  "complianceCode": "string",
  "complianceLabel": "compliant",
  "complianceYear": 1,
  "totalVerifiedT": 1.5,
  "totalSurrenderedT": 1.5,
  "latestYear": 1,
  "verifiedT": 1.5,
  "freeAllocationT": 1.5,
  "active": true,
  "changedAt": "string",
  "operator": {
    "id": "string",
    "name": "string",
    "domain": "string",
    "lei": "string",
    "ultimateParentLei": "string",
    "parentDomain": "string",
    "companyId": "string"
  },
  "years": [
    {
      "year": 1,
      "verifiedT": 1.5,
      "freeAllocationT": 1.5
    }
  ],
  "events": [
    {
      "day": "string",
      "type": "new_installation",
      "year": 1,
      "oldValue": "string",
      "newValue": "string"
    }
  ],
  "facility": {
    "id": "string",
    "name": "string",
    "city": "string",
    "parentCompany": "string",
    "parentDomain": "string",
    "releases": [
      {
        "year": 1,
        "medium": "string",
        "pollutant": "string",
        "quantityKg": 1.5
      }
    ]
  }
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

Clinical trials

GET /v1/trials

Clinical trials by sponsor, phase, status, condition and country, merged across ClinicalTrials.gov and EU CTIS

Trials from ClinicalTrials.gov and the EU CTIS public portal, one record per trial (a trial that one register cites in the other is merged), newest change first. Filters: `sponsor` (company website domain), `sponsorClass`, `phase`, `status`, `condition` (condition or MeSH words), `area`, `country` and `changedSince` (new trial, phase move, status change such as completed, terminated or suspended, moved dates). Each trial: registry ids, title, phase, status, conditions, intervention types, countries, start and primary completion date, enrolment target, number of sites, sponsor organisation and type. Organisation-level only: no investigators, contacts or site names. Cursor pagination.

Works without a key (anonymous only with sponsor or condition or area (one value of phase, status, country), at most 5 rows, no cursor); a key lifts the limits. Try it · listTrials

Parameters

NameInTypeDescription
sponsorquerystringSponsor company website domain, e.g. pfizer.com (trials of sponsors we joined to that domain).
sponsorClassquerystringType of sponsor.
phasequerystringPhases: early_phase1, phase1, phase1_2, phase2, phase2_3, phase3, phase4, na. Example: phase2,phase3
statusquerystringStatuses: planned (under evaluation), not_yet_recruiting, recruiting, active_not_recruiting, suspended, completed, terminated, withdrawn, unknown. Example: recruiting
conditionquerystringWords in a condition or MeSH term, e.g. "multiple sclerosis".
areaquerystringCondition area, e.g. oncology or cardiovascular.
countryquerystringTrials with a site or authorisation in any of these countries (ISO 3166-1 alpha-2). Example: DE,FR
changedSincequerystring (YYYY-MM-DD)Only trials whose record changed on or after this day (new trial, phase, status, dates, sites).
limitqueryintegerTrials per page (anonymous: at most 5).
cursorquerystring`nextCursor` of the previous page.

Example

curl -s "https://api.arcadiumdata.io/v1/trials?sponsor=sponsor"

Response TrialsPage

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "nextCursor": "string",
  "data": [
    {
      "id": "string",
      "ids": {
        "nct": "string",
        "euCt": "string",
        "eudract": "string",
        "isrctn": "string"
      },
      "sources": [],
      "title": "string",
      "phase": "early_phase1",
      "status": "planned",
      "studyType": "interventional",
      "conditions": [],
      "meshTerms": [],
      "conditionAreas": [],
      "interventionTypes": [],
      "countries": [],
      "startDate": "string",
      "primaryCompletionDate": "string",
      "enrolmentTarget": 1,
      "sites": 1,
      "sponsor": {
        "name": "string",
        "class": "industry",
        "domain": "string"
      },
      "firstPostedOn": "string",
      "updatedAt": "string",
      "links": {
        "clinicaltrialsGov": "string",
        "ctis": "string"
      }
    }
  ],
  "note": "string"
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

GET /v1/trials/sponsors/{domain}

Clinical-trial pipeline of one sponsor company: phases, statuses, areas, countries, recent changes, hiring and tenders

The pipeline of one sponsor, by its website domain: trials by phase, status, condition area and country, trials first posted in the last 90 days, its newest trial changes (new trial, phase move, status change, moved dates), open clinical and regulatory roles on its own career sites, public contract awards it won and its registry ids (EU Company ID). 404 when no sponsor with this domain has trials.

Works without a key (anonymous point lookup); a key lifts the limits. Try it · getTrialSponsor

Parameters

NameInTypeDescription
domain (required)pathstringSponsor company website domain, e.g. pfizer.com.

Example

curl -s "https://api.arcadiumdata.io/v1/trials/sponsors/stripe.com"

Response TrialSponsorProfile

Shape generated from the schema; values are placeholders.

{
  "domain": "string",
  "name": "string",
  "sponsorClass": "industry",
  "trials": 1,
  "open": 1,
  "byPhase": [
    {
      "value": "string",
      "trials": 1
    }
  ],
  "byStatus": [
    {
      "value": "string",
      "trials": 1
    }
  ],
  "byArea": [
    {
      "value": "string",
      "trials": 1
    }
  ],
  "topCountries": [
    {
      "value": "string",
      "trials": 1
    }
  ],
  "topConditions": [
    {
      "value": "string",
      "trials": 1
    }
  ],
  "newTrialsLast90Days": 1,
  "firstPostedOn": "string",
  "recentChanges": [
    {
      "trialId": "string",
      "type": "new_trial",
      "field": "string",
      "from": "string",
      "to": "string",
      "day": "string",
      "title": "string",
      "phase": "string",
      "countries": []
    }
  ],
  "hiring": {
    "openClinicalRoles": 1,
    "sampleTitles": [
      "string"
    ]
  },
  "tenders": {
    "awards": 1,
    "valueEur": 1.5,
    "lastAwardOn": "string",
    "topBuyerCountries": [
      "string"
    ]
  },
  "registryIds": [
    {
      "type": "string",
      "value": "string"
    }
  ],
  "asOf": "string",
  "note": "string"
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

Medical devices

GET /v1/devices/manufacturers

Medical-device manufacturers in EUDAMED, with certificates and FDA cross-reference

Manufacturers (legal entities only) registered in the EU medical-device database EUDAMED: Single Registration Number, seat, website domain, registry / VAT ids of that domain, number of registered devices by risk class, valid MDR/IVDR certificates and their notified bodies, whether a non-EU manufacturer names an EU authorised representative, and the matched US FDA establishment registrations (510(k)/PMA listed). Filter by `domain`, `srn`, name prefix `q`, `country`, `risk_class`, `us_cleared`, `no_eu_ar`, `cert_expiring` (valid certificate expiring within 90 days) and `no_devices`. Source: EUDAMED public data (European Commission) and openFDA registration & listing (public domain); contact persons, e-mail addresses and phone numbers are never included.

Works without a key (anonymous only with domain or srn, at most 10 rows, no cursor); a key lifts the limits. Try it · listDeviceManufacturers

Parameters

NameInTypeDescription
domainquerystringManufacturer website domain (the mailbox host it published in EUDAMED), e.g. biotronik.com.
srnquerystringEUDAMED Single Registration Number of the manufacturer.
qquerystringName prefix (legal forms and punctuation ignored).
countryquerystringRegistered seat, ISO 3166-1 alpha-2 (UK is GB).
risk_classquerystringHas at least one device of this class: class-i, class-iia, class-iib, class-iii (MDR) or class-a..class-d (IVDR).
us_clearedquerystringtrue = a matched FDA establishment lists a 510(k) or PMA.
no_eu_arquerystringtrue = non-EU manufacturer with no EU authorised representative named on any registered device.
cert_expiringquerystringtrue = has an issued certificate that expires within 90 days.
no_devicesquerystringtrue = registered as manufacturer but with no device registered yet.
limitqueryintegerManufacturers per page (anonymous: at most 10).
cursorquerystring`nextCursor` of the previous page.

Example

curl -s "https://api.arcadiumdata.io/v1/devices/manufacturers?domain=stripe.com"

Response DeviceManufacturersPage

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "total": 1,
  "nextCursor": "string",
  "asOf": "string",
  "data": [
    {
      "srn": "string",
      "name": "string",
      "country": "string",
      "euMember": true,
      "city": "string",
      "domain": "string",
      "registeredOn": "string",
      "registryIds": [],
      "devices": {
        "total": 1,
        "onMarket": 1,
        "byRiskClass": {}
      },
      "certificates": {
        "issued": 1,
        "expiringWithin90Days": 1,
        "notifiedBodies": []
      },
      "euAuthorisedRepresentative": true,
      "fda": {
        "registrations": 1,
        "listings": 1,
        "cleared": true
      }
    }
  ]
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

GET /v1/devices

Registered medical devices (UDI-DI) of one manufacturer, with its certificates and FDA matches

Devices registered in EUDAMED by one manufacturer, chosen by `manufacturer_domain` or `manufacturer_srn`: UDI-DI, basic UDI-DI, trade name, catalogue reference, risk class, status and EMDN nomenclature where filled; plus the manufacturer block, its certificates (notified body, validity) and the matched FDA establishments. When a domain belongs to several EUDAMED manufacturers (a group), the devices of all of them are listed and `manufacturer` is the largest; narrow with `manufacturer_srn`.

Works without a key (anonymous only with manufacturer_domain or manufacturer_srn, at most 10 rows, no cursor); a key lifts the limits. Try it · listDevices

Parameters

NameInTypeDescription
manufacturer_domainquerystringManufacturer website domain, e.g. biotronik.com. Give this or manufacturer_srn.
manufacturer_srnquerystringEUDAMED Single Registration Number of the manufacturer.
risk_classquerystringOnly devices of this class (class-i, class-iia, class-iib, class-iii, class-a..class-d).
statusquerystringDevice status code, e.g. on-the-market, no-longer-placed-on-the-market.
limitqueryintegerDevices per page (anonymous: at most 10).
cursorquerystring`nextCursor` of the previous page.

Example

curl -s "https://api.arcadiumdata.io/v1/devices"

Response DevicesPage

Shape generated from the schema; values are placeholders.

{
  "manufacturer": {
    "srn": "string",
    "name": "string",
    "country": "string",
    "euMember": true,
    "city": "string",
    "domain": "string",
    "registeredOn": "string",
    "registryIds": [
      {
        "type": "string",
        "value": "string",
        "confidence": 1.5,
        "sources": []
      }
    ],
    "devices": {
      "total": 1,
      "onMarket": 1,
      "byRiskClass": {}
    },
    "certificates": {
      "issued": 1,
      "expiringWithin90Days": 1,
      "notifiedBodies": []
    },
    "euAuthorisedRepresentative": true,
    "fda": {
      "registrations": 1,
      "listings": 1,
      "cleared": true
    }
  },
  "certificates": [
    {
      "number": "string",
      "notifiedBody": "string",
      "type": "string",
      "status": "string",
      "issuedOn": "string",
      "expiresOn": "string"
    }
  ],
  "matches": [
    {
      "registrationNumber": "string",
      "name": "string",
      "country": "string",
      "city": "string",
      "method": "name_country",
      "productCodes": [
        "string"
      ],
      "clearances": 1
    }
  ],
  "count": 1,
  "total": 1,
  "nextCursor": "string",
  "asOf": "string",
  "data": [
    {
      "udiDi": "string",
      "basicUdi": "string",
      "tradeName": "string",
      "reference": "string",
      "riskClass": "string",
      "status": "string",
      "emdn": {
        "code": "string",
        "name": "string"
      },
      "authorisedRepresentativeSrn": "string"
    }
  ]
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

GET /v1/devices/events

Change events: new registrations, certificates issued / expiring / withdrawn (needs an API key)

New manufacturer and device registrations in EUDAMED, certificates issued, expiring within 90 days, withdrawn or expired, and new FDA establishment registrations, newest first. Events start with the first complete load of each source (no backfill of history).

Needs an API key. Try it · listDeviceEvents

Parameters

NameInTypeDescription
srnquerystringOnly events of this manufacturer.
kindquerystring
sincequerystring (YYYY-MM-DD)Events on or after this day.
limitqueryinteger

Example

curl -s "https://api.arcadiumdata.io/v1/devices/events" \
  -H "Authorization: Bearer $ARCADIUM_API_KEY"

Response DeviceEvents

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "data": [
    {
      "kind": "string",
      "srn": "string",
      "key": "string",
      "occurredOn": "string",
      "detail": {}
    }
  ]
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

Pharma sites

GET /v1/pharma/sites

Pharma manufacturing and distribution sites: EU GMP/GDP status, licences, non-compliance and FDA record

Sites from EudraGMDP (EMA public register): OMS organisation / location ids, name, address, country, the number of valid GMP and GDP certificates, manufacturing (MIA) and wholesale (WDA) authorisations and active-substance registrations, GMP statements of non-compliance in force, and matched US FDA inspection classifications (NAI / VAI / OAI) and drug warning letters. Each site is joined to a company website domain and registry id where its legal name matches (method and confidence given). Filter by `country`, `domain`, `registry_id`, `status`, `since` (changed on or after) and name prefix `q`. Organisations only: qualified persons, responsible persons, inspectors and authority contacts are never included; a site whose name reads as a person is left out. Status per the sources on the date shown, not a finding about the company.

Works without a key (anonymous only with domain or registry_id, at most 10 rows, no cursor); a key lifts the limits. Try it · listPharmaSites

Parameters

NameInTypeDescription
countryquerystringSite country, ISO 3166-1 alpha-2 (UK and Northern Ireland are GB).
domainquerystringCompany website domain the site organisation is joined to, e.g. sanofi.com.
registry_idquerystringCompany registry id of the site organisation, as `type:value` (fr_siren:395030844) or the bare value.
statusquerystringnon_compliant = a GMP statement of non-compliance in force; fda_oai = latest matched FDA inspection Official Action Indicated; warning_letter = matched FDA drug warning letter in the last 2 years; certified = valid GMP/GDP certificate; authorised = MIA/WDA/active-substance registration only; listed = no public document.
sincequerystring (YYYY-MM-DD)Only sites with a change (document, statement, FDA record) on or after this day.
qquerystringSite organisation name prefix (legal forms ignored).
limitqueryintegerSites per page (anonymous: at most 10).
cursorquerystring`nextCursor` of the previous page.

Example

curl -s "https://api.arcadiumdata.io/v1/pharma/sites?domain=stripe.com"

Response PharmaSitesPage

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "total": 1,
  "nextCursor": "string",
  "asOf": "string",
  "notice": "string",
  "data": [
    {
      "siteKey": 1,
      "locId": "string",
      "orgId": "string",
      "name": "string",
      "address": "string",
      "country": "string",
      "company": {
        "domain": "string",
        "registryId": "string",
        "method": "string",
        "confidence": 1.5
      },
      "status": "non_compliant",
      "certificates": {
        "gmp": 1,
        "gdp": 1,
        "latestGmpIssuedOn": "string"
      },
      "authorisations": {
        "mia": 1,
        "wda": 1,
        "activeSubstanceRegistrations": 1
      },
      "nonCompliance": {
        "inForce": 1,
        "latestIssuedOn": "string"
      },
      "fda": {
        "inspections": 1,
        "oai": 1,
        "latestClassification": "string",
        "latestInspectionEnd": "string",
        "warningLetters": 1,
        "latestWarningLetterOn": "string"
      },
      "lastChange": "string",
      "url": "string"
    }
  ]
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

GET /v1/pharma/sites/{id}

One pharma site: its EudraGMDP documents, non-compliance statements, FDA inspections and warning letters

One site by EudraGMDP site key or OMS location id: the site block of the list, every certificate and authorisation listed now (type, number, issuing authority, status, issue date, link to the public document), GMP statements of non-compliance (in force or lifted), matched FDA inspection classifications and drug warning letters (with match confidence and the letter link) and the change events we recorded.

Works without a key (anonymous point lookup); a key lifts the limits. Try it · getPharmaSite

Parameters

NameInTypeDescription
id (required)pathstringEudraGMDP site key (3979) or OMS location id (LOC-100021398).

Example

curl -s "https://api.arcadiumdata.io/v1/pharma/sites/siemens.com"

Response PharmaSiteDetail

Shape generated from the schema; values are placeholders.

{
  "asOf": "string",
  "notice": "string",
  "site": {
    "siteKey": 1,
    "locId": "string",
    "orgId": "string",
    "name": "string",
    "address": "string",
    "country": "string",
    "company": {
      "domain": "string",
      "registryId": "string",
      "method": "string",
      "confidence": 1.5
    },
    "status": "non_compliant",
    "certificates": {
      "gmp": 1,
      "gdp": 1,
      "latestGmpIssuedOn": "string"
    },
    "authorisations": {
      "mia": 1,
      "wda": 1,
      "activeSubstanceRegistrations": 1
    },
    "nonCompliance": {
      "inForce": 1,
      "latestIssuedOn": "string"
    },
    "fda": {
      "inspections": 1,
      "oai": 1,
      "latestClassification": "string",
      "latestInspectionEnd": "string",
      "warningLetters": 1,
      "latestWarningLetterOn": "string"
    },
    "lastChange": "string",
    "url": "string"
  },
  "documents": [
    {
      "type": "string",
      "id": 1,
      "number": "string",
      "authority": "string",
      "status": "string",
      "issuedOn": "string",
      "url": "string"
    }
  ],
  "nonCompliance": [
    {
      "docRef": 1,
      "reportNumber": "string",
      "inspectionEnd": "string",
      "issuedOn": "string",
      "inForce": true,
      "url": "string"
    }
  ],
  "fdaInspections": [
    {
      "inspectionId": "string",
      "fei": "string",
      "inspectionEnd": "string",
      "classification": "string",
      "productType": "string",
      "projectArea": "string",
      "confidence": 1.5
    }
  ],
  "warningLetters": [
    {
      "issuedOn": "string",
  ...

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

Planning

GET /v1/planning/applications

UK and Ireland construction leads: commercial and large residential planning applications

Non-householder planning applications from official open data: Ireland (National Planning Applications, Department of Housing, CC BY 4.0) and Great Britain (London Borough of Camden, City of Bradford, Northumberland major applications; Open Government Licence). Householder and minor classes are dropped; commercial schemes and residential schemes of 10+ units are kept. Each row has the authority, reference, development description, type, project kind, units / floor area where stated, status (submitted, granted, refused, withdrawn, appealed, decided), dates, town and postcode district (never a street), the authority's public record URL and, where published, the COMPANY applicant with its Companies House number and website domain. Applicants who read as natural persons, agents, architects, e-mail addresses and phone numbers are never included; Ireland publishes no applicant. Filters: `country`, `authority`, `type`, `kind`, `status`, `min_units`, `min_floor_area`, `changed_since` (status moves and new applications), `with_applicant`. Newest change first.

Works without a key (anonymous only with country or authority (one value of country, authority), at most 5 rows, no cursor); a key lifts the limits. Try it · listPlanningApplications

Parameters

NameInTypeDescription
countryquerystringGB (UK) or IE.
authorityquerystringPlanning authority name, case-insensitive substring, e.g. "Cork" or "Camden".
typequerystringNormalised application type.
kindquerystringProject kind.
statusquerystringCurrent status of the application.
min_unitsqueryintegerResidential units stated by the record.
min_floor_areaqueryintegerFloor area in square metres (Ireland only; the UK feeds do not publish it).
changed_sincequerystring (YYYY-MM-DD)Applications first seen or whose status moved on or after this day (YYYY-MM-DD).
with_applicantquerystringtrue = only applications with a company applicant (Great Britain; Ireland publishes no applicant).
limitqueryintegerApplications per page (anonymous: at most 10).
cursorquerystring`nextCursor` of the previous page.

Example

curl -s "https://api.arcadiumdata.io/v1/planning/applications?country=DE"

Response PlanningApplicationsPage

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "total": 1,
  "nextCursor": "string",
  "asOf": "string",
  "data": [
    {
      "id": "string",
      "country": "string",
      "authority": "string",
      "reference": "string",
      "description": "string",
      "type": "string",
      "kind": "string",
      "units": 1,
      "floorAreaM2": 1.5,
      "status": "string",
      "receivedOn": "string",
      "decidedOn": "string",
      "changedOn": "string",
      "town": "string",
      "postcodeDistrict": "string",
      "url": "string",
      "applicant": {
        "name": "string",
        "registryType": "string",
        "registryId": "string",
        "domain": "string"
      }
    }
  ]
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

GET /v1/planning/companies/{domain}

Planning activity of one developer or builder, with its registry id and construction tender wins

Company applicants (legal entities only) that filed planning applications, by website domain: Companies House number, number of applications and how many were granted, refused or are pending, residential units, planning authorities, first / last application date, its most recent applications, and the construction-works (CPV 45) public contracts the same domain won in our tender index (count, value, last notice). 404 when no application names a company applicant for the domain.

Works without a key (anonymous point lookup, at most 5 rows); a key lifts the limits. Try it · getPlanningCompany

Parameters

NameInTypeDescription
domain (required)pathstringCompany website domain or URL, e.g. stripe.com.

Example

curl -s "https://api.arcadiumdata.io/v1/planning/companies/stripe.com"

Response PlanningCompany

Shape generated from the schema; values are placeholders.

{
  "domain": "string",
  "name": "string",
  "country": "string",
  "registryType": "string",
  "registryId": "string",
  "applications": 1,
  "granted": 1,
  "refused": 1,
  "pending": 1,
  "units": 1,
  "authorities": [
    "string"
  ],
  "firstReceived": "string",
  "lastReceived": "string",
  "recent": [
    {
      "id": "string",
      "country": "string",
      "authority": "string",
      "reference": "string",
      "description": "string",
      "type": "string",
      "kind": "string",
      "units": 1,
      "floorAreaM2": 1.5,
      "status": "string",
      "receivedOn": "string",
      "decidedOn": "string",
      "changedOn": "string",
      "town": "string",
      "postcodeDistrict": "string",
      "url": "string",
      "applicant": {
        "name": "string",
        "registryType": "string",
        "registryId": "string",
        "domain": "string"
      }
    }
  ],
  "tenderWins": {
    "count": 1,
    "valueEur": 1,
    "lastPublished": "string"
  },
  "asOf": "string"
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

Gambling

GET /v1/gambling/domains/{domain}

Is this website licensed for gambling, where, by whom, and with which licence status

Looks a domain up on the official operator / domain lists of six gambling regulators: UK Gambling Commission (GB), GGL whitelist (DE), Spelinspektionen (SE), Spillemyndigheden (DK), DGOJ (ES) and Kansspelautoriteit (NL). Per market: the licence holder (company name, address country, registry ids where we can link them), its licences with type, status (active, pending, suspended, revoked, surrendered, lapsed, expired) and validity, the domain status (active, white label, inactive), `licensed` and the day we last read the list. `match` says whether the host itself is listed or another host of the same registrable domain. `notListedOn` names the lists we read where the domain is not found, with that day: not a statement that the site is illegal. For payment onboarding (MCC 7995), ad and affiliate review and compliance. Companies only: holders that read as natural persons are left out. EUR 0.05 per check.

Works without a key (anonymous point lookup, at most 6 rows); a key lifts the limits. Try it · checkGamblingDomain

Parameters

NameInTypeDescription
domain (required)pathstringCompany website domain or URL, e.g. stripe.com.

Example

curl -s "https://api.arcadiumdata.io/v1/gambling/domains/stripe.com"

Response GamblingDomainCheck

Shape generated from the schema; values are placeholders.

{
  "input": "string",
  "host": "string",
  "registrableDomain": "string",
  "licensed": true,
  "licensedIn": [
    "string"
  ],
  "markets": [
    {
      "regulator": "ukgc",
      "country": "string",
      "regulatorName": "string",
      "host": "string",
      "match": "exact",
      "path": "string",
      "domainStatus": "active",
      "onList": true,
      "licensed": true,
      "operator": {
        "key": "string",
        "name": "string",
        "country": "string",
        "registryIds": [],
        "url": "string"
      },
      "licences": [
        {
          "type": "string",
          "activity": "string",
          "channel": "online",
          "status": "active",
          "validFrom": "string",
          "validTo": "string",
          "number": "string"
        }
      ],
      "listedSince": "string",
      "lastSeen": "string",
      "removedOn": "string"
    }
  ],
  "notListedOn": [
    {
      "regulator": "ukgc",
      "country": "string",
      "name": "string",
      "checkedOn": "string"
    }
  ],
  "events": [
    {
      "regulator": "ukgc",
      "country": "string",
      "type": "operator_listed",
      "day": "string",
      "operatorKey": "string",
      "operatorName": "string",
      "subject": "string",
      "details": {}
    }
  ],
  "method": "string",
  "asOf": "string"
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

POST /v1/gambling/domains/check

Bulk licence check: up to 100 domains in one call

The same answer as GET /v1/gambling/domains/{domain} for up to 100 domains or URLs (duplicates collapsed), plus how many are licensed somewhere. For merchant portfolio reviews, ad-network and affiliate screening. Needs an API key; each domain checked is one metered row (EUR 0.05 per domain).

Needs an API key. Try it · bulkCheckGamblingDomains

Request body GamblingCheckRequest

{
  "domains": [
    "stripe.com",
    "spotify.com"
  ]
}

Example

curl -s -X POST "https://api.arcadiumdata.io/v1/gambling/domains/check" \
  -H "Authorization: Bearer $ARCADIUM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"domains":["stripe.com","spotify.com"]}'

Response GamblingCheckResponse

Shape generated from the schema; values are placeholders.

{
  "checked": 1,
  "licensed": 1,
  "method": "string",
  "asOf": "string",
  "results": [
    {
      "input": "string",
      "host": "string",
      "registrableDomain": "string",
      "licensed": true,
      "licensedIn": [
        "string"
      ],
      "markets": [
        {
          "regulator": "ukgc",
          "country": "string",
          "regulatorName": "string",
          "host": "string",
          "match": "exact",
          "path": "string",
          "domainStatus": "active",
          "onList": true,
          "licensed": true,
          "operator": {
            "key": "string",
            "name": "string",
            "country": "string",
            "registryIds": [],
            "url": "string"
          },
          "licences": [],
          "listedSince": "string",
          "lastSeen": "string",
          "removedOn": "string"
        }
      ],
      "notListedOn": [
        {
          "regulator": "ukgc",
          "country": "string",
          "name": "string",
          "checkedOn": "string"
        }
      ],
      "events": [
        {
          "regulator": "ukgc",
          "country": "string",
          "type": "operator_listed",
          "day": "string",
          "operatorKey": "string",
          "operatorName": "string",
          "subject": "string",
          "details": {}
        }
      ]
    }
  ]
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

GET /v1/gambling/operators

Licensed gambling operators per market, with licences, domains and registry ids

Licence holders on the six lists (GB, DE, SE, DK, ES, NL): name, the regulator's key and page, address country and city, registry ids (stated by the regulator, matched in a national register, or of the company behind the licensed website), active / total licences with types, and the listed hosts. Filters: `q` (part of the name), `regulator`, `country` (market), `includeRemoved`. Without a key: `q` is required and five rows are returned.

Works without a key (anonymous only with q, at most 5 rows, no cursor); a key lifts the limits. Try it · listGamblingOperators

Parameters

NameInTypeDescription
qquerystringPart of the licence holder name, e.g. leovegas.
regulatorquerystringukgc = Gambling Commission (GB), de_ggl = GGL whitelist (DE), se_sga = Spelinspektionen (SE), dk_dga = Spillemyndigheden (DK), es_dgoj = DGOJ (ES), nl_ksa = Kansspelautoriteit (NL).
countryquerystringMarket: GB, DE, SE, DK, ES or NL.
includeRemovedquerystringtrue = also holders that left the list (default: only holders on the list now).
limitqueryinteger
cursorquerystring

Example

curl -s "https://api.arcadiumdata.io/v1/gambling/operators?q=engineer"

Response GamblingOperators

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "total": 1,
  "nextCursor": "string",
  "regulators": [
    {
      "regulator": "ukgc",
      "country": "string",
      "name": "string",
      "checkedOn": "string"
    }
  ],
  "asOf": "string",
  "data": [
    {
      "regulator": "ukgc",
      "country": "string",
      "operatorKey": "string",
      "name": "string",
      "holderCountry": "string",
      "city": "string",
      "registryIds": [],
      "onList": true,
      "licencesActive": 1,
      "licences": 1,
      "licenceTypes": [],
      "domains": [],
      "domainsActive": 1,
      "firstSeen": "string",
      "lastSeen": "string",
      "url": "string"
    }
  ]
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

GET /v1/gambling/events

Change feed: licences granted, suspended, revoked or ended, domains added or removed

Dated changes between our loads of each regulator's list: `licence_granted`, `licence_suspended`, `licence_revoked`, `licence_ended` (surrendered, lapsed, expired), `licence_reinstated`, `licence_removed` (left a list that shows only valid licences), `domain_added`, `domain_removed`, `operator_listed`, `operator_delisted`. `day` is the list's own start / end day when it is recent, else the day our load saw the change. Filters: `regulator`, `country`, `type`, `since`. Newest first. The baseline of a list's first load is not included.

Needs an API key. Try it · listGamblingEvents

Parameters

NameInTypeDescription
regulatorquerystringukgc = Gambling Commission (GB), de_ggl = GGL whitelist (DE), se_sga = Spelinspektionen (SE), dk_dga = Spillemyndigheden (DK), es_dgoj = DGOJ (ES), nl_ksa = Kansspelautoriteit (NL).
countryquerystring
typequerystring
sincequerystring (YYYY-MM-DD)Events on or after this day (YYYY-MM-DD).
limitqueryinteger
cursorquerystring

Example

curl -s "https://api.arcadiumdata.io/v1/gambling/events" \
  -H "Authorization: Bearer $ARCADIUM_API_KEY"

Response GamblingEvents

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "total": 1,
  "nextCursor": "string",
  "asOf": "string",
  "data": [
    {
      "regulator": "ukgc",
      "country": "string",
      "type": "operator_listed",
      "day": "string",
      "operatorKey": "string",
      "operatorName": "string",
      "subject": "string",
      "details": {}
    }
  ]
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

Mergers

GET /v1/mergers

Merger-control filings: notified concentrations at the EU Commission, Bundeskartellamt and UK CMA

Merger cases from the competition authorities' own public lists: European Commission DG COMP case data (open data, every EU merger case since 1990, NACE codes), the Bundeskartellamt list of current merger proceedings (German filings, often the first public trace of a mid-market deal) and the UK CMA merger inquiries (GOV.UK). Each case has the authority, reference, title, sector / product-area labels, NACE codes (EC), normalised status (pending, phase2, cleared, cleared_with_conditions, prohibited, withdrawn, referred, closed) with the authority's own label, phase, notification / deadline / decision dates, the authority's case page, and the COMPANY parties with role (acquirer, target, jv, party), stated country and, where we can resolve it, website domain and registry id with a match method and confidence (below 0.7 = candidate). Parties that read as natural persons are never returned (`withheldParties` counts them); case-handler and adviser names are not stored. Filters: `authority`, `country` (authority jurisdiction EU / DE / GB, or a party's stated country), `sector`, `nace` (prefix), `status`, `since` (notified, moved or decided on or after), `party_domain`, `party_registry_id`, `party`. Newest activity first.

Works without a key (anonymous only with authority or country or nace or sector or party_domain or party_registry_id (one value of authority, country), at most 5 rows, no cursor); a key lifts the limits. Try it · listMergerFilings

Parameters

NameInTypeDescription
authorityquerystringec = European Commission, bkarta = Bundeskartellamt, cma = UK CMA.
countryquerystringAuthority jurisdiction (EU, DE, GB) or the stated country of any party (ISO alpha-2), e.g. DE or US.
sectorquerystringCase-insensitive substring of a sector / product-area label, e.g. "battery" or "Software".
nacequerystringNACE code prefix (EC cases), e.g. "C.20", "C20.14" or "46.46".
statusquerystring
sincequerystring (YYYY-MM-DD)Cases notified, whose status moved, or decided on or after this day (YYYY-MM-DD).
party_domainquerystringWebsite domain of a party, e.g. "volkswagen.com".
party_registry_idquerystringRegistry id or LEI of a resolved party.
partyquerystringCase-insensitive substring of a party name.
limitqueryintegerCases per page (anonymous: at most 5).
cursorquerystring`nextCursor` of the previous page.

Example

curl -s "https://api.arcadiumdata.io/v1/mergers?authority=ec"

Response MergerCasesPage

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "total": 1,
  "nextCursor": "string",
  "asOf": "string",
  "data": [
    {
      "id": "string",
      "authority": "string",
      "authorityName": "string",
      "jurisdiction": "string",
      "reference": "string",
      "title": "string",
      "sectors": [],
      "nace": [],
      "status": "string",
      "rawStatus": "string",
      "phase": 1,
      "simplified": true,
      "notifiedOn": "string",
      "deadlineOn": "string",
      "decidedOn": "string",
      "changedOn": "string",
      "url": "string",
      "parties": [],
      "withheldParties": 1
    }
  ]
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

GET /v1/mergers/{id}

One merger case with its parties and dated events (notified, phase 2, decisions)

One case by id `<authority>:<reference>` (e.g. `ec:M.12641`, `bkarta:B4-75/26`, `cma:<case-slug>`; URL-encode the slash): the case fields of GET /v1/mergers plus its events in date order (notified, phase2, cleared, cleared_with_conditions, prohibited, withdrawn, referred, closed, other) with the authority's own decision label. 404 when the id is unknown.

Works without a key (anonymous point lookup, at most 5 rows); a key lifts the limits. Try it · getMergerFiling

Parameters

NameInTypeDescription
id (required)pathstringCase id `<authority>:<reference>`, e.g. `ec:M.12641`.

Example

curl -s "https://api.arcadiumdata.io/v1/mergers/siemens.com"

Response MergerCaseDetail

Shape generated from the schema; values are placeholders.

{
  "id": "string",
  "authority": "string",
  "authorityName": "string",
  "jurisdiction": "string",
  "reference": "string",
  "title": "string",
  "sectors": [
    "string"
  ],
  "nace": [
    "string"
  ],
  "status": "string",
  "rawStatus": "string",
  "phase": 1,
  "simplified": true,
  "notifiedOn": "string",
  "deadlineOn": "string",
  "decidedOn": "string",
  "changedOn": "string",
  "url": "string",
  "parties": [
    {
      "name": "string",
      "role": "string",
      "country": "string",
      "domain": "string",
      "registryType": "string",
      "registryId": "string",
      "match": {
        "method": "string",
        "confidence": 1.5
      }
    }
  ],
  "withheldParties": 1,
  "events": [
    {
      "kind": "string",
      "date": "string",
      "label": "string"
    }
  ],
  "asOf": "string"
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

Reviews

GET /v1/reviews/snapshot

Rating trajectory of tracked review listings

Works without a key (anonymous point lookup); a key lifts the limits. Try it · getReviewSnapshot

Parameters

NameInTypeDescription
q (required)querystringListing URL, id or name.
platformquerystringgooglemaps, booking, tripadvisor, capterra, appstore, googleplay.
daysqueryintegerDays of history.
limitqueryintegerListings, 1-5.

Example

curl -s "https://api.arcadiumdata.io/v1/reviews/snapshot?q=engineer"

Response ReviewSnapshotResponse

Shape generated from the schema; values are placeholders.

{}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

GET /v1/reviews/panel

Daily review velocity panel by ticker or name (derived metrics only)

Works without a key (anonymous only with ticker or q (one value of ticker), at most 28 rows, no cursor); a key lifts the limits. Try it · getReviewPanel

Parameters

NameInTypeDescription
tickerquerystringComma list of up to 20 tickers, e.g. DUOL,SPOT.
qquerystringSubject or name.
platformquerystringReview platform.
sincequerystring (YYYY-MM-DD)First day.
untilquerystring (YYYY-MM-DD)Last day.
rollupquerystringOne row per ticker and day.
limitqueryintegerRows, 1-2000.

Example

curl -s "https://api.arcadiumdata.io/v1/reviews/panel?ticker=SPOT"

Response ReviewPanelResponse

Shape generated from the schema; values are placeholders.

{}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

Watchlists

POST /v1/watchlists

Track a list of companies (needs an API key)

Billed per tracked company per month above the plan allowance (GET /v1/plans).

Needs an API key. Try it · createWatchlist

Request body WatchlistCreate

{
  "name": "Prospects",
  "domains": [
    "stripe.com",
    "spotify.com"
  ]
}

Example

curl -s -X POST "https://api.arcadiumdata.io/v1/watchlists" \
  -H "Authorization: Bearer $ARCADIUM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Prospects","domains":["stripe.com","spotify.com"]}'

Response Watchlist

Shape generated from the schema; values are placeholders.

{
  "id": 1,
  "name": "string",
  "companies": 1,
  "createdAt": "string",
  "domains": [
    "string"
  ],
  "rejected": [
    "string"
  ]
}

Errors: 400, 401, 403, 404, 429. Body {"error": code, "message": text}; see error codes.

GET /v1/watchlists

Your watchlists

Needs an API key. Try it · listWatchlists

Example

curl -s "https://api.arcadiumdata.io/v1/watchlists" \
  -H "Authorization: Bearer $ARCADIUM_API_KEY"

Response Watchlists

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "data": [
    {
      "id": 1,
      "name": "string",
      "companies": 1,
      "createdAt": "string",
      "domains": [],
      "rejected": []
    }
  ]
}

Errors: 400, 401, 403, 404, 429. Body {"error": code, "message": text}; see error codes.

GET /v1/watchlists/{id}

One watchlist with its domains

Needs an API key. Try it · getWatchlist

Parameters

NameInTypeDescription
id (required)pathintegerWatchlist id from POST /v1/watchlists.

Example

curl -s "https://api.arcadiumdata.io/v1/watchlists/siemens.com" \
  -H "Authorization: Bearer $ARCADIUM_API_KEY"

Response Watchlist

Shape generated from the schema; values are placeholders.

{
  "id": 1,
  "name": "string",
  "companies": 1,
  "createdAt": "string",
  "domains": [
    "string"
  ],
  "rejected": [
    "string"
  ]
}

Errors: 400, 401, 403, 404, 429. Body {"error": code, "message": text}; see error codes.

DELETE /v1/watchlists/{id}

Stop tracking a watchlist

Needs an API key. Try it · deleteWatchlist

Parameters

NameInTypeDescription
id (required)pathintegerWatchlist id from POST /v1/watchlists.

Example

curl -s -X DELETE "https://api.arcadiumdata.io/v1/watchlists/siemens.com" \
  -H "Authorization: Bearer $ARCADIUM_API_KEY"

Response Deleted

Shape generated from the schema; values are placeholders.

{
  "deleted": true
}

Errors: 400, 401, 403, 404, 429. Body {"error": code, "message": text}; see error codes.

GET /v1/watchlists/{id}/changes

Company Pulse events and the latest hiring signals of the tracked companies

Needs an API key. Try it · getWatchlistChanges

Parameters

NameInTypeDescription
id (required)pathintegerWatchlist id from POST /v1/watchlists.
sincequerystring (YYYY-MM-DD)Changes on or after this day; default 7 days ago, earliest 90 days ago.
typesquerystringEvent 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, register_registration, register_bankruptcy, register_restructuring, register_liquidation, register_dissolution, name_change, hq_moved, capital_increase, capital_decrease, headcount_band_change, sector_change, accounts_filed, business_sale, eu_grant_won. Example: hiring_up,new_country
limitqueryintegerEvents, 1-5000.

Example

curl -s "https://api.arcadiumdata.io/v1/watchlists/siemens.com/changes" \
  -H "Authorization: Bearer $ARCADIUM_API_KEY"

Response WatchlistChanges

Shape generated from the schema; values are placeholders.

{
  "id": 1,
  "since": "string",
  "count": 1,
  "data": [
    {
      "id": "string",
      "type": "hiring_up",
      "domain": "string",
      "occurredAt": "string",
      "observedAt": "string",
      "country": "string",
      "provisional": true,
      "source": "jobs",
      "evidence": {},
      "name": "string"
    }
  ],
  "companies": [
    {
      "domain": "string",
      "name": "string",
      "found": true,
      "asOf": "string",
      "openJobs": 1,
      "netChange7d": 1.5,
      "netChange30d": 1.5
    }
  ]
}

Errors: 400, 401, 403, 404, 429. Body {"error": code, "message": text}; see error codes.

Competitor Watch

POST /v1/watch/competitors

Watch competitors: a weekly email digest per competitor domain

Adds competitor domains to your account (the digest goes to the account email on the chosen weekday): hiring by function and country against a 4-week baseline, new countries, tools named in job ads, posted pay, reviews, public contracts won and ATS switches, each with dated evidence links. The first month is free for up to 3 competitors; then €29 per competitor a month or €149 for 10 (GET /v1/plans `addons`). Needs a self-serve key; not metered.

Needs an API key. Try it · watchCompetitors

Request body CompetitorWatchCreate

{
  "domains": [
    "stripe.com",
    "spotify.com"
  ],
  "weekday": "monday"
}

Example

curl -s -X POST "https://api.arcadiumdata.io/v1/watch/competitors" \
  -H "Authorization: Bearer $ARCADIUM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"domains":["stripe.com","spotify.com"],"weekday":"monday"}'

Response CompetitorWatches

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "limit": 1,
  "paidCompetitors": 1,
  "freeMonth": {
    "active": true,
    "endsAt": "string",
    "competitors": 1
  },
  "unsubscribed": true,
  "sendsTo": "string",
  "data": [
    {
      "domain": "string",
      "weekday": "monday",
      "createdAt": "string",
      "lastSentOn": "string"
    }
  ],
  "rejected": [
    "string"
  ],
  "sample": "string"
}

Errors: 400, 401, 403, 404, 429. Body {"error": code, "message": text}; see error codes.

GET /v1/watch/competitors

Your watched competitors, limit and free month

Needs an API key. Try it · listCompetitorWatches

Example

curl -s "https://api.arcadiumdata.io/v1/watch/competitors" \
  -H "Authorization: Bearer $ARCADIUM_API_KEY"

Response CompetitorWatches

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "limit": 1,
  "paidCompetitors": 1,
  "freeMonth": {
    "active": true,
    "endsAt": "string",
    "competitors": 1
  },
  "unsubscribed": true,
  "sendsTo": "string",
  "data": [
    {
      "domain": "string",
      "weekday": "monday",
      "createdAt": "string",
      "lastSentOn": "string"
    }
  ],
  "rejected": [
    "string"
  ],
  "sample": "string"
}

Errors: 400, 401, 403, 404, 429. Body {"error": code, "message": text}; see error codes.

DELETE /v1/watch/competitors/{domain}

Stop watching one competitor

Needs an API key. Try it · unwatchCompetitor

Parameters

NameInTypeDescription
domain (required)pathstringA watched competitor domain.

Example

curl -s -X DELETE "https://api.arcadiumdata.io/v1/watch/competitors/stripe.com" \
  -H "Authorization: Bearer $ARCADIUM_API_KEY"

Response CompetitorWatches

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "limit": 1,
  "paidCompetitors": 1,
  "freeMonth": {
    "active": true,
    "endsAt": "string",
    "competitors": 1
  },
  "unsubscribed": true,
  "sendsTo": "string",
  "data": [
    {
      "domain": "string",
      "weekday": "monday",
      "createdAt": "string",
      "lastSentOn": "string"
    }
  ],
  "rejected": [
    "string"
  ],
  "sample": "string"
}

Errors: 400, 401, 403, 404, 429. Body {"error": code, "message": text}; see error codes.

POST /v1/watch/checkout

Buy Competitor Watch: a Stripe Checkout link for the add-on

`competitor_watch_single` (€29 a month per competitor, `quantity` competitors) or `competitor_watch_10` (€149 a month, up to 10). A separate monthly subscription next to your plan. An account that already pays for the add-on gets a billing-portal link to change the quantity.

Needs an API key. Try it · createAddonCheckout

Request body AddonCheckoutRequest

{
  "addon": "competitor_watch_single",
  "quantity": 1
}

Example

curl -s -X POST "https://api.arcadiumdata.io/v1/watch/checkout" \
  -H "Authorization: Bearer $ARCADIUM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"addon":"competitor_watch_single","quantity":1}'

Response AddonCheckoutSession

Shape generated from the schema; values are placeholders.

{
  "mode": "checkout",
  "url": "string",
  "expiresAt": "string",
  "addon": "string",
  "quantity": 1,
  "priceEur": 1.5
}

Errors: 400, 401, 403, 404, 429. Body {"error": code, "message": text}; see error codes.

POST /v1/watch/unsubscribe

One-click unsubscribe from the Competitor Watch digests (link in every digest)

RFC 8058 one-click: mail apps POST here with the token from the List-Unsubscribe header; the page behind the footer link does the same. Pauses every digest of the account; adding a watch resumes them.

No key needed. Try it · unsubscribeDigests

Parameters

NameInTypeDescription
token (required)querystringThe token from the digest link.

Example

curl -s -X POST "https://api.arcadiumdata.io/v1/watch/unsubscribe?token=token"

Response Unsubscribed

Shape generated from the schema; values are placeholders.

{
  "unsubscribed": true
}

Errors: 400, 404. Body {"error": code, "message": text}; see error codes.

Account

GET /v1/plans

Plans, limits and prices

No key needed. Try it · listPlans

Example

curl -s "https://api.arcadiumdata.io/v1/plans"

Response Plans

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "currency": "EUR",
  "billing": true,
  "watchlist": {
    "eurPerTrackedCompanyMonth": 1.5
  },
  "perCall": {},
  "annualDiscount": 1.5,
  "annualFreeMonths": 1,
  "founding": {
    "code": "string",
    "plan": "string",
    "eurPerMonth": 1.5,
    "accounts": 1,
    "months": 1,
    "days": 1
  },
  "overage": {
    "mode": "hard_stop",
    "eurPer1000Calls": 1.5,
    "maxShareOfQuota": 1.5
  },
  "signup": "string",
  "data": [
    {
      "id": "string",
      "label": "string",
      "priceEurPerMonth": 1.5,
      "priceEurPerYear": 1.5,
      "selfServe": true,
      "overageEligible": true,
      "requestsPerMinute": 1,
      "requestsPerDay": 1,
      "monthlyQuota": 1,
      "maxPageSize": 1,
      "trialDays": 1,
      "trackedCompaniesIncluded": 1
    }
  ],
  "anonymousTools": {
    "perIpPerMinute": 1,
    "perIpPerDay": 1,
    "globalPerMinute": 1,
    "cacheTtlSeconds": 1,
    "cacheMaxEntries": 1,
    "badgeCacheSeconds": 1
  },
  "anonymousPolicy": {
    "pointLookupsOnly": true,
    "maxRows": 1,
    "maxBatchDomains": 1,
    "maxTextChars": 1,
    "perSubnetPerDay": 1
  },
  "addons": [
    {
      "id": "string",
      "label": "string",
      "priceEurPerMonth": 1.5,
      "competitors": 1,
      "perUnit": true,
      "freeMonthDays": 1,
      "freeMonthCompetitors": 1,
      "route": "string"
    }
  ],
  "devicePortfolio": {
    "freeManufacturers": 1,
    "route": "string",
    "tiers": [
      {
        "id": "string",
        "label": "string",
        "manufacturers": 1,
        "eurPerMonth": 1.5,
        "eurPerYear": 1.5
  ...

Errors: 400, 404. Body {"error": code, "message": text}; see error codes.

GET /v1/me

Your tier, plan, quota and usage

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.

Works without a key (anonymous allowed); a key lifts the limits. Try it · getMe

Example

curl -s "https://api.arcadiumdata.io/v1/me"

Response Me

Shape generated from the schema; values are placeholders.

{
  "tier": "anonymous",
  "plan": "string",
  "keyName": "string",
  "monthlyQuota": 1,
  "usedThisMonth": 1,
  "trackedCompanies": 1,
  "trackedCompaniesIncluded": 1,
  "expiresAt": "string",
  "remainingThisMonth": 1,
  "overageThisMonth": 1,
  "quotaResetsAt": "string",
  "requestsPerMinute": 1,
  "account": {
    "companyDomain": "string",
    "emailVerified": true,
    "billingInterval": "month",
    "subscriptionStatus": "string",
    "currentPeriodEnd": "string",
    "cancelAtPeriodEnd": true,
    "paymentFailed": true,
    "referralCode": "string"
  },
  "billing": true
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

POST /v1/account/signup

Sign up: email a one-time link that shows a free API key

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.

No key needed. Try it · signup

Request body SignupRequest

{
  "email": "[email protected]",
  "companyDomain": "acme.com",
  "acceptTerms": true,
  "ref": "string",
  "intent": {
    "intent": "watch-company",
    "plan": "starter",
    "domain": "string",
    "srn": "string",
    "registryId": "string",
    "nace": "string",
    "authority": "ec",
    "country": "string",
    "cpv": "string",
    "q": "string",
    "sector": "defence",
    "role": "string",
    "fn": "string",
    "region": "europe",
    "frequency": "daily"
  }
}

Example

curl -s -X POST "https://api.arcadiumdata.io/v1/account/signup" \
  -H "Content-Type: application/json" \
  -d '{"email":"[email protected]","companyDomain":"acme.com","acceptTerms":true,"ref":"string","intent":{"intent":"watch-company","plan":"starter","domain":"string","srn":"string","registryId":"string","nace":"string","authority":"ec","country":"string","cpv":"string","q":"string","sector":"defence","role":"string","fn":"string","region":"europe","frequency":"daily"}}'

Response SignupAccepted

Shape generated from the schema; values are placeholders.

{
  "status": "check_email",
  "message": "string",
  "expiresInHours": 1
}

Errors: 400, 404. Body {"error": code, "message": text}; see error codes.

POST /v1/account/verify

Redeem the emailed link: returns the API key (once)

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.

No key needed. Try it · verifySignup

Request body VerifyRequest

{
  "token": "string"
}

Example

curl -s -X POST "https://api.arcadiumdata.io/v1/account/verify" \
  -H "Content-Type: application/json" \
  -d '{"token":"string"}'

Response NewApiKey

Shape generated from the schema; values are placeholders.

{
  "apiKey": "string",
  "keyPrefix": "string",
  "plan": "string",
  "monthlyQuota": 1,
  "companyDomain": "string",
  "accountCreated": true,
  "replacedKeys": 1,
  "shownOnce": true,
  "intent": {
    "intent": "watch-company",
    "plan": "starter",
    "domain": "string",
    "srn": "string",
    "registryId": "string",
    "nace": "string",
    "authority": "ec",
    "country": "string",
    "cpv": "string",
    "q": "string",
    "sector": "defence",
    "role": "string",
    "fn": "string",
    "region": "europe",
    "frequency": "daily"
  }
}

Errors: 400, 404. Body {"error": code, "message": text}; see error codes.

POST /v1/account/checkout

Upgrade: a Stripe Checkout link for Starter, Pro or Business

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.

Needs an API key. Try it · createCheckout

Request body CheckoutRequest

{
  "plan": "starter",
  "interval": "month"
}

Example

curl -s -X POST "https://api.arcadiumdata.io/v1/account/checkout" \
  -H "Authorization: Bearer $ARCADIUM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"plan":"starter","interval":"month"}'

Response CheckoutSession

Shape generated from the schema; values are placeholders.

{
  "mode": "checkout",
  "url": "string",
  "expiresAt": "string",
  "plan": "string",
  "interval": "month",
  "priceEur": 1.5
}

Errors: 400, 401, 403, 404, 429. Body {"error": code, "message": text}; see error codes.

GET /v1/account/export

Download everything we hold about your account (GDPR access and portability)

JSON with the email, company domain, plan, key metadata (never the secrets), watches, dates and usage counters. Not metered. Limited to 10 requests an hour per account.

Needs an API key. Try it · exportAccountData

Example

curl -s "https://api.arcadiumdata.io/v1/account/export" \
  -H "Authorization: Bearer $ARCADIUM_API_KEY"

Response AccountExport

Shape generated from the schema; values are placeholders.

{
  "exportedAt": "string",
  "account": {
    "email": "string",
    "companyDomain": "string",
    "plan": "string",
    "termsVersion": "string",
    "termsAcceptedAt": "string",
    "emailVerifiedAt": "string",
    "createdAt": "string",
    "digestUnsubscribedAt": "string",
    "billing": {
      "stripeCustomerId": "string",
      "billingInterval": "string",
      "subscriptionStatus": "string",
      "currentPeriodEnd": "string",
      "cancelAtPeriodEnd": true,
      "competitorSlots": 1
    }
  },
  "keys": [
    {
      "prefix": "string",
      "name": "string",
      "plan": "string",
      "createdAt": "string",
      "expiresAt": "string",
      "revokedAt": "string"
    }
  ],
  "watchlists": [
    {
      "name": "string",
      "createdAt": "string",
      "domains": [
        "string"
      ]
    }
  ],
  "competitorWatches": [
    {
      "domain": "string",
      "weekday": 1,
      "createdAt": "string",
      "lastSentOn": "string"
    }
  ],
  "tenderWatches": [
    {
      "countries": [
        "string"
      ],
      "cpv": [
        "string"
      ],
      "q": "string",
      "sector": "string",
      "weekday": 1,
      "createdAt": "string",
      "lastSentOn": "string"
    }
  ],
  "deviceWatches": [
    {
      "srn": "string",
      "domain": "string",
      "createdAt": "string",
      "lastSentOn": "string"
    }
  ],
  "mergerWatches": [
    {
      "kind": "string",
      "value": "string",
      "createdAt": "string",
      "lastSentOn": "string"
    }
  ],
  "usage": [
    {
      "month": "string",
      "route": "string",
  ...

Errors: 400, 401, 403, 404, 429. Body {"error": code, "message": text}; see error codes.

DELETE /v1/account

Delete the account and erase the email address (GDPR erasure)

Send {"confirm":"delete"}. Cancels a paid Stripe subscription immediately (no refund of the running period), revokes every key, deletes the watches and erases the email. An account that ever paid keeps, without the email, only the Stripe customer id and company domain for 10 years (invoice and tax law). Cannot be undone. Limited to 3 requests an hour per account.

Needs an API key. Try it · deleteAccount

Request body AccountDeleteRequest

{
  "confirm": "delete"
}

Example

curl -s -X DELETE "https://api.arcadiumdata.io/v1/account" \
  -H "Authorization: Bearer $ARCADIUM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"confirm":"delete"}'

Response AccountDeleted

Shape generated from the schema; values are placeholders.

{
  "deleted": true,
  "emailErased": true,
  "keysRevoked": 1,
  "competitorWatchesDeleted": 1,
  "tenderWatchesDeleted": 1,
  "watchlistsDeleted": 1,
  "subscriptionCancelled": true,
  "retained": {
    "items": [
      "string"
    ],
    "legalBasis": "string",
    "deleteAfter": "string"
  }
}

Errors: 400, 401, 403, 404, 429. Body {"error": code, "message": text}; see error codes.

GET /v1/account/portal

Billing portal link: invoices, card, plan change, cancel

Needs an API key. Try it · getBillingPortal

Example

curl -s "https://api.arcadiumdata.io/v1/account/portal" \
  -H "Authorization: Bearer $ARCADIUM_API_KEY"

Response PortalSession

Shape generated from the schema; values are placeholders.

{
  "url": "string"
}

Errors: 400, 401, 403, 404, 429. Body {"error": code, "message": text}; see error codes.

Recalls

GET /v1/recalls

Recall Radar: product safety alerts (EU Safety Gate, US CPSC, UK OPSS)

Official product safety alerts and recalls, normalised: product name, brand, model, GTIN barcodes (check digit verified), category, risk type, measures, the marketplace listings the authority names, links to the official page and images. Newest first; cursor pagination. Alerts concern products: no notifier or consumer-contact data is included. EU Safety Gate: reuse with acknowledgement (European Commission); CPSC: US public domain; OPSS: Open Government Licence v3.0.

Works without a key (anonymous only with brand or barcode or q (one value of brand, source, country), at most 5 rows, no cursor); a key lifts the limits. Try it · searchRecalls

Parameters

NameInTypeDescription
qquerystringWords in the product name, brand or model.
sourcequerystringsafety_gate = EU Safety Gate (RAPEX), cpsc = US Consumer Product Safety Commission, opss = UK Office for Product Safety and Standards. Example: safety_gate
countryquerystringNotifying country (ISO 3166-1 alpha-2; US for CPSC, GB for OPSS). Example: DE,FR
categoryquerystringProduct category as the authority states it, e.g. Toys.
brandquerystringBrand, exact match, case-insensitive.
riskTypequerystringWords in the risk type, e.g. Chemical, Choking, Fire.
barcodequerystringGTIN / EAN / UPC (8-14 digits) of the product.
sincequerystring (YYYY-MM-DD)Published on or after this day.
untilquerystring (YYYY-MM-DD)Published on or before this day.
withMatchesquerystringtrue = only alerts that have at least one matching marketplace listing.
limitqueryintegerAlerts per page (anonymous: at most 10).
cursorquerystring`nextCursor` of the previous page.

Example

curl -s "https://api.arcadiumdata.io/v1/recalls?brand=brand"

Response RecallsPage

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "nextCursor": "string",
  "attribution": "string",
  "data": [
    {
      "id": "string",
      "source": "safety_gate",
      "publishedOn": "string",
      "country": "string",
      "category": "string",
      "productName": "string",
      "brand": "string",
      "model": "string",
      "barcodes": [],
      "riskType": "string",
      "riskLevel": "string",
      "hazard": "string",
      "measures": "string",
      "originCountry": "string",
      "citedListings": [],
      "imageUrls": [],
      "sourceUrl": "string",
      "matchCount": 1
    }
  ]
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

GET /v1/recalls/matches

Recall Radar: marketplace listings that match a recall alert

Live listings on Amazon, AliExpress, Etsy and TikTok Shop that match a recall alert: by the listing the alert itself names (confidence 0.99), by barcode (0.97), or by brand plus model code or name (0.80-0.93; sibling variants such as another colour are not matched). Each match shows the listing, price, the marketplace seller id (never a name), when we first and last saw it, and the alert. Every match is "listing matches a recall alert - verify", never a finding that a listing is illegal. Filter by `marketplace` and `brand`.

Works without a key (anonymous only with brand or alertId (one value of brand, marketplace), at most 5 rows, no cursor); a key lifts the limits. Try it · searchRecallMatches

Parameters

NameInTypeDescription
marketplacequerystringMarketplace key: amazon.<tld> (amazon.de), aliexpress, etsy, tiktok_shop. Example: amazon.de,aliexpress
brandquerystringBrand of the alert, exact match, case-insensitive.
categoryquerystringCategory of the alert.
alertIdquerystringOnly matches of this alert id.
minConfidencequerynumber0.75-1. cited 0.99, ean 0.97, brand_model 0.80-0.93.
sincequerystring (YYYY-MM-DD)Matches last seen on or after this day.
limitqueryintegerMatches per page (anonymous: at most 5).
cursorquerystring`nextCursor` of the previous page.

Example

curl -s "https://api.arcadiumdata.io/v1/recalls/matches?brand=brand"

Response RecallMatchesPage

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "nextCursor": "string",
  "attribution": "string",
  "data": [
    {
      "notice": "string",
      "confidence": 1.5,
      "method": "cited",
      "marketplace": "string",
      "listingId": "string",
      "listingUrl": "string",
      "title": "string",
      "price": 1.5,
      "currency": "string",
      "sellerId": "string",
      "firstSeen": "string",
      "lastSeen": "string",
      "alert": {
        "id": "string",
        "source": "safety_gate",
        "publishedOn": "string",
        "country": "string",
        "category": "string",
        "productName": "string",
        "brand": "string",
        "model": "string",
        "barcodes": [],
        "riskType": "string",
        "riskLevel": "string",
        "hazard": "string",
        "measures": "string",
        "originCountry": "string",
        "citedListings": [],
        "imageUrls": [],
        "sourceUrl": "string",
        "matchCount": 1
      }
    }
  ]
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.

Tender Watch

POST /v1/watch/tenders

Save a tender search: a weekly email with its new awards and open calls

Saves buyer countries, CPV prefixes, keywords and/or a sector preset (`sector: "defence"` = defence and security procurement; at least one); every week (chosen weekday, morning UTC) the account email gets the new award and call-for-tenders notices of the past 7 days. Free during the beta, up to 5 saved searches per account; the same search saved twice is kept once. Needs a self-serve key; not metered. The one-click unsubscribe of the digests pauses these alerts too.

Needs an API key. Try it · watchTenders

Request body TenderWatchCreate

{
  "countries": [
    "string"
  ],
  "cpv": [
    "string"
  ],
  "q": "string",
  "sector": "defence",
  "weekday": "monday"
}

Example

curl -s -X POST "https://api.arcadiumdata.io/v1/watch/tenders" \
  -H "Authorization: Bearer $ARCADIUM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"countries":["string"],"cpv":["string"],"q":"string","sector":"defence","weekday":"monday"}'

Response TenderWatches

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "limit": 1,
  "unsubscribed": true,
  "sendsTo": "string",
  "data": [
    {
      "id": 1,
      "label": "string",
      "countries": [],
      "cpv": [],
      "q": "string",
      "sector": "defence",
      "weekday": "monday",
      "createdAt": "string",
      "lastSentOn": "string"
    }
  ]
}

Errors: 400, 401, 403, 404, 429. Body {"error": code, "message": text}; see error codes.

GET /v1/watch/tenders

Your saved tender searches

Needs an API key. Try it · listTenderWatches

Example

curl -s "https://api.arcadiumdata.io/v1/watch/tenders" \
  -H "Authorization: Bearer $ARCADIUM_API_KEY"

Response TenderWatches

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "limit": 1,
  "unsubscribed": true,
  "sendsTo": "string",
  "data": [
    {
      "id": 1,
      "label": "string",
      "countries": [],
      "cpv": [],
      "q": "string",
      "sector": "defence",
      "weekday": "monday",
      "createdAt": "string",
      "lastSentOn": "string"
    }
  ]
}

Errors: 400, 401, 403, 404, 429. Body {"error": code, "message": text}; see error codes.

DELETE /v1/watch/tenders/{id}

Delete one saved tender search

Needs an API key. Try it · unwatchTenders

Parameters

NameInTypeDescription
id (required)pathintegerId of a saved tender search.

Example

curl -s -X DELETE "https://api.arcadiumdata.io/v1/watch/tenders/siemens.com" \
  -H "Authorization: Bearer $ARCADIUM_API_KEY"

Response TenderWatches

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "limit": 1,
  "unsubscribed": true,
  "sendsTo": "string",
  "data": [
    {
      "id": 1,
      "label": "string",
      "countries": [],
      "cpv": [],
      "q": "string",
      "sector": "defence",
      "weekday": "monday",
      "createdAt": "string",
      "lastSentOn": "string"
    }
  ]
}

Errors: 400, 401, 403, 404, 429. Body {"error": code, "message": text}; see error codes.

Job Watch

POST /v1/watch/jobs

Save a remote-job search: an email with its new jobs, daily or weekly

Saves keywords and/or a region (europe, uk, us, worldwide); the account email gets the new remote jobs first seen since the last alert (morning UTC), each with the link to the employer's own posting. Free, up to 5 saved searches per account; the same search saved twice is kept once. Needs a self-serve key (the free sign-up with the `watch-jobs` intent needs no company website); not metered. The one-click unsubscribe of the digests pauses these alerts too.

Needs an API key. Try it · watchJobs

Request body JobWatchCreate

{
  "q": "string",
  "region": "europe",
  "frequency": "daily",
  "weekday": "monday"
}

Example

curl -s -X POST "https://api.arcadiumdata.io/v1/watch/jobs" \
  -H "Authorization: Bearer $ARCADIUM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"q":"string","region":"europe","frequency":"daily","weekday":"monday"}'

Response JobWatches

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "limit": 1,
  "unsubscribed": true,
  "sendsTo": "string",
  "data": [
    {
      "id": 1,
      "label": "string",
      "q": "string",
      "region": "europe",
      "frequency": "daily",
      "weekday": "monday",
      "createdAt": "string",
      "lastSentOn": "string"
    }
  ]
}

Errors: 400, 401, 403, 404, 429. Body {"error": code, "message": text}; see error codes.

GET /v1/watch/jobs

Your saved remote-job searches

Needs an API key. Try it · listJobWatches

Example

curl -s "https://api.arcadiumdata.io/v1/watch/jobs" \
  -H "Authorization: Bearer $ARCADIUM_API_KEY"

Response JobWatches

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "limit": 1,
  "unsubscribed": true,
  "sendsTo": "string",
  "data": [
    {
      "id": 1,
      "label": "string",
      "q": "string",
      "region": "europe",
      "frequency": "daily",
      "weekday": "monday",
      "createdAt": "string",
      "lastSentOn": "string"
    }
  ]
}

Errors: 400, 401, 403, 404, 429. Body {"error": code, "message": text}; see error codes.

DELETE /v1/watch/jobs/{id}

Delete one saved remote-job search

Needs an API key. Try it · unwatchJobs

Parameters

NameInTypeDescription
id (required)pathintegerId of a saved job search.

Example

curl -s -X DELETE "https://api.arcadiumdata.io/v1/watch/jobs/siemens.com" \
  -H "Authorization: Bearer $ARCADIUM_API_KEY"

Response JobWatches

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "limit": 1,
  "unsubscribed": true,
  "sendsTo": "string",
  "data": [
    {
      "id": 1,
      "label": "string",
      "q": "string",
      "region": "europe",
      "frequency": "daily",
      "weekday": "monday",
      "createdAt": "string",
      "lastSentOn": "string"
    }
  ]
}

Errors: 400, 401, 403, 404, 429. Body {"error": code, "message": text}; see error codes.

Recall Watch

POST /v1/watch/recalls

Watch a brand: a weekly email with its new product safety alerts and marketplace matches

Saves a brand; the account email gets, once a week (morning UTC), the new EU Safety Gate, CPSC and OPSS alerts for that brand and the marketplace listings that match them ("listing matches a recall alert - verify"). Free, up to 5 brands per account; the same brand saved twice is kept once. Needs a self-serve key; not metered. The one-click unsubscribe of the digests pauses these emails too.

Needs an API key. Try it · watchRecalls

Request body RecallWatchCreate

{
  "brand": "string",
  "weekday": "monday"
}

Example

curl -s -X POST "https://api.arcadiumdata.io/v1/watch/recalls" \
  -H "Authorization: Bearer $ARCADIUM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"brand":"string","weekday":"monday"}'

Response RecallWatches

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "limit": 1,
  "unsubscribed": true,
  "sendsTo": "string",
  "data": [
    {
      "id": 1,
      "brand": "string",
      "weekday": "monday",
      "createdAt": "string",
      "lastSentOn": "string"
    }
  ]
}

Errors: 400, 401, 403, 404, 429. Body {"error": code, "message": text}; see error codes.

GET /v1/watch/recalls

Your watched brands

Needs an API key. Try it · listRecallWatches

Example

curl -s "https://api.arcadiumdata.io/v1/watch/recalls" \
  -H "Authorization: Bearer $ARCADIUM_API_KEY"

Response RecallWatches

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "limit": 1,
  "unsubscribed": true,
  "sendsTo": "string",
  "data": [
    {
      "id": 1,
      "brand": "string",
      "weekday": "monday",
      "createdAt": "string",
      "lastSentOn": "string"
    }
  ]
}

Errors: 400, 401, 403, 404, 429. Body {"error": code, "message": text}; see error codes.

DELETE /v1/watch/recalls/{id}

Stop watching one brand

Needs an API key. Try it · unwatchRecalls

Parameters

NameInTypeDescription
id (required)pathintegerId of a saved brand.

Example

curl -s -X DELETE "https://api.arcadiumdata.io/v1/watch/recalls/siemens.com" \
  -H "Authorization: Bearer $ARCADIUM_API_KEY"

Response RecallWatches

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "limit": 1,
  "unsubscribed": true,
  "sendsTo": "string",
  "data": [
    {
      "id": 1,
      "brand": "string",
      "weekday": "monday",
      "createdAt": "string",
      "lastSentOn": "string"
    }
  ]
}

Errors: 400, 401, 403, 404, 429. Body {"error": code, "message": text}; see error codes.

Device Watch

POST /v1/watch/devices

Follow an EUDAMED manufacturer: an email when it registers devices or a certificate changes

Follows one manufacturer by its EUDAMED Single Registration Number (`srn`) or every manufacturer SRN of a website `domain`. The account email gets an alert (early afternoon UTC, after the daily EUDAMED refresh) only on a day with a change: first device registered, new UDI-DIs, certificate issued, withdrawn, expired or expiring within 90 days. Each line links to the public EUDAMED record. Free, up to 10 manufacturers per account; a portfolio tier (50, 250 or unlimited, GET /v1/plans `devicePortfolio`) follows more and sends one weekly digest instead; the same one followed twice is kept once. Needs a self-serve key (the /eudamed/ checker signs up with the `watch-devices` intent); not metered. The one-click unsubscribe of the digests pauses these alerts too.

Needs an API key. Try it · watchDevices

Request body DeviceWatchCreate

{
  "srn": "string",
  "domain": "stripe.com"
}

Example

curl -s -X POST "https://api.arcadiumdata.io/v1/watch/devices" \
  -H "Authorization: Bearer $ARCADIUM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"srn":"string","domain":"stripe.com"}'

Response DeviceWatches

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "limit": 1,
  "portfolio": "p50",
  "frequency": "daily",
  "unsubscribed": true,
  "sendsTo": "string",
  "bulk": {
    "rows": 1,
    "srns": 1,
    "added": 1,
    "alreadyFollowed": 1,
    "overLimit": 1,
    "invalid": [
      {
        "line": 1,
        "input": "string"
      }
    ]
  },
  "data": [
    {
      "id": 1,
      "srn": "string",
      "domain": "string",
      "createdAt": "string",
      "lastSentOn": "string"
    }
  ]
}

Errors: 400, 401, 403, 404, 429. Body {"error": code, "message": text}; see error codes.

GET /v1/watch/devices

Your followed EUDAMED manufacturers

Needs an API key. Try it · listDeviceWatches

Example

curl -s "https://api.arcadiumdata.io/v1/watch/devices" \
  -H "Authorization: Bearer $ARCADIUM_API_KEY"

Response DeviceWatches

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "limit": 1,
  "portfolio": "p50",
  "frequency": "daily",
  "unsubscribed": true,
  "sendsTo": "string",
  "bulk": {
    "rows": 1,
    "srns": 1,
    "added": 1,
    "alreadyFollowed": 1,
    "overLimit": 1,
    "invalid": [
      {
        "line": 1,
        "input": "string"
      }
    ]
  },
  "data": [
    {
      "id": 1,
      "srn": "string",
      "domain": "string",
      "createdAt": "string",
      "lastSentOn": "string"
    }
  ]
}

Errors: 400, 401, 403, 404, 429. Body {"error": code, "message": text}; see error codes.

POST /v1/watch/devices/bulk

Follow many EUDAMED manufacturers at once from a CSV of SRNs (client portfolio)

Bulk add for consultants and EU authorised representatives: send `csv` (any CSV or text export of your client list; every SRN like DE-MF-000006413 in any column is followed, other columns are ignored and never stored) or `srns` (JSON array). SRNs already followed are skipped; SRNs above the account limit (10 free; 50, 250 or unlimited with a portfolio tier) are counted in `bulk.overLimit` and not added. A list with nothing to add over the limit answers 403 `device_watch_limit`. Up to 5,000 lines per call. Needs a self-serve key; not metered.

Needs an API key. Try it · watchDevicesBulk

Request body DeviceWatchBulk

{
  "csv": "string",
  "srns": [
    "string"
  ]
}

Example

curl -s -X POST "https://api.arcadiumdata.io/v1/watch/devices/bulk" \
  -H "Authorization: Bearer $ARCADIUM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"csv":"string","srns":["string"]}'

Response DeviceWatches

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "limit": 1,
  "portfolio": "p50",
  "frequency": "daily",
  "unsubscribed": true,
  "sendsTo": "string",
  "bulk": {
    "rows": 1,
    "srns": 1,
    "added": 1,
    "alreadyFollowed": 1,
    "overLimit": 1,
    "invalid": [
      {
        "line": 1,
        "input": "string"
      }
    ]
  },
  "data": [
    {
      "id": 1,
      "srn": "string",
      "domain": "string",
      "createdAt": "string",
      "lastSentOn": "string"
    }
  ]
}

Errors: 400, 401, 403, 404, 429. Body {"error": code, "message": text}; see error codes.

DELETE /v1/watch/devices/{id}

Stop following one manufacturer

Needs an API key. Try it · unwatchDevices

Parameters

NameInTypeDescription
id (required)pathintegerId of a followed manufacturer.

Example

curl -s -X DELETE "https://api.arcadiumdata.io/v1/watch/devices/siemens.com" \
  -H "Authorization: Bearer $ARCADIUM_API_KEY"

Response DeviceWatches

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "limit": 1,
  "portfolio": "p50",
  "frequency": "daily",
  "unsubscribed": true,
  "sendsTo": "string",
  "bulk": {
    "rows": 1,
    "srns": 1,
    "added": 1,
    "alreadyFollowed": 1,
    "overLimit": 1,
    "invalid": [
      {
        "line": 1,
        "input": "string"
      }
    ]
  },
  "data": [
    {
      "id": 1,
      "srn": "string",
      "domain": "string",
      "createdAt": "string",
      "lastSentOn": "string"
    }
  ]
}

Errors: 400, 401, 403, 404, 429. Body {"error": code, "message": text}; see error codes.

Merger Watch

POST /v1/watch/mergers

Follow merger filings: a daily email when a new filing or a status change matches

Adds one Merger Watch rule: a party by website `domain` or `registry_id`, a sector by `nace` code prefix (EC cases), an `authority` (ec, bkarta, cma), a `country` (authority jurisdiction EU / DE / GB, or a party country) or a `keyword` (title, sector label or party name). The account email gets one alert a day (morning UTC, after the daily refresh of the EC, Bundeskartellamt and CMA lists) only when a case matching a rule was notified or changed status (phase 2, cleared, cleared with conditions, prohibited, withdrawn, referred, closed). Each case links to the authority page. Free accounts keep up to 3 rules; the Pro plan includes Merger Radar (50 companies, 5 topics), Business and Scale Merger Radar Pro (1,000 companies, 100 topics). The same rule twice is kept once. Needs a self-serve key (the /mergers/ form signs up with the `watch-mergers` intent); not metered. The one-click unsubscribe of the digests pauses these alerts too.

Needs an API key. Try it · watchMergers

Request body MergerWatchCreate

{
  "kind": "domain",
  "value": "string"
}

Example

curl -s -X POST "https://api.arcadiumdata.io/v1/watch/mergers" \
  -H "Authorization: Bearer $ARCADIUM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kind":"domain","value":"string"}'

Response MergerWatches

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "tier": "free",
  "limit": {
    "total": 1,
    "companies": 1,
    "topics": 1
  },
  "unsubscribed": true,
  "sendsTo": "string",
  "data": [
    {
      "id": 1,
      "kind": "domain",
      "value": "string",
      "label": "string",
      "createdAt": "string",
      "lastSentOn": "string"
    }
  ]
}

Errors: 400, 401, 403, 404, 429. Body {"error": code, "message": text}; see error codes.

GET /v1/watch/mergers

Your Merger Watch rules and allowance

Needs an API key. Try it · listMergerWatches

Example

curl -s "https://api.arcadiumdata.io/v1/watch/mergers" \
  -H "Authorization: Bearer $ARCADIUM_API_KEY"

Response MergerWatches

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "tier": "free",
  "limit": {
    "total": 1,
    "companies": 1,
    "topics": 1
  },
  "unsubscribed": true,
  "sendsTo": "string",
  "data": [
    {
      "id": 1,
      "kind": "domain",
      "value": "string",
      "label": "string",
      "createdAt": "string",
      "lastSentOn": "string"
    }
  ]
}

Errors: 400, 401, 403, 404, 429. Body {"error": code, "message": text}; see error codes.

DELETE /v1/watch/mergers/{id}

Remove one Merger Watch rule

Needs an API key. Try it · unwatchMergers

Parameters

NameInTypeDescription
id (required)pathintegerId of a Merger Watch rule.

Example

curl -s -X DELETE "https://api.arcadiumdata.io/v1/watch/mergers/siemens.com" \
  -H "Authorization: Bearer $ARCADIUM_API_KEY"

Response MergerWatches

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "tier": "free",
  "limit": {
    "total": 1,
    "companies": 1,
    "topics": 1
  },
  "unsubscribed": true,
  "sendsTo": "string",
  "data": [
    {
      "id": 1,
      "kind": "domain",
      "value": "string",
      "label": "string",
      "createdAt": "string",
      "lastSentOn": "string"
    }
  ]
}

Errors: 400, 401, 403, 404, 429. Body {"error": code, "message": text}; see error codes.

Supplier Watch

POST /v1/watch/suppliers

Upload a supplier list: a risk digest of status, VAT and contract changes by email

Send a CSV (`csv`, columns `domain`, `vat`, `id` + `country`, `name` + `country`; header optional) or the same rows as JSON (`suppliers`), up to 2,000 per call. Each row is matched to a company in the national registers (stored data): the answer is a match report with matched / ambiguous / not found / withheld rows (sole traders and natural persons are withheld and never stored). Matched suppliers are followed up to your plan's tracked-company allowance. The account email gets a Supplier risk digest (weekly on the chosen weekday, daily on Pro, Business and Scale): per supplier the changes since the last digest, ranked dissolved / insolvency / strike-off > VAT invalid > unreliable VAT payer > accounts overdue > contract won > hiring freeze, each with a link to the official source. Needs a self-serve key. The one-click unsubscribe of the digests pauses it.

Needs an API key. Try it · watchSuppliers

Request body SupplierWatchCreate

{
  "csv": "string",
  "suppliers": [
    {
      "domain": "string",
      "vat": "string",
      "id": "string",
      "country": "string",
      "name": "string"
    }
  ],
  "weekday": "monday"
}

Example

curl -s -X POST "https://api.arcadiumdata.io/v1/watch/suppliers" \
  -H "Authorization: Bearer $ARCADIUM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"csv":"string","suppliers":[{"domain":"string","vat":"string","id":"string","country":"string","name":"string"}],"weekday":"monday"}'

Response SupplierWatches

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "limit": 1,
  "plan": "string",
  "frequency": "daily",
  "weekday": "monday",
  "unsubscribed": true,
  "sendsTo": "string",
  "data": [
    {
      "id": 1,
      "domain": "string",
      "country": "string",
      "legalName": "string",
      "vat": "string",
      "registerSource": "string",
      "registryId": "string",
      "createdAt": "string"
    }
  ],
  "match": {
    "rows": 1,
    "matched": 1,
    "ambiguous": 1,
    "notFound": 1,
    "withheld": 1,
    "invalid": 1,
    "duplicates": 1,
    "added": 1,
    "overLimit": 1,
    "items": [
      {
        "line": 1,
        "input": "string",
        "status": "matched",
        "legalName": "string",
        "country": "string",
        "reason": "string",
        "candidates": []
      }
    ],
    "invalidRows": [
      {
        "line": 1,
        "reason": "string"
      }
    ]
  },
  "sample": "string"
}

Errors: 400, 401, 403, 404, 429. Body {"error": code, "message": text}; see error codes.

GET /v1/watch/suppliers

The suppliers you follow, plan limit and digest schedule

Needs an API key. Try it · listSupplierWatches

Parameters

NameInTypeDescription
limitqueryintegerSuppliers per page.
offsetqueryintegerSuppliers to skip.

Example

curl -s "https://api.arcadiumdata.io/v1/watch/suppliers" \
  -H "Authorization: Bearer $ARCADIUM_API_KEY"

Response SupplierWatches

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "limit": 1,
  "plan": "string",
  "frequency": "daily",
  "weekday": "monday",
  "unsubscribed": true,
  "sendsTo": "string",
  "data": [
    {
      "id": 1,
      "domain": "string",
      "country": "string",
      "legalName": "string",
      "vat": "string",
      "registerSource": "string",
      "registryId": "string",
      "createdAt": "string"
    }
  ],
  "match": {
    "rows": 1,
    "matched": 1,
    "ambiguous": 1,
    "notFound": 1,
    "withheld": 1,
    "invalid": 1,
    "duplicates": 1,
    "added": 1,
    "overLimit": 1,
    "items": [
      {
        "line": 1,
        "input": "string",
        "status": "matched",
        "legalName": "string",
        "country": "string",
        "reason": "string",
        "candidates": []
      }
    ],
    "invalidRows": [
      {
        "line": 1,
        "reason": "string"
      }
    ]
  },
  "sample": "string"
}

Errors: 400, 401, 403, 404, 429. Body {"error": code, "message": text}; see error codes.

DELETE /v1/watch/suppliers/{id}

Stop following one supplier

Needs an API key. Try it · unwatchSupplier

Parameters

NameInTypeDescription
id (required)pathintegerId of a followed supplier.

Example

curl -s -X DELETE "https://api.arcadiumdata.io/v1/watch/suppliers/siemens.com" \
  -H "Authorization: Bearer $ARCADIUM_API_KEY"

Response SupplierWatches

Shape generated from the schema; values are placeholders.

{
  "count": 1,
  "limit": 1,
  "plan": "string",
  "frequency": "daily",
  "weekday": "monday",
  "unsubscribed": true,
  "sendsTo": "string",
  "data": [
    {
      "id": 1,
      "domain": "string",
      "country": "string",
      "legalName": "string",
      "vat": "string",
      "registerSource": "string",
      "registryId": "string",
      "createdAt": "string"
    }
  ],
  "match": {
    "rows": 1,
    "matched": 1,
    "ambiguous": 1,
    "notFound": 1,
    "withheld": 1,
    "invalid": 1,
    "duplicates": 1,
    "added": 1,
    "overLimit": 1,
    "items": [
      {
        "line": 1,
        "input": "string",
        "status": "matched",
        "legalName": "string",
        "country": "string",
        "reason": "string",
        "candidates": []
      }
    ],
    "invalidRows": [
      {
        "line": 1,
        "reason": "string"
      }
    ]
  },
  "sample": "string"
}

Errors: 400, 401, 403, 404, 429. Body {"error": code, "message": text}; see error codes.

GET /v1/suppliers/risk

Supplier risk: register, VAT, accounts, contract and hiring changes at a supplier domain, ranked

For each supplier domain (one without a key, up to 10 with one): the company behind it (stored EU Company ID match), the status its national register last showed, and what changed in the look-back window, most severe first: dissolved, bankruptcy, liquidation, restructuring, proposal to strike off, VAT number invalid in VIES, unreliable VAT payer (CZ) or VAT deregistration (SK), annual accounts overdue (GB), public contract won, hiring freeze or surge. Every finding links to the official source. Stored data, no live outbound call; companies only (sole traders are withheld). A signal to check, not a credit rating.

Works without a key (anonymous point lookup); a key lifts the limits. Try it · supplierRisk

Parameters

NameInTypeDescription
domains (required)querystringSupplier website domain(s), comma separated: one without an API key, up to 10 with a key (e.g. `acme.com,supplier.no`).
daysqueryintegerLook back this many days (by when we saw the change).

Example

curl -s "https://api.arcadiumdata.io/v1/suppliers/risk?domains=domains"

Response SupplierRisk

Shape generated from the schema; values are placeholders.

{
  "since": "string",
  "count": 1,
  "data": [
    {
      "domain": "string",
      "found": true,
      "match": "matched",
      "legalName": "string",
      "country": "string",
      "registerStatus": "string",
      "vat": "string",
      "topSeverity": 1,
      "findings": []
    }
  ],
  "sources": {},
  "note": "string"
}

Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.