Order a background check

Orders a background check under a payer-payee record. Either seat may order — the payer directly, naming a packageId; the payee, the contractor the check is run against, only against a requirementId, which is what authorises it. The calling Account must BE one of the two seats. Both Accounts are resolved from payerPayeeId, so neither is named in the body.

Placing the same order twice returns the existing active check rather than a duplicate: the order is keyed on the payer-payee record and the package. A payer who resets the requirement behind a check overrides that and gets a genuinely new order, because a reset is a demand for a fresh one.

A requirementId is a gate, not a link. It is checked and then discarded — the BackgroundCheck returned here does not reference it, and binding the Requirement to the check is a separate step. When it is supplied, the package comes from the Requirement's own configuration, and it overrides any packageId a payer sent alongside it. A payee sending one gets 422 instead — the configuration is not theirs to choose.

Supplying an externalId already in use for this account returns 409 ResourceConflict — create is not an upsert. externalId is not an order key either: the duplicate-order check above is keyed on the payer-payee record and the package, so a repeat order returns the existing check carrying whatever externalId it was ordered with.

409 ResourceConflict has two other causes, and they want opposite responses. Concurrent orders for one record and package are serialised, and a request that waits out that window without reaching the front gets a 409 meaning an earlier request is still in flight: retry it under a NEW Idempotency-Key, because reusing the old one replays this same 409 from the idempotency cache rather than placing the order. Separately, a requirementId whose definition names no configuration also gets a 409; that one is a misconfigured Requirement and retrying never clears it.

This operation answers 404 too, which is unusual for a create. The causes: the payerPayeeId names no record; the calling Account is not itself a seat on the one it names; the Requirement's configuration no longer resolves; or the package is not orderable — inactive, or scoped to a different payer. That last one is the commonest in practice and it reaches a payee too, whose Requirement may point at a package the payer has since deactivated. An Account that can read a record through an organization's branch is not thereby a seat on it and cannot order against it.

400 comes first for a payee. ANY request from the payee seat without a requirementId answers 400, whatever else it carries — there is nothing authorising it, so the fields are not examined. Send the requirementId before reading the 422s below.

422 covers the request shapes the record cannot support: a payer naming neither packageId nor requirementId; a payee who DID send a requirementId and also sent packageId, externalId or metadata, none of which are theirs to set on the payer's order; a record seating one Account on both sides; and — the everyday one — a record whose counterparty has not linked yet, which has no second Account to seat the order against.

Recent Requests
Log in to see full request history
TimeStatusUser Agent
Retrieving recent requests…
LoadingLoading…
Body Params

Body for ordering a background check under a payer-payee record. Supply at least one of packageId (the payer's direct-order path) or requirementId (the only path open to the payee). A body with neither names nothing to order and returns 422.

That last rule is deliberately NOT expressed as an anyOf here. It would buy a 400 "must match a schema in anyOf" in place of the service's 422 "packageId is required" — a less useful message — and, because an anyOf at the root of an object schema collapses the generated TypeScript type to unknown, it would cost every SDK consumer the request body's type (PayoutDestination already ships that collapse; this schema should not join it).

string
required
length ≥ 1

The payer-payee record the check is ordered under. Both Accounts are resolved from it, so no Account is named here. Accepts canonical Wingspan ids and legacy composite relationship ids returned by V3 payer/payee read/list endpoints.

Which side of the record you hold decides what else you may send. A payer may order directly, naming a packageId. A payee — the contractor the check is run against — may order only against a requirementId — without one the request is 400 whatever else it carries — and must send none of packageId, externalId or metadata: the order is the payer's, and so are those fields.

string

The Requirement the order satisfies. Required when the payee orders, which is the only thing authorising it; optional when the payer does.

A gate, not a link. It is checked and then discarded — the resulting BackgroundCheck does not reference it, and binding the Requirement to the check is a separate step. When it is supplied, the package comes from the Requirement's own configuration: that OVERRIDES a packageId a payer sent alongside it, and a payee sending one gets 422 instead.

string

Caller-supplied reconciliation id, unique per requesting account. A duplicate returns 409 ResourceConflict. The payer's namespace only: from the payee seat this is 422 alongside a requirementId, or 400 without one, since the missing requirementId is checked first.

string

The BackgroundCheckPackage to order; its vendor determines the provider. The payer's direct-order path only: from the payee seat this is 422 alongside a requirementId, or 400 without one, since the missing requirementId is checked first. The Requirement supplies the package instead.

metadata
object

The payer's annotations on their own order. From the payee seat a non-empty one is refused: 422 alongside a requirementId, or 400 without one, since the missing requirementId is checked first. The row carries a single bag that every party to the check reads, so a payee writing into it would add entries the payer never authored and cannot distinguish from their own.

Headers
string
length between 1 and 255
^[\x21-\x7e]{1,255}$

Optional idempotency token for authenticated POST and PATCH requests. Reusing the same key and body returns the cached response for 24 hours, except credential operations that explicitly document a 409 because one-time secret material is never cached; reusing it with a different body returns 409 IdempotencyKeyConflict. Use 1-255 printable ASCII characters.

string
^(?:[A-Za-z0-9_.]{22}|[a-f0-9]{24})$

Select the Account for an Account-scoped operation. A direct ServiceAccount API key MUST supply this header, and the target must be within the ServiceAccount owner's or Authorization grant's Account boundary. A Person bearer may select an Account on which it has an active Stakeholder, and an Account session may select its bound Account (or a descendant only when the session explicitly includes descendants).

string
enum
Defaults to application/json

Generated from available response content types

Allowed:
Responses

Language
Credentials
Bearer
JWT
LoadingLoading…
Response
Click Try It! to start a request and see the response here! Or choose an example:
application/json
application/problem+json