Skip to content
Sandbox

Formats

JSON, encoding, maximum size, the exact format of each request field, the canonical form used to compare two transactions, and the format of returned identifiers.

View as Markdown

Transport

ItemRule
ProtocolHTTPS, to the configured base URL
Body of POST routesA JSON object, UTF-8 encoded, sent with Content-Type: application/json
Body size16 KiB at most (16,384 bytes), counted in bytes, not characters. Beyond: 413 request_entity_too_large
Response bodiesJSON. Errors are application/problem+json
GET routeNo body

The 16 KiB limit comfortably covers one transaction; it exists because the API processes one transaction per request, not a file.

Request fields

FieldTypeExact formatExample
descriptorstringRequired, not empty (not whitespace only), 512 characters at most"CB MCDONALDS PARIS 4519"
amountnumberA finite JSON number; a string is refused12.40
currencystringISO 4217, three upper-case letters"EUR"
occurred_atstringISO 8601 date and time in UTC with the Z suffix, optional fraction of a second (1 to 9 digits)"2026-09-06T11:42:00Z"
countrystringISO 3166-1 alpha-2, two upper-case letters"FR"
mccstringFour digits, as a string"5814"
external_transaction_idstring1 to 255 characters; create only"tx_8f21c0"

Only descriptor is required. An optional field you do not have must be omitted: the value null is refused for each of them. See Validation.

Why upper case

eur is rejected with 400, and so is fr. This is deliberate: the canonical form compares currency, country and mcc verbatim, so EUR and eur would be two distinct economic identities and two invoices for what you meant as one call. The validator refuses the ambiguity rather than normalising behind your back.

The canonical form

To decide whether two requests carry the same transaction (idempotency and deduplication), Noryo compares a canonical form of the six economic fields:

FieldProcessing before comparison
descriptorUnicode NFC normalisation, lower case, runs of whitespace collapsed to one space, leading and trailing whitespace removed
amountDecimal representation to 15 significant digits
occurred_atConverted to UTC and truncated to the second
currency, country, mccNone: compared verbatim
Absent fieldStays absent: an omitted field and a present field make two different inputs

As a result, "CB McDonalds Paris" and "cb mcdonalds paris" are the same input; so are 2026-09-06T11:42:00.250Z and 2026-09-06T11:42:00Z; so are 12.4 and 12.40. On the other hand, a request carrying amount and a request without it are two transactions.

This form is only used for comparison. The raw descriptor itself is not retained.

Identifiers returned by the API

IdentifierShapeNotes
enrichment_idenr_ followed by a version 4 UUID, lower caseRandom: it reveals neither an order nor a volume. A malformed identifier returns 404.
request_id / Noryo-Request-Idreq_ followed by a version 7 UUIDTime-ordered, useful for sorting your logs.
API keynry_mer_sbx_<key_id>.<secret> or nry_mer_live_<key_id>.<secret>See API keys.

Treat these identifiers as opaque: store and compare them as they are, without extracting meaning from them.

Returned values

FieldShape
merchant.confidenceA number between 0 and 1
merchant.categoryA text code, for example alimentation.restaurant
merchant.logo_urlA URI
merchant.locationAn object { "city", "postal_code" } or null. See Location.
Retry-AfterA whole number of seconds

Published on 2026-10-08 21:04 UTC (version 1).

Was this page helpful?