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
-
GET
/servicesServiceverzoeken opvragen -
GET
/services/{service}Serviceverzoek ophalen -
POST
/servicesServiceverzoek aanmaken -
PATCH
/services/{service}Serviceverzoek bijwerken -
POST
/services/{service}/statusStatus van een serviceverzoek wijzigen -
DELETE
/services/{service}Serviceverzoek verwijderen
Serviceverzoeken opvragen
/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
| Naam | Type | Omschrijving |
|---|---|---|
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 "https://app.klantly.com/api/v1/services?filter[status]=planned&sort=-updated_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', 'services', [
'query' => [
'filter[status]' => 'planned',
'sort' => '-updated_at',
],
]);
$data = json_decode((string) $response->getBody(), true)['data'];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();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.
{
"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
-
403
insufficient_scope— Deze API-sleutel heeft geen toegang tot deze actie. -
422
validation_failed— De invoer is ongeldig.
Serviceverzoek ophalen
/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
| Naam | Type | Omschrijving |
|---|---|---|
service verplicht |
string (uuid) | De id (UUID) van het serviceverzoek. |
Voorbeeldverzoek
curl "https://app.klantly.com/api/v1/services/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', 'services/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70');
$data = json_decode((string) $response->getBody(), true)['data'];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();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
{
"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
-
403
insufficient_scope— Deze API-sleutel heeft geen toegang tot deze actie. -
404
not_found— Niet gevonden.
Serviceverzoek aanmaken
/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)
| Veld | Type | Omschrijving |
|---|---|---|
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 -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."
}'$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'];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();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
{
"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
-
403
insufficient_scope— Deze API-sleutel heeft geen toegang tot deze actie. -
422
validation_failed— De invoer is ongeldig. -
422
unknown_field— De invoer bevat een onbekend veld. -
415
unsupported_media_type— Dit formaat wordt niet ondersteund. -
413
payload_too_large— De body van het verzoek is te groot. -
422
idempotency_key_reused— Deze Idempotency-Key is al gebruikt voor een ander verzoek. -
409
idempotency_in_progress— Een verzoek met deze Idempotency-Key is nog bezig.
Serviceverzoek bijwerken
/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
| Naam | Type | Omschrijving |
|---|---|---|
service verplicht |
string (uuid) | De id (UUID) van het serviceverzoek. |
Body (JSON)
| Veld | Type | Omschrijving |
|---|---|---|
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 -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."
}'$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'];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();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
{
"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
-
403
insufficient_scope— Deze API-sleutel heeft geen toegang tot deze actie. -
422
validation_failed— De invoer is ongeldig. -
422
unknown_field— De invoer bevat een onbekend veld. -
415
unsupported_media_type— Dit formaat wordt niet ondersteund. -
413
payload_too_large— De body van het verzoek is te groot. -
404
not_found— Niet gevonden. -
412
precondition_failed— Het record is intussen gewijzigd.
Status van een serviceverzoek wijzigen
/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
| Naam | Type | Omschrijving |
|---|---|---|
service verplicht |
string (uuid) | De id (UUID) van het serviceverzoek. |
Body (JSON)
| Veld | Type | Omschrijving |
|---|---|---|
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 -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"
}'$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'];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();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
{
"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
-
403
insufficient_scope— Deze API-sleutel heeft geen toegang tot deze actie. -
422
validation_failed— De invoer is ongeldig. -
422
unknown_field— De invoer bevat een onbekend veld. -
415
unsupported_media_type— Dit formaat wordt niet ondersteund. -
413
payload_too_large— De body van het verzoek is te groot. -
404
not_found— Niet gevonden. -
409
invalid_state_transition— Deze actie kan niet in de huidige status. -
422
idempotency_key_reused— Deze Idempotency-Key is al gebruikt voor een ander verzoek. -
409
idempotency_in_progress— Een verzoek met deze Idempotency-Key is nog bezig.
Serviceverzoek verwijderen
/api/v1/services/{service}
Verwijdert de melding, inclusief haar foto's.
- Scope
-
services.delete— Serviceverzoeken verwijderen - Vereiste functie
work_orders
Padparameters
| Naam | Type | Omschrijving |
|---|---|---|
service verplicht |
string (uuid) | De id (UUID) van het serviceverzoek. |
Voorbeeldverzoek
curl -X DELETE "https://app.klantly.com/api/v1/services/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('DELETE', 'services/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70');
$data = json_decode((string) $response->getBody(), true)['data'];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();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
{
"data": {
"object": "note",
"id": "9d3f7b41-2d6f-4e8c-9b3a-4f5d6e7a8b92",
"deleted": true
}
}Mogelijke fouten
-
403
insufficient_scope— Deze API-sleutel heeft geen toegang tot deze actie. -
404
not_found— Niet gevonden.
Het object
Alle velden zijn altijd aanwezig; een veld zonder waarde is null.
| Veld | Type | Omschrijving |
|---|---|---|
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). |