curl and jq and the same calls in Node.js, Python and PHP (Laravel). Webhooks are step 8 and have their own page.
Before you start
You need, from Vort:- a sandbox partner key (the value you send in
x-partner-key); - an activation code for your sandbox customer organization (
VORT-XXXX-XXXX).
The sandbox runs real searches but returns synthetic contact details and never charges real credits. Keep
target_count at 20 or below. See Sandbox for every difference from production.1
Configure your environment
The sandbox base URL is
https://vort-partner-api.vercel.app/sandbox/v1. VORT_BASE includes /v1, so every call below is $VORT_BASE/<path>.The Node.js, Python and PHP examples on this page call a small helper that reads the same two values and adds the headers. Every request sends x-partner-key; every request except the redeem call also sends the customer’s org token in x-vort-org.2
Connect a customer
Redeem the activation code. This is the only call made without In your product, store the token server-side, encrypted at rest, keyed by the
x-vort-org.Response
external_id you sent (your id for this customer).3
Register a recruiter
Response
external_id (acting_user_external_id). It is a field, not a credential. POST /users is an upsert and safe to retry.4
Create the job
Response
POST /jobs again whenever the job changes in your ATS: it updates the title, description and location and returns the same job_id.5
Start a run
Response (202)
202means the run started.warnings[]never block; show each one under the requirement at itsindex.422 requirements_rejectedmeans nothing started. Show eachrejected[]message (and suggestion) under its requirement, let the recruiter fix it, and resubmit.
6
Poll the run
Poll Then look at what the recruiter would see:In your UI: show
GET /runs/{run_id} every 5 seconds while a recruiter is watching, and stop when the status is completed or failed. Honor Retry-After on 429.progress.confirmed / progress.target as numbers and a bar, render every notice in its slot (including codes you do not know), keep the candidates in API order, and show the run_id. In the sandbox, candidate names are pseudonyms such as Candidate 7F3A until the data processing annex is signed.7
Reveal a contact
Show the price from In the sandbox the contact details are synthetic and a reveal is never charged (
reveal_price_credits before the click, then reveal.Response (sandbox)
credits_charged: 0). In production, credits_charged is the real charge. Either way, render credits_charged and wallet_balance_after exactly as returned, and a null e-mail or phone as “not found”. A repeat reveal of the same candidate is not charged again.8
Report decisions
Every recruiter decision about a Vort candidate, and every notice code you rendered, goes back to Vort. This is a condition of the partnership.Send the same request again and you get
Response
{"accepted": 0, "duplicates": 1}: a retry that reuses occurred_at is stored once. A rejection carries one of the seven fixed reject_reason values (or null) and an optional note; see Decisions and reject reasons.Next steps
Webhooks
Receive and verify webhooks instead of polling runs nobody is watching.
UI specification
Build the screens and render notices by the rules Vort fixes.
Errors and rate limits
Handle errors, rate limits and retries.
Certification
Run the certification fixtures and work through the checklist.