Klantly Developers

API-referentie

Webshopbestellingen

Bestellingen uit je webshop of configurator opvolgen: de status bijwerken, track and trace invullen en notities plaatsen.

Endpoints

Bestellingen opvragen

GET /api/v1/orders

Een lijst van webshopbestellingen, nieuwste eerst, met regels en notities. Filter op status, klant of wijzigingsdatum. Met filter[status]=paid haal je op wat klaarstaat om te verwerken.

Scope
orders.read — Webshopbestellingen lezen, met regels, adressen en de contactgegevens van de klant
Vereiste functie
webshop

Queryparameters

NaamTypeOmschrijving
limit integer Aantal resultaten per pagina. van 1 tot 100 · standaard: 50
cursor string De next_cursor of prev_cursor uit meta van het vorige antwoord.
sort string Sortering op created_at of updated_at; een min-teken ervoor is aflopend. een van: -created_at, created_at, -updated_at, updated_at · standaard: -created_at
filter[status] string Alleen bestellingen met deze status, bijvoorbeeld paid of shipped. een van: pending_payment, paid, processing, shipped, delivered, cancelled, refunded
filter[customer_id] string (uuid) Alleen wat bij deze klant hoort.
filter[updated_since] string (date-time) Alleen wat sinds dit tijdstip is gewijzigd: ISO 8601 mét tijdzone, bijvoorbeeld 2026-09-14T10:15:00Z. Handig om te synchroniseren.

Voorbeeldverzoek

cURL
curl "https://app.klantly.com/api/v1/orders?filter[status]=paid&sort=created_at" \
  -H "Authorization: Bearer $KLANTLY_API_KEY"
PHP
$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'];
JavaScript
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();
Python
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"]

Antwoord 200

Het antwoord is een lijst met cursorpaginering: data bevat de objecten, meta de paginering.

Voorbeeldantwoord
{
  "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
  }
}

Mogelijke fouten

Daarnaast kan elk endpoint de algemene fouten geven, zoals een ongeldige sleutel of een bereikte limiet. Bekijk alle foutcodes.

Bestelling ophalen

GET /api/v1/orders/{order}

Eén bestelling op id, met regels, adressen en notities.

Scope
orders.read — Webshopbestellingen lezen, met regels, adressen en de contactgegevens van de klant
Vereiste functie
webshop

Padparameters

NaamTypeOmschrijving
order verplicht string (uuid) De id (UUID) van de bestelling.

Voorbeeldverzoek

cURL
curl "https://app.klantly.com/api/v1/orders/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70" \
  -H "Authorization: Bearer $KLANTLY_API_KEY"
PHP
$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'];
JavaScript
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();
Python
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"]

Antwoord 200

Voorbeeldantwoord
{
  "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"
  }
}

Mogelijke fouten

Daarnaast kan elk endpoint de algemene fouten geven, zoals een ongeldige sleutel of een bereikte limiet. Bekijk alle foutcodes.

Status van een bestelling wijzigen

POST /api/v1/orders/{order}/status

Zet de bestelling op in behandeling, verzonden, afgeleverd of geannuleerd, net als in de app: het tijdstip wordt vastgelegd, er komt een interne notitie bij en de klant krijgt de mail die bij die status hoort. Terugbetalen kan hier niet: dat verplaatst geld en doe je in Klantly.

Scope
orders.write — De status van webshopbestellingen wijzigen (de klant krijgt dan mail), track and trace invullen en notities plaatsen
Vereiste functie
webshop

Stuur een Idempotency-Key mee, dan maakt een nieuwe poging na een time-out geen dubbel record.

Padparameters

NaamTypeOmschrijving
order verplicht string (uuid) De id (UUID) van de bestelling.

Body (JSON)

VeldTypeOmschrijving
status verplicht string pending_payment (wacht op betaling), paid (betaald), processing (in behandeling), shipped (verzonden), delivered (afgeleverd), cancelled (geannuleerd) of refunded (terugbetaald). Bij invoer alleen processing, shipped, delivered of cancelled. een van: processing, shipped, delivered, cancelled

Voorbeeldverzoek

cURL
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"
}'
PHP
$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'];
JavaScript
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();
Python
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"]

Antwoord 200

Voorbeeldantwoord
{
  "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"
  }
}

Mogelijke fouten

Daarnaast kan elk endpoint de algemene fouten geven, zoals een ongeldige sleutel of een bereikte limiet. Bekijk alle foutcodes.

Track and trace invullen

POST /api/v1/orders/{order}/tracking

Slaat de trackingcode en eventueel de trackinglink op, bijvoorbeeld vanuit je verzendsysteem. Stuur je alleen een code, dan blijft de bestaande link staan; null wist de code.

Scope
orders.write — De status van webshopbestellingen wijzigen (de klant krijgt dan mail), track and trace invullen en notities plaatsen
Vereiste functie
webshop

Stuur een Idempotency-Key mee, dan maakt een nieuwe poging na een time-out geen dubbel record.

Padparameters

NaamTypeOmschrijving
order verplicht string (uuid) De id (UUID) van de bestelling.

Body (JSON)

VeldTypeOmschrijving
tracking_code verplicht string De trackingcode van de zending. Verplicht bij Track and trace invullen; null wist hem. kan leeg zijn (null) · maximaal 255 tekens
tracking_url optioneel string (uri) De link naar de trackingpagina (http of https). Laat je hem weg, dan blijft de bestaande link staan. kan leeg zijn (null) · maximaal 500 tekens

Voorbeeldverzoek

cURL
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"
}'
PHP
$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'];
JavaScript
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();
Python
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"]

Antwoord 200

Voorbeeldantwoord
{
  "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"
  }
}

