Your tools, connected.
Bring jobs into TAP from your own systems and read their progress. Customer API access is available to agency owners with active Agency Growth access, including an eligible Growth trial.
Manage API access Download OpenAPI specification
Start with a secure key
- Sign into your agency owner workspace and open API access.
- Choose a name, permissions and expiry. Copy the key once into your server’s secret storage.
- Send it in
Authorization: Bearer YOUR_KEYover HTTPS.
curl https://taprecruiter.com/api/v1/jobs \ -H "Authorization: Bearer $TAP_API_KEY"
Keys apply only to the issuing agency. They cannot access other agencies’ records or take over a member’s session. Keys stop working after expiry, revocation, loss of owner access or loss of the required plan. Requests from browser JavaScript are not supported.
What you can connect
| Request | Permission | Result |
|---|---|---|
| GET /api/v1/clients | clients:read | Owned client company IDs, names, industry, location and status. No individual contact details. |
| GET /api/v1/jobs | jobs:read | Agency-owned jobs, including private jobs. |
| GET /api/v1/jobs/{id} | jobs:read | Job details and current workspace revision. |
| GET /api/v1/jobs/{id}/progress | jobs:read | Job status and application counts grouped by stage. No candidate identities. |
| POST /api/v1/jobs | jobs:write | Create a private, unadvertised job for an existing owned client. |
| PATCH /api/v1/jobs/{id} | jobs:write | Update title, location or description. Commercial terms, workflow status and sharing remain controlled in TAP. |
Candidate records, CV files, deletion, client creation, billing, messages, webhooks and automatic two-way synchronisation are outside v1. Use TAP’s existing integrations and workspace controls for those workflows.
Create a job safely
Read your client IDs first. Reuse the same Idempotency-Key if a create request times out. A successful replay returns the existing job’s current representation; a key reused with different input returns 409.
curl https://taprecruiter.com/api/v1/jobs \
-H "Authorization: Bearer $TAP_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: your-unique-request-0001" \
-d '{"title":"Operations Manager","clientId":"YOUR_CLIENT_ID",
"location":"Toronto","type":"Permanent","salary":100000,
"currency":"CAD","taxTreatment":"exclusive",
"feeModel":"Percentage","feeValue":15,
"description":"Your approved job description."}'All amounts use the supplied job currency. These are stored job terms, not a payment or an invoice. New jobs are not automatically advertised or shared.
Update without overwriting someone’s work
GET the job, then send its ETag value in the PATCH request’s If-Match header. If anyone has changed the workspace, TAP returns 409. Read the latest record before retrying. PATCH accepts only title, location and description.
PATCH /api/v1/jobs/YOUR_JOB_ID
Authorization: Bearer YOUR_KEY
Content-Type: application/json
If-Match: "42"
{"description":"Updated, approved description."}Limits and errors
60 requests per minute per agency, shared across its keys. List endpoints accept limit (1–100, default 25) and after (the returned nextCursor). Lists are ordered by record ID, not date; changes during pagination are not a snapshot. Request bodies are limited to 40 KB.
400: invalid input · 401: invalid/expired/revoked key · 403: missing scope, ownership or plan · 404: record unavailable · 409: conflicting revision or duplicate request · 413: body too large · 415: unsupported content type · 422: TAP workflow rule · 429: rate limit (wait at least 60 seconds) · 503: temporary failure.
Errors include a request ID for support. API change logs contain action, key and record IDs. Entries older than 90 days are removed on the next API write. Key hashes and create-request IDs are included in account-deletion handling. API keys never appear in logs or later key-list responses. Rotate keys by creating a replacement, updating your integration, then revoking the old key.
