Skip to content
Last updated

Using the API

Content-Type

The Content-Type entity header is used to describe the media type of a resource. In requests, a Content-Type header tells the server what type of data is being sent. In responses, it tells the client what type of data the returned content actually is.

Our default is to accept data as application/x-www-form-urlencoded (which is typical for most websites you interact with), but you are free to send other data types, like application/json, as it suits you. Simply specify the Content-Type in the header of the request.

curl -X POST https://api.checkr.com/v1/candidates \
  -H "Content-Type: application/json" \
  -u YOUR_API_KEY: \
  -d '{"first_name": "John", "last_name": "Smith", "email": "john.smith@gmail.com"}'

Embedding resources

By default, an API response contains the requested resource, and provides the IDs of related resources. You can also request related resources to be embedded in the initial response.

The include parameter specifies the names of resources that should be embedded in the response. Resources to embed must be comma-separated.

curl -X GET "https://api.checkr.com/v1/reports/59b650f567e1dd0f01422b92?include=candidate,ssn_trace,county_criminal_searches" \
  -u YOUR_API_KEY:

Pagination is enabled for endpoints that return a list of records.

There are two parameters that control pagination: page, which specifies the page number to retrieve, and per_page, which indicates how many records each page should contain. The default value of per_page is 25 records.

curl -X GET "https://api.checkr.com/v1/candidates?page=2&per_page=25" \
  -u YOUR_API_KEY:
ParametersDescription
pageinteger
greater than or equal to 1
per_pageinteger
between 0 and 100

Paginated responses include the following attributes:

AttributesDescription
countinteger
the total number of items
dataarray
list of objects
next_hrefstring
URI to fetch the next page of results
objectstring
"list"
previous_hrefstring
URI to fetch the previous page of results

Rate limiting

In order to provide a high-quality of service for all customers, our API is rate limited. The current limit is 1200 requests per minute across all endpoints. We reserve the right to adjust the rate limit for given endpoints.

If the rate limit is exceeded, the API responds with a HTTP 429 "Too Many Requests" status code. The response has a X-Ratelimit-Reset header that tells you when the rate limit count will reset.

Here are the headers related to rate limiting that our API returns for any requests:

HeaderDescription
X-Ratelimit-LimitNumber of requests allowed per minute
X-Ratelimit-RemainingRemaining number of requests allowed for the current minute
X-Ratelimit-ResetTime at which the rate limit count resets

Staying under the limit

Here are some recommendations to stay under the limit:

  • Subscribe to Checkr webhooks to get updates about a report's activity instead of polling.
  • If you do anticipate situations where you could exceed the limit, we recommend using an exponential backoff (wait 2 seconds, then 5, then 10, then 30, etc.) and retrying the API call.

Idempotency

The Checkr API supports idempotency in POST requests. Use this feature to safely repeat POST requests without accidentally creating the same reports or candidates multiple times.

First, provide an Idempotency-Key: <key> header to the POST request. This header value will be used server side to recognize retries of the same request.

The client side must then generate a unique value for every POST request, and re-use the same header value in any subsequent retry attempts. We recommend the use of V4 UUIDs to avoid collisions.

curl -X POST https://api.checkr.com/v1/reports \
  -u YOUR_API_KEY: \
  -H 'Idempotency-Key: 40b23921-c005-4ec7-832a-3ae023dbbc11' \
  -d package=driver_pro \
  -d candidate_id=be529e5d8cc5ad26e655ce89 \
  -d consent_document_ids[]=b73f89e14b393979857806f9

When serving the request with a new idempotency key, Checkr service will save the response (including status code, headers, body) for the first request if it is successful (2xx status), and return the saved response for later requests with the same idempotency key.

The idempotency key expires after 24 hours. Retries with an expired idempotency key will be handled as new requests.

409 HTTP status code will be received when another request with the same idempotency key is still being processed. Wait for the other request to complete before making a new request with the same idempotency key.

Supported characters

The Checkr API supports alphanumeric character input, as well as accented characters and some punctuation marks.

