Keysender Supply is a wholesale catalog of game keys, gift cards, and eSIMs you can source without holding stock. The Catalog endpoints let your software browse products with prices and quantities, reserve the items you want, convert the reservation into an order, and collect the delivered codes when the order completes, all against your account's wallet.
Make sure you have:
POST /login and the base URL https://panel.keysender.com/api/v1.0.403 with a message that names the address to write to. Request it through Connect a supplier or a ticket.Catalog errors use their own shape: {"status": "...", "error_code": "...", "message": "..."}, and dates are UTC with a Z suffix.
GET /catalog/products. Filter with sku, name, categories, regions, price_min, price_max, qty_min, type (esim, game, wock), since (a date), updated_at (a UTC timestamp, for polling changes), and sort with sort_by (price, qty, name, updated_at) and sort_order. Page with page and per_page.total, page, items_per_page, and docs, the product list. Each product has sku, name, type, qty, purchase_price, regular_price, currency, updated_at, and, where known, release_date, developer, publisher, and description.GET /catalog/products/EXAMPLE-SKU for one product. Add additional_information=1 to include the extra fields.POST /catalog/reserve with your own order_id and the lines:curl -X POST "https://panel.keysender.com/api/v1.0/catalog/reserve" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"order_id": "SHOP-10422", "order_items": [{"sku": "EXAMPLE-SKU", "quantity": 2}]}'
reservation_id. A reservation holds the stock but does not charge you.POST /catalog/order with {"reservation_id": "..."}. The response is status: "Processing"; the order is fulfilled in the background and your wallet is charged.GET /catalog/order?order_id=SHOP-10422 every few seconds. While it still says Processing there are no products in the body yet.products lists each line with sku, quantity, and assigned_codes, each {"code", "type"}. Add additional_information=1 to receive activation details for dynamic products.POST /catalog/order/cancel-item with increment_id (the order) and line_item_id. Success is HTTP 204 with no body; 403, 422, and 502 carry the error shape above.POST /catalog/order/top-up with order_id, iccid, and top_up_sku. The response confirms the ICCID and status: "Complete".GET /catalog/order returns the codes for every line you reserved, the order appears under Supply in the panel, and the wallet balance has dropped by the purchase price.
403 on every catalog call: Supply access is not enabled on the account yet.409 on reserve: the quantity is no longer available; re-read the product's qty and try a smaller line.Processing for a long time: keep polling; do not create a second order for the same order_id.order_id, the reservation_id, and the response.Supply access is enabled per account by Keysender. Until it is switched on, every catalog endpoint answers 403 with a message naming the address to write to. Request access through Connect a supplier or a ticket.
A reservation holds stock without charging you. The charge to your wallet happens when you convert the reservation with POST /catalog/order and the order is fulfilled.
The order is still Processing. Fulfilment runs in the background; keep polling every few seconds, and do not create a second order for the same order_id.