API Reference

Search, preview, autocomplete, enrich, and fetch contacts for professional profiles — from your own stack, with precise filters and structured, ready-to-use data.

Introduction

The RecruitKar API is a REST interface for people search and enrichment. You send JSON, we return structured professional profiles. Five endpoints do everything:

EndpointDoesCost
POST/v1/person/searchFind matching profiles1 / profile
POST/v1/person/previewCount matches (no profiles)1 / call
POST/v1/person/search/autocompleteValid values for a filter fieldFree
POST/v1/person/enrichFull record for a profile URL25 / profile
POST/v1/person/contactEmail + phone for a profile URL3 / contact

All requests are POST with a JSON body, over HTTPS.

Skills and summary come from Enrich, not Search. On Search, skills is available to filter on but is not returned — call Enrich on the profiles you want to hydrate. Emails and phone numbers come from Contact.

Quick start

Create a key on the API Keys page, then make your first search:

RequestcURL
curl -X POST https://api.recruitkar.com/v1/person/search \
  -H "Authorization: Bearer rk_live_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "filters": {
      "op": "and",
      "conditions": [
        { "field": "title", "type": "(.)", "value": "Software Engineer" },
        { "field": "skills", "type": "in", "value": ["React", "Node.js"] }
      ]
    },
    "limit": 10
  }'

You get back a profiles array, a total_count, and a next_cursor for paging. Credits charged and remaining come back in the response headers.

Authentication

Every request authenticates with your API key as a bearer token. The base URL is:

https://api.recruitkar.com/v1
HeadersTEXT
Authorization: Bearer rk_live_your_key_here
Content-Type: application/json

Keys are created and revoked on the API Keys page. A key is shown once at creation — store it securely. Requests without a valid key return 401 UNAUTHORIZED. Every response carries an x-api-version header identifying the version that served it.

Preview

POST/v1/person/preview

Return the match count for a filter set, without the profiles. 1 credit per call — size a search before you spend.

At a glance

MethodPOST/v1/person/preview
Requiredfilters
Response{ match_count }
Cost1 credit / call
RequestJSON
{ "filters": { "field": "skills", "type": "(.)", "value": "Rust" } }
ResponseJSON
{ "match_count": 8421 }

Autocomplete

POST/v1/person/search/autocomplete

Suggest real values for a filter field. Use it to turn free text into exact values for in filters. Free.

At a glance

MethodPOST/v1/person/search/autocomplete
Requiredfield · query
Optionallimit (1–100, default 20) · filters
Response{ suggestions: [ string ] }
CostFree

Supported on any field marked ✓ in the Search Fields table (title, company, location, skills, seniority, industry, degree, school, languages, and more). Pass a partial query for type-ahead, or an empty query to get the most common values. Optional filters scope the suggestions to a subset of the population.

RequestJSON
{ "field": "location", "query": "san fran", "limit": 5 }
ResponseJSON
{
  "suggestions": [
    "San Francisco, California, United States",
    "San Francisco Bay Area"
  ]
}

Recommended flow: autocomplete a value → use the exact string in an in filter → search.

Enrich

POST/v1/person/enrich

Return the complete profile record for people you know by profile URL. Billed 25 credits per matched profile.

At a glance

MethodPOST/v1/person/enrich
Requiredlinkedin_urls
LimitsUp to 25 profile URLs per request
ResponseArray of matches, one per URL
Cost25 credits / matched profile

Enrich returns the full record: skills, summary, languages, connections, and detailed employment and education. Identifiers with no match are not charged.

Enrich takes profile URLs only — it does not accept emails and does not return contact details. For verified emails and phone numbers, use Contact.
RequestJSON
{ "linkedin_urls": ["https://www.linkedin.com/in/janesmith"] }
ResponseJSON
[
  {
    "matched_on": "https://www.linkedin.com/in/janesmith",
    "match_type": "linkedin_url",
    "matches": [
      {
        "confidence_score": 1,
        "person": {
          "id": "9f340bef557aa20053661f25",
          "name": "Jane Smith",
          "summary": "Engineer focused on distributed systems...",
          "skills": ["Python", "AWS", "Kafka"],
          "languages": ["English"],
          "connections": 507,
          "current_experience": { "title": "Senior Software Engineer", "company": "Acme Corp", "is_current": true },
          "past_experience": [],
          "education": []
        }
      }
    ]
  }
]

