
Partner API for ATS-integration teams
Sourcing, outreach and assessment for every ATS your customers use.
One API to rank and source candidates for a job, enrich profiles, draft and send outreach, and score resumes. You keep the ATS and the candidate record; Hire++ does the work and calls you back with signed webhooks.
How it works
One profile URL in. A candidate your ATS can act on, out.
- POST /v1/profilesYour ATS sends a profile URL. 202 Accepted; enrichment starts.
- status: enrichingHire++ resolves the profile from its providers.
- GET /v1/profiles/{id}A structured profile: experience, education, skills.
- POST /v1/outreach/generateAn outreach draft for this candidate and job.
- POST /v1/resumesUpload a resume; Hire++ parses it and scores it against the job's requirements.
- profile.createdA signed webhook lands on your endpoint.
Kenji Silva
- Go
- AWS
- Docker
- Kubernetes
outreach draft …your platform work at Globex stood out.
assessment Skill match against the job requirements
✓ profile.created · signed
Try it live
Describe a job. Watch Magic Search find the people.
Magic Search looks across LinkedIn and GitHub, ranks every profile against the job, and adds the best matches to it, free. Try a guided run below with sample candidates; developers can switch to the raw API call against the sandbox, webhook signature included.
Senior Backend Engineer, Bengaluru, hybridExample
- 1.Asha R.Senior Backend Engineer · Northwind Pay · 7 yrsStrong fit91GoPostgreSQLKafka12 km away
- 2.Ishaan V.Backend Engineer · Contoso Cloud · 6 yrsStrong fit84GoPostgreSQLKafka22 km away
- 3.Priya N.Staff Engineer, Payments · Woodgrove Bank · 11 yrsStrong fit83GoPostgreSQLKafka8 km away
- 4.Sneha M.Staff Engineer · Fabrikam · 10 yrsStrong fit81GoPostgreSQLKafka5 km away
- 5.Nisha P.Senior Software Engineer · Litware · 8 yrsStrong fit79GoPostgreSQLKafka9 km away
- 6.Vivek I.Senior Backend Engineer · Adatum · 11 yrsStrong fit77GoPostgreSQLKafka24 km away
- 7.Rahul M.Backend Engineer · Proseware · 4 yrsStrong fit74GoKafkaRemote-friendly
- 8.Aditya K.Go Developer · Tailspin · 5 yrsStrong fit73GoKafka16 km away
- 9.Pooja R.Distributed Systems Engineer · Wingtip · 6 yrsStrong fit72GoKafka18 km away
- 10.Tanvi S.Platform Engineer · Fourth Coffee · 7 yrsStrong fit70GoPostgreSQL23 km away
Sample candidates: every name and company here is made up. In the console, Magic Search runs for real, free.Request sandbox keys
This calls the Hire++ sandbox: test mode, fixture providers, no email sent, no credits spent. The webhook signature is checked in your browser with the demo's public secret.
Recorded example. Press Run to call the sandbox.
{
"method": "POST",
"path": "/v1/profiles",
"headers": {
"Authorization": "Bearer <access_token>",
"Content-Type": "application/json",
"Idempotency-Key": "62abcb65-3664-448a-8d86-f92303f2acbd",
"Hire-Customer-Id": "cus_01M37X4GSBE5QRDZW2FDTXKKEC"
},
"body": {
"profile_url": "https://www.linkedin.com/in/ada-lovelace",
"job_id": "job_01M37X4GSNEKETDEMWMTVYB6AD"
}
}{
"status": 202,
"headers": {
"Content-Type": "application/json",
"Hire-Request-Id": "req_6e2826c0bc9f4bbf9c1f06e73f2bd280"
},
"body": {
"id": "prf_01M37X4GTTE5YV11ZMDDB99CMP",
"object": "profile",
"customer_id": "cus_01M37X4GSBE5QRDZW2FDTXKKEC",
"job_id": "job_01M37X4GSNEKETDEMWMTVYB6AD",
"external_candidate_id": null,
"external_customer_id": "hpp-landing-demo",
"external_job_id": "ext-9ca6b7e5994d",
"profile_url": "https://www.linkedin.com/in/ada-lovelace",
"status": "queued",
"source": null,
"failure_reason": null,
"name": null,
"email": null,
"phone": null,
"headline": null,
"location": null,
"work_history": [],
"education": [],
"skills": [],
"batch_id": null,
"metadata": {},
"created_at": "2026-09-23T19:50:58.647Z",
"updated_at": "2026-09-23T19:50:58.651Z"
}
}content-type: application/json
user-agent: HirePlusPlus-Webhooks/1.0
webhook-id: evt_01M37X4KRRE1GVR39E64PB79P3
webhook-timestamp: 1790193061
webhook-signature: v1,hfg4fCrxp06/Wv3nCvvSREROt1dB9TP/gogO+b7zsIY=
{
"id": "evt_01M37X4KRRE1GVR39E64PB79P3",
"env": "test",
"data": {
"job_id": "job_01M37X4GSNEKETDEMWMTVYB6AD",
"status": "ready",
"profile_id": "prf_01M37X4GTTE5YV11ZMDDB99CMP",
"external_job_id": "ext-9ca6b7e5994d",
"external_candidate_id": null
},
"type": "profile.created",
"created_at": "2026-09-23T19:51:01.649Z",
"partner_id": "01a0cfd2-4320-757c-b6ca-853415f0cabf",
"customer_id": "cus_01M37X4GSBE5QRDZW2FDTXKKEC",
"external_customer_id": "hpp-landing-demo"
}secret: whsec_ZLhxzh2B4X9aCtiPv1ngImtMMvn8Ly8O
curl
curl -s https://api.hireplusplus.com/v1/profiles \
-X POST \
-H "authorization: Bearer $HPP_TOKEN" \
-H "hire-customer-id: cus_…" \
-H 'content-type: application/json' \
-H "idempotency-key: $(uuidgen)" \
-d '{"job_id":"job_…","profile_url":"https://www.linkedin.com/in/ada-lovelace"}'TypeScript SDK
const profile = await hpp.profiles.create(
{ job_id: job.id, profile_url: 'https://www.linkedin.com/in/ada-lovelace' },
{ customerId: customer.id },
);Candidate matching
A job description in. A ranked, explained shortlist out.
Hire++ reads the JD, ranks the candidates already in your customer's pool against it, and when that isn't enough, finds more from public profiles. Every score comes with its reasons.
POST /v1/jobs
Understands the JD 1 credit per JD version
Free text becomes structured must-have and nice-to-have skills, seniority, years, work mode, office and radius, and remote regions. Override any field with PATCH /v1/jobs/{id}/profile; overrides are free and carry over when the JD changes.
POST /v1/jobs/{id}/matches
Ranks your pool Free
A deterministic 0–100 score from fixed weights, then an AI review that moves each of the top 20 at most three places and explains it: a reason, strengths and gaps. Location-aware (within radius, outside it, remote-eligible), and hired or rejected candidates drop out using the ATS status you record.
POST /v1/jobs/{id}/sourcing_runs
Finds more Free
When the pool runs thin, Find more searches public GitHub and LinkedIn profiles, pre-scores every hit against the job and adds only the best to your pool, with photo, company and years. Duplicates are skipped, and there is a daily cap.
Senior Backend Engineer
Asha Rao
All three must-haves and seven years building payment systems.
Score 91
Rahul Mehta
Strong Go and Kafka; MySQL rather than PostgreSQL.
Score 74
Kavya Nairfound by Find more
Go and Kafka at scale; PostgreSQL is a gap.
Score 68
Score weights
- Must-have skills30
- Role and seniority20
- Experience relevance15
- Nice-to-have skills10
- Location10
- Activity10
- Education5
Fair by construction. Names, photos and protected attributes (age, gender, ethnicity, nationality, and proxies for them) are never used in scoring or sent to the AI. Reviewers can turn on Hide photos in the console for a blind review.
job.profile_readyjob.profile_failedmatch.sourcing_completedmatch.sourcing_failed
Matching API referenceCapabilities
Four more jobs, done properly.
Profile enrichment
Post a LinkedIn or GitHub profile URL and get a 202 while enrichment runs. When no provider has the candidate, the profile moves to pending_capture with a capture_url, so a recruiter can finish it with the browser extension.
AI outreach
Generate a personalised draft for a profile and a job, then send it by email and hear back through outreach.sent or outreach.failed. LinkedIn InMail is draft-only: Hire++ never sends it.
Resume parsing and assessment
Upload a PDF or DOCX of up to 10 MB. Hire++ parses it and scores it against the job: a resume score, skill match, matched and missing skills, and key highlights.
Webhooks
Every delivery is signed per Standard Webhooks. A failed delivery is retried 8 times over about 23 hours, and any delivery can be replayed.
Built for partners
The details an integration team checks first.
hpp_test_… / hpp_live_…Test and live keysOne base URL; the key you authenticate with picks the environment. Test mode sends no real email and spends no credits.client_id=hpp_test_51df2a9c… → environment: test client_id=hpp_live_51df2a9c… → environment: live One base URL: no separate sandbox host.
Idempotency-KeySafe retriesEvery POST takes a key, and a repeat replays the original response instead of running twice. The SDK sets one for you.idempotency-key: 5b1f6c2e-9e3a-4c7d-8b1a-2f9e0c1d4a6b Same key, request finished → replayed, Idempotent-Replayed: true Same key, different request → 422 idempotency_key_reused
application/problem+jsonErrors you can branch onEvery error is an RFC 7807 body with a stable code and a request_id. The SDK throws a typed HppApiError.{ "type": "…/errors/insufficient_credits", "title": "Insufficient credits", "status": 402, "request_id": "req_5f3a1c2b8e9d4f60" }row-level securityTenant isolationPostgres row-level security scopes every tenant table to your partner and environment, so test and live data never mix.RLS policies on every tenant table scope each query to (partner, env) Test and live rows never mix, one deployment No cross-tenant reads, enforced in Postgres
external_customer_idYour ids, everywhereEvery webhook carries your external_* ids, so a handler joins straight back to the ATS record without a lookup."external_customer_id": "acme-corp-42", "data": { "external_candidate_id": "candidate-9001" } Joins straight back to your ATS record, no follow-up GETRetry-AfterRate limits you can plan forEvery /v1 response carries RateLimit headers. A 429 comes with Retry-After, which the SDK honours.RateLimit-Limit: 100 RateLimit-Remaining: 0 429 rate_limited → Retry-After: 2
The console
Jobs and matches, credits, keys, webhooks and request logs, all in one place.


Console shown with sample data.
Monthly plans with included credits.
Plans are being finalised. Talk to us about plans and sandbox access.
- Job understanding
- 1 credit per JD version
- Ranking your pool
- Free
- Find more
- Free
Test mode is free.

Send your first request today.
Read the docs, then ask us for sandbox keys. Test mode never sends email or spends credits.