Everything below runs against the sandbox, which seeds the same six markets, stores and couriers the apps use. Sandbox money is not real, but the state machine, the address rules and the currency formatting are exactly the ones production runs.
Get a key
Create an application, tick the scopes you will actually call, and leave the environment on Sandbox. The key is shown once; after that the portal only ever lists its prefix and last four characters.
PALOPGO_KEY=sk_sandbox_8f2c…91d4 https://api.palopgo.com/v1/markets \ -H "Authorization: Bearer $PALOPGO_KEY"Create an order
A real order from the seed: a whole grilled chicken, chips and two Cuca beers from Kilamba Grill in Luanda, delivered to a gated condominium in Talatona, paid in cash with change for 20 000 Kz. Amounts are integers in the market's minor unit; 1 580 000 is 15 800 Kz, not 1 580 000 Kz.
https://api.palopgo.com/v1/orders \ -H "Authorization: Bearer $PALOPGO_KEY" \ -H "Idempotency-Key: cmd_4f1a9e" \ -H "Content-Type: application/json" \ -d '{ "market": "ao-lad", "merchant_id": "m-ao-002", "currency": "AOA", "fulfilment": "delivery", "lines": [ { "item_id": "it-ao-002-01", "qty": 1, "options": [{ "group_id": "picante", "option_id": "medio" }] }, { "item_id": "it-ao-002-04", "qty": 1 }, { "item_id": "it-ao-002-05", "qty": 2 } ], "place": { "bairro": "Talatona", "landmark": "Condomínio Jardim de Rosas, portão 3, depois da bomba Sonangol", "phone": "+244923456789", "access_notes": "Dizer ao guarda que é para a casa 14", "pin": { "lat": -8.9192, "lng": 13.1844 } }, "payment_method": "cash", "cash": { "change_for_minor": 2000000 } }'{ "id": "ord-2026-ao-2211", "short_code": "2211", "market": "ao-lad", "state": "CREATED", "phase": "PAYMENT_PENDING", "currency": "AOA", "totals": { "subtotal_minor": 1330000, "delivery_fee_minor": 250000, "total_minor": 1580000 }, "cash": { "amount_minor": 1580000, "change_for_minor": 2000000, "change_minor": 420000, "courier_float_ok": }, "aggregate_version": 1}Money and currencies
Never format money yourself. Ask the market for its rule and apply it, or render the string the API gives you. The same integer reads six different ways across the platform.
| Market | Currency | Minor | 345000 reads as |
|---|---|---|---|
| Lisboa | EUR | 2 | 3 450,00 € |
| Luanda | AOA | 2 | 3 450 Kz |
| Maputo | MZN | 2 | 3 450 MT |
| Praia | CVE | 2 | 3 450$00 |
| Bissau | XOF | 0 | 345 000 FCFA |
| São Tomé | STN | 2 | 3 450 Db |
Webhooks
Add an endpoint, subscribe to order.* and fulfilment.*, and the order you just created will narrate itself. Every event carries the machine state and the customer-facing phase, so your own screens can say the same thing the PalopGO app says.
{ "id": "evt_01JBV8", "type": "fulfilment.courier_assigned", "livemode": , "created_at": "2026-10-07T12:05:33+01:00", "aggregate": { "type": "order", "id": "ord-2026-ao-2211", "version": 5 }, "data": { "state": "COURIER_ASSIGNED", "phase": "COURIER_ASSIGNED", "courier": { "first_name": "Nelson", "vehicle": "moto", "phone_masked": "+244 92* *** *41" }, "eta": { "minutes_min": 30, "minutes_max": 45 } }}- Create a sandbox key with orders:write and orders:read.
- Create the order above and keep its id.
- Add an endpoint, subscribe to order.* and fulfilment.*, send a test event.
- Advance the order in the sandbox and watch the versions arrive in order.