Contact

POST/v1/person/contact

Fetch verified emails and phone numbers by profile URL. Billed 3 credits per contact found.

At a glance

MethodPOST/v1/person/contact
Requiredlinkedin_urls
LimitsUp to 25 profile URLs per request
ResponseArray of matches, one per URL
Cost3 credits / contact found

Returns business and personal emails plus phone numbers. Identifiers with no contact found are not charged. Each email carries a deliverability status: deliverable, catch_all, invalid, or unknown.

RequestJSON
{ "linkedin_urls": ["https://www.linkedin.com/in/janesmith"] }
ResponseJSON
[
  {
    "matched_on": "https://www.linkedin.com/in/janesmith",
    "match_type": "linkedin_url",
    "matches": [
      {
        "confidence_score": 1,
        "person_data": {
          "contact": {
            "business_emails": [ { "email": "[email protected]", "status": "deliverable" } ],
            "personal_emails": [ { "email": "[email protected]", "status": "deliverable" } ],
            "phone_numbers": ["+1-555-0100"]
          }
        }
      }
    ]
  }
]

Person object

The profile shape returned inside profiles[] (Search) and matches[].person (Enrich):

FieldTypeDescription
idstringStable, opaque identifier for the profile
namestringFull name
headlinestringProfessional headline
summarystring | nullAbout / bio text — Enrich only
locationstringLocation (city, state, country)
linkedin_urlstringPublic profile URL
twitter_urlstring | nullTwitter / X profile, if available
profile_picture_urlstring | nullAvatar URL, served via the RecruitKar media proxy
years_experiencenumber | nullTotal years of professional experience
connectionsnumber | nullNetwork size — Enrich only
skillsstring[]Skills — Enrich only (filter-only on Search)
languagesstring[]Languages — Enrich only
current_experienceobject | nullCurrent role — see Experience object
past_experienceobject[]Past roles — see Experience object
educationobject[]Education — see Education object

Experience object

The shape of current_experience and each item in past_experience:

FieldTypeDescription
titlestring | nullRole title
companystring | nullEmployer name
locationstring | nullRole location
start_datestring | nullISO start date
end_datestring | nullISO end date; null for the current role
is_currentbooleanWhether this is the current role

Education object

Each item in education:

FieldTypeDescription
degreestring | nullDegree earned
field_of_studystring | nullField of study
institutionstring | nullInstitution name
start_datestring | nullStart year
end_datestring | nullEnd year

Errors

Errors always return the same shape, with a stable code and a human-readable message:

ErrorJSON
{ "error": { "code": "INSUFFICIENT_CREDITS", "message": "This request costs up to 25 credits; your balance is 12." } }
CodeHTTPWhen it happens
INVALID_QUERY400A filter field, operator, value, or identifier is invalid — see the message
UNAUTHORIZED401Missing or invalid API key — check the Authorization header
INSUFFICIENT_CREDITS402Not enough credits — top up to continue
FORBIDDEN403Account suspended — contact your account manager
RATE_LIMITED429Too many requests — retry after a short backoff
UPSTREAM_UNAVAILABLE503Temporary issue — retry with exponential backoff

Rate limits & billing

Rate limit: 60 requests per minute per key. Exceeding it returns 429 RATE_LIMITED.

EndpointPriceNotes
Search1 credit / profile returnedCharged for the profiles you receive; unreturned page slots refunded
Preview1 credit / callMatch count for a filter set (runs a search to read it)
AutocompleteFreeFilter-value suggestions
Enrich25 credits / matched profileThe complete profile record; unmatched URLs refunded
Contact3 credits / contact foundNot-found identifiers refunded

Billed responses include x-credits-charged and x-credits-remaining headers. Top-ups are handled by your account manager.