SG API Docs

SchoonGenoeg Platform — Volledige API Referentie

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
VeldTypeVerplichtBeschrijving
emailstringE-mailadres van de gebruiker
passwordstringWachtwoord
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
ParameterTypeBeschrijving
statusstringoptioneelFilter: active, planned, done, offerte, goedkeuring, factuur
searchstringoptioneelZoek op naam, client of locatie
pagenumberoptioneelPagina (standaard: 1)
limitnumberoptioneelResultaten 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
ParameterTypeBeschrijving
rolestringoptioneelFilter op rol: opdrachtgever · zzp · voorman · etc.
projectIdstringoptioneelTeamleden 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)
Binnenkort beschikbaar. Momenteel worden uitnodigingen via de werving-pagina afgehandeld (werving.html). REST-endpoint volgt.
201{ inviteId, email, role, expiresAt }
GET tables/planning Planning ophalen voor een week
ParameterTypeBeschrijving
weekstringoptioneelISO weeknummer bijv. 2026-W16 (standaard: huidige week)
projectIdstringoptioneelFilter op project
userIdstringoptioneelFilter op persoon
200{ days: { "2026-04-14": [ {userId, projectId, van, tot, rol} ] } }
POST tables/planning Persoon inplannen op project + dag
VeldTypeBeschrijving
userIdstringGebruiker-ID
projectIdstringProject-ID
datestringDatum YYYY-MM-DD
vanstringoptioneelStarttijd HH:MM
totstringoptioneelEindtijd HH:MM
201 — Planningsregel aangemaakt. ATW-check wordt automatisch uitgevoerd.
GET tables/hours Urenlog ophalen per project / persoon / periode
ParameterTypeBeschrijving
projectIdstringoptioneelUren van één project
userIdstringoptioneelUren van één persoon
fromstringoptioneelStartdatum YYYY-MM-DD
tostringoptioneelEinddatum YYYY-MM-DD
statusstringoptioneelpending · 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
Binnenkort beschikbaar. Export naar CSV werkt al in de UI. REST-endpoint voor directe koppeling met Exact Online en Rompslomp volgt.
GET tables/contracts Contracten ophalen (per project of persoon)
ParameterTypeBeschrijving
projectIdstringoptioneelContracten van één project
personIdstringoptioneelContracten van één persoon
statusstringoptioneelconcept · signed · expired
200{ data: [Contract] }
POST tables/contracts/generate Contract automatisch genereren voor een persoon + project
VeldTypeBeschrijving
projectIdstringProject ID
personIdstringPersoon ID
priceModelenumoptioneelhourly · fixed · daily
ratenumberoptioneelTarief (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)
ParameterTypeBeschrijving
projectIdstringoptioneelGroepschat van een project
userIdstringoptioneelDM-thread met gebruiker
limitnumberoptioneelAantal berichten (standaard: 50)
beforestringoptioneelPaginatie: berichten vóór timestamp
200{ data: [Message], hasMore: bool }
POST tables/messages Bericht versturen
VeldTypeBeschrijving
textstringBerichttekst
projectIdstringoptioneelGroepschat (of userId voor DM)
toUserIdstringoptioneelDirect message naar gebruiker
locationobjectoptioneel{ 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
WebSocket-endpoint in ontwikkeling. Momenteel werkt real-time chat client-side via polling. Volledige WebSocket-implementatie volgt voor multi-device sync.
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)
VeldTypeBeschrijving
tostring[]Array van user-IDs of "all"
channelenumchat · planning · compliance · contracten · finance · marktplaats · etc.
titlestringNotificatie-titel
bodystringNotificatie-tekst
dataobjectoptioneelExtra 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
ParameterTypeBeschrijving
landstringISO-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
VeldTypeBeschrijving
landstringISO landcode
datumstringYYYY-MM-DD
tijdstipstringoptioneelHH:MM starttijdstip rit
gewichtnumberoptioneelVoertuiggewicht in ton
200{ verboden: bool, reden: string, uitzonderingen: string[] }
POST /compliance/atw/check ATW-check uitvoeren voor een persoon op een dag/week
VeldTypeBeschrijving
userIdstringGebruiker-ID
weekOfstringDatum 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.
In ontwikkeling. De UI voor facturen en tarieven is live. REST API endpoints voor auto-facturatie, Exact-koppeling en BTW-export zijn gepland voor Q3 2026.
POST /invoices/generate Factuur aanmaken op basis van goedgekeurde uren
Gepland. Body: { projectId, userId, periode: { from, to }, priceModel }. Retourneert factuur-PDF URL.
POST /integrations/exact/sync Uren + facturen synchroniseren naar Exact Online
Gepland. Vereist Exact Online OAuth-token. Stuurt uren-regels naar de dagboek-module.
GET tables/marktplaats_opdrachten Openstaande opdrachten ophalen
ParameterTypeBeschrijving
categoriestringoptioneelSchoonmaak · Standbouw · Transport · etc.
locatiestringoptioneelStad of regio
typestringoptioneelpubliek · 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.
In ontwikkeling. Configureer een endpoint-URL en selecteer events. SchoonGenoeg stuurt een POST met JSON payload + X-SG-Signature header voor verificatie.
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.
In ontwikkeling. De SG-Bot UI is al beschikbaar in de app. REST API voor integratie in eigen workflows (bijv. WhatsApp-bot, Slack) volgt na LLM-koppeling.
POST /bot/ask Vraag stellen aan de SG-Bot
VeldTypeBeschrijving
questionstringDe vraag in natuurlijke taal (NL/EN)
contextobjectoptioneelExtra context: { projectId, userId, date }
200{ answer: string, sources: [], suggestions: [] }
Upload API voor ID-scans, certificaten en contracten. Inclusief OCR-herkenning (ID-kaart/paspoort) en KVK-verificatie via KVK Open API.
POST /vault/upload Document uploaden naar digitale kluis
VeldTypeBeschrijving
fileFilePDF, JPG, PNG (max 10MB)
categorystringid · vca · kvk · contract · certificaat · kostenbon
userIdstringoptioneelDocument koppelen aan gebruiker
201{ docId, category, uploadedAt, expiresAt }
Endpoint voor keurmerk-status ophalen + exporteren als PDF-verklaring. Bruikbaar als bewijs bij belastingcontrole of voor opdrachtgevers.
GET /keurmerk/{userId} Keurmerk-score en status ophalen
200{ score: 85, status: "bijna_compleet", checks: [{label, ok}], exportUrl: null }
REST API voor externe LMS-koppeling (LearnDash, Moodle, eigen systeem). Certificaat-uploads met automatische vervaldatum-waarschuwingen.
CRUD API voor voertuigen. APK-reminders via webhook. RDW kenteken-check koppeling. Onderhoud-interval tracking per voertuig.