Corresponding regex character ranges: [a-zA-Z0-9ªµºÀ-ÖØ-öø-ÿ\-'., ]

Supported accented characters

ªµºÀÁÂÃÄÅÆ
ÇÈÉÊËÌÍÎÏÐ
ÑÒÓÔÖØÙÚÛÜ
ÝÞßàáâãäåæ
çèéêëìíîïð
ñòóôõöøùúû
üýþÿ'.,-

SSN validation

Checkr's product incorporates SSN field controls designed to not accept SSNs with the following characteristics:

  • SSNs without exactly 9 numeric characters
  • SSNs that start with 666 (666-34-3768)
  • SSNs that start with 9 (967-65-4325)
  • SSNs that are a single digit (111-11-1111)
  • SSNs that are sequential digits (123-45-6789)

Email validation

The Checkr API validates submitted email addresses using the industry standard RFC 5322. The string length must be <=255, and the domain must be valid and configured to accept email. (For example: gmail.com is a valid domain, while gmeil.con is not.)

To avoid errors, we suggest that you validate emails used in your candidate creation requests.

Error codes

Checkr's API offers a number of error codes to facilitate your building and troubleshooting. Some common error codes include:

Status CodeResponse
400SSN is invalid
400Zipcode is invalid
400Email is not a valid email address
400First name must only contain letters, numbers, spaces, hyphens, apostrophes, periods, and commas
400Last name must only contain letters, numbers, spaces, hyphens, apostrophes, periods, and commas
400Middle name must only contain letters, numbers, spaces, hyphens, apostrophes, periods, and commas.
400Report is too old to upgrade
400New package does not add any screenings
400Candidate must have a driver license number and a driver license state for the package mvr
400Report has a pre-existing adverse action. See Update a Report
400SSN is invalid. TIN was provided.
400SSN has already been taken
400First name must only contain letters, numbers, spaces, hyphens, apostrophes, periods, and commas", "Last name must only contain letters, numbers, spaces, hyphens, apostrophes, periods, and commas
400Candidate must be at least 16 years old
400Candidate must be at least 18 years old
400Candidate must have SSN for the package driver_premium
400Candidate has reached the limit of Reports allowed
400Candidate must_not have middle name when no_middle_name flag is set to true for the candidate report_id=
400Candidate must have middle name when no_middle_name flag is set for the candidate report_id=
400No middle name can not be updated, No middle name must have middle name when no_middle_name flag is set to false for the candidate candidate_id=
400Report driver license state not supported or not enabled for account
400Number Driver license number must only contain letters, numbers, spaces, hyphens, and asterisks
400Number can't be blank, State can't be blank, State is not a valid US state
403Forbidden
403Sorry, your account is not approved for production
403Candidate has requested that their PII be removed
409Duplicate geo, name: peninsulasw_wa, state: WA already exists
409Duplicate report detected. No more than 3 reports per candidate can be created within a 24 hour period
409Duplicate candidate detected. No more than 2 duplicate candidates can be created within a 24 hour period

Cancellation reasons

Screenings can be canceled due to various scenarios. Here is a list of the current cancellation reasons and their descriptions.

ReasonDescription
candidate_missing_consentCandidate consent not provided
candidate_pii_updated_customer_requestedCustomer updated candidate PII prior to screening completion
exception_ssn_traceSSN Trace completed with an exception prior to screening completion
source_inaccessible_closed_courtCourt closed or has limited access to court records
complete_now_customer_requestedCustomer requested Complete Now prior to screening completion
missing_required_informationRequired information not received
vendor_unable_to_completeVendor unable to complete screening
vendor_account_deauthorizedVendor deauthorized account
international_entry_not_supportedScreening does not support international entries
no_history_required_informationCandidate declared no history
profile_on_hold_customer_requestedCustomer requested candidate profile on hold
candidate_withdrew_consentCandidate withdrew consent
minors_package_not_enabledPackage not configured to allow candidates under age 18
candidate_below_minimum_ageCandidate is below the minimum age for a background check
exception_mvrMVR canceled with an exception
customer_account_deauthorizedCustomer account was deauthorized
adverse_action_completedAdverse Action completed prior to screening completion
adverse_action_suspended_report_timer_customer_requestedCustomer configured the Adverse Action on Suspended Reports feature and its timer expired prior to screening completion
unable_to_fulfill_mvrUnable to fulfill MVR request as data is not available
identity_verification_unverifiedIdentity Verification completed with an Unverified result and action was taken to cancel the Report
request_withdrawnRequest withdrawn
license_state_not_enabledUnable to fulfill MVR request as driver license state is not enabled for account

Verification types

Verification type values that indicate additional information or actions requested from a candidate. These types are shown inside of webhooks and from the API for verifications. For more information about verifications please visit the links for the webhook events or the api.

Type
candidate_employment_history
driver_license
driver_license_history
education
id
id_document
license_document
passport_document
previous_license_document
ssn_confirmation
ssn_document
matrix
consent

Form I-9 definitions

Workflow types

Workflow types are high-level flows the employee can select at the moment of creating an I9 form, it affects what will be the filling experience is from a candidate’s perspective.

Workflow TypeDescription
remote_section_1_onlyEmployee will complete Section 1 on their own. Then Employer help them complete Section 2 on-site.
employee_appointmentEmployee will complete Section 1 on their own. Then Employer authorize an employee-designated representative to help them complete Section 2.

Form I-9 status

Represents the current status of the I-9/E-Verify process.

StatusDescription
Section 1 in progressIndicates that the employee must complete Section 1.
Section 2 in progressIndicates that the employer/customer or the Authorized Representative (when applicable) must complete Section 2.
E-Verify in progressIndicates that the E-Verify case is in progress.
Action requiredIndicates that the employer/customer must take action — for example, resolving an E-Verify Tentative Non-Confirmation (TNC), a photo match, or a document upload, or following up on a rejected Section 1.
AuthorizedIndicates that the Form I-9 is complete and, when E-Verify is enabled for the Worksite, the E-Verify case closed as authorized.
UnauthorizedIndicates that the E-Verify case closed without confirming employment authorization (for example, a Final Nonconfirmation).

Driver license validation

Checkr has compiled the following table of valid driver license number input per jurisdiction. To avoid errors, we suggest that you implement driver license number validation for both the Candidates and Driver Licenses endpoints.

JurisdictionValidation CriteriaRegex
AL7-8 Numeric/\A\d{7,8}\z/
AK7 Numeric/\A\d{7}\z/
AZ(1 Alpha + 8 Numeric) OR 9 Numeric/\A[A-Z]{1}\d{8}\z/ OR /\A\d{9}\z/
AR9 Numeric/\A\d{9}\z/
CA1 Alpha + 7 Numeric/\A[A-Z]{1}\d{7}\z/
CO9 Numeric/\A\d{9}\z/
CT9 Numeric/\A\d{9}\z/
DE2-7 Numeric/\A\d{2,7}\z/
DC7-9 Numeric/\A\d{7,9}\z/
FL1 Alpha + 12 Numeric/\A[A-Z]{1}\d{12}\z/
GA9 Numeric/\A\d{9}\z/
HI("H" + 8 Numeric) or 9 Numeric/\AH\d{8}\z/ OR /\A\d{9}\z/
ID(2 Alpha + 6 Numeric + 1 Alpha) or 9 Numeric/\A[A-Z]{2}\d{6}[A-Z]{1}\z/ OR /\A\d{9}\z/
IL1 Alpha + 11-12 Numeric/\A[A-Z]{1}\d{11,12}\z/
IN10 Numeric/\A\d{10}\z/
IA9 Numeric or (3 Numeric + 2 Alpha + 4 Numeric)/(\A\d{9}\z)/ OR /(\A\d{3}[A-Z]{2}\d{4}\z)/
KS"K" + 8 Numeric/\A[K]{1}\d{8}\z/
KY1 Alpha + 8 Numeric/\A[A-Z]{1}\d{8}\z/
LA("0" + 7 Numeric) OR ("0" + 8 Numeric) OR 7 Numeric or 8 Numeric/\A[0]{0,1}\d{7,8}\z/
ME7 Numeric/\A\d{7}\z/
MD(1 Alpha + 12 Numeric) OR ("MD" + 11 Numeric)/\A[A-Z]{1}\d{12}\z/ OR /\AMD\d{11}\z/
MA("SA" + 7 Numeric) OR ("S" + 8 Numeric) OR 9 Numeric\ASA\d{7}\z OR \AS\d{8}\z OR \A\d{9}\z
MI1 Alpha + 12 Numeric/\A[A-Z]{1}\d{12}\z/
MN1 Alpha + 12 Numeric/\A[A-Z]{1}\d{12}\z/
MS9 Numeric/\A\d{9}\z/
MO9 Numeric OR (1 Alpha + 5-9 Numeric) OR (3 Numeric + 1 Alpha + 6 Numeric)/(\A\d{9}\z)/ OR /(\A[A-Z]{1}\d{5,9}\z)/ OR /(\A\d{3}[A-Z]{1}\d{6}\z)/
MT13 Numeric or 9 Alpha-Numeric or (3 Alpha + 10 Numeric)/(\A\d{13}\z)/ OR /(\A(\d|[A-Z]){9}\z)/ OR \ /(\A[A-Z]{3}\d{10}\z)/
NE1 Alpha + 3-8 Numeric/\A[A-Z]{1}\d{3,8}\z/
NV9-10 Numeric OR 12 Numeric OR ("X" + 8 Numeric)/\A\d{9,10}\z/ OR /\A\d{12}\z/ OR /\AX\d{8}\z/
NH(2 Numeric + 3 Alpha + 5 Numeric) OR (("NHL" or "NHN") + 8 Numeric)/(\A\d{2}[A-Z]{3}\d{5}\z)/ OR /(\A(NHL|NHN)\d{8}\z)/
NJ1 Alpha + 14 Numeric/\A[A-Z]{1}\d{14}\z/
NM9 Numeric/\A\d{9}\z/
NY9 Numeric OR 1 Alpha + 18 Numeric/(\A\d{9}\z)/ OR /(\A[A-Z]{1}\d{18}\z)/
NC4-12 Numeric (with up to 5 leading zeros)/\A0{0,5}\d{4,12}\z/
ND9 Alpha-Numeric/\A(\d|[A-Z]){9}\z/
OH(1-2 Alpha + 4-7 Numeric) OR 8 Numeric/(\A[A-Z]{1,2}\d{4,7}\z)/ OR /(\A\d{8}\z)/
OK(1 Alpha + 9 Numeric) or 9 Numeric/(\A[A-Z]{1}\d{9}\z)/ OR /(\A\d{9}\z)/
OR5-7 Numeric OR (1 Alpha + 6 Numeric)/(\A\d{5,7}\z)/ OR /(\A[A-Z]{1}\d{6}\z)/
PA8 Numeric/\A\d{8}\z/
PR5-9 Numeric/\A\d{5,9}\z/
RI7-8 Numeric OR ("V" + 6 Numeric)/(\A\d{7,8}\z)/ OR /(\AV\d{6}\z)/
SC3-10 Numeric/\A\d{3,10}\z/
SD6-9 Numeric/\A\d{6,9}\z/
TN7-9 Numeric/\A\d{7,9}\z/
TX7-8 Numeric/\A\d{7,8}\z/
UT4-10 Numeric/\A\d{4,10}\z/
VT8 Numeric or (7 Numeric + 1 Alpha [A, F, J, K, L, Q, R, T, V, X, Y])/(\A\d{8}\z)/ OR /(\A\d{7}[AFJKLQRTVXY]\z)/
VA(1 Alpha + 8 Numeric) OR 9 Numeric/\A[A-Z]{1}\d{8}\z/ OR /\A\d{9}\z/
WA(4-8 Alpha + 2-3 Numeric + 2 Alpha-Numeric) OR ("WDL" + 9 Alpha-Numeric)/\A[A-Z*]{4,8}\d{2,3}(\d|[A-Z]){2}\z/ OR /\AWDL([A-Z]|\d){9}\z/
WV7 Alpha-Numeric/\A([A-Z]|\d){7}\z/
WI1 Alpha + 13 Numeric/\A[A-Z]{1}\d{13}\z/
WY9 Numeric/\A\d{9}\z/
AB1-9 Numeric/\A\d{1,9}\z/
BC7-8 Numeric/\A\d{7,8}\z/
MB1 Alpha + 4 Alpha or Asterisk + 1 Alpha + 1 Alpha or Asterisk + 2 Alpha-Numeric + 1 Numeric + 2 Alpha-Numeric/\A[A-Z][A-Z*]{4}[A-Z][A-Z*][A-Z0-9]{2}\d[A-Z0-9]{2}\z/
NB1-7 Numeric/\A\d{1,7}\z/
NL1 Alpha + 9 Numeric/\A[A-Z]\d{9}\z/
NS5 Alpha or Asterisk + 9 Numeric/\A[A-Z*]{5}\d{9}\z/
NT1-6 Numeric/\A\d{1,6}\z/
NU1-6 Numeric/\A\d{1,6}\z/
ON1 Alpha + 14 Numeric/\A[A-Z]\d{14}\z/
PE1-6 Numeric/\A\d{1,6}\z/
QC1 Alpha + 10 Numeric + 1 Alpha-Numeric + 1 Numeric/\A[A-Z]\d{10}[A-Z0-9]\d\z/
SK8 Numeric/\A\d{8}\z/
YT1-6 Numeric/\A\d{1,6}\z/