Klantly Developers

API-referentie

Serviceverzoeken

Meldingen van klanten (storingen, garantie, klachten) met foto's: aanmaken vanuit bijvoorbeeld een klantportaal, toewijzen en de status volgen. Het uitvoerende werk met uren en facturatie is de werkbon. Een afspraak koppel je met appointment_id; ondertekenen, het moment zelf inplannen en het omzetten naar een werkbon doet een mens in Klantly of in de app.

Endpoints

Serviceverzoeken opvragen

GET /api/v1/services

Een lijst van meldingen, nieuwste eerst, met foto's. Filter op status, prioriteit, klant, medewerker, offerte of wijzigingsdatum.

Scope
services.read — Serviceverzoeken lezen, met naam, adres en contactgegevens van de klant
Vereiste functie
work_orders

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 Het veld waarop je sorteert; een min-teken ervoor is aflopend. Welke velden je kunt kiezen en wat de standaard is, staat bij deze parameter. een van: -created_at, created_at, -updated_at, updated_at · standaard: -created_at
filter[status] string Alleen meldingen met deze status. een van: draft, planned, in_progress, completed, cancelled
filter[priority] string Alleen meldingen met deze prioriteit. een van: low, normal, high, urgent
filter[customer_id] string (uuid) Alleen wat bij deze klant hoort.
filter[assigned_user_id] string Alleen wat aan deze gebruiker is toegewezen (de id uit Gebruikers opvragen).
filter[quote_id] string (uuid) Alleen wat bij deze offerte 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. Neem een overlap van een paar minuten op je vorige moment, omdat de klok van jouw systeem en die van Klantly niet exact gelijk lopen, en omdat een wijziging vlak na je vorige moment anders net buiten de boot valt. De grens is inclusief: iets dat exact op dit tijdstip is gewijzigd, doet mee.

Voorbeeldverzoek

cURL
curl "https://app.klantly.com/api/v1/services?filter[status]=planned&sort=-updated_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', 'services', [
    'query' => [
        'filter[status]' => 'planned',
        'sort' => '-updated_at',
    ],
]);

$data = json_decode((string) $response->getBody(), true)['data'];
JavaScript
const response = await fetch('https://app.klantly.com/api/v1/services?filter[status]=planned&sort=-updated_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/services",
    headers={
        "Authorization": f"Bearer {os.environ['KLANTLY_API_KEY']}",
    },
    params={
        "filter[status]": "planned",
        "sort": "-updated_at"
    },
)
data = response.json()["data"]

Antwoord 200

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

