Introductie
Taskport biedt een JSON API voor integraties met externe systemen zoals CRM-, planning-, ticketing-, backoffice- of partnerplatformen. De publieke API bestaat uit drie hoofdflows:
- Incoming API: opdrachten en contractor-interne berichten naar Taskport schrijven
- Planning API: planvoorstellen ophalen en opdrachten plannen binnen de scope van de bearer-token
- Outbound Sync API: wijzigingen vanuit Taskport ophalen via een cursor-based event feed
Basis-URL
https://taskport.nl
Dataformaat
Taskport gebruikt JSON voor request payloads en responses.
| Header | Waarde |
|---|---|
Content-Type | application/json |
Accept | application/json |
HTTP-methodes
| Methode | Gebruik |
|---|---|
POST | Incoming API voor create, update en internal messaging, plus Planning API voor suggesties en inplannen |
GET | Outbound Sync API voor read-only event synchronisatie |
Authenticatie
Authorization: Bearer YOUR_API_TOKEN
Content-Type: application/json
Accept: application/json
Authorization: Bearer YOUR_API_TOKEN
Accept: application/json
Authorization: Bearer YOUR_API_TOKEN
Content-Type: application/json
Accept: application/json
Rechten
- Voor outbound moet de token outbound-rechten hebben, technisch:
can_use_outbound_api = 1. - Voor incoming is een actieve token voldoende, tenzij incoming-scopes actief zijn; dan moet
can_use_incoming_api = 1op de token staan. - Voor planning moet de token planning-rechten hebben, technisch:
can_use_planning_api = 1. - Dezelfde token mag incoming, planning en outbound combineren als de bijbehorende rechten op die token aanwezig zijn.
Rate limits
| Bucket | Limiet | Periode |
|---|---|---|
| Unauthenticated requests per IP | 20 | per 60 seconden |
| Authenticated requests per token | 60 | per 60 seconden |
| Authenticated requests per IP | 90 | per 60 seconden |
429 Too Many Requests stuurt Taskport ook een Retry-After-header terug.
Fouten
missing_api_token | Geen bearer-token meegestuurd |
invalid_api_token | Ongeldig API-token |
forbidden_scope | Token heeft niet de juiste rechten |
token_misconfigured | Token is niet volledig geconfigureerd |
rate_limited | Te veel verzoeken, probeer later opnieuw |
invalid_json | Request body is geen geldige JSON |
create_identifier_required | Bij create ontbreekt zowel my_id als idempotency_key |
missing_required_fields | Verplichte create-velden ontbreken |
customer_create_failed | Klant aanmaken mislukt |
site_create_failed | Site aanmaken mislukt |
job_create_failed | Opdracht aanmaken mislukt |
message_store_failed | Bericht opslaan mislukt |
internal_server_error | Onverwachte interne fout |
job_not_found | Opdracht niet gevonden binnen de scope van de token |
geo_pending | Locatie is nog niet planbaar; geocoding loopt nog |
technician_not_found | Technicus niet toegankelijk binnen deze company |
technician_unavailable | Technicus heeft op deze dag geen werkvenster |
outside_workday | Slot valt buiten werktijden |
overlaps_break | Slot overlapt met lunch/pauze |
time_off_conflict | Technicus is afwezig of vrij gepland |
overlap_conflict | Slot overlapt met een bestaande opdracht |
suggest_plan_failed | Taskport kon geen voorstel berekenen binnen de huidige randvoorwaarden |
200 | Succesvolle create, update, message append of outbound read |
400 | Ongeldige request, JSON of queryparameter |
401 | Niet geauthenticeerd |
403 | Token heeft onvoldoende rechten |
404 | Niet gevonden waar van toepassing |
405 | Methode niet toegestaan |
429 | Rate limit overschreden |
500 | Interne fout |
200 OK, niet 201 Created.
Quick start
- Gebruik een actieve integration bearer-token. Voor outbound moet die token outbound-rechten hebben.
- Maak of update opdrachten via
POST /api/contractor_incoming_api.php. Klantgegevens en opdrachtgegevens gaan samen in dezelfde request. - Vraag daarna, zodra de locatie gereed is, planvoorstellen op via
POST /api/contractor_planning_api.phpmetaction = suggest_plan. - Lees wijzigingen terug via
GET /api/outbound_sync_api.phpen bewaar steeds de nieuwstenext_cursor.
Incoming API
De incoming API is bedoeld voor externe systemen die opdrachten of contractor-interne berichten naar Taskport willen sturen.
POST https://taskport.nl/api/contractor_incoming_api.php
POST https://taskport.nl/api/intercom_incoming_api.php
Opdracht aanmaken / bijwerken
Deze route wordt gebruikt om nieuwe opdrachten aan te maken of bestaande opdrachten bij te werken.
Taskport gebruikt hiervoor my_id als externe sleutel.
Bij een nieuwe opdracht worden klantgegevens en opdrachtgegevens samen ingestuurd.
Bij een update zoekt Taskport eerst op my_id en werkt daarna de bestaande opdracht bij.
Velden bij aanmaken
Verplicht bij aanmaken:
namestreethouse_numberzipcodecitymobileemailserial_numbertitleproblem_descriptionurgencyslamy_idofidempotency_key
Velden bij bijwerken
Verplicht bij bijwerken:
my_id
my_id al, dan werkt Taskport de bestaande opdracht bij. Als my_id bij create ontbreekt, voorkomt idempotency_key dubbele opdrachten bij retries.
Interne notitie toevoegen
Gebruik hetzelfde endpoint om contractor-interne notities aan een bestaande opdracht toe te voegen.
Verplicht voor een bericht:
my_idmessaging.messagemessaging.external_message_id
Optioneel:
messaging.message_typemessaging.created_at
Veldreference
| Veld | Type | Omschrijving |
|---|---|---|
name | string | Klantnaam |
street | string | Straat |
house_number | string | Huisnummer |
zipcode | string | Postcode |
city | string | Woonplaats |
mobile | string | Mobiel nummer |
email | string | E-mailadres |
serial_number | string | Serienummer |
title | string | Korte opdrachttitel |
problem_description | string | Uitgebreide probleemomschrijving |
job_type | string | Werkbontype code of label, bijvoorbeeld vervanging_easee of Vervanging easee |
job_type_code | string | Alternatieve veldnaam voor job_type |
work_type | string | Alternatieve veldnaam voor job_type |
urgency | string | Urgentie |
sla | string | SLA-label |
my_id | string | Externe opdrachtreferentie |
idempotency_key | string | Idempotency-sleutel voor create-retries |
price_ex | number | Optionele API-prijs exclusief btw |
api_price_ex | number | Alternatieve veldnaam voor price_ex |
purchase_ex | number | Alternatieve veldnaam voor price_ex |
calculated_price | number | Alternatieve veldnaam voor price_ex |
source_url | string | Link naar het bronrecord |
intercom_url | string | Alternatieve veldnaam voor source_url |
Voorbeeld: opdracht aanmaken
curl -X POST "https://taskport.nl/api/contractor_incoming_api.php" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
--data-raw '{
"name": "Jane Example",
"street": "Harbor Lane",
"house_number": "14A",
"zipcode": "1012AB",
"city": "Amsterdam",
"mobile": "+31612345678",
"email": "jane.example@example.test",
"my_id": "SRC-90010001",
"serial_number": "SRC_009001",
"title": "kWh meter defect",
"problem_description": "Customer reports that the charger no longer registers meter values.",
"job_type": "vervanging_easee",
"urgency": "normal",
"sla": "standard_24h"
}'
{
"ok": true,
"action": "job_created",
"job_id": 60001,
"my_id": "SRC-90010001",
"geo_status": "ok",
"geo_message": "Locatie gecontroleerd. Planvoorstellen zijn beschikbaar.",
"planning_ready": true
}
Voorbeeld: opdracht bijwerken
curl -X POST "https://taskport.nl/api/contractor_incoming_api.php" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
--data-raw '{
"my_id": "SRC-90010001",
"title": "kWh meter defect - revisie 2",
"job_type": "vervanging_easee",
"urgency": "high"
}'
{
"ok": true,
"action": "job_updated",
"job_id": 60001,
"my_id": "SRC-90010001",
"geo_status": "pending",
"geo_message": "Locatie wordt verwerkt. Planvoorstellen zijn meestal binnen 1 minuut beschikbaar.",
"planning_ready": false
}
messaging toe, dan kan de response extra velden bevatten zoals message_action, thread_id en message_id. Bij een dubbel external_message_id wordt message_action = duplicate_ignored teruggegeven.
{
"ok": true,
"action": "job_updated",
"job_id": 60001,
"my_id": "SRC-90010001",
"geo_status": "ok",
"geo_message": "Locatie gecontroleerd. Planvoorstellen zijn beschikbaar.",
"planning_ready": true,
"message_action": "message_added",
"thread_id": 123,
"message_id": 456
}
Planning API
De planning API is bedoeld voor externe systemen die, binnen de scope van hun bearer-token, planvoorstellen willen ophalen of een opdracht zelf willen inplannen.
POST https://taskport.nl/api/contractor_planning_api.php
Planning werkt alleen als de token can_use_planning_api = 1 heeft én de opdracht
binnen de company/contractor-scope van die token valt.
geo_status terug in plaats van een vage timeout.
Acties
| Action | Doel |
|---|---|
suggest_plan | Geeft beschikbare planvensters terug voor een bestaande opdracht |
plan_job | Plant een opdracht in op een gekozen technicus en starttijd |
move_job | Verplaatst een al geplande opdracht naar een nieuw slot |
remove_from_planning | Haalt een opdracht uit de planning en zet de status terug naar created |
Planvoorstellen ophalen
Gebruik action = suggest_plan om beschikbare vensters op te vragen.
curl -X POST "https://taskport.nl/api/contractor_planning_api.php" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
--data-raw '{
"action": "suggest_plan",
"my_id": "SRC-90010001",
"month": "2026-05"
}'
{
"ok": true,
"action": "suggest_plan",
"job_id": 60001,
"my_id": "SRC-90010001",
"site_id": 981,
"geo_status": "ok",
"geo_message": "Locatie gecontroleerd. Planvoorstellen zijn beschikbaar.",
"planning_ready": true,
"windows": [
{
"date": "2026-05-01",
"dayname": "vrijdag",
"window_key": "middag",
"label": "Middag",
"technician_id": 12,
"technician_name": "Patrick",
"scheduled_start": "2026-05-01 14:00:00",
"scheduled_end": "2026-05-01 15:30:00"
}
],
"duration": 90,
"job_location": {
"lat": 52.3771,
"lng": 4.8980
}
}
200 OK, maar met
planning_ready = false en een lege windows-array.
{
"ok": true,
"action": "suggest_plan",
"job_id": 60001,
"my_id": "SRC-90010001",
"site_id": 981,
"geo_status": "pending",
"geo_message": "Locatie wordt verwerkt. Planvoorstellen zijn meestal binnen 1 minuut beschikbaar.",
"planning_ready": false,
"windows": [],
"duration": null,
"job_location": null
}
Opdracht plannen of verplaatsen
Gebruik action = plan_job of action = move_job om een gekozen venster definitief te maken.
Als scheduled_end ontbreekt, berekent Taskport die automatisch op basis van de duur van de opdracht.
curl -X POST "https://taskport.nl/api/contractor_planning_api.php" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
--data-raw '{
"action": "plan_job",
"my_id": "SRC-90010001",
"technician_id": 12,
"scheduled_start": "2026-05-01 14:00:00"
}'
{
"ok": true,
"action": "job_planned",
"job_id": 60001,
"my_id": "SRC-90010001",
"technician_id": 12,
"scheduled_start": "2026-05-01 14:00:00",
"scheduled_end": "2026-05-01 15:30:00",
"status": "scheduled"
}
Uit planning halen
Gebruik action = remove_from_planning om een opdracht terug te zetten naar ongepland.
{
"action": "remove_from_planning",
"my_id": "SRC-90010001"
}
{
"ok": true,
"action": "remove_from_planning",
"job_id": 60001,
"my_id": "SRC-90010001",
"status": "created"
}
Veldreference
| Veld | Type | Omschrijving |
|---|---|---|
action | string | suggest_plan, plan_job, move_job of remove_from_planning |
job_id | integer | Interne Taskport job-id; optioneel als my_id aanwezig is |
my_id | string | Externe opdrachtreferentie; aanbevolen lookup-veld |
month | string | Optioneel bij suggest_plan, formaat YYYY-MM |
technician_id | integer | Verplicht bij plan_job en move_job |
scheduled_start | datetime | Verplicht bij plan_job en move_job, lokale NL-tijd |
scheduled_end | datetime | Optioneel; wordt anders automatisch berekend |
geo_status | string | Responsveld: ok, pending of failed |
geo_message | string | Responsveld: leesbare uitleg over de huidige locatie-status |
planning_ready | boolean | Responsveld: geeft aan of Taskport al planvoorstellen kan geven |
Planning-fouten
| Code | HTTP | Omschrijving |
|---|---|---|
geo_pending | 409 | De locatie is nog niet routeklaar; probeer later opnieuw |
invalid_parameters | 400 | technician_id en scheduled_start ontbreken of zijn ongeldig |
outside_workday | 409 | Het gekozen slot valt buiten het werkvenster van de technicus |
overlaps_break | 409 | Het gekozen slot overlapt met de pauze van de technicus |
time_off_conflict | 409 | De technicus is vrij, afwezig of geblokkeerd op dit moment |
overlap_conflict | 409 | De technicus heeft al een andere opdracht op dit tijdstip |
Outbound Sync API
De outbound sync API is bedoeld voor externe systemen die wijzigingen vanuit Taskport willen uitlezen. Deze API is read-only en werkt via een cursor-based event feed.
Sync-events ophalen
Gebruik deze route om wijzigingen uit Taskport op te halen.
- haal events op vanaf een cursor
- verwerk ze in het eigen systeem
- bewaar
next_cursor - gebruik die cursor bij de volgende run
Queryparameters
| Parameter | Type | Verplicht | Omschrijving |
|---|---|---|---|
cursor | string | Nee | Laatst verwerkte eventcursor, bijvoorbeeld evt_0000000123 |
limit | integer | Nee | Aantal items, standaard 100, minimum 1, maximum 500 |
types | string | Nee | Komma-gescheiden lijst van event types |
entity_types | string | Nee | Komma-gescheiden lijst van entity types |
since | string | Nee | ISO datetime fallback als er nog geen cursor is |
Event-object
| Veld | Type | Omschrijving |
|---|---|---|
event_id | string | Unieke eventcursor |
event_type | string | Type event |
entity_type | string | Logische entity |
occurred_at | datetime | Publicatiemoment in UTC |
integration_id | integer | Interne koppeling |
contractor_id | integer | Interne contractor-id |
company_id | integer | Interne company-id |
taskport_id | integer | Interne Taskport-id |
external_id | string | Externe referentie, meestal my_id |
payload | object | Event-specifieke data |
Event types
customer_updatedjob_createdjob_updatedworkorder_updatedmessage_addedjob_plannedjob_status_changed
customerjobworkorderjob_messagejob_planningjob_status
Voorbeeldresponse
curl -X GET "https://taskport.nl/api/outbound_sync_api.php?cursor=evt_0000000123&limit=100" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Accept: application/json"
{
"ok": true,
"items": [
{
"event_id": "evt_0000001024",
"event_type": "job_created",
"entity_type": "job",
"occurred_at": "2026-03-18T12:41:30+00:00",
"integration_id": 17,
"contractor_id": 4,
"company_id": 1,
"taskport_id": 51425,
"external_id": "EXT-1001",
"payload": {
"customer_name": "Demo Klant",
"serial_number": "EXT_1001",
"title": "kWh meter defect",
"status": "created"
}
}
],
"next_cursor": "evt_0000001024",
"has_more": false,
"count": 1
}
X-Taskport-Integration-Id, X-Taskport-Event-Count en, als er een volgende pagina is, X-Taskport-Next-Cursor.
Request IDs
Gebruik bij support of troubleshooting altijd de request-id uit de response headers.
X-Taskport-Request-Id: <request-id>