Clocsy API
Explore available company information and signals.
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.
Company records with sourced updates.
Clocsy combines directory records with available observations from company sites, filings, hiring pages and news sources. Coverage and refresh times vary; some companies have no tracked signals. Review each observation's source and date before acting on it.
See the metered 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 |
| 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).
Embeddable RFP widget
Free · no API key, no account required
Drop a real procurement intake form onto your own site. Paste two lines of HTML and Clocsy handles the rest: AI request structuring, spam filtering, and matching the request to potential suppliers on the platform -- the same intake that runs on clocsy.com/rfp, in an iframe sized to fit its own content automatically.
<div data-clocsy-rfp-widget></div>
<script src="https://clocsy.com/rfp-widget.js" async></script>That's the whole integration -- no configuration object, no callback required. The script finds every element carrying data-clocsy-rfp-widget on the page and mounts a Clocsy-hosted iframe into it. Optionally listen for a submission:
document.querySelector('[data-clocsy-rfp-widget]')
.addEventListener('clocsy:rfp-submitted', (event) => {
// event.detail.status is 'active' or 'moderation'
});Data handling
Submitted data goes straight from the iframe to Clocsy's backend. Nothing about the request is exposed to your page's own JavaScript.
Sizing
The iframe reports its own height and resizes automatically -- no fixed height, no scrollbars, no CSS required on your end.
Rate limits
Shares the same public rate limits as clocsy.com/rfp -- built to survive normal traffic, not a way around abuse controls.
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.