POST /v1/tenants/{tenant_id}/product-configurations, which answers the stored configuration and the version it was written as.
A configuration is never edited. A change writes a new version, every earlier version stays readable, and a Loan keeps the version it was issued under.
A configuration names no jurisdiction and no borrower. It states the bounds a Loan’s own figures fall inside: the principal range, the two rate corridors, the term menu, the fees and the cadence. Issuance picks one point inside each.
Fields
The fields travel invalues, and the Archetype’s frame decides which of them a configuration admits. Every field is optional on the wire, and a missing one is refused by name rather than supplied.
Eight fields are required of all three Archetypes.
The penalty corridor is required of all three. A configuration that cannot say what happens when it is not paid does not describe a sellable product. A penalty rate invented at issuance is a term nobody agreed to.
Five fields are optional on all three Archetypes.
An absent optional field means the absence rather than a default. No
late_fee is no late fee, and no grace_days is no grace.
One of the five carries a meaning when absent. early_money_treatment absent is reduces_principal, the statutory prepayment: the law’s answer rather than a value the Platform picked. Its alternative, advances_instalments, settles Periods that have not matured instead.
Archetypes
An Archetype fixes the repayment shape. The set is closed —instalment, bnpl and payday — and no route adds a fourth.
The Archetype is chosen when the configuration is created, and a new version carries values alone. The shape a Loan was issued under never changes.
Each Archetype adds the fields its shape needs and locks the ones its shape fixes. A locked field is refused with the Archetype’s own reason, and a field of another shape as not part of this frame. Neither is ignored: a value you believe is in force and is not is a dispute waiting for its Loan.
Instalment
Aninstalment product repays a principal over a menu of terms, and each payment carries principal, interest, fee and tax. It locks nothing: a field this frame refuses is one belonging to another Archetype’s shape.
Two fields belong to the instalment frame.
An issuance whose quoted payment falls under
minimum_instalment answers 422. Nothing adjusts the term or the principal to clear the floor.
Buy Now Pay Later
Abnpl product splits a purchase into instalments and always collects a payment at the purchase itself. That collection is the Archetype’s own invariant, so a BNPL issuance carries a down_payment.
Four fields belong to the BNPL frame, and one of them exists to be refused.
The commission is signed because it runs both ways. The store pays the tenant for financing the purchase, or the tenant pays the store for bringing the client. Nothing at issuance or in servicing reads it: the configuration records the commercial term, and settling it with the store is yours.
Pay Day Loan
Apayday product carries a single period to one date, and it is the only Archetype whose frame carries the rollover fields. It has no instalment menu, and minimum_instalment is not a field of a payday product.
Three fields belong to the payday frame.
Both rollover fields are recorded and read by nothing: no route rolls a Loan over, and none reports one.
Example
The configuration behind every worked example on this site is aninstalment product in MXN.
201. An issuance names this id as its configuration_id and this version as its configuration_version.
Create a configuration
The endpoint page: every field, every refusal, and a playground that sends the call.
Quickstart
The walk from this configuration to a settled instalment, in six calls.
Versions
Five routes serve the configuration: they create it, list yours, read the latest version, write a new version, and read one version by number. The paths are on API reference, and not one of the five reads a query parameter. Reading the latest and reading one version are separate addresses on purpose.?version=2 on the read of the latest answers 400: this route does not read the parameter "version". A caller asking for a version is never handed whatever the newest happens to be.
A version number counts from 1 and rises by one. The word latest in an issuance’s configuration_version is refused by name.
Limits
The Platform’s own bounds are headroom, not policy. They catch a typo or an overflow. What is lawful to sell is your compliance question, and a configuration names no jurisdiction for the Platform to test it against.Restrictions
Presence is read from the keys ofvalues, not from what they decoded to. "terms": [] and "terms": null both count as stated, so a locked field spelled empty is refused rather than quietly accepted.
422:
- a field the Archetype does not carry, and a field the Archetype locks, told apart by the message
- a required field the frame declares and the body omits
- a value outside a bound above
- a minimum above its maximum, in either corridor or in the principal range
- amounts in two currencies inside one configuration
- an empty term menu where the frame requires one, or the same term offered twice
- a rate quoted other than annually, or in a form that is not an exact decimal percentage
- a schedule carrying another kind’s parameters: an interval on
anchored_monthly, grid days onanchored_every_n_days - a
semi_monthly_gridof fewer than two days, of a day outside the month, or of a day repeated
404, the same as one that never existed. Any query parameter on any of the five routes answers 400.