Callback API
Add AI CV writing, interview practice and LinkedIn rewriting to your own product, or search candidates who chose to be visible to recruiters. Simple JSON over HTTPS, in English, French and Spanish.
https://YOUR-DOMAIN/api/v1
All requests and responses are JSON (except the PDF endpoint, which returns a PDF file). Times are UTC, ISO 8601.
Authentication
Every request needs an API key. Send it in the Authorization header (or X-Api-Key):
Authorization: Bearer cb_live_3f9a1c2b7d10_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Keys are created by the Callback team and shown once. Each key has scopes that decide which endpoints it can call: cv, interview, profile, talent.
Keep keys on your server. Never put them in a mobile app, browser JavaScript or a public repository. If a key leaks, ask us to revoke it and we'll issue a new one.
Limits & usage
| Limit | Value |
|---|---|
| Requests per minute, per key | 60 |
| Requests per month, per key | Set on your plan (default 1,000) |
| Request body size | 1 MB |
Every response includes X-RateLimit-Monthly-Limit and X-RateLimit-Monthly-Remaining headers.
Errors
Errors use standard HTTP status codes and a JSON body:
{ "error": { "code": "invalid_request", "message": "\"notes\" (object) is required." } }
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | A required field is missing or malformed. |
| 401 | invalid_api_key | Missing, malformed or revoked key. |
| 403 | scope_not_allowed | Your key can't use this endpoint. |
| 413 | payload_too_large | Body over 1 MB. |
| 429 | rate_limited / monthly_quota_exceeded | Slow down, or your monthly quota is used. |
| 502 / 503 | upstream_error, invalid_json, sampling_disabled | The AI didn't answer correctly. Retry after a few seconds. |
Generate a CV
Scope cv. Turns rough notes into a structured, ATS-friendly CV.
| Field | Type | Description |
|---|---|---|
notes | object, required | name, target_role, location, experience_notes, education_notes, skills_and_languages, additional_details (array) |
job_description | string | Optional. Tailors the CV to this job. |
language | string | en (default), fr or es |
tone | string | e.g. "Confident and professional" |
curl -X POST BASE/cv/generate \
-H "Authorization: Bearer $CALLBACK_KEY" -H "Content-Type: application/json" \
-d '{"language":"en","notes":{"name":"Maria Lopez","target_role":"Customer Success Manager",
"experience_notes":"5 yrs support at a SaaS company, 60 tickets/day, 94% CSAT, built FAQ",
"skills_and_languages":"Zendesk, HubSpot, English, Spanish"}}'
const r = await fetch("BASE/cv/generate", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.CALLBACK_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({ language: "en", notes: { name: "Maria Lopez", target_role: "Customer Success Manager", experience_notes: "..." } }),
});
const { cv } = await r.json();
import os, requests
r = requests.post("BASE/cv/generate",
headers={"Authorization": f"Bearer {os.environ['CALLBACK_KEY']}"},
json={"language": "en", "notes": {"name": "Maria Lopez", "target_role": "Customer Success Manager", "experience_notes": "..."}})
cv = r.json()["cv"]
Response
{ "cv": { "headline": "Customer Success Manager", "summary": "...", "skills": ["Zendesk", "..."],
"experience": [{ "title": "...", "company": "...", "location": "...", "dates": "2021 – Present", "bullets": ["..."] }],
"education": [{ "degree": "...", "school": "...", "dates": "..." }], "extras": ["..."], "tips": ["..."] } }
CV to PDF
Scope cv. Returns application/pdf: a real text PDF (ATS-readable), without Callback branding.
| Field | Type | Description |
|---|---|---|
cv | object, required | The object returned by /cv/generate (or your own, same shape). |
name | string | Candidate's full name. |
contacts | string[] | Email, phone, city, LinkedIn… (max 8) |
template | string | classic, modern or sidebar |
accent | string | Hex colour, e.g. #3D5AFE |
photo | string | Optional JPEG/PNG data URL (square works best). photo_shape: circle, rounded, square. |
language | string | Section headings language. |
curl -X POST BASE/cv/pdf -H "Authorization: Bearer $CALLBACK_KEY" -H "Content-Type: application/json" \
-d @cv.json --output Maria-Lopez-CV.pdf
Interview question
Scope interview. Opening question for a mock interview.
{ "role": "Data Analyst", "company": "Acme", "type": "Behavioral (STAR)", "level": "Mid", "job_description": "...", "language": "fr" }
→ { "question": "...", "focus": "..." }
Interview feedback
Scope interview. Scores an answer and returns the next question.
{ "role": "Data Analyst", "question": "Tell me about yourself.", "answer": "...", "previous": [{ "question": "...", "answer": "..." }], "last": false, "language": "en" }
→ { "score": 7, "verdict": "...", "strengths": ["..."], "improve": ["..."], "stronger_answer": "...", "next_question": "...", "focus": "..." }
Profile rewrite
Scope profile. LinkedIn headline options, About section, experience, skills, social bios and banner text.
{ "notes": { "name": "...", "target_role": "...", "experience_notes": "...", "skills_and_languages": "..." }, "language": "es" }
Talent search
Scope talent. Only candidates who opted in to the recruiter talent pool are returned. Candidates can leave at any time; don't store their data longer than your hiring process needs.
{ "total": 12, "page": 1, "results": [{ "id": "…", "name": "…", "country": "CA", "email": "…", "headline": "…", "skills": ["…"], "summary": "…", "updated_at": "…" }] }
Usage
{ "key": "cb_live_3f9a…", "month": "202610", "monthly_limit": 1000, "used": 214, "by_endpoint": { "cv_generate": 120, "cv_pdf": 94 }, "scopes": ["cv"] }
Security & privacy
- HTTPS only. Keys are stored as SHA-256 hashes; we can't read them back.
- AI processing uses Anthropic's Claude models under commercial terms: your data isn't used to train them.
- You are responsible for having a lawful basis to send candidate data, and for honouring deletion requests.
- Talent results respect each candidate's consent. Using them for anything but recruiting is prohibited.
Get access
Tell us about your platform, the endpoints you need and your expected monthly volume. We'll send your key and pricing.