Multi-bill fee - 23 September 2026
Multi-bill payment - September 2026
New optional parameter, no breaking changes.
billId still works exactly as it does today. billIds is an alternative to it, never a replacement.POST /v3/bills/pay now accepts billIds — up to 50 factures from the same READY transaction, settled as one order at the biller, one card payment and one service fee on the combined total.
🟢 What’s New
billId or billIds — exactly one of the two
billId or billIds — exactly one of the two
billId— one facture, a string of at most 100 characters. Unchanged.billIds— 1 to 50 ids, each at most 100 characters, with no id repeated.
400 ERR_VALIDATION — “Provide exactly one of billId or billIds”. A repeated id answers “billIds must not repeat the same bill id”.One fee, on the combined total
One fee, on the combined total
The fee is computed once, on the sum of the factures you selected — never as the sum of the per-bill fees quoted in
bills[]. Under SEAAL’s 0.5% rule with its 30 DZD minimum and 60 DZD maximum, three quarters of 327.00, 480.00 and 767.81 DZD total 1574.81 DZD: 0.5% of that is 7.87, below the floor, so the order carries a single fee of 30.00 DZD and a total of 1604.81 DZD. Paid one at a time those same three would carry the floor three times — 90.00 DZD. A five-facture water order costs 30.00 DZD in fees instead of 150.00 DZD.The transaction reports the order as one aggregate selected bill: amount is the sum of the factures chosen, fee the single fee on that sum. Sandbox does the same arithmetic as production, so the figures you validate there are the figures production will charge.A list is never partly settled
A list is never partly settled
Every id you send must still be on that
READY transaction; one stale or unknown id refuses the whole call and nothing is paid. The already-paid and payment-in-flight guards then run for every id in the list, and they recognise a facture that was settled earlier as one line of a larger order — so a quarter paid inside a group still answers 409 BILL_ALREADY_PAID on its own.Where it helps: SEAAL
Where it helps: SEAAL
Grouping only means something where the biller’s own portal settles several documents in one transaction. Today that is SEAAL, where water is billed quarterly and an account routinely owes many unpaid quarters at once — 25 on one verified production account. Every other biller returns a single bill anyway, so
billIds with one entry is simply equivalent to billId.SEAAL’s 200 DA order minimum applies to the selected total, not to each line, so grouping only makes it easier to clear.Paying Bills
The worked example
Pay a Bill
The endpoint reference
SEAAL bill payment - September 2026
New biller, no breaking changes. SEAAL is live on the
/v3/bills endpoints you already call. Nothing you send today changes.ACTIVE in the availability map alongside ADE, SONELGAZ, AADL and Algérie Télécom. Earlier releases described SEAAL as unreachable and permanently UNAVAILABLE: that is no longer true, so read the availability map instead of hiding the partner unconditionally.
🟢 What’s New
A nested account identifier
A nested account identifier
SEAAL is the first partner addressed by a pair rather than a single key, because the biller authenticates on both halves together:
code_client— 2 to 6 alphanumeric characterscode_contrat— 2 to 10 digits
account.codeClient.Several quarters, one order, one fee
Several quarters, one order, one fee
Water is billed quarterly and an account can carry many unpaid factures at once — one account verified at go-live owed 45 quarters. Selecting several of them produces one order and one card payment, and the fee is charged once on the total, never summed per bill. The SEAAL fee rule is 0.5% of the amount, clamped to a 30 DZD minimum and a 60 DZD maximum — the same rule the other billers use, and on a water facture it always lands on the 30 DZD floor.
Multi-bill selection shipped in the OneClickDz consumer checkout first. It is on this API too:
POST /v3/bills/pay accepts a billIds array of up to 50 factures — see the entry above.Five sandbox scenarios
Five sandbox scenarios
Each scenario is keyed off
code_client; code_contrat still has to be present and well-formed.Biller rules worth handling
Biller rules worth handling
- A 200 DA minimum. SEAAL refuses any order whose selected total is below 200 DA.
- Temporary account lockout. After repeated failed attempts the biller blocks that account for a few hours and says how long. It is account-specific — not an outage and not a bad identifier — and the only remedy is to wait.
- Nothing due is a result, not a fault. A fully settled account answers “Vous êtes à jour, merci pour votre fidélité.” and surfaces as
BILL_ALREADY_PAID. Reconciliation works by absence: a paid facture simply stops being listed.
Partners and accounts
The identifier rules
Bill Payment Overview
The whole flow
Bill Payment API - August 2026
New product, no breaking changes. Bill Payment is a new section of the v3 API, on the base URL and the key you already use. Nothing else in the Flexy API changed.
🟢 What’s New
The base URL you already use
The base URL you already use
X-Access-Token header, same key — no new base URL and no new authentication mechanism. Your sandbox key selects the sandbox environment, exactly as it does everywhere else in v3.Discover, pay, poll, download
Discover, pay, poll, download
POST /v3/bills/discover— ask a biller what an account owesPOST /v3/bills/pay— pay one of the discovered billsGET /v3/bills/transactions/{transactionId}— follow it to a final stateGET /v3/bills/transactions/{transactionId}/receipt— download the proof of payment
200 is an acknowledgement, and the outcome appears in the transaction’s status.A deterministic sandbox
A deterministic sandbox
Each key is bound to one environment. In sandbox, the account identifier you send chooses the outcome, so a decline, a refund and an unconfirmed payment can all be reproduced on demand.
Bill Payment Overview
Start here
API Reference
All seven endpoints
v3.0.0 - October 2025
🔴 What You Must Change
1. Base URL Changed
1. Base URL Changed
2. Authentication Header Changed
2. Authentication Header Changed
3. Response Structure Changed
3. Response Structure Changed
All responses now wrapped in standardized format:Before (v2):After (v3):Access data via
response.data instead of directly from response.4. Endpoint Paths Changed
4. Endpoint Paths Changed
5. Error Handling Changed
5. Error Handling Changed
Before (v2):After (v3):Always check
response.success boolean first.✨ What’s New
- Gift Cards API: Complete gift card delivery system with 100+ products
- Sandbox Keys: Separate API keys for testing without affecting production balance
- IP Whitelisting: Enhanced security through dashboard settings
- Request Tracking: Every request includes unique
requestIdfor debugging - Better Errors: Structured error codes with actionable messages
- Schema Validation: Automatic validation prevents invalid requests
📅 Migration Deadline
🔗 Resources
v2.x - Pre-October 2025
August 2025
- Added sandbox mode for testing
- Improved error handling and logging
July 2023
- Initial sandbox implementation
- Added support for ADSL internet recharge
Earlier
- Mobile top-ups for Mobilis, Djezzy, Ooredoo
- Basic transaction tracking
- Account balance management
Need Help?
Contact Support
Questions about migration? We’re here to help.

