Skip to content
Developers
Menu

API

Verifications

API reference for submitting verification requests and tracking their holder-authorised results.

Updated

On this page

A verification request asks Arrota to compare what a candidate told you with a record in their Vault. The record holder must authorise the check, the issuing organisation's disclosure policy applies, and you receive a result for each claim. You never receive the record's stored values.

Who can use it

  • Your organisation must be an active verifier organisation on a plan with API access.
  • Your key needs the verifications:write scope.

Other organisations receive 403 even with the scope.

How a request moves

  1. You submit claims about a record. The request starts as authorisation_required, and Arrota emails the holder.
  2. The holder approves or denies it in their Vault. Nothing is compared until they approve.
  3. If they approve, the issuing organisation's policy decides: the result is released immediately, or held for the organisation's review (pending_review).
  4. The request becomes resolved with an outcome and per-claim fields.

There is no webhook for your own requests; poll the request until it is resolved.

Submit a verification request

POST/api/v1/verifications

Body

FieldTypeRequiredDescription
record_idstring (UUID)YesThe record to check. The holder can share its Record ID from their Vault.
submitted_claimsobjectYesThe facts to compare, as field: "value" strings of up to 500 characters. Only fields for the record's type are accepted.
authorisation_proof_urlstringNoAn https link to the candidate's consent form.
Record typeFields you can submit
Employmentemployer_name, job_title, employment_type, start_date, end_date
Education, Transcriptinstitution_name, qualification, field_of_study, graduation_year, start_date, end_date
Other typesstart_date, end_date

Example request

curl -X POST "https://app.arrota.com/api/v1/verifications" \
  -H "Authorization: Bearer $ARROTA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "record_id": "9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b",
    "submitted_claims": {
      "job_title": "Operations Manager",
      "start_date": "2021-01-15"
    }
  }'

Response

Response 202
{
  "ok": true,
  "request_id": "2c4e6a8b-0d1f-4a3c-b5e7-9a1c3e5b7d9f",
  "status": "Authorisation Required",
  "message": "The record holder must authorise this verification before any comparison runs. Poll GET /api/v1/verifications/{request_id} for the outcome."
}

In the live response, {request_id} in message is replaced by the request's own ID.

Errors

StatuscodeWhen
400nonerecord_id is not a UUID, submitted_claims is empty, a claim field or value is not accepted, or authorisation_proof_url is not https.
403RECORD_NOT_ELIGIBLEOnly active records issued by an organisation can be checked.
403DISCLOSURE_REFUSEDThe issuing organisation does not answer verification requests for this record type.
403noneMissing scope, or your organisation is not an eligible verifier.
404noneThe record could not be checked. Arrota gives the same answer for a record that does not exist.
500noneThe request was created, but the holder could not be notified. The body includes request_id.

Each accepted call creates a new request and emails the holder, so do not resubmit a request that was accepted.

Get a verification request

GET/api/v1/verifications/{id}

Returns the current state of a request your organisation submitted. Requests from other organisations return 404.

curl "https://app.arrota.com/api/v1/verifications/2c4e6a8b-0d1f-4a3c-b5e7-9a1c3e5b7d9f" \
  -H "Authorization: Bearer $ARROTA_API_KEY"

Status

statusMeaning
authorisation_requiredWaiting for the holder to approve.
pending_reviewThe holder approved; the issuing organisation is reviewing the result.
Payment RequiredThe holder approved, but your organisation's free verification allowance is used up. Complete payment in the verifier workspace to release the result.
resolvedFinished. outcome and fields are present.

outcome and fields appear only when status is resolved.

Outcome

outcomeMeaning
MatchedEvery claim matched.
Partially MatchedSome claims matched.
Not MatchedNo claims matched.
RefusedThe holder declined, or the issuing organisation's policy refuses disclosure. fields is empty.

Each entry in fields has a verdict of match, mismatch or not_applicable. A mismatch never reveals the stored value.

Using Arrota rather than building on it? The Help Center covers product workflows.