Customer Credit Checks
Reference for the customer_credit_checks resource. Requests follow the conventions in
Requests and Responses; fields you
receive and may write are filtered by your user's permissions, so responses can
contain a subset of the fields below.
Operations
| Operation | Request |
|---|---|
| List | GET /{profile}/user/v4/customer_credit_checks |
| Fetch | GET /{profile}/user/v4/customer_credit_checks/{id} |
| Run a live credit pull against a bureau and persist the resulting check | POST /{profile}/user/v4/customer_credit_checks/run |
| Record a manually-entered credit score (no bureau pull) | POST /{profile}/user/v4/customer_credit_checks/record |
Not available as a standard REST operation for this resource: create, update, delete —
such requests return 402 feature_not_enabled or 403 permission_denied (see the actions above for this resource's write path).
How it works
customer_credit_checks are the credit pulls and manually-entered scores on a customer or
lead. A check's result columns (score, bureau response, printable report) come from the credit
bureau, not from the client — so checks are not created with a plain POST. Two collection
actions create them:
| Operation | What it does |
|---|---|
POST /customer_credit_checks/run |
Runs a live pull against a configured bureau (TransUnion, TransUnion Canada, Equifax, Brinks/Monitronics, SEP, …) and persists the resulting check. |
POST /customer_credit_checks/record |
Records a manually-entered score (a check pulled outside SecurityTrax). No bureau is contacted. |
Both are gated by the Credit Reports permission at the customer's location (leads: the
lead-side Credit Reports permission). Reading a check's score and printable report
additionally requires Beacon Score - Full Control — without it those fields are simply
absent from responses. Raw bureau request/response payloads are never returned by the API,
and no score data is ever exposed to AI/MCP surfaces.
Running a live pull
Find the tenant's configured bureaus (and their types) with the
credit bureaus catalog: GET /credit_bureaus.
The bureau subject (name, SSN, date of birth, current address) is built from the customer record — sensitive identity data never rides the API request. Optionally send previous addresses and per-bureau options:
curl -X POST "https://portal.securitytrax.com/acme/user/v4/customer_credit_checks/run" \
-H "Authorization: Bearer stx_acme_..." \
-H "Content-Type: application/json" \
-d '{
"data": {
"attributes": {
"customer_id": 100,
"credit_bureau_id": 3,
"addresses": [
{"address": "123 Main St", "city": "Provo", "state": "UT", "zip": "84601"}
]
}
}
}'
Per-bureau options (rejected with a 422 if sent for a different bureau type):
| Field | Bureau | Notes |
|---|---|---|
sep_options |
SEP | Required for SEP bureaus. At least one of from_year, how_long, payment, monthly_income, loan_payment, loan_type. |
brinks_options |
Brinks / Monitronics | Optional {run_credit_override: 0|1, credit_override_reason} — both must be sent together. |
pin |
Equifax | Optional subject PIN. |
On success you get 201 with the created check (score visible only with the confidential
permission). Failure modes:
| Status | Meaning |
|---|---|
422 credit_report_failed |
The bureau answered but produced no usable score — the response detail carries the bureau's error text. No check is persisted. |
502 bureau_unreachable |
The bureau host could not be reached (network/TLS/timeout, bounded at 10 s). No check is persisted. Safe to retry. |
409 duplicate_pull |
The duplicate-pull guard (below). |
402 credit_reporting_disabled |
Credit reporting is not enabled for the company. |
The duplicate-pull guard
Live pulls are billable per run, so run refuses when a check for the same customer and
bureau was created within the last 24 hours — the 409 names the existing check id.
This protects against accidental double-submission and automation retries. When the re-pull
is intentional (e.g. the customer's SSN or address was just corrected), pass "force": true
to run anyway. Only successful pulls trip the guard — a failed pull persists nothing, so
retrying after a 422/502 is never blocked. The record action has no guard (manual
entries cost nothing).
Recording a manual score
curl -X POST "https://portal.securitytrax.com/acme/user/v4/customer_credit_checks/record" \
-H "Authorization: Bearer stx_acme_..." \
-H "Content-Type: application/json" \
-d '{"data": {"attributes": {"customer_id": 100, "score": "720", "transaction_id": "TU-8842107"}}}'
credit_bureau_id is optional: omitted, the score is attributed to the company's Manual
Score Entry bureau (created automatically if missing). If supplied, it must be a
manual-type bureau — recording a hand-keyed score against a live bureau is rejected, and
running a live pull against the manual bureau is likewise rejected.
When a check is applied to the customer
"Applying" a check writes its score onto the customer record (beacon_score), points the
customer at the check, and stores the bureau transaction id. Two independent rules decide
this — both are exact parity with the v1 API and the SecurityTrax UI:
- First-check rule (both actions): if the new check is the customer's only check, it is applied automatically. Later checks are not — the customer keeps whichever check was applied until one is applied explicitly in SecurityTrax.
- Company auto-apply flag (live pulls only): when the company setting auto-apply credit check to customer is on, every successful pull is applied, first or not.
Manual record entries are only ever auto-applied by the first-check rule.
Reading checks
GET /customer_credit_checks?customer_id=100 lists a customer's checks (filters:
customer_id, credit_bureau_id, created_at_from/created_at_to; sort: id,
customer_id, created_at). GET /customer_credit_checks/{id} fetches one. The parent
include also works: GET /customers/100?include=credit_checks. In every read shape the
score and printable report require the confidential-beacon permission, and the raw bureau
request/response payloads are never returned.
Fields
Fields are grouped by the permission that gates them. A group you may not view
is absent from responses; a group you may not write is rejected with 422 when
sent in a write.
Credit Check
View: customers — Credit Run at the record's location; leads — Lead Credit Run. Create: customers — Credit Run at the record's location; leads — Lead Credit Run.
| Field | Type | Writable | Validation |
|---|---|---|---|
customer_id |
integer | Create only | min 0 |
credit_bureau_id |
integer (nullable) | Create only | min 0 |
transaction_id |
string (nullable) | Create only | max length 255 |
created_at |
string (nullable) | Read-only | — |
created_by |
integer | Read-only | — |
updated_at |
string (nullable) | Read-only | — |
updated_by |
integer | Read-only | — |
Sensitive Result
View: customers — Cust Conf Beacon at the record's location; leads — Lead Conf Beacon.
| Field | Type | Writable | Validation |
|---|---|---|---|
score |
string (nullable) | Read-only | — |
print_image |
string (nullable) | Read-only | — |
Pagination
The list endpoint uses client-controlled offset pagination: ?page= (1-based) and
?per_page= (default 25, max 100). The response mirrors
meta.pagination (page, per_page, total, last_page) and sends an RFC5988
Link header; follow rel="next" to walk pages. See
Pagination.
Filters
The list endpoint accepts these query-param filters: customer_id, credit_bureau_id, created_at_from, created_at_to.
An unsupported filter parameter returns 422. See
Filtering collections
for matching semantics.
Sorting
GET .../customer_credit_checks?sort= orders the list by: id, customer_id, created_at.
Prefix a field with - for descending; comma-separate for tie-breakers. An
unsupported field returns 422. See
Sorting collections.
Related
- Requests and Responses — envelope, errors, pagination, and rate limits.
- Authentication — tokens and the
Authorizationheader.