Introductie

De WBV Draw Project API maakt het mogelijk om vanuit externe applicaties projectdata te lezen en te schrijven — zonder dat de gebruiker ingelogd hoeft te zijn. Toegang wordt geregeld via project-tokens: lange, unieke sleutels die je per project aanmaakt in de beheerpagina.

Tokens beginnen altijd met wbvt_ gevolgd door 40 hexadecimale tekens. Elk token heeft een permissieniveau (read of write) en kan optioneel verlopen.

Tokens aanmaken doe je in dashboard.html → project openen → Tokens. Je ziet het volledige token slechts één keer direct na aanmaken — sla het op in een kluis of environment variable.

Authenticatie

Geef het token mee via de Authorization-header (aanbevolen) of als queryparameter:

Aanbevolen — Authorization header

Authorization: Bearer wbvt_a1b2c3d4…

Alternatief — querystring

GET /api/project-token.php?action=features&token=wbvt_a1b2c3d4…
Vermijd de token in de URL als de requests gelogd worden (server-logs, browser-history). Gebruik dan de Authorization-header.

Tokenbeheer-endpoints (aanmaken, opvragen, intrekken) vereisen een actieve sessie-cookie — die heb je automatisch als je ingelogd bent in WBV Draw.

Base URL

https://1check.nl/wbvdraw/api/project-token.php

Alle endpoints zijn relatief aan deze URL. Development: vervang wbvdraw door wbvdraw2.

Foutcodes

Elke response is JSON. Bij succes: {"ok": true, …}. Bij een fout:

{"ok": false, "error": "Omschrijving van het probleem"}
HTTPBetekenis
200Succes
400Verplicht veld ontbreekt of ongeldig formaat
401Token ontbreekt, ongeldig of verlopen
403Token heeft onvoldoende rechten (read vs write)
404Project of feature niet gevonden
405Verkeerde HTTP-methode (GET i.p.v. POST of andersom)
500Serverfout (opslaan mislukt e.d.)

Tokens opvragen

GET ?action=list&project_id=<id> sessie vereist

Geeft alle tokens terug die voor dit project zijn aangemaakt. Het volledige token is niet zichtbaar — alleen een preview (wbvt_a1b2…).

Queryparameters

ParameterTypeOmschrijving
project_idstringverplichtID van het project (bijv. p20260724_101457_bbc8b9)

Response

{
  "ok": true,
  "tokens": [
    {
      "id": 1,
      "name": "Veldwerk app",
      "permission": "write",
      "token_preview": "wbvt_a1b2c3d4e5f…",
      "created_by_name": "Huub van Hal",
      "created_at": "2026-11-02T10:00:00+01:00",
      "last_used_at": "2026-11-02T14:22:01+01:00",
      "expires_at": null,
      "active": 1
    }
  ]
}

Token aanmaken

POST ?action=create sessie vereist

Maakt een nieuw token aan voor een project. Het volledige token is alleen in deze response zichtbaar — sla het direct op.

Request body (JSON)

VeldTypeOmschrijving
project_idstringverplichtID van het project
namestringverplichtLeesbare naam, bijv. "Veldwerk app"
permissionstringoptioneelread (standaard) of write
expires_daysintegeroptioneelVervalt na N dagen. Weglaten = nooit verlopen.

Response

{
  "ok": true,
  "id": 1,
  "token": "wbvt_a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2",
  "permission": "write",
  "expires_at": null
}

Token intrekken

POST ?action=revoke&id=<token_id> sessie vereist

Zet het token op inactief. Alle verzoeken met dit token worden daarna geweigerd met HTTP 401.

Queryparameters

ParameterOmschrijving
idverplichtInteger ID van het token (uit de list-response)

Project ophalen

GET ?action=project token read

Geeft het volledige project JSON terug: metadata, kaartinstellingen en alle features.

Response

{
  "ok": true,
  "project": {
    "id": "p20260724_101457_bbc8b9",
    "name": "Buggenum",
    "created_by": "Huub van Hal",
    "view": { "lat": 51.17, "lng": 5.96, "zoom": 14 },
    "basemap": "brt_grijs",
    "features": [
      {
        "id": "ft_20261102_142201_a1b2c3",
        "geomType": "point",
        "latlngs": [[51.17012, 5.96334]],
        "props": { "boornummer": "B01", "diepte": 5.2 },
        "symbolKey": "boring",
        "label": "B01"
      }
    ],
    "created_at": "2026-07-24T10:14:57+02:00",
    "updated_at": "2026-11-02T14:00:00+01:00"
  }
}

Features ophalen

GET ?action=features token read

Geeft alle features terug. Optioneel te filteren op geometrietype.

Queryparameters

ParameterOmschrijving
geomTypeoptioneelFilter: point, polyline, polygon

Response

{
  "ok": true,
  "project_id": "p20260724_101457_bbc8b9",
  "count": 32,
  "features": [ { "id": "…", "geomType": "point", "latlngs": [[…]], "props": {…}, "label": "B01" }, … ]
}

Feature ophalen

GET ?action=feature&feature_id=<fid> token read

Queryparameters

ParameterOmschrijving
feature_idverplichtID van de feature (bijv. ft_20261102_142201_a1b2c3)

Activiteitenlog

GET ?action=log token read

Queryparameters

ParameterOmschrijving
limitoptioneelAantal regels, max 200 (standaard 50)

Response

{
  "ok": true,
  "project_id": "p20260724_101457_bbc8b9",
  "entries": [
    { "action": "save", "details": null, "user_name": "Huub van Hal", "created_at": "2026-11-02T14:00:00+01:00", "ip_address": "…" }
  ]
}

