FCRA Partner API · v1.0.0 · approved partners

White-label & branding

Your name, logo and colour on the consent flow, the e-mails and the portal; the agency named where the law puts it.

Livehttps://api.offendersearch.appSandboxhttps://sandbox.offendersearch.app

Three modes, one engine

Every FCRA partner runs on the same orders, controls, evidence, signed reports, disputes and consumer portal. The mode on your agreement decides who the consumer reporting agency is and therefore who runs the consumer-facing steps.

ModeYou areThe consumer reporting agency isWho runs consent, notices and the portal
directAn employer, landlord or organization screening for itselfUsWe do, in your branding
platformA platform, staffing firm or property manager screening for its clientsUsWe do, in your branding; each client is an end user you register
craA consumer reporting agencyYouYou do, in your own flow; we furnish the records, controls, evidence and the dispute channel

You choose the mode on the application (dashboard → FCRA → Settings, or POST /v1/fcra/application); the agreement fixes it. GET /v1/fcra/partner reports it as kind.

What the consumer sees, surface by surface

In direct and platform mode the consumer sees you as the requester and sees the agency where the Fair Credit Reporting Act requires the consumer reporting agency to be identified. That is the whole of the white-label rule: your brand up front, the agency’s legal name where the law puts it.

SurfaceYour brandThe agency’s legal name
Invitation e-mail and reminderSender name, header logo, button colour, reply-toFooter: who prepares the report, consumer contact
Hosted consent page (/apply/…)Logo or name at the top, button colour, “[Your name] has asked for your authorization”Named in the disclosure and the authorization as the agency; the page footer
Disclosure and authorization texts“[End user] may obtain a consumer report about you…”“The report will be prepared by [agency]…” with the consumer contact
Copy of the report e-mailSender name, header, colourFooter, and the portal it links to
Consumer portalYour logo or name at the top; “Requested by [your name]”“Prepared by [agency], a consumer reporting agency” with the dispute contact
Pre- and post-adverse noticesSender name, header, colour; “[End user] is considering a decision…”Named as the agency that prepared the report, with address and contact, as § 1681m requires
The report PDF and receiptYour end user and reference on the reportThe agency as the furnisher; the signed receipt
  • Links go to offendersearch.app/apply/… and the portal at offendersearch.app/consumer/report. A custom domain for those pages is not available yet.
  • Want the consent step inside your own product? Create the invitation with sendEmail: false and present applyUrl yourself; the page still carries your branding.
  • Platform partners: register each client as an end user. Its name is what the consumer reads as the requester in the disclosure; your branding frames the page.

Set your branding

From the dashboard: FCRA → Settings → Branding (account admins). From the API: PUT /v1/fcra/branding with any of the fields below; what you send replaces what is stored. Our team seeds displayName and website from your application when it is approved.

PUT /v1/fcra/branding
curl -X PUT "https://api.offendersearch.app/v1/fcra/branding" \
  -H "X-API-Key: $OFFENDERSEARCH_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "displayName": "Acme Staffing",
    "logoUrl": "https://acme.example/logo.png",
    "primaryColor": "#0f766e",
    "supportEmail": "screening@acme.example",
    "website": "https://acme.example",
    "replyTo": "screening@acme.example"
  }'
FieldWhere it showsNotes
displayNameE-mail sender name, page header, portal, “Requested by”Up to 120 characters
logoUrlE-mail header, consent page header, portal headerAn https URL to a PNG, JPEG or SVG; rendered up to 48 px tall on a white background, so a horizontal logo works best
primaryColorButtons and highlights on the consent page and in e-mails#rrggbb
supportEmail, supportPhoneWhere the consumer can reach you about the request itself (not about the report)The pre-adverse notice tells the consumer to respond to you here
websiteLinked from your namehttps
replyToReply-to on every e-mail we send on your behalfDefaults to supportEmail

Set your branding — PUT /v1/fcra/branding

PUT/v1/fcra/brandingAuth: X-API-Key

Replaces your branding. From the dashboard, an account admin only.

Request

