REST + OpenAPI 3
JSON bodies and clear error codes (application/problem+json). Download the OpenAPI file and generate a client in your own language.
Connect your order, ERP or warehouse system straight to Courino: get the price, create the order and hear back through a signed webhook when it is delivered. In your courier company's panel the order looks just like one entered by hand.
Turkish version of the docs: API dokümanı (Türkçe)
Every order task you do by hand in the portal can also be done through the API. The price comes from the same calculation as the price list your courier company set up for you.
JSON bodies and clear error codes (application/problem+json). Download the OpenAPI file and generate a client in your own language.
Paste your key into Authorize in the docs and try every endpoint from the browser with your real account. In English and Turkish.
Picked up, delivered, cancelled… every event arrives signed with X-KOS-Signature (HMAC-SHA256). If your endpoint is down it is retried; X-KOS-Delivery stays the same across retries.
Send an Idempotency-Key when creating and cancelling orders: a dropped connection never turns one request into two orders; the first response is returned.
Up to 1000 rows in one request. Validate first (dryRun), then create; the same reference number never becomes a second order.
Get the order's tracking link and send it to your recipient through your own channel. While the courier is on the way you can read the location from the API too.
No code needed for Trendyol, Hepsiburada, Shopify, WooCommerce and others; connect them from My online store in the portal.
A separate key for each system (up to 5), with the last-used time shown. A key cannot touch the password, cards or account settings.
Take the <district-id> and <delivery-type-id> values from the GET /me/order-options response. Amounts are always returned as strings ("185.00"), so no cents are lost.
# Price quote: calculates only, saves nothing curl https://client.courino.com/api/v1/pricing/quote \ -H "Authorization: Bearer $COURINO_KEY" \ -H "Content-Type: application/json" \ -d '{ "payer": "sender", "sender": {}, "recipient": { "districtId": "<district-id>" }, "deliveryTypeId": "<delivery-type-id>" }'
total: the total including VAT; lines: the breakdown (base, extra, waiting, VAT…).sender can be left empty.# Create the order: on a network error, retry with the same Idempotency-Key curl https://client.courino.com/api/v1/orders \ -H "Authorization: Bearer $COURINO_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: ORD-48213" \ -d '{ "payer": "sender", "sender": {}, "recipient": { "name": "Jane Doe", "phone": "0532 123 45 67", "address": "Moda Cd. No:12 D:3", "districtId": "<district-id>" }, "deliveryTypeId": "<delivery-type-id>", "reference": "ORD-48213" }'
201 returns the order's id and number; the order lands on your courier company's dispatch screen.409 IDEMPOTENCY_MISMATCH. Keys are kept for 24 hours.GET /me/orders/{id} or listen for it with a webhook.import crypto from 'node:crypto' // Use the raw body: app.post('/courino', express.raw({ type: '*/*' }), …) function verify(req, secret) { // secret: whsec_… (all of it) const sig = req.get('X-KOS-Signature') // t=1761040000,v1=9f2c… const { t, v1 } = Object.fromEntries(sig.split(',').map((p) => p.split('='))) const mac = crypto.createHmac('sha256', secret) .update(`${t}.`).update(req.body).digest('hex') const fresh = Math.abs(Date.now() / 1000 - Number(t)) < 300 return fresh && mac.length === v1?.length && crypto.timingSafeEqual(Buffer.from(mac), Buffer.from(v1)) }
{ id, type, occurredAt, data: { order } }; type e.g. order.delivered.X-KOS-Delivery value and skip the second one.410 Gone, retries stop for that message.The API works with your account in your courier company's Courino customer portal. No separate sign-up or contract is needed.
GET /me/order-options.POST /pricing/quote.POST /orders.All paths are under https://client.courino.com/api/v1. The full list, fields and examples are in the docs.
/me/order-optionsDistricts and delivery types (districtId is required in addresses)/pricing/quotePrice quote (saves nothing)/ordersCreates an order · Idempotency-Key/me/orders/batchBulk orders, up to 1000 rows/me/ordersMy orders; search by reference, barcode and date/me/orders/{id}Order details and status/me/orders/{id}Edits the order (while it is still in the pool)/me/orders/{id}/cancelCancel · Idempotency-Key/me/orders/{id}/trackingLive courier tracking/me/orders/{id}/tracking-linkTracking link to send to the recipientX-RateLimit-Limit, -Remaining and -Reset on every response; over the limit you get 429 with Retry-After.
Up to 5 active API keys and 5 webhook subscriptions per account. The key and the signing secret are shown only once.
When the account password changes, all of that account's keys are revoked. A key you revoke stops working within 30 seconds.
Grant integration permission to their account on the customer card; your customer creates their own key in the portal. Orders land in your panel as normal orders, priced from the customer's price list. If you suspect a key has leaked, revoke it from the customer card.
Register your company for free →Ask your courier company to grant integration permission to your portal account; then create your key and follow the docs. If you get stuck, write to destek@courino.com.
Go to the API docs →Open the Swagger docs, or download the OpenAPI file and load it into your own tool (Postman, Insomnia, code generators).