Read the technology census from your own code
One JSON endpoint per technology, one CSV export endpoint, the same confirmed data the public pages show. An API key is created from your account and requires an active plan.
Authentication
Send the key in the Authorization header as a bearer token:
Authorization: Bearer sc_YOUR_KEYA browser signed in to the account also works, no key needed: both routes accept the session cookie. The two failure modes are deliberately different codes rather than one 403: 401 means the request has no key and no session, or the key is wrong, unknown or revoked, so nobody is identified. 402 means the opposite: the key or session identifies a real account, and that account has no active plan right now.
Endpoint
GET /api/v1/companies-using/<slug>Finding a slug: the same one the public page uses. Every technology is listed on /companies-using; the slug is the last part of its page URL, e.g. Stripe is stripe, Google Analytics 4 is google-analytics-4.
| Query param | Range | Default | Notes |
|---|---|---|---|
| limit | 1–500 | 100 | Rows per request. |
| offset | 0–100000 | 0 | Rows to skip. There is no page number, only limit/offset. |
Example request
curl "https://stackcensus.io/api/v1/companies-using/stripe?limit=100&offset=0" \
-H "Authorization: Bearer sc_YOUR_KEY"Example response (200)
{
"technology": "Stripe",
"category": "Payments",
"total": 1221,
"limit": 100,
"offset": 0,
"companies": [
{
"domain": "example.com",
"rank": 48213,
"confidence": 100,
"sources": ["http_archive", "common_crawl"],
"last_verified": "2026-06-01"
}
]
}| Field | Type | Meaning |
|---|---|---|
| technology | string | Catalog display name, e.g. "Stripe". |
| category | string | Catalog category, e.g. "Payments". |
| total | number | Total confirmed domains for this technology, independent of limit. |
| limit | number | The effective limit after clamping (1–500). |
| offset | number | The effective offset after clamping (0–100000). |
| companies[].domain | string | The domain detected using this technology. |
| companies[].rank | number | null | Popularity rank when known; null for the long tail (Common Crawl has no rank). |
| companies[].confidence | number | 0–100. Only confirmed rows (100) reach this API. |
| companies[].sources | string[] | Which ingestion sources detected it, e.g. ["http_archive"]. |
| companies[].last_verified | string | YYYY-MM-DD, the corpus snapshot date, not the ingest timestamp. |
Response headers: Content-Type: application/json, Cache-Control: private, no-store. No pagination or rate-limit headers: page through with limit/offset against total in the body.
Errors
| Status | Body | Meaning |
|---|---|---|
| 400 | {"error":"offset must be at most 100000"} | offset exceeds the maximum. Lower it or page through with a bounded loop. |
| 401 | {"error":"Authentication required"} | No Authorization header, and no session either. A bad, unknown or revoked key also lands here, not 402: this endpoint cannot tell a wrong key from no key. |
| 402 | {"error":"An active plan is required"} | The key or session is valid, but the account has no active plan. A past_due subscription (a retrying card) also gets this: it does not count as active. |
| 404 | {"error":"Unknown technology"} | The slug is not in the catalog. See "Finding a slug" above. |
CSV export
GET /api/export/<slug>Same authentication, same errors (401, 402, 404). The body streams as it is read from the database, uncapped, one row per confirmed domain, in domain,confidence,source,last_verified order.
curl "https://stackcensus.io/api/export/stripe" \
-H "Authorization: Bearer sc_YOUR_KEY" \
-OJResponse headers: Content-Type: text/csv; charset=utf-8, Content-Disposition: attachment; filename="stackcensus-<slug>.csv". Because it streams, a failure partway through leaves a truncated file rather than an error response.
Limits and delivery
- No rate limiting on either endpoint today.
- Pagination is limit/offset only, capped at 1–500 rows and 0–100000 offset. There is no page number.
- A successful call to either endpoint records a delivery on the account, the same accounting the
/list/<slug>page and the account's CSV button use. Taking data this way closes the self-service refund for the payment the account is currently on: the next payment opens a new period and is refundable again, within 14 days, until its data is taken. A technology with zero confirmed rows returns an emptycompaniesarray or a header-only CSV and records nothing, since there is nothing to take. - The web list at
/list/<slug>is metered instead (100 rows per billing period before it closes the refund); this API and the CSV export are both binary, any call closes it.