How the sandbox works
A sandbox key uses the same base URL, routes, envelope, statuses and polling as production. The differences:- No biller is contacted and no money moves.
- The outcome is chosen by the account identifier you send (tables below). Any other identifier returns one bill of 500.00 DZD and a successful payment.
- Discovery completes in about 0.2 s and payment in about 0.5 s, so your poller still has to handle
PENDINGandPROCESSING. GET /v3/bills/partnersreports every billerACTIVE.- Receipts are PNG images.
- Sandbox and production transactions are fully separate. A sandbox key never sees a production transaction, and vice versa.
Test accounts
ADE
account: { "electronic_payment_key": "<value>" }
SONELGAZ
account: { "sonelgaz": { "invoice_number": "<value>", "amount_without_stamp": "1200.00", "ebb_key": "123456" } } — the outcome depends on invoice_number; the other two fields only need to be present.
SEAAL
account: { "seaal": { "code_client": "<value>", "code_contrat": "446563" } } — the outcome depends on code_client; code_contrat only needs to be 2 to 10 digits.
AADL
account: { "aadl": { "codeloc": "<value>" } }
The AADL notice endpoint (
/avis) is not available in the sandbox.
SEOR
account: { "seor": { "contrat": "100001", "facture": "<value>" } } — the outcome depends on facture; contrat only needs to be 1 to 6 digits.
Algérie Télécom
account: { "phone_number": "<value>" }
Errors you can trigger
A complete sandbox run
Before going live
- Your poller handles every status, including
UNKNOWN(SONELGAZ6006006006). - A
FAILEDorREFUNDEDpayment does not leave a charge on your customer. - A
409,403or timeout never triggers a secondpay. - Every
payuses a newref. - Multi-bill orders show
selectedBillscorrectly (SEAAL100001). - Receipts are stored with
operationId. - The production key is loaded from configuration, never from code.

