API Reference

Everything you need to integrate Enrichkit into your workflow. Simple key auth, JSON in, JSON out.

Authentication

All API requests require an API key. Pass it via the X-API-Key header (preferred) or Authorization: Bearer. Generate keys from your dashboard.

X-API-Key (preferred)
Bearer
X-API-Key: ek_your_api_key_here

# or
Authorization: Bearer ek_your_api_key_here

Keys are prefixed with ek_. Keep them secret — do not expose them in client-side code.

Base URL

Base URL
https://enrichkit.dev/api/v1

Enrich Profile

Look up a professional profile by URL. Returns structured data including name, title, company, location, and experience.

POST /v1/profile

Request Body

ParameterTypeRequiredDescription
urlstringYesProfile URL to enrich

Example Request

curl
curl -X POST https://enrichkit.dev/api/v1/profile \
  -H "X-API-Key: ek_your_key" \
  -H "Content-Type: application/json" \
  -d '{"url": "linkedin.com/in/janedoe"}'

Example Response

200 OK
{
  "public_id": "marcela-vidal",
  "profile_url": "https://www.linkedin.com/in/marcela-vidal",
  "first_name": "Marcela",
  "last_name": "Vidal",
  "headline": "CTO @ Terracotta — we make ERPs not suck | ex-Shopify",
  "summary": "I spent 6 years building commerce infra at Shopify...",
  "location": "Montreal, Quebec, Canada",
  "industry": "Software Development",
  "connections": 2777,
  "follower_count": 2882,
  "current_company": "Terracotta",
  "current_company_linkedin_url": "https://www.linkedin.com/company/terracotta-erp",
  "current_title": "Co-Founder & CTO",
  "profile_picture": "https://media.licdn.com/dms/image/v2/D5603AQ...",
  "experiences": [
    {
      "title": "Co-Founder & CTO",
      "company": "Terracotta",
      "company_logo": "https://media.licdn.com/dms/image/v2/C4D0BAQ...",
      "company_linkedin_url": "https://www.linkedin.com/company/terracotta-erp",
      "location": "Montreal, QC",
      "description": "Vertical ERP for ceramics studios...",
      "start_date": { "month": 3, "year": 2022 },
      "end_date": null
    }
  ],
  "educations": [
    {
      "school": "McGill University",
      "degree": "Bachelor of Science",
      "field": "Computer Science",
      "start_date": { "month": null, "year": 2010 },
      "end_date": { "month": null, "year": 2014 }
    }
  ],
  "skills": ["Ruby on Rails", "PostgreSQL", "TypeScript", ...],
  "certifications": [
    {
      "name": "AWS Certified Solutions Architect – Associate",
      "authority": "Amazon Web Services (AWS)",
      "url": "https://www.credly.com/badges/abc123",
      "issued_date": { "month": 9, "year": 2021 }
    }
  ]
}

Get Posts

Retrieve recent posts from a profile.

POST /v1/posts
ParameterTypeRequiredDescription
urlstringYesProfile URL
countnumberNoNumber of posts (1-100, default 10)

Example Response

200 OK
[
  {
    "activity_id": "7433440736181899264",
    "post_url": "https://www.linkedin.com/feed/update/urn:li:activity:7433440736181899264/",
    "text": "We just mass-deleted 11,000 lines of code from Terracotta...",
    "created_at": 1710523200000,
    "posted_ago": "3d ago",
    "likes": 842,
    "comments": 127,
    "reposts": 43,
    "media_type": "none",
    "media_url": "",
    "is_repost": false
  }
]

The media_type field can be "none", "image", or "article". The created_at timestamp is in milliseconds (Unix epoch).

Get Reactions

Retrieve reactions on a specific post.

POST /v1/reactions
ParameterTypeRequiredDescription
post_urlstringYesPost URL
pagenumberNoPage number (default 1)

Example Response

200 OK
{
  "page": 1,
  "total": 842,
  "has_more": true,
  "reactions": [
    {
      "name": "Tomás Garza",
      "headline": "Founding eng @ Campfire · prev Vercel",
      "profile_url": "https://www.linkedin.com/in/tomasgarza",
      "profile_id": "tomasgarza",
      "profile_picture": "https://media.licdn.com/dms/image/v2/D5603AQ...",
      "reaction_type": "LIKE"
    }
  ]
}

Reaction types include LIKE, CELEBRATE, LOVE, INSIGHTFUL, FUNNY, and SUPPORT. Use has_more to paginate through all reactions.

Enrich Company

Look up a company by URL. Returns structured company data.

POST /v1/company
ParameterTypeRequiredDescription
urlstringYesCompany URL to enrich

Example Response

200 OK
{
  "name": "Campfire",
  "universal_name": "campfire-dev",
  "linkedin_url": "https://www.linkedin.com/company/campfire-dev",
  "website": "https://campfire.dev",
  "description": "Campfire replaces your internal tools sprawl...",
  "industries": ["Software Development"],
  "company_type": "Privately Held",
  "headquarters": "Berlin, Berlin, Germany",
  "founded_year": 2021,
  "employee_count": 12,
  "employee_range": "11-50",
  "follower_count": 1847,
  "specialities": ["internal tools", "developer tools", ...],
  "logo": "https://media.licdn.com/dms/image/v2/C560BAQ...",
  "phone": null,
  "tagline": "Internal tools that don't make you mass email the eng team"
}

Check Usage

Returns your current usage, limits, and rate limit info.

GET /v1/usage

Example Response

200 OK
{
  "plan": "growth",
  "credits": {
    "remaining": 37550,
    "total": 50000,
    "resets_at": "2026-04-15T00:00:00Z"
  },
  "rate_limit": {
    "requests_per_minute": 300
  }
}

Rate Limits

Rate limits are enforced per API key based on your plan. Limits reset every minute on a sliding window.

PlanRequests / monthRequests / min
Starter10,000100
Growth50,000300
Pro200,000600

When you hit a rate limit, the API returns 429 Too Many Requests with a Retry-After header.

Errors

Enrichkit uses standard HTTP status codes. Errors return a JSON body with a message field.

StatusMeaning
200Success
400Bad request — invalid JSON or missing required field
401Invalid, missing, or revoked API key
403No active plan — subscribe first
429Monthly quota exhausted
502Upstream error — bad response from data source
503Upstream unreachable — try again shortly

Error Response

429 Too Many Requests
{
  "error": "quota_exceeded",
  "message": "No credits remaining. Upgrade your plan for more requests.",
  "credits": 0,
  "plan": "starter"
}