Production is locked until a market agreement is recorded

Quickstart

A sandbox key, a first order in Luanda and the event that tells you it moved — in about ten minutes.

Start here8 min

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.

every request
export PALOPGO_KEY=sk_sandbox_8f2c…91d4 curl 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.

POST /v1/orders
curl 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 }  }'
201 Created
{  "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": true  },  "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.

345000 in each market's currency
MarketCurrencyMinor345000 reads as
LisboaEUR23 450,00 €
LuandaAOA23 450 Kz
MaputoMZN23 450 MT
PraiaCVE23 450$00
BissauXOF0345 000 FCFA
São ToméSTN23 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.

fulfilment.courier_assigned
{  "id": "evt_01JBV8",  "type": "fulfilment.courier_assigned",  "livemode": false,  "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 }  }}
  1. Create a sandbox key with orders:write and orders:read.
  2. Create the order above and keep its id.
  3. Add an endpoint, subscribe to order.* and fulfilment.*, send a test event.
  4. Advance the order in the sandbox and watch the versions arrive in order.

Keep going