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

Record what you observed about a Company or concluded about a Segment

Appends up to 200 observations about one subject: a Company with `companyId`, or a Segment with `segmentId` when the conclusion is about the set rather than about any one member. Exactly one of the two — a Fact about both is a caller that has not decided what it observed. Every field must be declared first and every value is validated against its declared type, so a number field cannot receive "about 5M". A field you looked at and found nothing for is recorded with `absent: true` — knowledge, not a gap, and coverage reports it as checked rather than missing. Facts are appended and never edited: the newest observation becomes the current value, an older observation arriving late does not displace a newer one, and `pin: true` fixes one observation as current until `pin: false` releases it. Set `observedAt` when you learned something about an earlier moment. A conclusion about a Segment cites the Jobs it was reduced from with `{ kind: "job", jobId }` evidence. Native namespaces are refused: a Fact in one is a Spore run's receipt. Free.

POST
/api/v1/record

Appends up to 200 observations about one subject: a Company with companyId, or a Segment with segmentId when the conclusion is about the set rather than about any one member. Exactly one of the two — a Fact about both is a caller that has not decided what it observed. Every field must be declared first and every value is validated against its declared type, so a number field cannot receive "about 5M". A field you looked at and found nothing for is recorded with absent: true — knowledge, not a gap, and coverage reports it as checked rather than missing. Facts are appended and never edited: the newest observation becomes the current value, an older observation arriving late does not displace a newer one, and pin: true fixes one observation as current until pin: false releases it. Set observedAt when you learned something about an earlier moment. A conclusion about a Segment cites the Jobs it was reduced from with { kind: "job", jobId } evidence. Native namespaces are refused: a Fact in one is a Spore run's receipt.

Free.

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Header Parameters

Idempotency-Key*string

Required for writes. Reusing this key with the same input replays the original response.

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

application/json

curl -X POST "https://example.com/api/v1/record" \  -H "Idempotency-Key: string" \  -H "Content-Type: application/json" \  -d '{    "companyId": "7f9c2a14-3b6e-4d51-9a2f-1c8e5b0d47a3",    "fields": [      {        "field": "icp.score",        "value": 8,        "evidence": [          {            "kind": "url",            "url": "https://example.com/pricing",            "excerpt": "Enterprise plans start at 50 seats."          }        ]      }    ]  }'
{  "companyId": "7f9c2a14-3b6e-4d51-9a2f-1c8e5b0d47a3",  "segmentId": null,  "recorded": 1,  "items": [    {      "field": "icp.score",      "factId": "1d0f5b2c-9a37-4e61-8b25-7c3d4a1e6f80",      "current": true,      "pinned": false    }  ]}

Read your Catalog GET

Returns every namespace this organization can record into: its own declarations, and the native ones the Spore tools own. A field marked `frozen` has Facts standing on it, so its type, unit, dimension, and promotion are fixed. The Catalog is private to the organization and never shared-cached. Free.

Unlock every Legal entity a search matched POST

Mints every Legal entity the receipt's filter matches as a Company of this organization and unlocks it, at one credit per entity not unlocked before. The quote is computed from the live population before anything is written; the call is refused whole — never partly applied — when it exceeds `maxCredits`, the plan's Company allowance, or the balance, and `dryRun` returns the same quote without minting, unlocking, or charging. Two kinds of match are left alone and never charged, and both are counted in the response: `conflicts`, where an identifier of the entity belongs to a Company that already names a different Legal entity (a merge, not an unlock), and `incomplete`, where the registry record cannot make a Company's Core. A population above 50,000 entities is refused: narrow the filter and search again. The Companies it creates are listed through `GET /api/v1/companies`. Variable price, quoted per request. 1 credit per Legal entity not yet unlocked, once, forever. Already-unlocked entities are free.

companyId?string

The Company this knowledge is about.

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
segmentId?string

The Segment this conclusion is about. Never together with companyId.

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
fields*array<>
Items1 <= items <= 200