Contract-Version header.
Stating a version
Send the version your client was built against in the same header:What breaks
Ignore a response field you do not know.
A breaking change passes through a window. The old behaviour is served until a stated day, at least 90 days after the release that announces it. The day never moves. Until then, every response that relies on it carries three headers:
Open and closed enumerations
The reference marks every enumerationx-enum-open: true or false.
You know a closed member when you stated a version that introduced it, when your request names it (a listing filtered by it), or when the record exists because you used the field or route introduced with it. Otherwise a listing leaves the record out, and a read of that one record is refused
406 contract_version_required. Its details.bound names the version to state.
Versions
Contract-Version, open and closed enumerations
Added
Contract-Versionon every response, and as an optional request header.invalid_contract_version(400): a version that was never published.contract_version_required(406): a record in a closed member your version does not know.x-enum-openon every enumeration in the reference.- Client guards on a product version:
max_open_loans_per_client,max_outstanding_per_client,refuse_while_any_loan_overdue. Issuance and preview refuse past them withclient_open_loans,client_exposureorclient_overdue(422). - A limit decision:
limit: trueon a credit decision asks for the most the band admits; the decision answersceilingandover_ceiling. - A line:
line: trueon a facility created from a limit decision, drawn by every purchase and refilled by repayment;supersedesandsuperseded_bywhen a line is renewed. New refusalsfacility_supersededandcannot_supersede(422). - A whole return: a goods return may state more than the outstanding principal. The answer states
returned_whole,unwound_principal,principal_owed_back,interest_owed_back,beyond_the_loanandstill_owed; the client’s obligations listreturnsandreturned. A return that was refused for exceeding the outstanding principal is now served where the loan received principal. - The product frame’s field
unitis open, and gainsloans. - What falls due on a day:
GET /v1/tenants/{tenant_id}/dues?on=lists every Client with something fallen due and unpaid on the date, with each owing Loan’soverdue,lateandinstalmentas the payment options answer them and per-currency totals. Narrowed byonly=lateandmin_days_past_due; one request examines at most twicelimitClients. - Your request bounds:
GET /v1/tenants/{tenant_id}/boundsanswersconcurrent,patience_ms,per_second,burstandsource. The reference states the defaults — 16, 2 seconds, 50 per second, 100 — and that requests within them are never refused for a bound. - A market’s rules:
GET /v1/tenants/{tenant_id}/markets/{jurisdiction}answers the penalty cap’s form, the penalty base, capitalisation, whether a late fee may stand beside a penalty rate, acceleration, the tax rules, the disclosure convention, the calendar’s last covered day and the facility window, each withsourceandprovisional. A jurisdiction nothing is supplied for is404 not_found. details.boundanddetails.observedonpenalty_rate_above_cap,outside_window_bound,beyond_horizonandinvalid_identifier: the bound the market’s rules state (or the identifier pattern) and the value that exceeded it.effectiveon every product configuration read, create and preview: every field the frame declares, with its value andsource(statedordefault).valuesis unchanged.advisorieson a configuration create, a version create and both previews, with the open codesfirst_period_may_fall_next_dayandno_tolerance. An advisory refuses nothing.percentbeside the ratio on a decision’s, a resolution’s and a facility’srate: the decimal percentage a loan states.rateis optional on a preview and an issuance under a facility, which then takes the facility’s rate;penalty_rateis optional under a version whose penalty corridor is a single point, which then takes the point.- Lookup keys: a word of your own that names the configuration version you sell, the same in every environment.
PUT,GETandDELETE /v1/tenants/{tenant_id}/product-lookup-keys/{lookup_key}, andGET /v1/tenants/{tenant_id}/product-lookup-keys, which resolves up to ten keys in one read with a repeatedlookup_key. A key that names another version moves only withtransfer: true; otherwiselookup_key_taken(409), with the configuration and version it names indetails. No selling request changes: sell under the pair the read answers. Server-Timingon every response at both doors:totalalways, andqueue,conn,dbandderiveonce the caller is authenticated. See reading Server-Timing.- A dated read answers from one moment of the client’s record: a receipt recorded while the read runs is wholly in the answer or wholly out of it. No field or figure changes.
vat_rate_bps stays deprecated until 2027-01-15, from 2026-10-15.Closed enumerations: no new member. A caller stating this version and one stating none are served the same bodies.Breaking: one refusal, at the console’s policy authoring. A policy version whose approving band’s rate has no decimal of at most eight places as a percentage — one third, say — is refused at validation and publication. No loan could ever be issued under such a band, so nothing issuable is lost, and no window applies.The baseline
What the API served when versions began. A request stating no version is served this.Deprecated
Until that day a statement carrying
vat_rate_bps is accepted with the field ignored. The answer carries Deprecation: @1799971200, Sunset: Fri, 15 Jan 2027 00:00:00 GMT and a Link to this entry.Reached production the same day, before versions existedThese closed-enumeration members shipped on 2026-10-15, before the rule above. They are part of the baseline and are served to every caller.A listing still leaves
held, expired and voided loans out unless state names them.