Migration guide from v2

Move an existing /v2 integration to v3, one endpoint at a time.

JOIN API v3 replaces v2. Your existing API key already works with v3, so you can move over one endpoint at a time.

  • Same data. v2 and v3 read and write the same jobs, applications, candidates and locations.
  • Same key. Your v2 key was converted to a company API token automatically. Its value did not change.
  • Your pace. Both versions run side by side until v2 is switched off.

Key dates

DateEvent
v3 launchv3 is live. v2 is deprecated and receives only bug fixes and security patches.
31 October 2027v2 stops working. Every request to /v2 fails after this date.

Steps

  1. Find your token. Go to Settings → Developer → API tokens. Your v2 key is listed there, named after the admin who owned it, for example "Sarah's API Token". The page is available to System Admins.
  2. Keep the same key. Send it on every request as Authorization: Bearer <your key>. If the key is lost, create a new token and revoke the old one. New tokens work with both v2 and v3.
  3. Change the URL. Replace /v2/ with /v3/ in each request.
  4. Update your code for the new format. See Differences below. Move one endpoint at a time and test it before moving the next.
  5. Remove v2 calls before 31 October 2027.

Differences

Topicv2v3
API keyOne personal key per userCompany tokens, up to 10, managed by System Admins. New tokens start with join_sk_
ResponsesBare objects and arraysAlways wrapped: { "data": ... }
PaginationPage numbers, X-Total-Count headerlimit (max 50) and cursor. Pass nextCursor for the next page; null means the last page
ErrorsVaries by endpointAlways { "error": { "code", "message", "details" } }. Branch on code
Rate limits40 requests per 20 seconds600 requests per minute and 100 per 10 seconds, per token. On 429, wait Retry-After seconds
Application statusstate, hiringState, stagestatus (ACTIVE, OFFER, REJECTED, HIRED) and currentPipelineStage
Moving an applicationNot availablePUT /v3/applications/{id}/pipeline-stage with a stage from GET /v3/jobs/{jobId}/pipeline
External IDPATCH /v2/applications/{id}/externalDataPATCH /v3/applications/{id} with externalId
Deleting an applicationDELETE /v2/applications/{id}Not available. Remove the candidate from the job in JOIN
Job on an applicationFull job objectjobId only
Candidate IDsGlobal candidate IDCompany candidate ID, the id returned by /v3/candidates
Renamed fieldsphone, JOIN_CV, lastUpdatedAtphoneNumber, CV, updatedAt
Job category and seniorityReturnedNot returned

Support

Contact JOIN support with the endpoint, the time of the request, and the code from the error response.