Taskport API

Taskport API Reference

Publieke developer reference voor externe systemen die met Taskport willen integreren. Deze pagina bevat alle informatie die nodig is om opdrachten naar Taskport te schrijven en wijzigingen vanuit Taskport terug te lezen.

Basis-URL https://taskport.nl
Authenticatie Bearer token
Incoming POST /api/contractor_incoming_api.php
Outbound GET /api/outbound_sync_api.php
Planning POST /api/contractor_planning_api.php

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
1 publieke reference Incoming + planning + outbound JSON over HTTPS

Basis-URL

https://taskport.nl

Dataformaat

Taskport gebruikt JSON voor request payloads en responses.

Header Waarde
Content-Typeapplication/json
Acceptapplication/json

HTTP-methodes

Methode Gebruik
POSTIncoming API voor create, update en internal messaging, plus Planning API voor suggesties en inplannen
GETOutbound Sync API voor read-only event synchronisatie

Authenticatie

Incoming
Authorization: Bearer YOUR_API_TOKEN
Content-Type: application/json
Accept: application/json
Outbound
Authorization: Bearer YOUR_API_TOKEN
Accept: application/json
Planning
Authorization: Bearer YOUR_API_TOKEN
Content-Type: application/json
Accept: application/json
Deze API’s zijn bruikbaar voor elke partij met een geldige bearer-token die de juiste rechten heeft voor de betreffende route.

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 = 1 op 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 IP20per 60 seconden
Authenticated requests per token60per 60 seconden
Authenticated requests per IP90per 60 seconden
Bij 429 Too Many Requests stuurt Taskport ook een Retry-After-header terug.

Fouten

Authenticatie en rechten
missing_api_tokenGeen bearer-token meegestuurd
invalid_api_tokenOngeldig API-token
forbidden_scopeToken heeft niet de juiste rechten
token_misconfiguredToken is niet volledig geconfigureerd
rate_limitedTe veel verzoeken, probeer later opnieuw
Incoming validatie
invalid_jsonRequest body is geen geldige JSON
create_identifier_requiredBij create ontbreekt zowel my_id als idempotency_key
missing_required_fieldsVerplichte create-velden ontbreken
customer_create_failedKlant aanmaken mislukt
site_create_failedSite aanmaken mislukt
job_create_failedOpdracht aanmaken mislukt
message_store_failedBericht opslaan mislukt
internal_server_errorOnverwachte interne fout
Planning validatie
job_not_foundOpdracht niet gevonden binnen de scope van de token
geo_pendingLocatie is nog niet planbaar; geocoding loopt nog
technician_not_foundTechnicus niet toegankelijk binnen deze company
technician_unavailableTechnicus heeft op deze dag geen werkvenster
outside_workdaySlot valt buiten werktijden
overlaps_breakSlot overlapt met lunch/pauze
time_off_conflictTechnicus is afwezig of vrij gepland
overlap_conflictSlot overlapt met een bestaande opdracht
suggest_plan_failedTaskport kon geen voorstel berekenen binnen de huidige randvoorwaarden
HTTP-statuscodes
200Succesvolle create, update, message append of outbound read
400Ongeldige request, JSON of queryparameter
401Niet geauthenticeerd
403Token heeft onvoldoende rechten
404Niet gevonden waar van toepassing
405Methode niet toegestaan
429Rate limit overschreden
500Interne fout
Let op: de incoming API retourneert op dit moment bij een succesvolle create of update ook gewoon 200 OK, niet 201 Created.

Quick start

  1. Gebruik een actieve integration bearer-token. Voor outbound moet die token outbound-rechten hebben.
  2. Maak of update opdrachten via POST /api/contractor_incoming_api.php. Klantgegevens en opdrachtgegevens gaan samen in dezelfde request.
  3. Vraag daarna, zodra de locatie gereed is, planvoorstellen op via POST /api/contractor_planning_api.php met action = suggest_plan.
  4. Lees wijzigingen terug via GET /api/outbound_sync_api.php en bewaar steeds de nieuwste next_cursor.
Er is in deze publieke reference geen aparte klant-create endpoint. Een nieuwe opdracht wordt aangemaakt inclusief klantgegevens in dezelfde incoming request. Taskport maakt waar nodig ook direct een locatie aan en probeert die meteen te geocoden.

Incoming API

De incoming API is bedoeld voor externe systemen die opdrachten of contractor-interne berichten naar Taskport willen sturen.

Ondersteunde URL
POST https://taskport.nl/api/contractor_incoming_api.php
Alternatieve URL
POST https://taskport.nl/api/intercom_incoming_api.php
Beide URLs doen functioneel hetzelfde. Je kunt dus dezelfde incoming API via beide routes benaderen.

Opdracht aanmaken / bijwerken

POST /api/contractor_incoming_api.php

Deze route wordt gebruikt om nieuwe opdrachten aan te maken of bestaande opdrachten bij te werken. Taskport gebruikt hiervoor my_id als externe sleutel.

Aanmaken

Bij een nieuwe opdracht worden klantgegevens en opdrachtgegevens samen ingestuurd.

Bijwerken

Bij een update zoekt Taskport eerst op my_id en werkt daarna de bestaande opdracht bij.

Velden bij aanmaken

Verplicht bij aanmaken:

  • name
  • street
  • house_number
  • zipcode
  • city
  • mobile
  • email
  • serial_number
  • title
  • problem_description
  • urgency
  • sla
  • my_id of idempotency_key

