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
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
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
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
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
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
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
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
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
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
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
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
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
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
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.
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
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
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
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
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
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
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
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
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
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.
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
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
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
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
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
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
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
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.
Consent
GET /v1/consent/market
Consent-management platform (CMP) market share and tracker prevalence, by country or segment
Which consent-management platform company websites load (OneTrust, Cookiebot, Usercentrics, Didomi, TrustArc, Quantcast Choice, Sourcepoint, CookieYes, iubenda, Axeptio, Complianz, Termly, Osano, Shopify apps and more) and which trackers (Google Analytics 4, Tag Manager, Meta Pixel, LinkedIn Insight, TikTok Pixel, Hotjar, HubSpot, Segment and more), from one plain read of each company home page per month. Per scope (`country`, or `segment` = shops, employers, reviews, registers, tenders): pages read, CMP adoption, vendor shares (of all pages and of pages with a CMP), tracker prevalence, counts per static-HTML signal and the monthly history. Technical detection only. Shares are of the domains we hold, not of the whole web.
Works without a key (anonymous preview, at most 40 rows, one value of country, segment); a key lifts the limits. Try it · getConsentMarket
Parameters
Example
curl -s "https://api.arcadiumdata.io/v1/consent/market"
Response ConsentMarket
Shape generated from the schema; values are placeholders.
{
"scope": "string",
"month": "string",
"base": 1,
"withCmp": 1,
"cmpAdoptionPct": 1.5,
"lowBase": true,
"vendors": [
{
"cmp": "string",
"name": "string",
"domains": 1,
"sharePct": 1.5,
"shareOfCmpPct": 1.5
}
],
"trackers": [
{
"tracker": "string",
"name": "string",
"category": "string",
"domains": 1,
"sharePct": 1.5
}
],
"signals": {},
"months": [
{
"month": "string",
"base": 1,
"withCmp": 1,
"topCmp": "string",
"topSharePct": 1.5
}
],
"method": "string",
"asOf": "string"
}
Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.
GET /v1/consent/companies/{domain}
Which CMP and which trackers one company website loads, with its history
The consent and tracking stack of one company domain from its latest monthly scan: CMPs, trackers with category, trackers whose script tag has no consent hold-back marker in the delivered HTML (Google tags excluded), automatic-blocker, Google Consent Mode and TCF flags, the scan history and the CMP/tracker changes between scans. A technical observation of a plain fetch, not a statement about compliance. 404 when the domain has not been scanned.
Works without a key (anonymous point lookup, at most 5 rows); a key lifts the limits. Try it · getConsentCompany
Parameters
Example
curl -s "https://api.arcadiumdata.io/v1/consent/companies/stripe.com"
Response ConsentCompany
Shape generated from the schema; values are placeholders.
{
"domain": "string",
"country": "string",
"segment": "string",
"firstMonth": "string",
"lastMonth": "string",
"scans": 1,
"cmps": [
{
"cmp": "string",
"name": "string"
}
],
"trackers": [
{
"tracker": "string",
"name": "string",
"category": "string"
}
],
"scriptsWithoutConsentGate": [
{
"tracker": "string",
"name": "string"
}
],
"autoBlock": true,
"consentMode": true,
"tcf": true,
"signal": "string",
"history": [
{
"month": "string",
"cmps": [
"string"
],
"trackers": [
"string"
],
"ok": true
}
],
"events": [
{
"domain": "string",
"country": "string",
"kind": "cmp_switched",
"month": "string",
"previousMonth": "string",
"fromCmp": "string",
"toCmp": "string",
"tracker": "string"
}
],
"method": "string",
"asOf": "string"
}
Errors: 400, 401, 403, 404, 429, 503. Body {"error": code, "message": text}; see error codes.
GET /v1/consent/switches
Companies that switched, added or dropped a consent-management platform
Changes between two consecutive monthly scans of a company domain: `cmp_switched` (from one CMP to another), `cmp_added`, `cmp_removed`, and with `kind` also `tracker_added` / `tracker_removed`. Filters: `domain`, `from_cmp`, `to_cmp`, `country`, `kind`, `since`. Newest first. Only complete page reads are compared, so a failed or cut-off read never produces a change.
Works without a key (anonymous only with domain, at most 5 rows, no cursor); a key lifts the limits. Try it · listConsentSwitches
Parameters
Example
curl -s "https://api.arcadiumdata.io/v1/consent/switches?domain=stripe.com"
Response ConsentSwitches
Shape generated from the schema; values are placeholders.
{
"count": 1,
"total": 1,
"nextCursor": "string",
"asOf": "string",
"data": [
{
"domain": "string",
"country": "string",
"kind": "cmp_switched",
"month": "string",
"previousMonth": "string",
"fromCmp": "string",
"toCmp": "string",
"tracker": "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
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
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
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
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
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.
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
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
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
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
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
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
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
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
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
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.
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
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
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
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
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
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.