Docs
API reference

Create a candidate

POST
/api/v1/candidates

Creates a candidate. A resume (an uploaded file or plain text) is read in the background and the profile filled in; follow resumeStatus. An existing candidate with the same externalId, or the same email unless allowDuplicate is true, returns candidate_exists with the existing candidate's ID in existingId.

Required scope: candidates:write.

Errors

  • 400: invalid_content_type, invalid_idempotency_key, invalid_json, request_body_too_large, unknown_field
  • 401: authentication_required, invalid_api_key
  • 403: api_access_disabled, insufficient_scope
  • 404: file_not_found
  • 409: candidate_exists, file_already_attached, idempotency_key_reused, idempotency_request_in_progress
  • 422: file_expired, file_not_uploaded, file_rejected, invalid_parameter
  • 429: rate_limit_exceeded
  • 500: api_error
  • 503: maintenance_mode, service_unavailable

Authorization

ApiKey
headerAuthorizationBearer <probb_live_<id>_<secret>>

Header Parameters

Idempotency-Key?string

Makes retries safe. Repeating a request with the same key and body within 24 hours returns the original response with Idempotent-Replayed: true. The same key with a different body, or from a different API key, returns idempotency_key_reused.

Length1 <= length <= 255

Request Body

application/json
  1. body
name?string

The candidate's full name.

Length1 <= length <= 160
email?string

The candidate's email address.

Formatemail
Lengthlength <= 254
linkedinUrl?string

The candidate's LinkedIn profile URL.

Formaturi
Lengthlength <= 500
currentRole?string

The candidate's current role or headline.

Length1 <= length <= 160
location?string

Where the candidate is based.

Length1 <= length <= 160
externalId?string

Your own ID for the candidate. Unique within the organization.

Length1 <= length <= 128
resume?

The resume, as an uploaded file or plain text.

allowDuplicate?boolean

Create the candidate even if one with the same email exists. A matching externalId is always a conflict.

Defaultfalse

Response Body

Success.

application/json
  1. response
object*string
id*string

The candidate's ID. The same ID the app uses.

externalId*|

Your own ID for the candidate, unique within the organization.

name*|

The candidate's full name.

email*|

The candidate's email address.

linkedinUrl*|

The candidate's LinkedIn profile URL.

currentRole*|

The candidate's current role or headline.

location*|

Where the candidate is based.

resumeStatus*string

none without a resume, processing while Probb reads it, ready once it has been read, failed if it could not be read.

Value in"none""processing""ready""failed"
resumeError*|

Why the resume could not be read, when resumeStatus is failed.

revision*string

Changes on every update. Send it as If-Match to avoid overwriting newer changes.

createdAt*string

When the candidate was created.

Formatdate-time
updatedAt*string

When the candidate last changed.

Formatdate-time
Example Request
# Set PROBB_URL and PROBB_API_KEY. Replace any *_VALUE placeholder and any example ID (such as job_example) with a real one.# Idempotency-Key is optional. Reuse the same key and body when retrying one logical write.curl --fail-with-body -X POST "$PROBB_URL/api/v1/candidates" \  -H "Authorization: Bearer $PROBB_API_KEY" \  -H "Idempotency-Key: $REQUEST_KEY" \  -H 'Content-Type: application/json' \  --data-binary '{  "name": "Ada Lovelace",  "email": "ada@example.com",  "currentRole": "Principal Engineer",  "location": "London",  "externalId": "ats-4821",  "resume": {    "fileId": "file_example"  }}'
Example Response
{  "object": "candidate",  "id": "string",  "externalId": "string",  "name": "string",  "email": "string",  "linkedinUrl": "string",  "currentRole": "string",  "location": "string",  "resumeStatus": "none",  "resumeError": "string",  "revision": "string",  "createdAt": "2019-08-24T14:15:22Z",  "updatedAt": "2019-08-24T14:15:22Z"}