Docs
API reference

Create a report

POST
/api/v1/reports

Analyses a candidate's resume against a job. Answers 202 with the report in queued; follow it with GET /v1/reports/{id} or the report.* webhooks. It starts at once when it can, and waits (still queued) while the candidate's resume is being read or while the organisation already has 10 analyses running. Credits or monthly quota are reserved when it starts. Send candidate instead of candidateId to find or create the candidate in the same call.

Required scope: reports:write.

Errors

  • 400: invalid_content_type, invalid_idempotency_key, invalid_json, request_body_too_large, unknown_field
  • 401: authentication_required, invalid_api_key
  • 402: insufficient_credits, price_exceeds_max, quota_exceeded
  • 403: api_access_disabled, insufficient_scope
  • 404: candidate_not_found, file_not_found, job_not_found
  • 409: file_already_attached, idempotency_key_reused, idempotency_request_in_progress, job_closed, report_exists
  • 422: candidate_resume_failed, candidate_resume_missing, 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
jobId*string

The job to analyse against.

Length1 <= length <= 200
candidateId?string

An existing candidate. Send this or candidate.

Length1 <= length <= 200
candidate?

A candidate to find or create, with the same fields as POST /v1/candidates. It matches an existing candidate by externalId, then by email; otherwise it creates one.

externalId?string

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

Length1 <= length <= 128
maxCredits?number

The most credits you allow this to cost. If the current price is higher the request fails with price_exceeds_max and nothing is charged. Read the price from GET /v1/organization.

Range0 < value <= 1000000

Response Body

Success.

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

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

externalId*|

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

status*string

queued while it waits for the resume to be read or for capacity, processing while it is analysed, needs_review when a person must decide, completed and failed.

Value in"queued""processing""needs_review""completed""failed"
failureCode*|

Why the report failed, when status is failed.

candidate*|

The candidate analysed. Null if the candidate was deleted.

job*|

The job analysed against. Null if the job was deleted.

score*|

Resume fit: how well the resume fits the job, 0 to 10.

summary*|

A short assessment of the fit.

decision*|

The current hiring decision for this candidate and job.

interview*|

The latest interview for this report.

reportVersion*|

The report version that analysed the resume. Null until the analysis starts.

createdAt*string

When the report was created.

Formatdate-time
updatedAt*string

When the report last changed.

Formatdate-time
completedAt*|

When the analysis finished.

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/reports" \  -H "Authorization: Bearer $PROBB_API_KEY" \  -H "Idempotency-Key: $REQUEST_KEY" \  -H 'Content-Type: application/json' \  --data-binary '{  "jobId": "job_example",  "candidate": {    "name": "Ada Lovelace",    "email": "ada@example.com",    "externalId": "ats-4821",    "resume": {      "fileId": "file_example"    }  },  "externalId": "app-9931",  "maxCredits": 5}'
Example Response
{  "object": "report",  "id": "string",  "externalId": "string",  "status": "queued",  "failureCode": "analysis_failed",  "candidate": {    "id": "string",    "name": "string"  },  "job": {    "id": "string",    "title": "string"  },  "score": 0,  "summary": "string",  "decision": "advance",  "interview": {    "id": "string",    "status": "invited"  },  "reportVersion": "string",  "createdAt": "2019-08-24T14:15:22Z",  "updatedAt": "2019-08-24T14:15:22Z",  "completedAt": "2019-08-24T14:15:22Z"}