Skip to content

Introduction

Structured B2B data via a single REST API. Enrich people and company profiles, search by attribute, and get a webhook when a tracked record changes.

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/v1

and 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

EndpointReturns
GET /personFull profile by identifier: name, headline, current role, work history, education
POST /people/searchProfiles matching filters: title, seniority, location, industry, company, skills, and more
POST /people/bulk-enrichUp to 100 profiles enriched in one request, mixed identifier types
POST /people/bulkUp to 500 profiles enriched in one request by internal ID
GET /person/similarPeople with matching seniority, industry, and country
GET /person/colleaguesA person's current coworkers
GET /person/job-changesPeople who recently started a new role, optionally filtered by prior employer
GET /person/checkWhether a record exists and when it was last refreshed, without spending a full lookup
GET /institution/alumniPeople whose education history includes a given school

Companies

EndpointReturns
GET /companyFull company profile by identifier: firmographics, locations, headcount
POST /companies/searchCompanies matching industry, headcount range, or HQ location
GET /company/current-employeesPeople currently listed at a company
GET /company/past-employeesPeople who previously worked there, with their past role
GET /company/headcount-by-seniorityIndexed headcount broken down by seniority tier
GET /company/hiring-signalsPeople who joined recently, a proxy for growth
GET /company/decision-makersC-level, VP, and director contacts
GET /company/checkWhether a record exists and when it was last refreshed

Monitors

EndpointReturns
POST /monitorsSubscribe to a person or company; fires a signed webhook the moment a change is detected
GET /monitorsList active monitors for the workspace
DELETE /monitors/:idRemove 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

StatuscodeMeaning
400VALIDATION_ERRORMissing or malformed parameters
401API_KEY_INVALIDMissing or invalid API key
402LICENSE_INACTIVEWorkspace has no active license
404NOT_FOUNDRecord not indexed yet
429RATE_LIMIT_EXCEEDEDToo many requests; retry after the given interval
451DATA_SUBJECT_BLOCKEDWithheld 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
Navigation

Type to search…

↑↓ navigate↵ selectEsc close