Statuses
The four values of enrichment.status, what each one guarantees about merchant, the closed list of enrichment.reason values, and the difference between a status and an HTTP code.
A 200 response always carries an enrichment.status. Read it first: it says what the engine answered, and what you can do with merchant.
The four statuses
| Status | Meaning | merchant | reason | Billing |
|---|---|---|---|---|
resolved | Identity complete and above the resolution policy's threshold | complete object | null | 1 unit |
partial | An identity exists, but a required element is missing or its confidence is below the threshold | incomplete or uncertain object | a reason | not billed |
not_found | The engine answered, and its answer is "nobody" | null | no_usable_merchant_identity | not billed |
refresh_recalculated | A refresh produced a complete identity | complete object | null | 1 unit |
refresh_recalculated is the refresh counterpart of resolved; a refresh that does not succeed returns partial or not_found.
One case falls outside these four values: the enrichment_id carried by a 503 engine_error designates the failed attempt, and a GET on it returns 200 with merchant: null and enrichment.status: "engine_error". Nothing was billed.
What each status guarantees
resolvedandrefresh_recalculated: under the resolution policy in force,merchant.nameandmerchant.categoryare present and the confidence reached the threshold.logo_urlandlocationremain optional.partial:merchantis notnulland always carries aname. A required field may be missing (most oftencategory), or the confidence is below the threshold.not_found:merchantisnull. It is neither an error nor a failure: it is a complete answer. See not_found.
The threshold belongs to Noryo's resolution policy; it is not part of the API contract.
The reasons (enrichment.reason)
reason is null for resolved and refresh_recalculated. For the other statuses, it takes a value from a closed list:
reason | Status | Meaning |
|---|---|---|
no_usable_merchant_identity | not_found | No usable merchant identity |
missing_required_fields | partial | A field required by the policy is missing |
confidence_below_threshold | partial | The confidence is below the policy's threshold |
logo_required | partial | The policy requires a logo and it is missing |
location_required | partial | The policy requires a location and it is missing |
policy_not_calibrated | partial | The policy has no calibrated threshold |
unspecified | partial | None of the above |
The policy in force requires neither a logo nor a location and carries a calibrated threshold: in practice, a partial currently returns missing_required_fields or confidence_below_threshold. Treat any unknown value as unspecified.
Status and HTTP code: two questions
| What you receive | What it means |
|---|---|
200 with status: not_found | The engine answered: nobody. A normal result, not billed. |
404 enrichment_not_found | The requested enrichment_id does not exist for you. It is not a result. |
503 engine_error | The engine did not answer. Nothing is billed or memorised; retry. |
A not_found is a settled result, memorised, and returned again if the same transaction is sent again. A 503 is none of these.
Reading a status in your code
switch (body.enrichment.status) {
case "resolved":
case "refresh_recalculated":
return useMerchant(body.merchant); // complete identity
case "partial":
return reviewOrShowCautiously(body.merchant, body.enrichment.reason);
case "not_found":
return showRawDescriptor(); // no identity, not an error
default:
return showRawDescriptor(); // unexpected value: be cautious
}TypeScriptPublished on 2026-10-08 21:04 UTC (version 1).