Voorbeeldantwoord
{
  "data": [
    {
      "object": "service",
      "id": "9d3f8339-9ed1-4f6e-8dbc-c1dfe0f1a2bb",
      "number": "SV-2026-00042",
      "status": "planned",
      "priority": "high",
      "category": "malfunction",
      "title": "Lekkage bij de dakgoot",
      "location": null,
      "description": "Water loopt langs de gevel na regen.",
      "resolution": null,
      "customer_notes": null,
      "customer_id": "9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70",
      "customer": {
        "type": "business",
        "name": "De Vries Bouw",
        "email": "jan@example.com",
        "phone": "+31 6 12345678",
        "address": "Dorpsstraat 1",
        "postal_code": "3511 AB",
        "city": "Utrecht",
        "country": "NL"
      },
      "quote_id": null,
      "appointment_id": null,
      "work_order_id": null,
      "assigned_user_id": "usr_0k3j9x21m4zq8p",
      "language": "nl",
      "reported_at": null,
      "scheduled_at": "2026-10-01T08:00:00Z",
      "started_at": null,
      "completed_at": null,
      "signature": {
        "is_signed": false,
        "signed_by_name": null,
        "signed_at": null
      },
      "photos": [],
      "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.

Serviceverzoek ophalen

GET /api/v1/services/{service}

Eén melding op id, met foto's (met downloadlink) en de stand van de handtekening.

Scope
services.read — Serviceverzoeken lezen, met naam, adres en contactgegevens van de klant
Vereiste functie
work_orders

Padparameters

NaamTypeOmschrijving
service verplicht string (uuid) De id (UUID) van het serviceverzoek.

Voorbeeldverzoek

cURL
curl "https://app.klantly.com/api/v1/services/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', 'services/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70');

$data = json_decode((string) $response->getBody(), true)['data'];
JavaScript
const response = await fetch('https://app.klantly.com/api/v1/services/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/services/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70",
    headers={
        "Authorization": f"Bearer {os.environ['KLANTLY_API_KEY']}",
    },
)
data = response.json()["data"]

Antwoord 200

Voorbeeldantwoord
{
  "data": {
    "object": "service",
    "id": "9d3f8339-9ed1-4f6e-8dbc-c1dfe0f1a2bb",
    "number": "SV-2026-00042",
    "status": "planned",
    "priority": "high",
    "category": "malfunction",
    "title": "Lekkage bij de dakgoot",
    "location": null,
    "description": "Water loopt langs de gevel na regen.",
    "resolution": null,
    "customer_notes": null,
    "customer_id": "9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70",
    "customer": {
      "type": "business",
      "name": "De Vries Bouw",
      "email": "jan@example.com",
      "phone": "+31 6 12345678",
      "address": "Dorpsstraat 1",
      "postal_code": "3511 AB",
      "city": "Utrecht",
      "country": "NL"
    },
    "quote_id": null,
    "appointment_id": null,
    "work_order_id": null,
    "assigned_user_id": "usr_0k3j9x21m4zq8p",
    "language": "nl",
    "reported_at": null,
    "scheduled_at": "2026-10-01T08:00:00Z",
    "started_at": null,
    "completed_at": null,
    "signature": {
      "is_signed": false,
      "signed_by_name": null,
      "signed_at": null
    },
    "photos": [],
    "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.

Serviceverzoek aanmaken

POST /api/v1/services

Maakt een melding aan bij een klant, als concept of ingepland. Klantly geeft hem een nummer uit een eigen reeks (standaard SV-jaar-volgnummer); naam, adres en contact komen van de klant. Zonder reported_at is dat het moment van aanmaken.

Scope
services.write — Serviceverzoeken aanmaken en wijzigen, de status aanpassen en foto's toevoegen
Vereiste functie
work_orders

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

Body (JSON)

VeldTypeOmschrijving
customer_id verplicht string (uuid) De klant. Verplicht bij aanmaken; naam, adres en contact komen van de klant.
title verplicht string Onderwerp van de melding. Verplicht bij aanmaken. maximaal 255 tekens
status optioneel string draft (concept), planned (ingepland), in_progress (bezig), completed (afgerond) of cancelled (geannuleerd). Bij aanmaken draft of planned. een van: draft, planned
category optioneel string Soort melding, bijvoorbeeld malfunction (storing), warranty (garantie), maintenance (onderhoud), complaint (klacht), question of other. Vrije tekst: een bedrijf mag zijn eigen soorten gebruiken. kan leeg zijn (null) · maximaal 64 tekens
priority optioneel string low, normal, high of urgent. Standaard normal. een van: low, normal, high, urgent
location optioneel string Waar het probleem zit, als dat niet het adres van de klant is. kan leeg zijn (null) · maximaal 255 tekens
description optioneel string Het probleem zoals de klant het meldt. kan leeg zijn (null) · maximaal 20000 tekens
resolution optioneel string Wat er is gedaan om het op te lossen. kan leeg zijn (null) · maximaal 20000 tekens
customer_notes optioneel string Opmerkingen voor de klant. kan leeg zijn (null) · maximaal 20000 tekens
reported_at optioneel string (date-time) Wanneer de melding binnenkwam (UTC). Leeg bij aanmaken = het moment van aanmaken. Bij invoer: ISO 8601 mét tijdzone. kan leeg zijn (null)
scheduled_at optioneel string (date-time) Wanneer het servicebezoek gepland staat (UTC). Bij invoer: ISO 8601 mét tijdzone. kan leeg zijn (null)
assigned_user_id optioneel string De medewerker die de melding oppakt, of null. kan leeg zijn (null)
appointment_id optioneel string (uuid) De afspraak voor het servicebezoek, of null. kan leeg zijn (null)
quote_id optioneel string (uuid) De offerte waar de melding bij hoort, of null. kan leeg zijn (null)
language optioneel string Taal van de melding: nl, en, de of fr. een van: nl, en, de, fr

Voorbeeldverzoek

cURL
curl -X POST "https://app.klantly.com/api/v1/services" \
  -H "Authorization: Bearer $KLANTLY_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f" \
  -d '{
  "customer_id": "9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70",
  "title": "Lekkage bij de dakgoot",
  "category": "malfunction",
  "priority": "high",
  "description": "Water loopt langs de gevel na regen."
}'
PHP
$client = new \GuzzleHttp\Client([
    'base_uri' => 'https://app.klantly.com/api/v1/',
    'headers' => ['Authorization' => 'Bearer ' . getenv('KLANTLY_API_KEY')],
]);

$response = $client->request('POST', 'services', [
    'headers' => [
        'Idempotency-Key' => '6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f',
    ],
    'json' => [
        'customer_id' => '9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70',
        'title' => 'Lekkage bij de dakgoot',
        'category' => 'malfunction',
        'priority' => 'high',
        'description' => 'Water loopt langs de gevel na regen.',
    ],
]);

$data = json_decode((string) $response->getBody(), true)['data'];
JavaScript
const response = await fetch('https://app.klantly.com/api/v1/services', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.KLANTLY_API_KEY}`,
    'Content-Type': 'application/json',
    'Idempotency-Key': '6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f',
  },
  body: JSON.stringify({
  "customer_id": "9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70",
  "title": "Lekkage bij de dakgoot",
  "category": "malfunction",
  "priority": "high",
  "description": "Water loopt langs de gevel na regen."
}),
});

const { data } = await response.json();
Python
import os

import requests

response = requests.post(
    "https://app.klantly.com/api/v1/services",
    headers={
        "Authorization": f"Bearer {os.environ['KLANTLY_API_KEY']}",
        "Idempotency-Key": "6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
    },
    json={
        "customer_id": "9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70",
        "title": "Lekkage bij de dakgoot",
        "category": "malfunction",
        "priority": "high",
        "description": "Water loopt langs de gevel na regen."
    },
)
data = response.json()["data"]

Antwoord 201

Voorbeeldantwoord
{
  "data": {
    "object": "service",
    "id": "9d3f8339-9ed1-4f6e-8dbc-c1dfe0f1a2bb",
    "number": "SV-2026-00042",
    "status": "planned",
    "priority": "high",
    "category": "malfunction",
    "title": "Lekkage bij de dakgoot",
    "location": null,
    "description": "Water loopt langs de gevel na regen.",
    "resolution": null,
    "customer_notes": null,
    "customer_id": "9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70",
    "customer": {
      "type": "business",
      "name": "De Vries Bouw",
      "email": "jan@example.com",
      "phone": "+31 6 12345678",
      "address": "Dorpsstraat 1",
      "postal_code": "3511 AB",
      "city": "Utrecht",
      "country": "NL"
    },
    "quote_id": null,
    "appointment_id": null,
    "work_order_id": null,
    "assigned_user_id": "usr_0k3j9x21m4zq8p",
    "language": "nl",
    "reported_at": null,
    "scheduled_at": "2026-10-01T08:00:00Z",
    "started_at": null,
    "completed_at": null,
    "signature": {
      "is_signed": false,
      "signed_by_name": null,
      "signed_at": null
    },
    "photos": [],
    "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.

Serviceverzoek bijwerken

PATCH /api/v1/services/{service}

Wijzigt alleen de velden die je meestuurt. De koppeling met de werkbon zet je niet zelf: die ontstaat door de melding in Klantly om te zetten.

Scope
services.write — Serviceverzoeken aanmaken en wijzigen, de status aanpassen en foto's toevoegen
Vereiste functie
work_orders

Stuur de ETag mee in If-Match, dan overschrijf je nooit per ongeluk een nieuwere versie.

Padparameters

NaamTypeOmschrijving
service verplicht string (uuid) De id (UUID) van het serviceverzoek.

Body (JSON)

VeldTypeOmschrijving
title optioneel string Onderwerp van de melding. Verplicht bij aanmaken. maximaal 255 tekens
category optioneel string Soort melding, bijvoorbeeld malfunction (storing), warranty (garantie), maintenance (onderhoud), complaint (klacht), question of other. Vrije tekst: een bedrijf mag zijn eigen soorten gebruiken. kan leeg zijn (null) · maximaal 64 tekens
priority optioneel string low, normal, high of urgent. Standaard normal. een van: low, normal, high, urgent
location optioneel string Waar het probleem zit, als dat niet het adres van de klant is. kan leeg zijn (null) · maximaal 255 tekens
description optioneel string Het probleem zoals de klant het meldt. kan leeg zijn (null) · maximaal 20000 tekens
resolution optioneel string Wat er is gedaan om het op te lossen. kan leeg zijn (null) · maximaal 20000 tekens
customer_notes optioneel string Opmerkingen voor de klant. kan leeg zijn (null) · maximaal 20000 tekens
reported_at optioneel string (date-time) Wanneer de melding binnenkwam (UTC). Leeg bij aanmaken = het moment van aanmaken. Bij invoer: ISO 8601 mét tijdzone. kan leeg zijn (null)
scheduled_at optioneel string (date-time) Wanneer het servicebezoek gepland staat (UTC). Bij invoer: ISO 8601 mét tijdzone. kan leeg zijn (null)
assigned_user_id optioneel string De medewerker die de melding oppakt, of null. kan leeg zijn (null)
appointment_id optioneel string (uuid) De afspraak voor het servicebezoek, of null. kan leeg zijn (null)
quote_id optioneel string (uuid) De offerte waar de melding bij hoort, of null. kan leeg zijn (null)
language optioneel string Taal van de melding: nl, en, de of fr. een van: nl, en, de, fr

Voorbeeldverzoek

cURL
curl -X PATCH "https://app.klantly.com/api/v1/services/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70" \
  -H "Authorization: Bearer $KLANTLY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "resolution": "Goot opnieuw afgekit en getest."
}'
PHP
$client = new \GuzzleHttp\Client([
    'base_uri' => 'https://app.klantly.com/api/v1/',
    'headers' => ['Authorization' => 'Bearer ' . getenv('KLANTLY_API_KEY')],
]);

$response = $client->request('PATCH', 'services/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70', [
    'json' => [
        'resolution' => 'Goot opnieuw afgekit en getest.',
    ],
]);

$data = json_decode((string) $response->getBody(), true)['data'];
JavaScript
const response = await fetch('https://app.klantly.com/api/v1/services/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70', {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${process.env.KLANTLY_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
  "resolution": "Goot opnieuw afgekit en getest."
}),
});

const { data } = await response.json();
Python
import os

import requests

response = requests.patch(
    "https://app.klantly.com/api/v1/services/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70",
    headers={
        "Authorization": f"Bearer {os.environ['KLANTLY_API_KEY']}",
    },
    json={
        "resolution": "Goot opnieuw afgekit en getest."
    },
)
data = response.json()["data"]

Antwoord 200

Voorbeeldantwoord
{
  "data": {
    "object": "service",
    "id": "9d3f8339-9ed1-4f6e-8dbc-c1dfe0f1a2bb",
    "number": "SV-2026-00042",
    "status": "planned",
    "priority": "high",
    "category": "malfunction",
    "title": "Lekkage bij de dakgoot",
    "location": null,
    "description": "Water loopt langs de gevel na regen.",
    "resolution": null,
    "customer_notes": null,
    "customer_id": "9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70",
    "customer": {
      "type": "business",
      "name": "De Vries Bouw",
      "email": "jan@example.com",
      "phone": "+31 6 12345678",
      "address": "Dorpsstraat 1",
      "postal_code": "3511 AB",
      "city": "Utrecht",
      "country": "NL"
    },
    "quote_id": null,
    "appointment_id": null,
    "work_order_id": null,
    "assigned_user_id": "usr_0k3j9x21m4zq8p",
    "language": "nl",
    "reported_at": null,
    "scheduled_at": "2026-10-01T08:00:00Z",
    "started_at": null,
    "completed_at": null,
    "signature": {
      "is_signed": false,
      "signed_by_name": null,
      "signed_at": null
    },
    "photos": [],
    "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 serviceverzoek wijzigen

POST /api/v1/services/{service}/status

Zet de melding op concept, ingepland, bezig, afgerond of geannuleerd. Bij bezig en afgerond worden started_at en completed_at gezet. Staat in de werkbon-instellingen "handtekening verplicht bij service" aan, dan kan een niet-ondertekende melding niet op afgerond (invalid_state_transition).

Scope
services.write — Serviceverzoeken aanmaken en wijzigen, de status aanpassen en foto's toevoegen
Vereiste functie
work_orders

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

Padparameters

NaamTypeOmschrijving
service verplicht string (uuid) De id (UUID) van het serviceverzoek.

Body (JSON)

VeldTypeOmschrijving
status verplicht string draft (concept), planned (ingepland), in_progress (bezig), completed (afgerond) of cancelled (geannuleerd). Bij aanmaken draft of planned. een van: draft, planned, in_progress, completed, cancelled

Voorbeeldverzoek

cURL
curl -X POST "https://app.klantly.com/api/v1/services/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": "completed"
}'
PHP
$client = new \GuzzleHttp\Client([
    'base_uri' => 'https://app.klantly.com/api/v1/',
    'headers' => ['Authorization' => 'Bearer ' . getenv('KLANTLY_API_KEY')],
]);

$response = $client->request('POST', 'services/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70/status', [
    'headers' => [
        'Idempotency-Key' => '6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f',
    ],
    'json' => [
        'status' => 'completed',
    ],
]);

$data = json_decode((string) $response->getBody(), true)['data'];
JavaScript
const response = await fetch('https://app.klantly.com/api/v1/services/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": "completed"
}),
});

const { data } = await response.json();
Python
import os

import requests

response = requests.post(
    "https://app.klantly.com/api/v1/services/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70/status",
    headers={
        "Authorization": f"Bearer {os.environ['KLANTLY_API_KEY']}",
        "Idempotency-Key": "6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
    },
    json={
        "status": "completed"
    },
)
data = response.json()["data"]

Antwoord 200

Voorbeeldantwoord
{
  "data": {
    "object": "service",
    "id": "9d3f8339-9ed1-4f6e-8dbc-c1dfe0f1a2bb",
    "number": "SV-2026-00042",
    "status": "planned",
    "priority": "high",
    "category": "malfunction",
    "title": "Lekkage bij de dakgoot",
    "location": null,
    "description": "Water loopt langs de gevel na regen.",
    "resolution": null,
    "customer_notes": null,
    "customer_id": "9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70",
    "customer": {
      "type": "business",
      "name": "De Vries Bouw",
      "email": "jan@example.com",
      "phone": "+31 6 12345678",
      "address": "Dorpsstraat 1",
      "postal_code": "3511 AB",
      "city": "Utrecht",
      "country": "NL"
    },
    "quote_id": null,
    "appointment_id": null,
    "work_order_id": null,
    "assigned_user_id": "usr_0k3j9x21m4zq8p",
    "language": "nl",
    "reported_at": null,
    "scheduled_at": "2026-10-01T08:00:00Z",
    "started_at": null,
    "completed_at": null,
    "signature": {
      "is_signed": false,
      "signed_by_name": null,
      "signed_at": null
    },
    "photos": [],
    "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.

Serviceverzoek verwijderen

DELETE /api/v1/services/{service}

Verwijdert de melding, inclusief haar foto's.

Scope
services.delete — Serviceverzoeken verwijderen
Vereiste functie
work_orders

Padparameters

NaamTypeOmschrijving
service verplicht string (uuid) De id (UUID) van het serviceverzoek.

Voorbeeldverzoek

cURL
curl -X DELETE "https://app.klantly.com/api/v1/services/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('DELETE', 'services/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70');

$data = json_decode((string) $response->getBody(), true)['data'];
JavaScript
const response = await fetch('https://app.klantly.com/api/v1/services/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70', {
  method: 'DELETE',
  headers: {
    Authorization: `Bearer ${process.env.KLANTLY_API_KEY}`,
  },
});

const { data } = await response.json();
Python
import os

import requests

response = requests.delete(
    "https://app.klantly.com/api/v1/services/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70",
    headers={
        "Authorization": f"Bearer {os.environ['KLANTLY_API_KEY']}",
    },
)
data = response.json()["data"]

Antwoord 200

Voorbeeldantwoord
{
  "data": {
    "object": "note",
    "id": "9d3f7b41-2d6f-4e8c-9b3a-4f5d6e7a8b92",
    "deleted": true
  }
}

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 "service".
id string (uuid) Unieke id (UUID).
number string Nummer van de melding, bijvoorbeeld SV-2026-00042; geeft Klantly zelf, uit een eigen reeks naast de werkbonnen.
status string draft (concept), planned (ingepland), in_progress (bezig), completed (afgerond) of cancelled (geannuleerd). Bij aanmaken draft of planned. een van: draft, planned, in_progress, completed, cancelled
priority string low, normal, high of urgent. Standaard normal. een van: low, normal, high, urgent
category string Soort melding, bijvoorbeeld malfunction (storing), warranty (garantie), maintenance (onderhoud), complaint (klacht), question of other. Vrije tekst: een bedrijf mag zijn eigen soorten gebruiken. kan leeg zijn (null)
title string Onderwerp van de melding. Verplicht bij aanmaken.
location string Waar het probleem zit, als dat niet het adres van de klant is. kan leeg zijn (null)
description string Het probleem zoals de klant het meldt. kan leeg zijn (null)
resolution string Wat er is gedaan om het op te lossen. kan leeg zijn (null)
customer_notes string Opmerkingen voor de klant. kan leeg zijn (null)
customer_id string (uuid) De klant. Verplicht bij aanmaken; naam, adres en contact komen van de klant. kan leeg zijn (null)
customer object De klantgegevens op de melding, zoals ze bij het aanmaken waren.
customer.type string individual (particulier) of business (bedrijf). kan leeg zijn (null)
customer.name string Naam; bij een bedrijf de bedrijfsnaam. kan leeg zijn (null)
customer.email string E-mailadres. kan leeg zijn (null)
customer.phone string Telefoonnummer. kan leeg zijn (null)
customer.address string Straat en huisnummer. kan leeg zijn (null)
customer.postal_code string Postcode. kan leeg zijn (null)
customer.city string Plaats. kan leeg zijn (null)
customer.country string Land. kan leeg zijn (null)
quote_id string (uuid) De offerte waar de melding bij hoort, of null. kan leeg zijn (null)
appointment_id string (uuid) De afspraak voor het servicebezoek, of null. kan leeg zijn (null)
work_order_id string (uuid) De werkbon die uit de melding is ontstaan, of null. Deze zet je niet zelf: hij ontstaat door de melding in Klantly om te zetten. kan leeg zijn (null)
assigned_user_id string De medewerker die de melding oppakt, of null. kan leeg zijn (null)
language string Taal van de melding: nl, en, de of fr. een van: nl, en, de, fr
reported_at string (date-time) Wanneer de melding binnenkwam (UTC). Leeg bij aanmaken = het moment van aanmaken. Bij invoer: ISO 8601 mét tijdzone. kan leeg zijn (null)
scheduled_at string (date-time) Wanneer het servicebezoek gepland staat (UTC). Bij invoer: ISO 8601 mét tijdzone. kan leeg zijn (null)
started_at string (date-time) Wanneer de uitvoering begon. kan leeg zijn (null)
completed_at string (date-time) Wanneer de melding werd afgerond. kan leeg zijn (null)
signature object De handtekening van de klant bij oplevering (alleen de gegevens, geen afbeelding).
signature.is_signed boolean Is de melding ondertekend.
signature.signed_by_name string Naam van wie ondertekende. kan leeg zijn (null)
signature.signed_at string (date-time) Wanneer er werd ondertekend. kan leeg zijn (null)
photos array<object> De foto's bij de melding. Uploaden gaat via POST /services/{id}/photos.
photos.object string Altijd "service_photo".
photos.id string (uuid) Id van de foto.
photos.kind string issue (de melding), progress, completion (de oplevering) of other. kan leeg zijn (null) · een van: issue, progress, completion, other
photos.caption string Bijschrift bij de foto. kan leeg zijn (null)
photos.download_url string (uri) Een ondertekende link naar de foto, een kwartier geldig en zonder API-sleutel te openen.
photos.created_at string (date-time) Wanneer de foto werd toegevoegd (UTC).
created_at string (date-time) Wanneer de melding is aangemaakt (UTC).
updated_at string (date-time) Wanneer de melding voor het laatst wijzigde (UTC).