Kooperativa is a single REST API for structured people and company data. Look up a full profile by identifier, search a large dataset by attribute, enrich records in bulk, and subscribe to a profile or company to get a webhook the moment we detect a change. This page covers every endpoint at a glance, with real request and response shapes.
Sign in for the full reference
Base URL and authentication
Every request is made over HTTPS against:
https://kooperativa.io/api/v1and authenticated with a bearer API key:
Authorization: Bearer ik_live_...Kooperativa is licensed at a flat rate, not metered. Every endpoint below is included and unlimited on an active license, bound only by a shared rate limit of 500 requests per minute per workspace.
Endpoints
Twenty-one endpoints across three areas. Full parameter and response detail for each lives behind sign-in; this is the shape of what each one does.
People
| Endpoint | Returns |
|---|---|
GET /person | Full profile by identifier: name, headline, current role, work history, education |
POST /people/search | Profiles matching filters: title, seniority, location, industry, company, skills, and more |
POST /people/bulk-enrich | Up to 100 profiles enriched in one request, mixed identifier types |
POST /people/bulk | Up to 500 profiles enriched in one request by internal ID |
GET /person/similar | People with matching seniority, industry, and country |
GET /person/colleagues | A person's current coworkers |
GET /person/job-changes | People who recently started a new role, optionally filtered by prior employer |
GET /person/check | Whether a record exists and when it was last refreshed, without spending a full lookup |
GET /institution/alumni | People whose education history includes a given school |
Companies
| Endpoint | Returns |
|---|---|
GET /company | Full company profile by identifier: firmographics, locations, headcount |
POST /companies/search | Companies matching industry, headcount range, or HQ location |
GET /company/current-employees | People currently listed at a company |
GET /company/past-employees | People who previously worked there, with their past role |
GET /company/headcount-by-seniority | Indexed headcount broken down by seniority tier |
GET /company/hiring-signals | People who joined recently, a proxy for growth |
GET /company/decision-makers | C-level, VP, and director contacts |
GET /company/check | Whether a record exists and when it was last refreshed |
Monitors
| Endpoint | Returns |
|---|---|
POST /monitors | Subscribe to a person or company; fires a signed webhook the moment a change is detected |
GET /monitors | List active monitors for the workspace |
DELETE /monitors/:id | Remove a monitor |
Example: enriching a person
A single-identifier lookup returns a complete, structured profile. Field names and shape are exactly what the live endpoint returns; the values below are a fictional example, not a real record.
curl "https://kooperativa.io/api/v1/person?username=jordan-example" \
-H "Authorization: Bearer ik_live_..."{
"data": {
"id": "3f9a1c2e-example-4a5b-9c6d-7e8f9a0b1c2d",
"username": "jordan-example",
"full_name": "Jordan Example",
"headline": "VP of Engineering at Example Corp",
"current_title": "VP of Engineering",
"current_company": "Example Corp",
"geo_city": "Austin, Texas",
"geo_country_code": "US",
"positions": [
{ "title": "VP of Engineering", "companyName": "Example Corp", "isCurrent": true, "startYear": 2022 }
],
"educations": [
{ "schoolName": "Example State University", "degree": "B.S. Computer Science", "endYear": 2014 }
],
"skills": ["Distributed Systems", "Engineering Leadership"],
"fetched_at": "2026-08-10T01:52:41.662Z"
}
}Every field listed is always present in the response; fields the source has no value for come back as null rather than being omitted.
Example: searching by attribute
Any combination of filters, matched against the dataset:
curl -X POST "https://kooperativa.io/api/v1/people/search" \
-H "Authorization: Bearer ik_live_..." \
-H "Content-Type: application/json" \
-d '{"title": "VP of Sales", "location": "US", "seniority": "vp"}'{
"results": [
{ "id": "7b2e...", "full_name": "Jordan Example", "current_title": "VP of Sales", "current_company": "Example Corp" }
],
"total": 4021,
"page": 1,
"per_page": 10
}Bulk enrichment and monitors
Bulk enrichment accepts up to 500 identifiers in one request and returns a full record for each match, with matched, unmatched, and failed counts kept separate so a retry decision doesn't have to guess. A monitor is a standing subscription: pass a person or company identifier and a webhook URL, choose which change types matter (title changed, company changed, headcount changed, and others), and receive an HMAC-SHA256 signed POST the moment a change is detected, retried with backoff if your endpoint is briefly unreachable.
Errors
| Status | code | Meaning |
|---|---|---|
400 | VALIDATION_ERROR | Missing or malformed parameters |
401 | API_KEY_INVALID | Missing or invalid API key |
402 | LICENSE_INACTIVE | Workspace has no active license |
404 | NOT_FOUND | Record not indexed yet |
429 | RATE_LIMIT_EXCEEDED | Too many requests; retry after the given interval |
451 | DATA_SUBJECT_BLOCKED | Withheld under privacy law (GDPR / CCPA), permanently |
Switch on code, not on the human-readable error string, which may be reworded at any time.
Full reference, with live examples
Every parameter, every field, and a real response shape for each endpoint is available to signed-in Kooperativa accounts.
Sign in to view full docs