Ingest an applicant

Ingests an applicant from your platform and starts screening. The applicant's registry is resolved from `location_ref`, so you do not pass an organization — one call, one applicant, wherever they applied. **What happens next.** The applicant receives a heads-up SMS immediately and an AI screening call a few minutes later. Results land in the registry's CONFIRM portal, at the `portal_url` in the response. **Store two things:** `candidate_id` and `portal_url`. The first is the durable correlation key; the second is your "View Full Details" link. **Idempotency.** Re-submitting the same applicant returns the existing IDs with `deduped: true` and a `200`. It never conflicts and never creates a second application on the same location. Matching is by your `external_ref` first, then by phone number, then by email — so an applicant who reaches a registry through both your intake form and a job board resolves to one person, not two. **Consent governs contact.** `consent.contact` must be `true` for CONFIRM to text or call. Send `false` (or omit it) and the applicant is still created and visible in the portal, but no outreach happens and the response returns `screening: "skipped_no_consent"`. This is the TCPA boundary: we contact within minutes of ingest, so consent is not something to assume. **Unknown locations fail loudly.** A `location_ref` we don't recognise returns `404 unknown_location_ref` rather than dropping the applicant. The same request succeeds on retry once the location exists.

Authentication

AuthorizationBearer
Partner API key sent as `Authorization: Bearer cfk_...`. Keys are partner-level — one key reaches every registry linked to your partner account and nothing else. CONFIRM issues and revokes them; a key is shown exactly once at creation because only its hash is stored, and revocation takes effect on the next request. Develop against the sandbox base URL with a sandbox key, where telephony is restricted to an allowlist you provide.

Request

This endpoint expects an object.
external_refstringRequired

Your identifier for this applicant. Stored on the candidate and echoed on every response and webhook, and the primary key for idempotent re-submission.

location_refstringRequired

The location the applicant applied to (the external_ref you created it with). Resolves both the registry and the role.

first_namestringOptional
last_namestringOptional
emailstringOptionalformat: "email"

Required unless phone is supplied. Both is ideal.

phonestringOptional

Required unless email is supplied. E.164 preferred; other common formats are normalised. Screening calls need a phone — without one the response returns screening: "skipped_no_phone".

consentobjectOptional
What the applicant agreed to at intake.

Response

The applicant already existed. The original IDs are returned with deduped: true and no second application is created.

candidate_idstringformat: "uuid"
CONFIRM's identifier for the applicant. Store it on your applicant record.
application_idstringformat: "uuid"
The application opened at this location.
external_refstring
Your applicant identifier, echoed back.
dedupedboolean
True when this applicant already existed and the original IDs are being returned. No second application was created.
screeningenum

What happened to screening for this applicant.

  • enqueued — heads-up SMS sent, AI screening call queued.
  • skipped_no_consentconsent.contact was not true, so no outreach was made. The applicant is still visible in the portal.
  • skipped_no_phone — no usable phone number, so no call could be queued.
  • skipped_not_entitled — the registry is not currently entitled to place calls. The applicant is collected and dialed once it is.
portal_urlstringformat: "uri"
Complete deep link to the applicant in the registry's portal. Store it as an opaque string and render it as your "View Full Details" link.

Errors

400
Bad Request Error
401
Unauthorized Error
404
Not Found Error
429
Too Many Requests Error