curl --request POST \
--url https://connect.laces.run/v1/orders \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"event_id": "q3Zk9mVx",
"lines": [
{
"ticket_type_id": "tt_10k",
"quantity": 1,
"participants": [
{
"distance_km": 10
}
]
}
],
"buyer_name": "Amina Nakato",
"buyer_email": "amina@example.com",
"buyer_phone": "0763494235",
"payment_method": "momo",
"waiver_accepted": true,
"waiver_version": "2026-09-01",
"custom_fields": {
"kit_size": "M"
},
"partner_reference": "cart-8841"
}
'const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
event_id: 'q3Zk9mVx',
lines: [{ticket_type_id: 'tt_10k', quantity: 1, participants: [{distance_km: 10}]}],
buyer_name: 'Amina Nakato',
buyer_email: 'amina@example.com',
buyer_phone: '0763494235',
payment_method: 'momo',
waiver_accepted: true,
waiver_version: '2026-09-01',
custom_fields: {kit_size: 'M'},
partner_reference: 'cart-8841'
})
};
fetch('https://connect.laces.run/v1/orders', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://connect.laces.run/v1/orders"
payload = {
"event_id": "q3Zk9mVx",
"lines": [
{
"ticket_type_id": "tt_10k",
"quantity": 1,
"participants": [{ "distance_km": 10 }]
}
],
"buyer_name": "Amina Nakato",
"buyer_email": "amina@example.com",
"buyer_phone": "0763494235",
"payment_method": "momo",
"waiver_accepted": True,
"waiver_version": "2026-09-01",
"custom_fields": { "kit_size": "M" },
"partner_reference": "cart-8841"
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://connect.laces.run/v1/orders",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'event_id' => 'q3Zk9mVx',
'lines' => [
[
'ticket_type_id' => 'tt_10k',
'quantity' => 1,
'participants' => [
[
'distance_km' => 10
]
]
]
],
'buyer_name' => 'Amina Nakato',
'buyer_email' => 'amina@example.com',
'buyer_phone' => '0763494235',
'payment_method' => 'momo',
'waiver_accepted' => true,
'waiver_version' => '2026-09-01',
'custom_fields' => [
'kit_size' => 'M'
],
'partner_reference' => 'cart-8841'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}{
"code": 200,
"message": "Cart already created (idempotent replay)",
"data": {
"order": {
"id": "Hk2mQ8vR",
"order_code": "LC-7K2M9X",
"event_id": "q3Zk9mVx",
"status": "cart",
"currency": "UGX",
"subtotal": 50000,
"discount_total": 0,
"donation_total": 0,
"laces_fee": 2400,
"total": 52400,
"failure_kind": null,
"ticket_count": 1,
"buyer": {
"name": "Amina Nakato",
"email": "amina@example.com",
"phone": "+256763494235"
},
"attribution": {
"channel": "partner_api",
"api_client_id": "LCSCLI-EXAMPLECLNT2345EXAMP",
"checkout_session_id": null,
"partner_reference": "cart-8841"
},
"hold_expires_at": "2026-10-09T08:29:03.000Z",
"created_at": "2026-10-09T08:14:03.000Z"
},
"checkout_lines": [
{
"label": "Subtotal",
"amount": 50000
},
{
"label": "Laces Service Fee",
"amount": 2400
},
{
"label": "Total",
"amount": 52400
}
],
"is_free": false,
"is_test_mode": false,
"fee_rate": {
"flat_fee": 0,
"percent_fee": 0,
"currency": "UGX",
"payment_method": "momo"
},
"registrations": [
{
"id": "rg_5TfK2",
"ticket_type_id": "tt_10k",
"distance_km": 10,
"status": "pending"
}
],
"event_name": "Kampala City 10K",
"event_when_label": "Sun 15 Nov 2026, 7:00 AM"
}
}Create an order
Create a cart and hold places. No money moves until you pay it.
curl --request POST \
--url https://connect.laces.run/v1/orders \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"event_id": "q3Zk9mVx",
"lines": [
{
"ticket_type_id": "tt_10k",
"quantity": 1,
"participants": [
{
"distance_km": 10
}
]
}
],
"buyer_name": "Amina Nakato",
"buyer_email": "amina@example.com",
"buyer_phone": "0763494235",
"payment_method": "momo",
"waiver_accepted": true,
"waiver_version": "2026-09-01",
"custom_fields": {
"kit_size": "M"
},
"partner_reference": "cart-8841"
}
'const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
event_id: 'q3Zk9mVx',
lines: [{ticket_type_id: 'tt_10k', quantity: 1, participants: [{distance_km: 10}]}],
buyer_name: 'Amina Nakato',
buyer_email: 'amina@example.com',
buyer_phone: '0763494235',
payment_method: 'momo',
waiver_accepted: true,
waiver_version: '2026-09-01',
custom_fields: {kit_size: 'M'},
partner_reference: 'cart-8841'
})
};
fetch('https://connect.laces.run/v1/orders', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://connect.laces.run/v1/orders"
payload = {
"event_id": "q3Zk9mVx",
"lines": [
{
"ticket_type_id": "tt_10k",
"quantity": 1,
"participants": [{ "distance_km": 10 }]
}
],
"buyer_name": "Amina Nakato",
"buyer_email": "amina@example.com",
"buyer_phone": "0763494235",
"payment_method": "momo",
"waiver_accepted": True,
"waiver_version": "2026-09-01",
"custom_fields": { "kit_size": "M" },
"partner_reference": "cart-8841"
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://connect.laces.run/v1/orders",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'event_id' => 'q3Zk9mVx',
'lines' => [
[
'ticket_type_id' => 'tt_10k',
'quantity' => 1,
'participants' => [
[
'distance_km' => 10
]
]
]
],
'buyer_name' => 'Amina Nakato',
'buyer_email' => 'amina@example.com',
'buyer_phone' => '0763494235',
'payment_method' => 'momo',
'waiver_accepted' => true,
'waiver_version' => '2026-09-01',
'custom_fields' => [
'kit_size' => 'M'
],
'partner_reference' => 'cart-8841'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}{
"code": 200,
"message": "Cart already created (idempotent replay)",
"data": {
"order": {
"id": "Hk2mQ8vR",
"order_code": "LC-7K2M9X",
"event_id": "q3Zk9mVx",
"status": "cart",
"currency": "UGX",
"subtotal": 50000,
"discount_total": 0,
"donation_total": 0,
"laces_fee": 2400,
"total": 52400,
"failure_kind": null,
"ticket_count": 1,
"buyer": {
"name": "Amina Nakato",
"email": "amina@example.com",
"phone": "+256763494235"
},
"attribution": {
"channel": "partner_api",
"api_client_id": "LCSCLI-EXAMPLECLNT2345EXAMP",
"checkout_session_id": null,
"partner_reference": "cart-8841"
},
"hold_expires_at": "2026-10-09T08:29:03.000Z",
"created_at": "2026-10-09T08:14:03.000Z"
},
"checkout_lines": [
{
"label": "Subtotal",
"amount": 50000
},
{
"label": "Laces Service Fee",
"amount": 2400
},
{
"label": "Total",
"amount": 52400
}
],
"is_free": false,
"is_test_mode": false,
"fee_rate": {
"flat_fee": 0,
"percent_fee": 0,
"currency": "UGX",
"payment_method": "momo"
},
"registrations": [
{
"id": "rg_5TfK2",
"ticket_type_id": "tt_10k",
"distance_km": 10,
"status": "pending"
}
],
"event_name": "Kampala City 10K",
"event_when_label": "Sun 15 Nov 2026, 7:00 AM"
}
}Authorizations
A token from POST /oauth/token, valid 1 hour. Paste it as LCSTOK-…-X (without the word Bearer).
Headers
Any unique string you generate (a UUID is ideal), stored with your cart and reused on every retry of the same action. Scoped to your API client.
255Body
Must be your organization's event.
"q3Zk9mVx"
1Show child attributes
Show child attributes
"Amina Nakato"
Receipts and tickets go here.
"amina@example.com"
The buyer's phone number. Returned in E.164 (+2567…) in every order read.
"0763494235"
Sets the price. momo (default) is MTN Mobile Money only; airtel is Airtel Money only. Choose from the buyer's number: the pay call answers 409 reprice_required when the number's network does not match. Use only methods in the event's payment_methods: card is refused with 409 payment_method_unavailable until card is available (coming soon).
momo, card, airtel Required (true) when the event's waiver_required is true.
Required when waiver_required; must equal the event's current waiver_version.
Answers to additional_questions, keyed by key.
Minor units.
x >= 0Your own reference. Echoed back as attribution.partner_reference in order reads and webhooks.
128Optional referral code.
Optional note on the order.
Parent or guardian details, when the event requires them for minors.
Optional extra buyer fields, stored with the order.