Velden bij bijwerken

Verplicht bij bijwerken:

  • my_id
Bestaat 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

POST /api/contractor_incoming_api.php

Gebruik hetzelfde endpoint om contractor-interne notities aan een bestaande opdracht toe te voegen.

Verplicht voor een bericht:

  • my_id
  • messaging.message
  • messaging.external_message_id

Optioneel:

  • messaging.message_type
  • messaging.created_at
Een bericht via deze koppeling is altijd contractor-intern en niet zichtbaar voor de klant.

Veldreference

Veld Type Omschrijving
namestringKlantnaam
streetstringStraat
house_numberstringHuisnummer
zipcodestringPostcode
citystringWoonplaats
mobilestringMobiel nummer
emailstringE-mailadres
serial_numberstringSerienummer
titlestringKorte opdrachttitel
problem_descriptionstringUitgebreide probleemomschrijving
job_typestringWerkbontype code of label, bijvoorbeeld vervanging_easee of Vervanging easee
job_type_codestringAlternatieve veldnaam voor job_type
work_typestringAlternatieve veldnaam voor job_type
urgencystringUrgentie
slastringSLA-label
my_idstringExterne opdrachtreferentie
idempotency_keystringIdempotency-sleutel voor create-retries
price_exnumberOptionele API-prijs exclusief btw
api_price_exnumberAlternatieve veldnaam voor price_ex
purchase_exnumberAlternatieve veldnaam voor price_ex
calculated_pricenumberAlternatieve veldnaam voor price_ex
source_urlstringLink naar het bronrecord
intercom_urlstringAlternatieve 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
}
Voeg je in dezelfde request ook 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.

Planning endpoint
POST https://taskport.nl/api/contractor_planning_api.php
Belangrijk

Planning werkt alleen als de token can_use_planning_api = 1 heeft én de opdracht binnen de company/contractor-scope van die token valt.

Taskport probeert bij het eerste planningsverzoek ontbrekende locatiegegevens nog netjes af te handelen. Als een locatie nog niet routeklaar is, krijg je een duidelijke geo_status terug in plaats van een vage timeout.

Acties

Action Doel
suggest_planGeeft beschikbare planvensters terug voor een bestaande opdracht
plan_jobPlant een opdracht in op een gekozen technicus en starttijd
move_jobVerplaatst een al geplande opdracht naar een nieuw slot
remove_from_planningHaalt een opdracht uit de planning en zet de status terug naar created

Planvoorstellen ophalen

POST /api/contractor_planning_api.php

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
  }
}
Als de locatie nog niet planbaar is, krijg je nog steeds 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

POST /api/contractor_planning_api.php

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

POST /api/contractor_planning_api.php

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
actionstringsuggest_plan, plan_job, move_job of remove_from_planning
job_idintegerInterne Taskport job-id; optioneel als my_id aanwezig is
my_idstringExterne opdrachtreferentie; aanbevolen lookup-veld
monthstringOptioneel bij suggest_plan, formaat YYYY-MM
technician_idintegerVerplicht bij plan_job en move_job
scheduled_startdatetimeVerplicht bij plan_job en move_job, lokale NL-tijd
scheduled_enddatetimeOptioneel; wordt anders automatisch berekend
geo_statusstringResponsveld: ok, pending of failed
geo_messagestringResponsveld: leesbare uitleg over de huidige locatie-status
planning_readybooleanResponsveld: geeft aan of Taskport al planvoorstellen kan geven

Planning-fouten

Code HTTP Omschrijving
geo_pending409De locatie is nog niet routeklaar; probeer later opnieuw
invalid_parameters400technician_id en scheduled_start ontbreken of zijn ongeldig
outside_workday409Het gekozen slot valt buiten het werkvenster van de technicus
overlaps_break409Het gekozen slot overlapt met de pauze van de technicus
time_off_conflict409De technicus is vrij, afwezig of geblokkeerd op dit moment
overlap_conflict409De 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

GET /api/outbound_sync_api.php

Gebruik deze route om wijzigingen uit Taskport op te halen.

  1. haal events op vanaf een cursor
  2. verwerk ze in het eigen systeem
  3. bewaar next_cursor
  4. gebruik die cursor bij de volgende run

Queryparameters

Parameter Type Verplicht Omschrijving
cursorstringNeeLaatst verwerkte eventcursor, bijvoorbeeld evt_0000000123
limitintegerNeeAantal items, standaard 100, minimum 1, maximum 500
typesstringNeeKomma-gescheiden lijst van event types
entity_typesstringNeeKomma-gescheiden lijst van entity types
sincestringNeeISO datetime fallback als er nog geen cursor is

Event-object

Veld Type Omschrijving
event_idstringUnieke eventcursor
event_typestringType event
entity_typestringLogische entity
occurred_atdatetimePublicatiemoment in UTC
integration_idintegerInterne koppeling
contractor_idintegerInterne contractor-id
company_idintegerInterne company-id
taskport_idintegerInterne Taskport-id
external_idstringExterne referentie, meestal my_id
payloadobjectEvent-specifieke data

Event types

Belangrijkste event types
  • customer_updated
  • job_created
  • job_updated
  • workorder_updated
  • message_added
  • job_planned
  • job_status_changed
Belangrijkste entity types
  • customer
  • job
  • workorder
  • job_message
  • job_planning
  • job_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
}
De outbound response kan ook deze headers bevatten: 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>
Dit document is de enige publieke API-pagina die extern gedeeld hoeft te worden.