Body · application/json
FieldTypeDescription
displayName
optional
string or nullThe name the consumer sees as the requester.
Example "Acme Staffing"
logoUrl
optional
string or nullAn https logo shown at the top of the hosted flow and e-mails.
primaryColor
optional
string or nullA hex colour for buttons and highlights.
Example "#0f766e"
supportEmail
optional
string or nullWhere the consumer can reach you about the request itself.
supportPhone
optional
string or nullA phone number to show consumers. null clears it.
website
optional
string or nullYour public website (https://…). null clears it.
replyTo
optional
string or nullThe reply-to address on e-mails we send on your behalf.

Response

200 · application/json

The body is the BrandingStatus object. Your branding, your partner kind, and the agency named on every disclosure.

Errors
StatusCodeWhen
401—No valid X-API-Key (the body is { "detail": "…" }, a string).
403fcra_not_enabledThis account has no active FCRA partner agreement.
403fcra_not_on_trialFCRA orders are not available on a trial account.
403—A non-admin seat on a dashboard session (string detail).
422—A colour that is not #rrggbb, or a URL that is not https.

The BrandingStatus object

Your branding, your partner kind, and the agency named on every disclosure.

Returned or accepted by GET /v1/fcra/branding, PUT /v1/fcra/branding.

FieldTypeDescription
branding
BrandingAs stored (empty when none).
kind
string
one of "cra", "direct", "platform"
cra (you are the CRA), direct (we are the CRA; you are the end user) or platform (we are the CRA; you order for your clients under your brand).
agency
AgencyThe consumer reporting agency named on every disclosure, report and notice.

The Branding object — how the consumer sees you

Your branding on the hosted consent flow, the e-mails and the portal header.

Returned or accepted by GET /v1/fcra/partner, GET /v1/consumer/portal/report, GET /v1/fcra/branding, PUT /v1/fcra/branding, GET /v1/apply/{token}.

FieldTypeDescription
displayName
string or nullThe name the consumer sees as the requester.
Example "Acme Staffing"
logoUrl
string or nullAn https logo shown at the top of the hosted flow and e-mails.
primaryColor
string or nullA hex colour for buttons and highlights.
Example "#0f766e"
supportEmail
string or nullWhere the consumer can reach you about the request itself.
supportPhone
string or nullA phone number shown to consumers on the hosted consent page and in notices. null to show none.
website
string or nullYour public website, linked from the hosted consent page and the consumer portal. null for none.
replyTo
string or nullThe reply-to address on e-mails we send on your behalf.

Your branding — GET /v1/fcra/branding

GET/v1/fcra/brandingAuth: X-API-Key

Request

Response

200 · application/json

The body is the BrandingStatus object. Your branding, your partner kind, and the agency named on every disclosure.

Errors
StatusCodeWhen
401—No valid X-API-Key (the body is { "detail": "…" }, a string).
403fcra_not_enabledThis account has no active FCRA partner agreement.
403fcra_not_on_trialFCRA orders are not available on a trial account.

Preview it

On a sandbox key every account is a direct partner: set the branding, create an invitation with sendEmail: false, and open applyUrl to see the consent page exactly as a consumer would, in your colours, with the agency named in the disclosure. The sandbox sends no e-mail; the notices list shows what would have gone.

Test FCRA orders on the sandbox server

With a test key (os_test_…) every account is a sandbox FCRA partner on the sandbox server, with the same last-name rules. Register an end user, then place orders against it; nothing is billed. An order finishes right after the 202: read it once with GET /v1/fcra/orders/{orderId}.

Base URL
https://sandbox.offendersearch.app Not https://api.offendersearch.app, which takes live keys only.
Test key
In the dashboard, Developers → API keys → Create test key. Test keys begin os_test_; send yours in the X-API-Key header.
1. POST /v1/fcra/end-users
curl -X POST "https://sandbox.offendersearch.app/v1/fcra/end-users" \
  -H "X-API-Key: $OFFENDERSEARCH_TEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
      "name": "Sample Staffing LLC",
      "permissiblePurposes": [
        "employment"
      ],
      "certification": {
        "text": "End user certifies it will use reports only for employment purposes.",
        "version": "v1",
        "certifiedAt": "2026-10-01T12:00:00Z"
      }
    }'
2. POST /v1/fcra/orders
curl -X POST "https://sandbox.offendersearch.app/v1/fcra/orders" \
  -H "X-API-Key: $OFFENDERSEARCH_TEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
      "endUserId": "{endUserId}",
      "permissiblePurpose": "employment",
      "consent": {
        "obtainedAt": "2026-10-01T12:00:00Z",
        "method": "esign"
      },
      "subject": {
        "firstName": "Pat",
        "lastName": "Records",
        "dob": "1980-01-01"
      },
      "searches": [
        {
          "type": "sex_offender"
        },
        {
          "type": "criminal"
        }
      ]
    }'

Try it here

Pick a scenario, edit the request, and run it against the sandbox from this page. The explorer accepts os_test_ keys only and never reaches the live host, so nothing here is billed; the “production” code it copies is for your own backend with a live key.

Create a test key under Dashboard → API keys. Live keys are refused here.
Copy this request as code

Sandbox code uses your test key. Production code calls the live host and is billed per call; run it from your backend with an os_live_… key.

curl -X POST https://sandbox.offendersearch.app/v1/fcra/end-users \
  -H "X-API-Key: $OFFENDERSEARCH_TEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Sample Staffing LLC", "permissiblePurposes": [ "employment" ], "certification": { "text": "End user certifies it will use reports only for employment purposes.", "version": "v1", "certifiedAt": "2026-10-01T12:00:00Z" } }'

Product overview