Clocsy API
See what's happening to any company — and why.
Clocsy is building the place developers and businesses come to check a company the way they'd check a stock ticker: who they are, what changed recently, and the signal behind it — funding, hiring surges, leadership moves, expansion, pricing-page edits. Four real, key-authenticated REST endpoints (/api/v1), documented exactly as shipped — nothing planned, nothing aspirational.
Not a static directory. A live feed on every company.
Most company APIs give you a firmographic snapshot — name, size, address — and stop there. Clocsy's news/signal engine keeps watching after that: it crawls company sites, filings, hiring pages, and news sources to build a running record of what's actually changing at a company right now, and surfaces it as structured, queryable signals your product can act on.
This is genuinely new, metered infrastructure — see the Company Signals endpoint below for exactly what's returned and how it's billed.
Authentication
Every request carries a standard REST bearer token — not a custom header. Send your API key as:
Authorization: Bearer csy_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx- Keys are prefixed
csy_live_and shown to you exactly once, at creation — Clocsy stores only a salted hash, never the raw key. - A missing, invalid, expired, or revoked key returns
401withcode: "API_KEY_REQUIRED". - A valid key still only unlocks the endpoints that key's project plan covers — see each endpoint's access gate below.
- Every key belongs to one project and authenticates as that project — there is no separate "user" identity on this API.
Endpoints
Three routes are read-only GET requests, rate-limited to 60 requests/minute per API key. Company Signals and its batch sibling are additionally credit-metered per company resolved — see the pricing table and note below.
Find Companies — search
GET /api/v1/companies/search?q=fintech%20saas&page=1&pageSize=25Query parameters
| q | string | Free-text search, trimmed, capped at 200 characters. |
| page | integer | Default 1, max 2000. |
| pageSize | integer | Default 25, max 50. |
Response — 200
{
"success": true,
"companies": [
{
"id": "string", // stable result handle, not a DB id
"name": "string",
"domain": "string | null",
"website": "string | null",
"city": "string | null",
"country": "string | null",
"location": "string | null", // "City, Region, Country"
"industry": "string | null",
"employeeCount": "number | null"
}
],
"page": 1,
"pageSize": 25,
"total": 0,
"hasMore": false
}This reuses the exact internal client the in-app Find Companies tool already talks to — results are the same company graph, not a separate dataset.
Company Signals — what's happening, and why
Look up a single company by domain or name and get back its tracked intent/signal history — hiring, funding, expansion, leadership changes, site changes, and more — sourced by Clocsy's own news/signal crawler. This is the one endpoint on this page that isn't bundled free into plan access: every successful call costs credits from the key's project balance.
This endpoint spends real credit. The moment an authenticated request succeeds, 1 credit is debited from your project's balance automatically — there's no confirmation step, and looking up the same company twice is billed twice. Every response includes creditsCharged and creditsRemaining so you can track spend in real time; a 402 API_CREDITS_REQUIRED means the balance ran out before the call.
That $0.05/credit debit is the pay-as-you-go rate — the price you pay by default, no commitment. Top up the same wallet with a credit pack instead and every future lookup still costs exactly 1 credit, it just costs less per dollar to get there:
| Tier | Price | Credits | Effective rate |
|---|---|---|---|
| Pay-as-you-go | — | No pack | $0.05 / credit, list rate |
| Starter | $20 | 500 credits | $0.04 / credit — 20% off list |
| Growth | $35 | 1,000 credits | $0.035 / credit — 30% off list |
| Scale | $150 | 5,000 credits | $0.03 / credit — 40% off list, matches Apollo's own best rate |
| Enterprise | Contact sales | 25,000+ credits | Custom pricing |
Packs are bought from the API Pricing tab in your dashboard's Account area — the same wallet, the same checkout, just tagged so the right number of bonus credits land in your balance.
GET /api/v1/companies/signals?domain=example.comQuery parameters
| domain | string | Company domain, e.g. example.com. At least one of domain or q is required. |
| q | string | Company name to search for if domain isn't known. Capped at 200 characters. |
Response — 200
{
"success": true,
"company": {
"id": "string",
"name": "string",
"domain": "string | null",
"website": "string | null",
"city": "string | null",
"country": "string | null",
"location": "string | null",
"industry": "string | null",
"employeeCount": "number | null"
},
"signalsTracked": true, // false = company exists but Clocsy hasn't crawled signals for it yet
"signalCount": 4,
"signals": [
{
"id": "string",
"source": "string", // e.g. "rss" | "sec_edgar" | "site_change" | "google_news"
"signalType": "string", // e.g. "funding" | "hiring" | "leadership_change" | "expansion"
"title": "string | null",
"summary": "string",
"url": "string | null",
"strength": 0, // 0-100 relevance/confidence score
"occurredAt": "string | null"
}
],
"researchStatus": "string | null", // latest research job status for this company, if any
"creditsCharged": 1,
"creditsRemaining": 249
}Signal coverage grows continuously as Clocsy's crawler discovers and tracks more companies — a company that returns signalsTracked: false today may have signals tomorrow. Only genuinely unmatched domains/names return a 404.
Company Signals — batch lookup
Resolve up to 100 companies — by domain, name, or both — in a single authenticated call. Every item in the batch runs through the exact same lookup as the endpoint above; this is a batching wrapper around it, not a separate dataset or a different result shape.
You're billed only for companies actually resolved — never for the HTTP request itself, and never for a domain that comes back not-found. Capped at 100 companies per call. If your balance runs out partway through, Clocsy resolves as many as it can afford and marks the rest skipped_insufficient_credit — you always get one result per item you sent, the batch is never thrown away for one exhausted balance.
POST /api/v1/companies/signals/batch{
"companies": [
{ "domain": "example.com" },
{ "name": "Acme Inc" }
]
}Body parameters
| companies | array | 1-100 items. Required. |
| companies[].domain | string | Company domain, e.g. example.com. At least one of domain or name is required per item. |
| companies[].name | string | Company name to search for if domain isn't known. |
Response — 200
{
"success": true,
"resolved": 47,
"notFound": 3,
"skipped": 0,
"creditsCharged": 47,
"creditsRemaining": 202,
"results": [
{
"index": 0,
"domain": "example.com",
"q": null,
"status": "resolved", // "resolved" | "not_found" | "skipped_insufficient_credit" | "invalid"
"company": { "...": "same shape as the single-lookup endpoint's company object" },
"signalsTracked": true,
"signalCount": 4,
"signals": ["..."],
"researchStatus": "string | null"
},
{
"index": 1,
"domain": "doesnotexist.example",
"q": null,
"status": "not_found",
"error": "No company matched this domain or name."
}
]
}results always has exactly one entry per item you sent, in the same order you sent it — match by index, not by status. creditsCharged always equals the count of resolved items — not-founds and skipped items never appear in it.
Find Talent — candidate search
GET /api/v1/talent/candidates/search?page=1&pageSize=25Query parameters
| page | integer | Default 1, max 2000. |
| pageSize | integer | Default 25, max 100. |
Response — 200
{
"success": true,
"candidates": [
{
"id": "string",
"allocationId": "string",
"searchId": "string",
"searchTitle": "string | null",
"prospectId": "string | null",
"displayName": "string | null",
"title": "string | null",
"company": "string | null",
"location": "string | null",
"hasEmail": true, // real email address is never returned by this endpoint
"pipelineStatus": "string",
"relevanceScore": "number | null",
"relevanceMethod": "string | null"
}
],
"page": 1,
"pageSize": 25,
"total": 0,
"hasMore": false
}This reads candidates your project has already sourced through Find Talent — it does not trigger a new, live sourcing run, and it never exposes a candidate's actual email address (only whether one is on file).
Errors
Every error response shares one shape:
{ "success": false, "error": "human-readable message", "code": "MACHINE_READABLE_CODE" }| Status | Code | Meaning |
|---|---|---|
| 401 | API_KEY_REQUIRED | No key, or the key is invalid, expired, or revoked. |
| 403 | API_SALES_ACCESS_REQUIRED | Companies search / Company Signals: the key's project doesn't have active Sales Engine access. |
| 403 | API_TALENT_ACCESS_REQUIRED | Talent search: the key's project doesn't have an active Find Talent subscription. |
| 400 | API_QUERY_REQUIRED | Company Signals: neither domain nor q was provided. |
| 402 | API_CREDITS_REQUIRED | Company Signals: the key's project doesn't have enough credit balance for this request. |
| 404 | API_COMPANY_NOT_FOUND | Company Signals: no company matched the given domain or name. |
| 400 | API_BATCH_EMPTY | Batch lookup: companies was missing or an empty array. |
| 400 | API_BATCH_TOO_LARGE | Batch lookup: companies had more than 100 items. |
| 429 | SALES_RATE_LIMITED | Too many requests in the current window for this key. Retry-After header is set. |
| 500 | API_REQUEST_FAILED | Unexpected server-side failure processing the request. |
Get an API key
API keys are created, revealed once, and revoked from inside your Clocsy dashboard — there's no separate developer portal. Once you're signed in:
- 1.Open your dashboard — it lands on your project automatically.
- 2.Go to Account, then the API Keys tab.
- 3.Create a key, copy it immediately — it's shown only once — and use it as your bearer token above.