Documentation
Documentation

Overview

Spore docs

Start here

Getting startedInstall the CLIAuthentication and keys

Build

Search and filtersSegments and the loopEnrichment lifecycle

Recipes

Recipe: search to a live SegmentRecipe: enrich without a segmentRecipe: land your own research

Connect

Events

Account

Credits and billing

Reference

Conventions
API reference
Export the organization's Operation calls POSTPage the organization's Operation calls GETExport the organization's recorded acts POSTPage the organization's recorded acts GETCancel an enrichment launch POSTRead a vocabulary: tools, filters, knowledge, or NACE GETPublish a staged Commons Generation POSTRestore the retained previous Commons Generation POSTPage the organization's Companies GETCorrect a Company's Core under Spore-If-Match PATCHDelete a Company DELETERead everything you know about one Company GETRead Legal entity data for Companies you hold POSTFind Legal entities in the Commons POSTFold one Company into another POSTMint Companies from your own data, or attach rows to Companies you hold POSTPromote a declared current Fact into Company Core POSTRead one Company GETMeasure requested fields over a set of Companies POSTRun a native enrichment POSTPoll an enrichment GETFollow the organization's durable events stream GETPage a Job's frozen target list GETCreate an API key and reveal its secret once POSTRevoke an organization API key POSTList per-item enrichment outcomes GETDeclare a namespace and its fields before recording into them POSTDelete a declaration while nothing stands on it DELETERead your Catalog GETRecord what you observed about a Company or concluded about a Segment POSTUnlock every Legal entity a search matched POSTSearch the Commons: count, analytics, and a minted sample POSTPage a Segment's members, with the exact count GETName a live filter over your Companies POSTDelete a Segment DELETERead what you have concluded about one Segment GETRename a Segment, or change what it means, under Spore-If-Match PATCHRead a Segment's name and filter GETPage the organization's Segments GETPage the organization's credit ledger GETRead the balance and this key's spend bounds GET
API reference

Measure requested fields over a set of Companies

Reports current, stale, explicitly checked-none, and never-observed counts for only the requested Catalog fields, over either an explicit list of Companies or a Segment's live members. A `registry.*` reference is answered in `commons` instead: coverage of Legal entity data is per Commons Namespace from each Legal entity's Inventory, not per field, and it costs no Unlock, because reading an Inventory never triggers one. This read uses POST because an explicit target may carry up to 10,000 Company ids; its read posture means it takes no Idempotency-Key. Free.

POST
/api/v1/coverage

Reports current, stale, explicitly checked-none, and never-observed counts for only the requested Catalog fields, over either an explicit list of Companies or a Segment's live members. A registry.* reference is answered in commons instead: coverage of Legal entity data is per Commons Namespace from each Legal entity's Inventory, not per field, and it costs no Unlock, because reading an Inventory never triggers one. This read uses POST because an explicit target may carry up to 10,000 Company ids; its read posture means it takes no Idempotency-Key.

Free.

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/api/v1/coverage" \  -H "Content-Type: application/json" \  -d '{    "fields": [      "research.employee_count",      "registry.economic-activity.inventory.asOf"    ],    "companyIds": [      "7f9c2a14-3b6e-4d51-9a2f-1c8e5b0d47a3"    ]  }'
{  "companies": 1,  "fields": [    {      "field": "research.employee_count",      "current": 0,      "stale": 0,      "checkedNone": 0,      "missing": 1    }  ],  "commons": {    "linked": 1,    "inventoried": 1,    "namespaces": [      {        "namespace": "economic-activity",        "present": 1,        "oldestAsOf": "2026-08-31"      }    ]  }}

Read one Company GET

Returns the Company's Core with its strong ETag, and its Legal entity section: nothing when the Company holds no Registry link, existence with the legal name, the status and the Inventory of the Namespaces it has plus the unlock price when it is verified but not unlocked, and the live registry record once it is. A deleted id and an id of another organization both read as not found. The ETag validates the Core for a conditional correction; it is not a cache validator, because the registry section is read live and changes without the Core changing. Free.

Run a native enrichment POST

Runs one native tool against an explicit list of the organization's own Company ids. Every tool runs against a Company and reads its Core — name, country, primary Domain, Activity, Identifier — from the target, so a request states only the tool's own settings and, in `context`, the Catalog fields to resolve for each target. A repeated id is one target. A Company this organization does not hold is refused as not found. A target whose Company lacks a Core input the selected tool requires is refused at admission: it appears in `refused` with the slots it could not supply, gets no Run, and costs nothing, while the rest of the launch proceeds. When every target is refused the whole request is refused with `missing_input`. The quote is `runs + unlocks` — research is the door that pays for the Legal entity behind a verified target, one credit, once, forever — and it is refused whole against `maxCredits`. Set `dryRun` for a quote that commits nothing. Variable price, quoted per request.

fields*array<|>

Only the fields you care about; never the whole Catalog. A registry.* reference is answered per Commons Namespace rather than per field, because the Inventory is what states presence.

Items1 <= items <= 50
companyIds?array<>
Items1 <= items <= 10000
segmentId?string
Match^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
Formatuuid