Reading a response
GET /v1/dt-score returns a dt_score object. This page describes each field. The API reference has the same in schema form.
A full response#
This is sandbox carrier 1000005, which is knocked out:
{
"object": "dt_score",
"livemode": false,
"carrier": {
"dot_number": "1000005",
"mc_number": "MC1000005",
"legal_name": "Sandbox Ghost Transport LLC",
"dba_name": null
},
"score": 18,
"grade": "F",
"decision": "rejected",
"verdict": "Disqualified — do not book",
"needs_manual_review": false,
"knockout": {
"triggered": true,
"reasons": [
{ "code": "AUTHORITY_INACTIVE", "message": "Common and Contract Authority are both inactive." },
{ "code": "NO_BIPD", "message": "No active BIPD insurance filing." }
]
},
"reasons": [
{
"check": "Operating authority inactive",
"area": "Authority & Compliance",
"severity": "critical",
"detail": "Common and Contract Authority are both inactive.",
"facts": [
{ "label": "Common authority", "value": "None" },
{ "label": "Contract authority", "value": "None" }
]
},
{
"check": "No BIPD on file",
"area": "Insurance & Financial",
"severity": "critical",
"detail": "No active BIPD insurance filing.",
"facts": [{ "label": "BIPD on file", "value": "Not available" }]
}
],
"checks": { "total": 53, "triggered": 2, "passed": 45, "not_checked": 6 },
"flags": [],
"data_confidence": 0.75,
"model_version": "dt-trust-v3.5-sandbox",
"calculated_at": "2026-10-15T10:00:00Z"
}
Fields#
| Field | Type | Description |
|---|---|---|
object |
string | Always dt_score |
livemode |
boolean | true on live, false on the sandbox |
carrier.dot_number |
string | The carrier's USDOT number |
carrier.mc_number |
string or null | The carrier's MC docket number, when it has one |
carrier.legal_name |
string or null | Legal name on the FMCSA registration |
carrier.dba_name |
string or null | "Doing business as" name, when registered |
score |
integer | The DT Score, 0–100. Higher is safer |
grade |
string | A, B, C, D or F. See Grades |
decision |
string | approved, review, high_risk or rejected. See Decisions |
verdict |
string or null | One line for people, such as "Medium risk — review before booking" |
needs_manual_review |
boolean | A person should look before booking |
knockout.triggered |
boolean | A knockout fired; the decision is rejected |
knockout.reasons[] |
array | code and message for each knockout |
reasons[] |
array | Every check that found a problem, most serious first |
reasons[].check |
string | The check's name |
reasons[].area |
string | One of the seven areas in What is checked |
reasons[].severity |
string | critical, review, medium or low |
reasons[].detail |
string | What was found, in a sentence |
reasons[].facts[] |
array | The figures behind the finding, as label and display value |
checks |
object | How many checks ran in total, triggered, passed and not_checked |
flags[] |
array of strings | Markers worth surfacing, such as dual_authority or new_authority |
data_confidence |
number or null | 0 to 1: the share of core inputs that were available |
model_version |
string | The scoring model that produced the score |
calculated_at |
string | When the score was calculated (ISO 8601, UTC) |
Treat the response as extensible#
New fields may be added to the response at any time without a new API version. Write your code so unknown fields are ignored, and unknown values in severity, flags and knockout.reasons[].code are handled gracefully, for example by showing their message. See Versioning.
Response headers#
| Header | Description |
|---|---|
X-Request-Id |
Unique id for the request. Quote it when you contact support |
DT-Environment |
live or sandbox |
DT-Api-Version |
The API release that served the request |
X-RateLimit-Limit, -Remaining, -Reset |
See Rate limits |
X-Quota-Limit, X-Quota-Remaining |
Live only. See Rate limits |