{"name":"Kiki Commerce API","description":"Search, price and buy physical goods for delivery inside Nigeria. Kiki indexes listings from Nigerian marketplaces alongside its own merchants, and is the merchant of record for everything it sources — so a seller with no checkout of their own becomes buyable through one accountable counterparty. NOTE: one ORDER is one seller and one pickup location, because one delivery carries one pickup address. A basket spanning sellers is refused with the split to make, and each part carries its own delivery fee.","version":"1.0","country":"NG","currency":"NGN","storefront":"https://kiki.com.ng","openapi":"https://api.xrnet.tech/api/agent/openapi.json","llmsTxt":"https://kiki.com.ng/llms.txt","authentication":{"required":false,"note":"Search, quote and order creation are open. No key, no account, no session. Rate limits apply per IP."},"payment":{"model":"hosted_authorization","note":"Creating an order returns a hosted payment URL. The API never accepts card numbers, and an agent is not expected to have any — the agent assembles the order, a person authorises it in one tap. Poll GET /agent/orders/{reference} to learn when it lands; there is no agent-facing webhook yet.","rails":["bank_transfer","ussd","card"],"defaultRail":"bank_transfer","railNote":"Bank transfer is the default because it is the rail most Nigerian buyers actually use and the fastest for a person to complete."},"fulfilment":{"instant":{"humanStep":false,"confirmWithinHours":0,"meaning":"Stock-tracked inventory held by a merchant on Kiki. Quantity is known, price is fixed, and payment moves the order straight to fulfilment."},"merchant_confirms":{"humanStep":true,"confirmWithinHours":24,"meaning":"A merchant on Kiki who does not track stock counts. Price is fixed and binding; availability is confirmed by the merchant after payment."},"sourced":{"humanStep":true,"confirmWithinHours":48,"meaning":"An indexed listing Kiki sources on the buyer’s behalf. The listed price is an asking price: Kiki is the merchant of record, confirms the item with the source seller, absorbs ordinary price movement across the order, and refunds any line it cannot get."}},"endpoints":[{"method":"GET","path":"/agent/manifest","summary":"This document."},{"method":"GET","path":"/agent/destinations","summary":"Every destination deliverTo accepts, and every spelling."},{"method":"GET","path":"/agent/search","summary":"Search the catalogue. Pass deliverTo to get landed cost per row."},{"method":"POST","path":"/agent/quote","summary":"Authoritative total for a basket: live prices, real courier fee, per-line fulfilment class. Nothing is reserved."},{"method":"POST","path":"/agent/orders","summary":"Create an order and get a hosted payment URL for the buyer."},{"method":"GET","path":"/agent/orders/{reference}","summary":"Order state, what is blocking it, and what to do next."}],"delivery":{"model":"state_to_state","note":"The courier prices by route, not by weight or quantity, so the fee for a given pickup state to a given destination state is the same for every listing that travels it — and one order carries one fee. A basket split across two sellers therefore pays two fees."},"limits":{"search":"60 requests / minute / IP","quote":"20 requests / minute / IP","orders":"20 requests / minute / IP"},"policy":{"agentsWelcome":true,"note":"Automated shopping agents are a supported client of this API, not a tolerated one. Identify yourself in User-Agent so we can tell you apart from scrapers and raise your limits rather than block you."}}