Welkom bij de SchoonGenoeg API
Het SchoonGenoeg platform biedt een REST API waarmee je projecten, gebruikers, uren, contracten, GPS-tracking en meer kunt integreren met externe systemen. Hieronder vind je alle beschikbare en geplande endpoints — inclusief hoe je ze aanroept, welke parameters je meestuurt en wat je terugkrijgt.
Base URL
https://api.schoongenoeg.app/v1
Intern (RESTful Table API)
tables/{resource}
LIVE — beschikbaar
OP AANVRAAG — beschikbaar na aanvraag
BETA — test beschikbaar
POST
/auth/login
Inloggen en JWT-token ophalen
Request body
| Veld | Type | Verplicht | Beschrijving |
|---|---|---|---|
| string | ✓ | E-mailadres van de gebruiker | |
| password | string | ✓ | Wachtwoord |
curl -X POST https://api.schoongenoeg.app/v1/auth/login \ -H "Content-Type: application/json" \ -d '{"email":"[email protected]","password":"wachtwoord"}'
200 —
{ token: "eyJ…", user: { id, name, role, email } }
POST
/auth/refresh
Token vernieuwen
200 —
{ token: "eyJ…" } — Verzendt huidige token, ontvangt nieuw token (geldig 8u).
GET
tables/projects
Alle projecten ophalen (gefilterd op rol)
Query parameters
| Parameter | Type | Beschrijving | |
|---|---|---|---|
| status | string | optioneel | Filter: active, planned, done, offerte, goedkeuring, factuur |
| search | string | optioneel | Zoek op naam, client of locatie |
| page | number | optioneel | Pagina (standaard: 1) |
| limit | number | optioneel | Resultaten per pagina (max 100) |
200 —
{ data: [Project], total, page, limit }
POST
tables/projects
Nieuw project aanmaken
Request body — Project object
name
string ✓
Projectnaam
client
string
Opdrachtgever
location
string
Locatienaam (bijv. "Ahoy Rotterdam")
address
string
Volledig adres
start
string
Startdatum ISO of DD-MM-YYYY
end
string
Einddatum
status
enum
active · planned · done · offerte · goedkeuring · factuur
country
string
ISO landcode (NL, DE, BE…)
gpsLat / gpsLng
number
GPS-coördinaten
orderNr
string
Intern opdrachtnummer
team
array
Array van teamleden
color
string
blue · green · orange · red · purple
Bulk import: Gebruik
SGProjectAPI.webhook([...]) of de CSV-upload in de projecten-sectie voor bulk-imports via externe systemen (Exact, AFAS, ERP, eigen database).201 — Project object met gegenereerd
id
PATCH
tables/projects/{id}
Project gedeeltelijk bijwerken (status, team, etc.)
200 — Bijgewerkt project object. Gebruik PATCH om alleen gewijzigde velden te sturen (bijv.
{ "status": "done" }).
DELETE
tables/projects/{id}
Project verwijderen (soft delete)
204 — Geen inhoud. Soft delete: project krijgt
deleted: true vlag.
GET
tables/users
Gebruikers ophalen (gefilterd op rol/project)
Query parameters
| Parameter | Type | Beschrijving | |
|---|---|---|---|
| role | string | optioneel | Filter op rol: opdrachtgever · zzp · voorman · etc. |
| projectId | string | optioneel | Teamleden van een specifiek project |
200 —
{ data: [User] } — Gebruikers zonder gevoelige velden (geen wachtwoord/token).
GET
tables/users/{id}/beschikbaarheid
Beschikbaarheid van een gebruiker ophalen
200 —
{ werkdagen: [], uren: {}, regio: "", werksoort: "", notities: "" }
POST
/users/invite
Nieuwe gebruiker uitnodigen (e-mail + rol)
201 —
{ inviteId, email, role, expiresAt }
GET
tables/planning
Planning ophalen voor een week
| Parameter | Type | Beschrijving | |
|---|---|---|---|
| week | string | optioneel | ISO weeknummer bijv. 2026-W16 (standaard: huidige week) |
| projectId | string | optioneel | Filter op project |
| userId | string | optioneel | Filter op persoon |
200 —
{ days: { "2026-04-14": [ {userId, projectId, van, tot, rol} ] } }
POST
tables/planning
Persoon inplannen op project + dag
| Veld | Type | Beschrijving | |
|---|---|---|---|
| userId | string | ✓ | Gebruiker-ID |
| projectId | string | ✓ | Project-ID |
| date | string | ✓ | Datum YYYY-MM-DD |
| van | string | optioneel | Starttijd HH:MM |
| tot | string | optioneel | Eindtijd HH:MM |
201 — Planningsregel aangemaakt. ATW-check wordt automatisch uitgevoerd.
GET
tables/hours
Urenlog ophalen per project / persoon / periode
| Parameter | Type | Beschrijving | |
|---|---|---|---|
| projectId | string | optioneel | Uren van één project |
| userId | string | optioneel | Uren van één persoon |
| from | string | optioneel | Startdatum YYYY-MM-DD |
| to | string | optioneel | Einddatum YYYY-MM-DD |
| status | string | optioneel | pending · approved · exported |
200 —
{ data: [HourEntry], totaalUren, totaalBedrag }
POST
tables/hours
Uren registreren
userId
string ✓
Werknemer ID
projectId
string ✓
Project ID
date
string ✓
Datum YYYY-MM-DD
startTime
string
HH:MM starttijd
endTime
string
HH:MM eindtijd
travelKm
number
Reisafstand in km
notes
string
Notitie bij uren
status
enum
pending · approved
201 — HourEntry met berekend tarief (incl. nacht/weekend-toeslag op basis van CAO Evenementenbranche).
PATCH
tables/hours/{id}/approve
Uren accorderen (voorman / OG)
200 — Status wordt
approved. Triggert automatisch factuur-aanmaak indien ingeschakeld.
GET
tables/hours/export
Export uren naar CSV / PDF / Exact
GET
tables/contracts
Contracten ophalen (per project of persoon)
| Parameter | Type | Beschrijving | |
|---|---|---|---|
| projectId | string | optioneel | Contracten van één project |
| personId | string | optioneel | Contracten van één persoon |
| status | string | optioneel | concept · signed · expired |
200 —
{ data: [Contract] }
POST
tables/contracts/generate
Contract automatisch genereren voor een persoon + project
| Veld | Type | Beschrijving | |
|---|---|---|---|
| projectId | string | ✓ | Project ID |
| personId | string | ✓ | Persoon ID |
| priceModel | enum | optioneel | hourly · fixed · daily |
| rate | number | optioneel | Tarief (standaard: CAO-tarief €31,50/uur) |
201 — Contract gegenereerd. Verstuur e-mail met handtekeningverzoek via
/contracts/{id}/send.
POST
tables/contracts/{id}/sign
Contract digitaal ondertekenen
200 — Contract status wordt
signed. Tijdstempel + IP opgeslagen in kluis.
GET
tables/messages
Berichten ophalen (per project of DM)
| Parameter | Type | Beschrijving | |
|---|---|---|---|
| projectId | string | optioneel | Groepschat van een project |
| userId | string | optioneel | DM-thread met gebruiker |
| limit | number | optioneel | Aantal berichten (standaard: 50) |
| before | string | optioneel | Paginatie: berichten vóór timestamp |
200 —
{ data: [Message], hasMore: bool }
POST
tables/messages
Bericht versturen
| Veld | Type | Beschrijving | |
|---|---|---|---|
| text | string | ✓ | Berichttekst |
| projectId | string | optioneel | Groepschat (of userId voor DM) |
| toUserId | string | optioneel | Direct message naar gebruiker |
| location | object | optioneel | { lat, lng, label } — locatiebericht |
201 — Bericht verzonden. Real-time delivery via WebSocket aan alle actieve deelnemers.
WS
wss://api.schoongenoeg.app/v1/chat/ws
Real-time chat verbinding
const ws = new WebSocket('wss://api.schoongenoeg.app/v1/chat/ws'); ws.onopen = () => ws.send(JSON.stringify({ token, projectId })); ws.onmessage = (e) => renderMessage(JSON.parse(e.data));
POST
/notifications/send
Push notificatie versturen naar gebruiker(s)
| Veld | Type | Beschrijving | |
|---|---|---|---|
| to | string[] | ✓ | Array van user-IDs of "all" |
| channel | enum | ✓ | chat · planning · compliance · contracten · finance · marktplaats · etc. |
| title | string | ✓ | Notificatie-titel |
| body | string | ✓ | Notificatie-tekst |
| data | object | optioneel | Extra data (bijv. { projectId, url }) |
200 —
{ sent: number, failed: number }
GET
/gps/trackers
Alle actieve trackers ophalen (positie + status)
id
string
Tracker-ID
name
string
Naam voertuig/persoon
lat / lng
number
GPS-coördinaten
speed
number
Snelheid km/u
status
enum
online · idle · offline
lastSeen
string
ISO timestamp laatste ping
type
enum
vehicle · person · machine
battery
number
Batterijpercentage (indien beschikbaar)
Externe bron instellen: Configureer een Traccar, GPSwox of custom REST endpoint in de GPS Tracker instellingen. Veld-mapping configureerbaar per platform.
200 —
{ trackers: [Tracker], stats: { total, online, idle, offline } }
WS
wss://traccar.voorbeeld.nl/api/socket
Live GPS updates via WebSocket (Traccar / GPSwox)
Configureer het WebSocket-endpoint in de GPS-instellingen. Ontvang real-time positie-updates; de kaart herlaadt automatisch bij elk bericht.
GET
/rijverboden/{land}
Rijverboden voor een specifiek land ophalen
URL parameter
| Parameter | Type | Beschrijving | |
|---|---|---|---|
| land | string | ✓ | ISO-code: DE, FR, BE, NL, AT, CH, PL, ES, IT, CZ, SK, HU, RO, HR, SI, DK, LU |
200 —
{ naam, vlag, weekendVerbod, feestdagen, uitzonderingen, zomerverbod, bronUrl }
POST
/rijverboden/check
Check of een rit verboden is op datum + land
| Veld | Type | Beschrijving | |
|---|---|---|---|
| land | string | ✓ | ISO landcode |
| datum | string | ✓ | YYYY-MM-DD |
| tijdstip | string | optioneel | HH:MM starttijdstip rit |
| gewicht | number | optioneel | Voertuiggewicht in ton |
200 —
{ verboden: bool, reden: string, uitzonderingen: string[] }
POST
/compliance/atw/check
ATW-check uitvoeren voor een persoon op een dag/week
| Veld | Type | Beschrijving | |
|---|---|---|---|
| userId | string | ✓ | Gebruiker-ID |
| weekOf | string | ✓ | Datum van maandag YYYY-MM-DD |
200 —
{ ok: bool, alerts: [ { type, severity, beschrijving } ] }
GET
/compliance/milieuzones
Milieuzone-data per stad ophalen
200 — Array van milieuzones met stad, Euro-norm-eisen per voertuigtype, coördinaten en zone-kleur.
POST
/invoices/generate
Factuur aanmaken op basis van goedgekeurde uren
POST
/integrations/exact/sync
Uren + facturen synchroniseren naar Exact Online
GET
tables/marktplaats_opdrachten
Openstaande opdrachten ophalen
| Parameter | Type | Beschrijving | |
|---|---|---|---|
| categorie | string | optioneel | Schoonmaak · Standbouw · Transport · etc. |
| locatie | string | optioneel | Stad of regio |
| type | string | optioneel | publiek · privé |
200 —
{ data: [Opdracht] }
POST
tables/marktplaats_opdrachten
Nieuwe opdracht posten
titel
string ✓
Korte opdrachtomschrijving
categorie
string ✓
Type opdracht
locatie
string
Stad/adres
tarief
number
Uurloon of totaalprijs
aantalPersonen
number
Aantal ZZP/sub gezocht
vereisten
string[]
Bijv. ["VCA","Rijbewijs B"]
type
enum
publiek · privé
startDatum
string
ISO datum
201 — Opdracht geplaatst. Kost 1 SG-credit bij publieke post.
EVENT
project.created / project.updated / project.deleted
Project lifecycle events
// POST naar jouw endpoint { "event": "project.created", "timestamp": "2026-04-16T12:00:00Z", "data": { /* Project object */ } }
EVENT
hours.approved / contract.signed / user.invited
Goedkeuringen & documenten
Alle goedkeuringen (uren, contracten, offerten) triggereren een webhook naar het geconfigureerde endpoint.
EVENT
compliance.alert / gps.geofence / atw.violation
Compliance & GPS-alerts
Compliance-overtredingen (ATW, milieuzone, rijverbod) en GPS geofence-events sturen real-time webhooks.
POST
/bot/ask
Vraag stellen aan de SG-Bot
| Veld | Type | Beschrijving | |
|---|---|---|---|
| question | string | ✓ | De vraag in natuurlijke taal (NL/EN) |
| context | object | optioneel | Extra context: { projectId, userId, date } |
200 —
{ answer: string, sources: [], suggestions: [] }
POST
/vault/upload
Document uploaden naar digitale kluis
| Veld | Type | Beschrijving | |
|---|---|---|---|
| file | File | ✓ | PDF, JPG, PNG (max 10MB) |
| category | string | ✓ | id · vca · kvk · contract · certificaat · kostenbon |
| userId | string | optioneel | Document koppelen aan gebruiker |
201 —
{ docId, category, uploadedAt, expiresAt }
GET
/keurmerk/{userId}
Keurmerk-score en status ophalen
200 —
{ score: 85, status: "bijna_compleet", checks: [{label, ok}], exportUrl: null }