Référence de l'API
Commandes de la boutique
Suivre les commandes de votre boutique en ligne ou de votre configurateur : mettre à jour le statut, renseigner le suivi de colis et ajouter des notes.
Endpoints
-
GET
/ordersLister les commandes -
GET
/orders/{order}Récupérer une commande -
POST
/orders/{order}/statusModifier le statut d'une commande -
POST
/orders/{order}/trackingRenseigner le suivi de colis -
POST
/orders/{order}/notesAjouter une note
Lister les commandes
/api/v1/orders
Une liste des commandes de la boutique, les plus récentes d'abord, avec leurs lignes et leurs notes. Filtrez par statut, client ou date de modification. Avec filter[status]=paid, vous récupérez ce qui est prêt à être traité.
- Scope
-
orders.read— Lire les commandes de la boutique, avec leurs lignes, leurs adresses et les coordonnées du client - Fonctionnalité requise
webshop
Paramètres de requête
| Nom | Type | Description |
|---|---|---|
limit
|
integer | Nombre de résultats par page. de 1 à 100 · par défaut : 50 |
cursor
|
string | Le next_cursor ou prev_cursor de meta dans la réponse précédente. |
sort
|
string | Le champ sur lequel trier ; un signe moins devant signifie décroissant. Les champs que vous pouvez choisir et la valeur par défaut sont indiqués avec ce paramètre. l'une des valeurs : -created_at, created_at, -updated_at, updated_at · par défaut : -created_at |
filter[status]
|
string | Uniquement les commandes avec ce statut, par exemple paid ou shipped. l'une des valeurs : pending_payment, paid, processing, shipped, delivered, cancelled, refunded |
filter[customer_id]
|
string (uuid) | Uniquement ce qui appartient à ce client. |
filter[updated_since]
|
string (date-time) | Uniquement ce qui a changé depuis ce moment : ISO 8601 avec fuseau horaire, par exemple 2026-09-14T10:15:00Z. Pratique pour synchroniser. Prévoyez un chevauchement de quelques minutes avec votre moment précédent, car l'horloge de votre système et celle de Klantly ne sont pas exactement synchronisées, et car une modification juste après votre moment précédent tomberait sinon de justesse en dehors. La limite est inclusive : un élément modifié exactement à cet instant est inclus. |
Exemple de requête
curl "https://app.klantly.com/api/v1/orders?filter[status]=paid&sort=created_at" \
-H "Authorization: Bearer $KLANTLY_API_KEY"$client = new \GuzzleHttp\Client([
'base_uri' => 'https://app.klantly.com/api/v1/',
'headers' => ['Authorization' => 'Bearer ' . getenv('KLANTLY_API_KEY')],
]);
$response = $client->request('GET', 'orders', [
'query' => [
'filter[status]' => 'paid',
'sort' => 'created_at',
],
]);
$data = json_decode((string) $response->getBody(), true)['data'];const response = await fetch('https://app.klantly.com/api/v1/orders?filter[status]=paid&sort=created_at', {
headers: {
Authorization: `Bearer ${process.env.KLANTLY_API_KEY}`,
},
});
const { data } = await response.json();import os
import requests
response = requests.get(
"https://app.klantly.com/api/v1/orders",
headers={
"Authorization": f"Bearer {os.environ['KLANTLY_API_KEY']}",
},
params={
"filter[status]": "paid",
"sort": "created_at"
},
)
data = response.json()["data"]Réponse 200
La réponse est une liste avec pagination par curseur : data contient les objets, meta la pagination.
{
"data": [
{
"object": "order",
"id": "9d3f89ee-f4d6-4fbd-8c01-b6c4d5e6f7a0",
"number": "ORD-00042",
"status": "paid",
"customer_id": "9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70",
"customer": {
"name": "Jan de Vries",
"email": "jan@example.com",
"phone": "+31 6 12345678",
"company_name": null,
"vat_number": null
},
"billing_address": {
"address": "Dorpsstraat 1",
"postal_code": "3511 AB",
"city": "Utrecht",
"country": "NL"
},
"shipping_address": {
"address": "Dorpsstraat 1",
"postal_code": "3511 AB",
"city": "Utrecht",
"country": "NL"
},
"form_title": "Plissé op maat",
"language": "nl",
"currency": "EUR",
"subtotal": "100.00",
"discount_amount": "0.00",
"shipping_cost": "0.00",
"tax_amount": "21.00",
"total": "121.00",
"payment_method": "ideal",
"tracking_code": null,
"tracking_url": null,
"invoice_id": null,
"quote_id": null,
"paid_at": null,
"shipped_at": null,
"delivered_at": null,
"cancelled_at": null,
"refunded_at": null,
"items": [
{
"object": "order_item",
"type": "product",
"name": "Plissé",
"description": null,
"quantity": "1.00",
"unit": "stuk",
"unit_price": "100.00",
"discount_percentage": "0.00",
"discount_amount": "0.00",
"line_total": "100.00",
"is_taxable": true,
"tax_rate": "21.00"
}
],
"notes": [
{
"object": "order_note",
"type": "note",
"content": "Klant belde: graag na 14.00 uur leveren.",
"is_internal": true,
"created_at": "2026-09-16T10:15:00Z"
}
],
"created_at": "2026-09-14T10:15:00Z",
"updated_at": "2026-09-14T10:15:00Z"
}
],
"meta": {
"limit": 50,
"next_cursor": "eyJpZCI6IjlkM2Y2YzFlIn0",
"prev_cursor": null
}
}Erreurs possibles
-
403
insufficient_scope— Cette clé API n'a pas accès à cette action. -
422
validation_failed— Les données saisies ne sont pas valides.
Récupérer une commande
/api/v1/orders/{order}
Une commande par id, avec ses lignes, ses adresses et ses notes.
- Scope
-
orders.read— Lire les commandes de la boutique, avec leurs lignes, leurs adresses et les coordonnées du client - Fonctionnalité requise
webshop
Paramètres de chemin
| Nom | Type | Description |
|---|---|---|
order obligatoire |
string (uuid) | L'id (UUID) de la commande. |
Exemple de requête
curl "https://app.klantly.com/api/v1/orders/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70" \
-H "Authorization: Bearer $KLANTLY_API_KEY"$client = new \GuzzleHttp\Client([
'base_uri' => 'https://app.klantly.com/api/v1/',
'headers' => ['Authorization' => 'Bearer ' . getenv('KLANTLY_API_KEY')],
]);
$response = $client->request('GET', 'orders/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70');
$data = json_decode((string) $response->getBody(), true)['data'];const response = await fetch('https://app.klantly.com/api/v1/orders/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70', {
headers: {
Authorization: `Bearer ${process.env.KLANTLY_API_KEY}`,
},
});
const { data } = await response.json();import os
import requests
response = requests.get(
"https://app.klantly.com/api/v1/orders/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70",
headers={
"Authorization": f"Bearer {os.environ['KLANTLY_API_KEY']}",
},
)
data = response.json()["data"]Réponse 200
{
"data": {
"object": "order",
"id": "9d3f89ee-f4d6-4fbd-8c01-b6c4d5e6f7a0",
"number": "ORD-00042",
"status": "paid",
"customer_id": "9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70",
"customer": {
"name": "Jan de Vries",
"email": "jan@example.com",
"phone": "+31 6 12345678",
"company_name": null,
"vat_number": null
},
"billing_address": {
"address": "Dorpsstraat 1",
"postal_code": "3511 AB",
"city": "Utrecht",
"country": "NL"
},
"shipping_address": {
"address": "Dorpsstraat 1",
"postal_code": "3511 AB",
"city": "Utrecht",
"country": "NL"
},
"form_title": "Plissé op maat",
"language": "nl",
"currency": "EUR",
"subtotal": "100.00",
"discount_amount": "0.00",
"shipping_cost": "0.00",
"tax_amount": "21.00",
"total": "121.00",
"payment_method": "ideal",
"tracking_code": null,
"tracking_url": null,
"invoice_id": null,
"quote_id": null,
"paid_at": null,
"shipped_at": null,
"delivered_at": null,
"cancelled_at": null,
"refunded_at": null,
"items": [
{
"object": "order_item",
"type": "product",
"name": "Plissé",
"description": null,
"quantity": "1.00",
"unit": "stuk",
"unit_price": "100.00",
"discount_percentage": "0.00",
"discount_amount": "0.00",
"line_total": "100.00",
"is_taxable": true,
"tax_rate": "21.00"
}
],
"notes": [
{
"object": "order_note",
"type": "note",
"content": "Klant belde: graag na 14.00 uur leveren.",
"is_internal": true,
"created_at": "2026-09-16T10:15:00Z"
}
],
"created_at": "2026-09-14T10:15:00Z",
"updated_at": "2026-09-14T10:15:00Z"
}
}Erreurs possibles
-
403
insufficient_scope— Cette clé API n'a pas accès à cette action. -
404
not_found— Introuvable.
Modifier le statut d'une commande
/api/v1/orders/{order}/status
Passe la commande en traitement, expédiée, livrée ou annulée, comme dans l'application : l'heure est enregistrée, une note interne est ajoutée et le client reçoit l'e-mail correspondant à ce statut. Les remboursements ne sont pas possibles ici : ils déplacent de l'argent et se font dans Klantly.
- Scope
-
orders.write— Modifier le statut des commandes (le client reçoit alors un e-mail), renseigner le suivi de colis et ajouter des notes - Fonctionnalité requise
webshop
Envoyez une Idempotency-Key : une nouvelle tentative après un délai d'attente ne crée alors jamais de doublon.
Paramètres de chemin
| Nom | Type | Description |
|---|---|---|
order obligatoire |
string (uuid) | L'id (UUID) de la commande. |
Corps (JSON)
| Champ | Type | Description |
|---|---|---|
status
obligatoire
|
string | pending_payment (en attente de paiement), paid (payée), processing (en traitement), shipped (expédiée), delivered (livrée), cancelled (annulée) ou refunded (remboursée). À l'envoi, uniquement processing, shipped, delivered ou cancelled. l'une des valeurs : processing, shipped, delivered, cancelled |
Exemple de requête
curl -X POST "https://app.klantly.com/api/v1/orders/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70/status" \
-H "Authorization: Bearer $KLANTLY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f" \
-d '{
"status": "shipped"
}'$client = new \GuzzleHttp\Client([
'base_uri' => 'https://app.klantly.com/api/v1/',
'headers' => ['Authorization' => 'Bearer ' . getenv('KLANTLY_API_KEY')],
]);
$response = $client->request('POST', 'orders/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70/status', [
'headers' => [
'Idempotency-Key' => '6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f',
],
'json' => [
'status' => 'shipped',
],
]);
$data = json_decode((string) $response->getBody(), true)['data'];const response = await fetch('https://app.klantly.com/api/v1/orders/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70/status', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.KLANTLY_API_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': '6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f',
},
body: JSON.stringify({
"status": "shipped"
}),
});
const { data } = await response.json();import os
import requests
response = requests.post(
"https://app.klantly.com/api/v1/orders/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70/status",
headers={
"Authorization": f"Bearer {os.environ['KLANTLY_API_KEY']}",
"Idempotency-Key": "6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
},
json={
"status": "shipped"
},
)
data = response.json()["data"]Réponse 200
{
"data": {
"object": "order",
"id": "9d3f89ee-f4d6-4fbd-8c01-b6c4d5e6f7a0",
"number": "ORD-00042",
"status": "paid",
"customer_id": "9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70",
"customer": {
"name": "Jan de Vries",
"email": "jan@example.com",
"phone": "+31 6 12345678",
"company_name": null,
"vat_number": null
},
"billing_address": {
"address": "Dorpsstraat 1",
"postal_code": "3511 AB",
"city": "Utrecht",
"country": "NL"
},
"shipping_address": {
"address": "Dorpsstraat 1",
"postal_code": "3511 AB",
"city": "Utrecht",
"country": "NL"
},
"form_title": "Plissé op maat",
"language": "nl",
"currency": "EUR",
"subtotal": "100.00",
"discount_amount": "0.00",
"shipping_cost": "0.00",
"tax_amount": "21.00",
"total": "121.00",
"payment_method": "ideal",
"tracking_code": null,
"tracking_url": null,
"invoice_id": null,
"quote_id": null,
"paid_at": null,
"shipped_at": null,
"delivered_at": null,
"cancelled_at": null,
"refunded_at": null,
"items": [
{
"object": "order_item",
"type": "product",
"name": "Plissé",
"description": null,
"quantity": "1.00",
"unit": "stuk",
"unit_price": "100.00",
"discount_percentage": "0.00",
"discount_amount": "0.00",
"line_total": "100.00",
"is_taxable": true,
"tax_rate": "21.00"
}
],
"notes": [
{
"object": "order_note",
"type": "note",
"content": "Klant belde: graag na 14.00 uur leveren.",
"is_internal": true,
"created_at": "2026-09-16T10:15:00Z"
}
],
"created_at": "2026-09-14T10:15:00Z",
"updated_at": "2026-09-14T10:15:00Z"
}
}Erreurs possibles
-
403
insufficient_scope— Cette clé API n'a pas accès à cette action. -
422
validation_failed— Les données saisies ne sont pas valides. -
422
unknown_field— Les données contiennent un champ inconnu. -
415
unsupported_media_type— Ce format n'est pas pris en charge. -
413
payload_too_large— Le corps de la requête est trop volumineux. -
404
not_found— Introuvable. -
422
idempotency_key_reused— Cette Idempotency-Key a déjà été utilisée pour une autre requête. -
409
idempotency_in_progress— Une requête avec cette Idempotency-Key est encore en cours.
Renseigner le suivi de colis
/api/v1/orders/{order}/tracking
Enregistre le code de suivi et éventuellement le lien de suivi, par exemple depuis votre système d'expédition. Si vous n'envoyez qu'un code, le lien existant est conservé ; null efface le code.
- Scope
-
orders.write— Modifier le statut des commandes (le client reçoit alors un e-mail), renseigner le suivi de colis et ajouter des notes - Fonctionnalité requise
webshop
Envoyez une Idempotency-Key : une nouvelle tentative après un délai d'attente ne crée alors jamais de doublon.
Paramètres de chemin
| Nom | Type | Description |
|---|---|---|
order obligatoire |
string (uuid) | L'id (UUID) de la commande. |
Corps (JSON)
| Champ | Type | Description |
|---|---|---|
tracking_code
obligatoire
|
string | Le code de suivi de l'envoi. Obligatoire pour renseigner le suivi ; null l'efface. peut être vide (null) · au maximum 255 caractères |
tracking_url
facultatif
|
string (uri) | Le lien vers la page de suivi (http ou https). Sans indication, le lien existant est conservé. peut être vide (null) · au maximum 500 caractères |
Exemple de requête
curl -X POST "https://app.klantly.com/api/v1/orders/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70/tracking" \
-H "Authorization: Bearer $KLANTLY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f" \
-d '{
"tracking_code": "3SABCD123456789",
"tracking_url": "https://jouw.postnl.nl/track-and-trace/3SABCD123456789"
}'$client = new \GuzzleHttp\Client([
'base_uri' => 'https://app.klantly.com/api/v1/',
'headers' => ['Authorization' => 'Bearer ' . getenv('KLANTLY_API_KEY')],
]);
$response = $client->request('POST', 'orders/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70/tracking', [
'headers' => [
'Idempotency-Key' => '6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f',
],
'json' => [
'tracking_code' => '3SABCD123456789',
'tracking_url' => 'https://jouw.postnl.nl/track-and-trace/3SABCD123456789',
],
]);
$data = json_decode((string) $response->getBody(), true)['data'];const response = await fetch('https://app.klantly.com/api/v1/orders/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70/tracking', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.KLANTLY_API_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': '6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f',
},
body: JSON.stringify({
"tracking_code": "3SABCD123456789",
"tracking_url": "https://jouw.postnl.nl/track-and-trace/3SABCD123456789"
}),
});
const { data } = await response.json();import os
import requests
response = requests.post(
"https://app.klantly.com/api/v1/orders/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70/tracking",
headers={
"Authorization": f"Bearer {os.environ['KLANTLY_API_KEY']}",
"Idempotency-Key": "6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
},
json={
"tracking_code": "3SABCD123456789",
"tracking_url": "https://jouw.postnl.nl/track-and-trace/3SABCD123456789"
},
)
data = response.json()["data"]Réponse 200
{
"data": {
"object": "order",
"id": "9d3f89ee-f4d6-4fbd-8c01-b6c4d5e6f7a0",
"number": "ORD-00042",
"status": "paid",
"customer_id": "9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70",
"customer": {
"name": "Jan de Vries",
"email": "jan@example.com",
"phone": "+31 6 12345678",
"company_name": null,
"vat_number": null
},
"billing_address": {
"address": "Dorpsstraat 1",
"postal_code": "3511 AB",
"city": "Utrecht",
"country": "NL"
},
"shipping_address": {
"address": "Dorpsstraat 1",
"postal_code": "3511 AB",
"city": "Utrecht",
"country": "NL"
},
"form_title": "Plissé op maat",
"language": "nl",
"currency": "EUR",
"subtotal": "100.00",
"discount_amount": "0.00",
"shipping_cost": "0.00",
"tax_amount": "21.00",
"total": "121.00",
"payment_method": "ideal",
"tracking_code": null,
"tracking_url": null,
"invoice_id": null,
"quote_id": null,
"paid_at": null,
"shipped_at": null,
"delivered_at": null,
"cancelled_at": null,
"refunded_at": null,
"items": [
{
"object": "order_item",
"type": "product",
"name": "Plissé",
"description": null,
"quantity": "1.00",
"unit": "stuk",
"unit_price": "100.00",
"discount_percentage": "0.00",
"discount_amount": "0.00",
"line_total": "100.00",
"is_taxable": true,
"tax_rate": "21.00"
}
],
"notes": [
{
"object": "order_note",
"type": "note",
"content": "Klant belde: graag na 14.00 uur leveren.",
"is_internal": true,
"created_at": "2026-09-16T10:15:00Z"
}
],
"created_at": "2026-09-14T10:15:00Z",
"updated_at": "2026-09-14T10:15:00Z"
}
}Erreurs possibles
-
403
insufficient_scope— Cette clé API n'a pas accès à cette action. -
422
validation_failed— Les données saisies ne sont pas valides. -
422
unknown_field— Les données contiennent un champ inconnu. -
415
unsupported_media_type— Ce format n'est pas pris en charge. -
413
payload_too_large— Le corps de la requête est trop volumineux. -
404
not_found— Introuvable. -
422
idempotency_key_reused— Cette Idempotency-Key a déjà été utilisée pour une autre requête. -
409
idempotency_in_progress— Une requête avec cette Idempotency-Key est encore en cours.
Ajouter une note
/api/v1/orders/{order}/notes
Ajoute une note interne à la commande. Le client ne la voit jamais. Une note ajoutée via l'API n'a pas d'auteur.
- Scope
-
orders.write— Modifier le statut des commandes (le client reçoit alors un e-mail), renseigner le suivi de colis et ajouter des notes - Fonctionnalité requise
webshop
Envoyez une Idempotency-Key : une nouvelle tentative après un délai d'attente ne crée alors jamais de doublon.
Paramètres de chemin
| Nom | Type | Description |
|---|---|---|
order obligatoire |
string (uuid) | L'id (UUID) de la commande. |
Corps (JSON)
| Champ | Type | Description |
|---|---|---|
content
obligatoire
|
string | Le texte de la note (5 000 caractères au maximum). au maximum 5000 caractères |
Exemple de requête
curl -X POST "https://app.klantly.com/api/v1/orders/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70/notes" \
-H "Authorization: Bearer $KLANTLY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f" \
-d '{
"content": "Klant belde: graag na 14.00 uur leveren."
}'$client = new \GuzzleHttp\Client([
'base_uri' => 'https://app.klantly.com/api/v1/',
'headers' => ['Authorization' => 'Bearer ' . getenv('KLANTLY_API_KEY')],
]);
$response = $client->request('POST', 'orders/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70/notes', [
'headers' => [
'Idempotency-Key' => '6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f',
],
'json' => [
'content' => 'Klant belde: graag na 14.00 uur leveren.',
],
]);
$data = json_decode((string) $response->getBody(), true)['data'];const response = await fetch('https://app.klantly.com/api/v1/orders/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70/notes', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.KLANTLY_API_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': '6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f',
},
body: JSON.stringify({
"content": "Klant belde: graag na 14.00 uur leveren."
}),
});
const { data } = await response.json();import os
import requests
response = requests.post(
"https://app.klantly.com/api/v1/orders/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70/notes",
headers={
"Authorization": f"Bearer {os.environ['KLANTLY_API_KEY']}",
"Idempotency-Key": "6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
},
json={
"content": "Klant belde: graag na 14.00 uur leveren."
},
)
data = response.json()["data"]Réponse 201
{
"data": {
"object": "order",
"id": "9d3f89ee-f4d6-4fbd-8c01-b6c4d5e6f7a0",
"number": "ORD-00042",
"status": "paid",
"customer_id": "9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70",
"customer": {
"name": "Jan de Vries",
"email": "jan@example.com",
"phone": "+31 6 12345678",
"company_name": null,
"vat_number": null
},
"billing_address": {
"address": "Dorpsstraat 1",
"postal_code": "3511 AB",
"city": "Utrecht",
"country": "NL"
},
"shipping_address": {
"address": "Dorpsstraat 1",
"postal_code": "3511 AB",
"city": "Utrecht",
"country": "NL"
},
"form_title": "Plissé op maat",
"language": "nl",
"currency": "EUR",
"subtotal": "100.00",
"discount_amount": "0.00",
"shipping_cost": "0.00",
"tax_amount": "21.00",
"total": "121.00",
"payment_method": "ideal",
"tracking_code": null,
"tracking_url": null,
"invoice_id": null,
"quote_id": null,
"paid_at": null,
"shipped_at": null,
"delivered_at": null,
"cancelled_at": null,
"refunded_at": null,
"items": [
{
"object": "order_item",
"type": "product",
"name": "Plissé",
"description": null,
"quantity": "1.00",
"unit": "stuk",
"unit_price": "100.00",
"discount_percentage": "0.00",
"discount_amount": "0.00",
"line_total": "100.00",
"is_taxable": true,
"tax_rate": "21.00"
}
],
"notes": [
{
"object": "order_note",
"type": "note",
"content": "Klant belde: graag na 14.00 uur leveren.",
"is_internal": true,
"created_at": "2026-09-16T10:15:00Z"
}
],
"created_at": "2026-09-14T10:15:00Z",
"updated_at": "2026-09-14T10:15:00Z"
}
}Erreurs possibles
-
403
insufficient_scope— Cette clé API n'a pas accès à cette action. -
422
validation_failed— Les données saisies ne sont pas valides. -
422
unknown_field— Les données contiennent un champ inconnu. -
415
unsupported_media_type— Ce format n'est pas pris en charge. -
413
payload_too_large— Le corps de la requête est trop volumineux. -
404
not_found— Introuvable. -
422
idempotency_key_reused— Cette Idempotency-Key a déjà été utilisée pour une autre requête. -
409
idempotency_in_progress— Une requête avec cette Idempotency-Key est encore en cours.
L'objet
Tous les champs sont toujours présents ; un champ sans valeur vaut null.
| Champ | Type | Description |
|---|---|---|
object |
string | Toujours "order". |
id |
string (uuid) | Id unique (UUID). |
number |
string | Numéro de commande, par exemple ORD-00042. |
status |
string | pending_payment (en attente de paiement), paid (payée), processing (en traitement), shipped (expédiée), delivered (livrée), cancelled (annulée) ou refunded (remboursée). À l'envoi, uniquement processing, shipped, delivered ou cancelled. l'une des valeurs : pending_payment, paid, processing, shipped, delivered, cancelled, refunded |
customer_id |
string (uuid) | Le client dans Klantly, ou null. peut être vide (null) |
customer |
object | Les coordonnées du client telles qu'indiquées à la commande. |
customer.name |
string | Nom. peut être vide (null) |
customer.email |
string | Adresse e-mail. peut être vide (null) |
customer.phone |
string | Numéro de téléphone. peut être vide (null) |
customer.company_name |
string | Raison sociale. peut être vide (null) |
customer.vat_number |
string | Numéro de TVA. peut être vide (null) |
billing_address |
object | L'adresse de facturation. |
billing_address.address |
string | Rue et numéro. peut être vide (null) |
billing_address.postal_code |
string | Code postal. peut être vide (null) |
billing_address.city |
string | Ville. peut être vide (null) |
billing_address.country |
string | Pays. peut être vide (null) |
shipping_address |
object | L'adresse de livraison. |
shipping_address.address |
string | Rue et numéro. peut être vide (null) |
shipping_address.postal_code |
string | Code postal. peut être vide (null) |
shipping_address.city |
string | Ville. peut être vide (null) |
shipping_address.country |
string | Pays. peut être vide (null) |
form_title |
string | La boutique ou le configurateur d'où provient la commande. peut être vide (null) |
language |
string | Langue de la commande. peut être vide (null) |
currency |
string | Toujours "EUR". |
subtotal |
string | Total hors TVA, sous forme de texte à deux décimales. |
discount_amount |
string | Remise. |
shipping_cost |
string | Frais de livraison. |
tax_amount |
string | Montant de la TVA. |
total |
string | Total TTC. |
payment_method |
string | Comment le paiement a été effectué, par exemple ideal. peut être vide (null) |
tracking_code |
string | Le code de suivi de l'envoi. Obligatoire pour renseigner le suivi ; null l'efface. peut être vide (null) |
tracking_url |
string | Le lien vers la page de suivi (http ou https). Sans indication, le lien existant est conservé. peut être vide (null) |
invoice_id |
string (uuid) | La facture de cette commande, ou null. peut être vide (null) |
quote_id |
string (uuid) | Le devis dont provient la commande, ou null. peut être vide (null) |
paid_at |
string (date-time) | Quand le paiement a eu lieu. peut être vide (null) |
shipped_at |
string (date-time) | Quand la commande a été expédiée. peut être vide (null) |
delivered_at |
string (date-time) | Quand la commande a été livrée. peut être vide (null) |
cancelled_at |
string (date-time) | Quand la commande a été annulée. peut être vide (null) |
refunded_at |
string (date-time) | Quand le remboursement a eu lieu. peut être vide (null) |
items |
array<object> | Les lignes commandées. |
items.object |
string | Toujours "order_item". |
items.type |
string | Type de ligne, par exemple product. |
items.name |
string | Nom de la ligne. |
items.description |
string | Description. peut être vide (null) |
items.quantity |
string | Quantité. |
items.unit |
string | Unité. peut être vide (null) |
items.unit_price |
string | Prix unitaire, hors TVA. |
items.discount_percentage |
string | Remise sur cette ligne, en pourcentage. |
items.discount_amount |
string | Remise sur cette ligne, en montant. |
items.line_total |
string | Total de la ligne hors TVA, après remise. |
items.is_taxable |
boolean | Si cette ligne compte pour la TVA. |
items.tax_rate |
string | Taux de TVA, en pourcentage. |
notes |
array<object> | Les notes de la commande, les plus récentes d'abord. |
notes.object |
string | Toujours "order_note". |
notes.type |
string | note (note), status_change (changement de statut), tracking_update (suivi de colis) ou email_sent (e-mail envoyé). l'une des valeurs : note, status_change, tracking_update, email_sent |
notes.content |
string | Le texte. |
notes.is_internal |
boolean | Visible uniquement par votre entreprise. |
notes.created_at |
string (date-time) | Quand la note a été ajoutée. |
created_at |
string (date-time) | Quand la commande a été passée. |
updated_at |
string (date-time) | Quand la commande a été modifiée pour la dernière fois. |