Mogelijke fouten

Daarnaast kan elk endpoint de algemene fouten geven, zoals een ongeldige sleutel of een bereikte limiet. Bekijk alle foutcodes.

Notitie plaatsen

POST /api/v1/orders/{order}/notes

Plaatst een interne notitie bij de bestelling. De klant ziet die nooit. Een notitie via de API heeft geen auteur.

Scope
orders.write — De status van webshopbestellingen wijzigen (de klant krijgt dan mail), track and trace invullen en notities plaatsen
Vereiste functie
webshop

Stuur een Idempotency-Key mee, dan maakt een nieuwe poging na een time-out geen dubbel record.

Padparameters

NaamTypeOmschrijving
order verplicht string (uuid) De id (UUID) van de bestelling.

Body (JSON)

VeldTypeOmschrijving
content verplicht string De tekst van de notitie (maximaal 5.000 tekens). maximaal 5000 tekens

Voorbeeldverzoek

cURL
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."
}'
PHP
$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'];
JavaScript
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();
Python
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"]

Antwoord 201

Voorbeeldantwoord
{
  "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"
  }
}

Mogelijke fouten

Daarnaast kan elk endpoint de algemene fouten geven, zoals een ongeldige sleutel of een bereikte limiet. Bekijk alle foutcodes.

Het object

Alle velden zijn altijd aanwezig; een veld zonder waarde is null.

VeldTypeOmschrijving
object string Altijd "order".
id string (uuid) Unieke id (UUID).
number string Bestelnummer, bijvoorbeeld ORD-00042.
status string pending_payment (wacht op betaling), paid (betaald), processing (in behandeling), shipped (verzonden), delivered (afgeleverd), cancelled (geannuleerd) of refunded (terugbetaald). Bij invoer alleen processing, shipped, delivered of cancelled. een van: pending_payment, paid, processing, shipped, delivered, cancelled, refunded
customer_id string (uuid) De klant in Klantly, of null. kan leeg zijn (null)
customer object De klantgegevens zoals ze bij de bestelling zijn opgegeven.
customer.name string Naam. kan leeg zijn (null)
customer.email string E-mailadres. kan leeg zijn (null)
customer.phone string Telefoonnummer. kan leeg zijn (null)
customer.company_name string Bedrijfsnaam. kan leeg zijn (null)
customer.vat_number string Btw-nummer. kan leeg zijn (null)
billing_address object Het factuuradres.
billing_address.address string Straat en huisnummer. kan leeg zijn (null)
billing_address.postal_code string Postcode. kan leeg zijn (null)
billing_address.city string Plaats. kan leeg zijn (null)
billing_address.country string Land. kan leeg zijn (null)
shipping_address object Het afleveradres.
shipping_address.address string Straat en huisnummer. kan leeg zijn (null)
shipping_address.postal_code string Postcode. kan leeg zijn (null)
shipping_address.city string Plaats. kan leeg zijn (null)
shipping_address.country string Land. kan leeg zijn (null)
form_title string De webshop of configurator waar de bestelling vandaan kwam. kan leeg zijn (null)
language string Taal van de bestelling. kan leeg zijn (null)
currency string Altijd "EUR".
subtotal string Totaal zonder btw, als tekst met twee decimalen.
discount_amount string Korting.
shipping_cost string Verzendkosten.
tax_amount string Btw-bedrag.
total string Totaal inclusief btw.
payment_method string Hoe er is betaald, bijvoorbeeld ideal. kan leeg zijn (null)
tracking_code string De trackingcode van de zending. Verplicht bij Track and trace invullen; null wist hem. kan leeg zijn (null)
tracking_url string De link naar de trackingpagina (http of https). Laat je hem weg, dan blijft de bestaande link staan. kan leeg zijn (null)
invoice_id string (uuid) De factuur van deze bestelling, of null. kan leeg zijn (null)
quote_id string (uuid) De offerte waar de bestelling uit voortkomt, of null. kan leeg zijn (null)
paid_at string (date-time) Wanneer er is betaald. kan leeg zijn (null)
shipped_at string (date-time) Wanneer de bestelling is verzonden. kan leeg zijn (null)
delivered_at string (date-time) Wanneer de bestelling is afgeleverd. kan leeg zijn (null)
cancelled_at string (date-time) Wanneer de bestelling is geannuleerd. kan leeg zijn (null)
refunded_at string (date-time) Wanneer er is terugbetaald. kan leeg zijn (null)
items array<object> De bestelde regels.
items.object string Altijd "order_item".
items.type string Soort regel, bijvoorbeeld product.
items.name string Naam van de regel.
items.description string Omschrijving. kan leeg zijn (null)
items.quantity string Aantal.
items.unit string Eenheid. kan leeg zijn (null)
items.unit_price string Prijs per eenheid, zonder btw.
items.discount_percentage string Korting op deze regel, in procenten.
items.discount_amount string Korting op deze regel, als bedrag.
items.line_total string Regeltotaal zonder btw, na korting.
items.is_taxable boolean Telt deze regel mee voor de btw.
items.tax_rate string Btw-tarief, in procenten.
notes array<object> De notities bij de bestelling, nieuwste eerst.
notes.object string Altijd "order_note".
notes.type string note (notitie), status_change (statuswijziging), tracking_update (track and trace) of email_sent (mail verstuurd). een van: note, status_change, tracking_update, email_sent
notes.content string De tekst.
notes.is_internal boolean Alleen zichtbaar voor je bedrijf.
notes.created_at string (date-time) Wanneer de notitie is geplaatst.
created_at string (date-time) Wanneer de bestelling is geplaatst.
updated_at string (date-time) Wanneer de bestelling voor het laatst is gewijzigd.