A side-by-side of buy now, pay later plan costs: schedules, fees and finance charges for the plans you enter, every APR computed on the estate's Reg Z Appendix J maths, and provider plan shapes carried as cited labelled examples, never offers.
Enter a principal and up to eight plans; each plan is priced on the same stream discipline, then laid side by side.
A plan is either a provider preset or explicit parameters: number of instalments, cadence (weekly, biweekly or monthly), stated APR, and fees. The comparison ranks plans by total of payments, exact to the cent, and names the lowest-total plan; a tie stays a tie.
compare_bnpl_plans {"principal":400,"plans":[{"preset":"paypal_pay_in_4"},{"preset":"affirm_monthly_example"}]}This node authors no APR maths of its own: it carries the estate's Reg Z Appendix J solver inline, copied verbatim, and hands it each plan's payment stream; a parity test holds the copy equal to the live art-215 module.
The stream is expressed in unit periods: instalment one at purchase sits at period 0, the rest at 1, 2, 3. Amounts pass to the solver as exact cent integers so a zero-cost stream prices at exactly 0. When no sign-change bracket exists the solver reports no rate, and this node returns a null APR with a named flag rather than a guess.
compare_bnpl_plans {"principal":500,"plans":[{"num_instalments":6,"cadence":"monthly","apr_pct":19.9,"instalment_amount":88.25}]}The shape every provider calls pay in 4: instalment one at purchase, the rest one unit period apart.
Cadence sets the unit period: weekly is 52 periods a year, biweekly 26, monthly 12. An interest-free custom plan splits the principal equally with the cent remainder on the last instalment, so the pieces always sum to the principal exactly. An interest-bearing custom plan must carry its quoted instalment amount: this node compares plans as quoted, it does not originate an amortizing schedule.
Fees are part of the finance charge, so the Appendix J rate prices them in; on short plans the effect is large.
The same maths reads the providers' own labelled examples honestly. Klarna's published apply-in-advance example ($248 purchase, $62 down and three biweekly $62, $4.99 service fee, a stated 35.68% APR) prices at 35.6757% on this method; Afterpay's finance-fee example ($110 loan, $27.50 down and three biweekly $28.26, stated 36%) prices at 35.7644%. Late fees are different: they are contingent on missed payments, never part of a schedule here, and each preset cites the provider's stated late-fee clause as information only.
compare_bnpl_plans {"principal":100,"plans":[{"num_instalments":4,"cadence":"biweekly","apr_pct":0},{"num_instalments":4,"cadence":"biweekly","apr_pct":0,"per_instalment_fee":1.25}]}Every preset is a provider's own published example or plan shape, quoted with clause id, snapshot path and fetch date. None is an offer.
The quotes are verbatim from dated snapshots of the providers' US consumer pages (fetched 2026-10-28): research/clause-snapshots/bnpl-paypal-2026-10, bnpl-klarna-2026-10, bnpl-afterpay-2026-10 and bnpl-affirm-2026-10. Terms vary by provider, merchant and credit decision, and each preset carries the provider's own qualifier ("Options depend on your purchase amount, may vary by merchant, and may not be available in all states."), the lender of record where stated, and the late-fee clause. A preset with no published dollar example fills only the plan shape on your principal; a labelled example carries the provider's own amounts.
compare_bnpl_plans {"principal":248,"plans":[{"preset":"klarna_service_fee_example"}]}Per plan: the schedule, the totals, the finance charge, and the computed APR. Across plans: a ranking by total cost.
Refusals are named, never silent: an unknown preset, an unknown cadence, preset and explicit fields together, a bad principal, instalment count, fee or APR, a non-USD currency, more than eight plans, or an interest-bearing plan without a quoted instalment each return a domain_error by name. The stated APR you entered is echoed next to the computed one, and a flag names any gap wider than one percentage point.
One input surface, one output contract, one kernel digest, and the whole thing runs offline.
Kernel: chaingraph/kernels/art-779-bnpl-plan-comparator.kernel.mjs: schedule assembly in exact cents plus the art-215 Reg Z Appendix J solver carried verbatim between inline sentinels; no hashing inside the kernel, no iteration bound from inputs. Identity: sha256:1210161ca3752bb13065afddf23612751c2b1b0894750dd19848c6c6f23595e4 (SPEC §17.1 compute_images). Prove: deferred (a new gpu:false node excluded from §18 proving until the next batch). Fixtures: 20 vectors with pinned golden hashes; the manifest’s example_execution_hash (7e4a2f14…) equals the golden vector’s pinned hash. Clause authority: research/clause-snapshots/bnpl-{paypal,klarna,afterpay,affirm}-2026-10/SNAPSHOT.md (fetch 2026-10-28).
input : {principal: USD number, plans: [ {preset: id}
| {num_instalments: 1..156, cadence: weekly|biweekly|monthly,
apr_pct: stated 0..100, upfront_fee, per_instalment_fee,
instalment_amount (required when apr_pct > 0), down_payment,
first_instalment_at_purchase } ] (1..8 plans)}
output : {comparison: {ranked_by_total_of_payments[], lowest_total_of_payments_plans[]},
plans[]: {schedule[{kind, instalment_no, due_periods_from_purchase, amount}],
total_of_payments, fee_component_total, finance_charge,
stated_apr_pct, reg_z_apr{apr_pct, periodic_rate, converged, bracketed},
preset{clauses[], lender_note, late_fee_note, qualifiers[]}, flags[]}}
refuse : REFUSED_INSTALMENT_AMOUNT_REQUIRED | REFUSED_UNKNOWN_PRESET
| REFUSED_UNKNOWN_CADENCE | REFUSED_PRESET_AND_EXPLICIT
| REFUSED_INVALID_PRINCIPAL | REFUSED_TOO_MANY_PLANS
| REFUSED_INVALID_NUM_INSTALMENTS | REFUSED_NO_PLANS
| REFUSED_INVALID_CURRENCY
Copy this paragraph into Claude, OpenClaw, or any MCP-aware agent to run this exact tool, with this sample, and verify the artifact.
Run the AINumbers MCP tool `compare_bnpl_plans`. Task: Compare BNPL plans side by side on Reg Z Appendix J APR maths (delegated to art-215): schedules, fees, finance charges and computed APRs for pay-in-N and monthly plans, provider presets as cited labelled examples (never an offer), ranked by total cost.
Call it with arguments: {"policy_parameters":{"principal":248,"plans":[{"preset":"klarna_service_fee_example"}]}}
Verify before trusting: call `verify_execution_hash` on mcp.ainumbers.co (https://mcp.ainumbers.co/mcp) with the parameter `claimed_hash` set to the returned `execution_hash`, passing the full artifact the run returned (the object containing `policy_parameters` + `output_payload` + `execution_hash`; equivalently `policy_parameters` + `output_payload` with `claimed_hash`), not the bare hash string.
Return the ledger link https://ledger.ainumbers.co/ so a human can re-verify without contacting us.
PII rule: All inputs are processed locally in your browser. No data is transmitted. Do not enter real personal data — use synthetic or anonymised inputs only.
Open the tool with the sample prefilled: https://ainumbers.co/chaingraph/art-779-bnpl-plan-comparator.html#p=v1.H4sIAAAAAAAA_wFDALz_eyJwcmluY2lwYWwiOjI0OCwicGxhbnMiOlt7InByZXNldCI6ImtsYXJuYV9zZXJ2aWNlX2ZlZV9leGFtcGxlIn1dfd1jA91DAAAA