Feature toevoegen

POST ?action=add-feature token write

Voegt een nieuwe feature toe aan het project. Vereist een write-token.

Request body (JSON)

VeldTypeOmschrijving
geomTypestringverplichtpoint, polyline of polygon
latlngsarrayverplichtArray van [lat, lng] coördinaten. Point: 1 punt. Lijn/vlak: meerdere.
propsobjectoptioneelVrije key-value attributen, bijv. {"boornummer": "B01", "diepte": 5.2}
symbolKeystringoptioneelSymboolsleutel uit het project-schema
labelstringoptioneelLabel dat op de kaart wordt getoond

Voorbeeld

POST /api/project-token.php?action=add-feature
Authorization: Bearer wbvt_…

{
  "geomType": "point",
  "latlngs": [[51.17012, 5.96334]],
  "props": { "boornummer": "B05", "diepte_m": 4.8, "grondsoort": "zand" },
  "symbolKey": "boring",
  "label": "B05"
}

Response

{
  "ok": true,
  "feature": {
    "id": "ft_20261102_150312_d4e5f6",
    "geomType": "point",
    "latlngs": [[51.17012, 5.96334]],
    "props": { "boornummer": "B05", "diepte_m": 4.8, "grondsoort": "zand" },
    "symbolKey": "boring",
    "label": "B05"
  }
}

Feature bijwerken

POST ?action=update-feature&feature_id=<fid> token write

Werkt bestaande velden bij. props wordt samengevoegd (merge), niet overschreven.

Request body (JSON)

VeldTypeOmschrijving
propsobjectoptioneelAttributen om bij te werken (merge)
latlngsarrayoptioneelNieuwe coördinaten
labelstringoptioneelNieuw label
symbolKeystringoptioneelNieuw symbool

Feature verwijderen

POST ?action=delete-feature&feature_id=<fid> token write

Verwijdert een feature permanent uit het project.

Notitie toevoegen

POST ?action=add-note token write

Schrijft een notitie naar het activiteitenlog van het project. Handig voor statusupdates vanuit een veldapplicatie.

Request body (JSON)

VeldOmschrijving
textverplichtTekst van de notitie
authoroptioneelNaam van de auteur (standaard: tokennaam)

Voorbeeld — Python

import requests

BASE    = "https://1check.nl/wbvdraw/api/project-token.php"
TOKEN   = "wbvt_a1b2c3…"  # uit .env of secrets-manager
HEADERS = {"Authorization": f"Bearer {TOKEN}"}

# Alle boringen ophalen
r = requests.get(BASE, params={"action": "features", "geomType": "point"}, headers=HEADERS)
r.raise_for_status()
features = r.json()["features"]
print(f"{len(features)} punten gevonden")

# Nieuwe boring toevoegen
payload = {
    "geomType": "point",
    "latlngs": [[51.17012, 5.96334]],
    "props": {"boornummer": "B06", "diepte_m": 6.1, "grondsoort": "klei"},
    "symbolKey": "boring",
    "label": "B06",
}
r = requests.post(BASE, params={"action": "add-feature"}, json=payload, headers=HEADERS)
r.raise_for_status()
new_id = r.json()["feature"]["id"]
print(f"Toegevoegd: {new_id}")

Voorbeeld — JavaScript / Node.js

const BASE  = "https://1check.nl/wbvdraw/api/project-token.php";
const TOKEN = process.env.WBVDRAW_TOKEN; // sla nooit op in code

async function apiFetch(action, params = {}, body = null) {
  const url = new URL(BASE);
  url.searchParams.set("action", action);
  for (const [k, v] of Object.entries(params)) url.searchParams.set(k, v);
  const res = await fetch(url, {
    method: body ? "POST" : "GET",
    headers: { Authorization: `Bearer ${TOKEN}`, "Content-Type": "application/json" },
    body: body ? JSON.stringify(body) : undefined,
  });
  const data = await res.json();
  if (!data.ok) throw new Error(data.error);
  return data;
}

// Lees project
const { project } = await apiFetch("project");
console.log(project.name, project.features.length, "features");

// Voeg een feature toe
const { feature } = await apiFetch("add-feature", {}, {
  geomType: "point",
  latlngs: [[51.17012, 5.96334]],
  props: { boornummer: "B07", diepte_m: 3.5 },
  label: "B07",
});
console.log("Nieuw ID:", feature.id);

Voorbeeld — Claude Code (ander project)

Stel je hebt in een andere Claude Code-sessie het token beschikbaar als omgevingsvariabele. Zo gebruik je de API:

# In je andere project: sla het token op als env var
export WBVDRAW_TOKEN="wbvt_a1b2c3d4…"
export WBVDRAW_BASE="https://1check.nl/wbvdraw/api/project-token.php"
export WBVDRAW_PROJECT="p20260724_101457_bbc8b9"

# Lees alle features op als JSON
curl -s -H "Authorization: Bearer $WBVDRAW_TOKEN" \
  "$WBVDRAW_BASE?action=features&geomType=point" | jq .

# Of in een Claude Code Bash-tool:
curl -s -H "Authorization: Bearer $WBVDRAW_TOKEN" \
  "$WBVDRAW_BASE?action=add-feature" \
  -H "Content-Type: application/json" \
  -d '{"geomType":"point","latlngs":[[51.17,5.96]],"props":{"boring":"B08"},"label":"B08"}'
In Claude Code gebruik je Bash of WebFetch (voor GET) om de API aan te roepen. Sla het token op in een .env-bestand of de shell-omgeving, niet hardcoded in je code.