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.
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…
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"}
| HTTP | Betekenis |
|---|---|
| 200 | Succes |
| 400 | Verplicht veld ontbreekt of ongeldig formaat |
| 401 | Token ontbreekt, ongeldig of verlopen |
| 403 | Token heeft onvoldoende rechten (read vs write) |
| 404 | Project of feature niet gevonden |
| 405 | Verkeerde HTTP-methode (GET i.p.v. POST of andersom) |
| 500 | Serverfout (opslaan mislukt e.d.) |
Tokens opvragen
Geeft alle tokens terug die voor dit project zijn aangemaakt. Het volledige token is niet zichtbaar — alleen een preview (wbvt_a1b2…).
Queryparameters
| Parameter | Type | Omschrijving | |
|---|---|---|---|
| project_id | string | verplicht | ID 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
Maakt een nieuw token aan voor een project. Het volledige token is alleen in deze response zichtbaar — sla het direct op.
Request body (JSON)
| Veld | Type | Omschrijving | |
|---|---|---|---|
| project_id | string | verplicht | ID van het project |
| name | string | verplicht | Leesbare naam, bijv. "Veldwerk app" |
| permission | string | optioneel | read (standaard) of write |
| expires_days | integer | optioneel | Vervalt na N dagen. Weglaten = nooit verlopen. |
Response
{
"ok": true,
"id": 1,
"token": "wbvt_a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2",
"permission": "write",
"expires_at": null
}
Token intrekken
Zet het token op inactief. Alle verzoeken met dit token worden daarna geweigerd met HTTP 401.
Queryparameters
| Parameter | Omschrijving | |
|---|---|---|
| id | verplicht | Integer ID van het token (uit de list-response) |
Project ophalen
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
Geeft alle features terug. Optioneel te filteren op geometrietype.
Queryparameters
| Parameter | Omschrijving | |
|---|---|---|
| geomType | optioneel | Filter: point, polyline, polygon |
Response
{
"ok": true,
"project_id": "p20260724_101457_bbc8b9",
"count": 32,
"features": [ { "id": "…", "geomType": "point", "latlngs": [[…]], "props": {…}, "label": "B01" }, … ]
}
Feature ophalen
Queryparameters
| Parameter | Omschrijving | |
|---|---|---|
| feature_id | verplicht | ID van de feature (bijv. ft_20261102_142201_a1b2c3) |
Activiteitenlog
Queryparameters
| Parameter | Omschrijving | |
|---|---|---|
| limit | optioneel | Aantal 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
Voegt een nieuwe feature toe aan het project. Vereist een write-token.
Request body (JSON)
| Veld | Type | Omschrijving | |
|---|---|---|---|
| geomType | string | verplicht | point, polyline of polygon |
| latlngs | array | verplicht | Array van [lat, lng] coördinaten. Point: 1 punt. Lijn/vlak: meerdere. |
| props | object | optioneel | Vrije key-value attributen, bijv. {"boornummer": "B01", "diepte": 5.2} |
| symbolKey | string | optioneel | Symboolsleutel uit het project-schema |
| label | string | optioneel | Label 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
Werkt bestaande velden bij. props wordt samengevoegd (merge), niet overschreven.
Request body (JSON)
| Veld | Type | Omschrijving | |
|---|---|---|---|
| props | object | optioneel | Attributen om bij te werken (merge) |
| latlngs | array | optioneel | Nieuwe coördinaten |
| label | string | optioneel | Nieuw label |
| symbolKey | string | optioneel | Nieuw symbool |
Feature verwijderen
Verwijdert een feature permanent uit het project.
Notitie toevoegen
Schrijft een notitie naar het activiteitenlog van het project. Handig voor statusupdates vanuit een veldapplicatie.
Request body (JSON)
| Veld | Omschrijving | |
|---|---|---|
| text | verplicht | Tekst van de notitie |
| author | optioneel | Naam 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"}'