API Documentatie
✦ API v1 — StabielIntroductie
De FactuurMakenOnline REST API geeft je volledige toegang tot je facturen, klanten en producten. Alle responses zijn JSON.
Base URL: https://dashboard.factuurmakenonline.nl/api
Authenticatie
De API gebruikt Laravel Sanctum — een cookie-gebaseerde sessie voor browser-clients (SPA) en token-gebaseerde auth voor externe clients.
Sessie-authenticatie (browser / SPA)
# 1. CSRF cookie ophalen GET /sanctum/csrf-cookie # 2. Inloggen POST /login { "email": "jouw@email.nl", "password": "..." } # 3. Alle verzoeken sturen met Cookie + X-XSRF-TOKEN header
Token-authenticatie (externe apps)
POST /api-tokens
{
"token_name": "mijn-app"
}
# Response
{ "token": "1|abcdef123456..." }
# Gebruik in verzoeken
Authorization: Bearer 1|abcdef123456...
Foutafhandeling
HTTP-statuscodes volgen de standaard conventies:
| Code | Betekenis |
|---|---|
200 | Succes |
201 | Aangemaakt |
401 | Niet ingelogd / ongeldig token |
403 | Geen toegang (ander bedrijf) |
422 | Validatiefout — zie errors in de response |
413 | Bestand te groot / opslagquotum vol |
500 | Serverfout |
# Voorbeeld validatiefout { "message": "The email field is required.", "errors": { "email": ["The email field is required."] } }
Bedrijven
Een account kan bij meerdere bedrijven horen (multi-bedrijven). Elke API-call werkt altijd op het op dit moment actieve bedrijf.
Geeft alle bedrijven waar de ingelogde gebruiker lid van is (eigenaar of medewerker), met vermelding welk bedrijf nu actief is.
[
{
"id": 19,
"naam": "A IT",
"logo_url": null,
"rol": "eigenaar",
"actief": true
}
]
| Veld | Type | Verplicht | Beschrijving |
|---|---|---|---|
company_id | integer | verplicht | ID van een bedrijf waar je lid van bent |
Geeft 403 als je geen lid bent van het opgegeven bedrijf.
| Veld | Type | Verplicht | Beschrijving |
|---|---|---|---|
naam | string | verplicht | Naam van het nieuwe bedrijf |
Een extra bedrijf toevoegen is een functie voor betalende klanten: dit vereist een actief betaald abonnement op minstens één van je bestaande bedrijven. Geeft 403 als dat ontbreekt. Het nieuwe bedrijf start zelf op de gratis tier, zonder proefperiode.
Klanten
Geeft een gepagineerde lijst van klanten voor het ingelogde bedrijf.
{
"data": [
{
"id": 1,
"naam": "Jan Jansen",
"bedrijfsnaam": "Jansen BV",
"email": "jan@jansen.nl",
"btw_nummer": "NL123456789B01"
}
],
"total": 42
}
| Veld | Type | Verplicht | Beschrijving |
|---|---|---|---|
naam | string | verplicht | Volledige naam of contactpersoon |
email | string | verplicht | E-mailadres |
bedrijfsnaam | string | optioneel | Bedrijfsnaam |
btw_nummer | string | optioneel | BTW-nummer (NL123456789B01) |
adres | string | optioneel | Straat + huisnummer |
postcode | string | optioneel | Postcode |
stad | string | optioneel | Woonplaats |
land | string | optioneel | Landcode (NL, BE, DE...) |
Facturen
| Query param | Type | Beschrijving |
|---|---|---|
status | string | Filter op status: concept, verzonden, betaald, verlopen |
klant_id | integer | Filter op klant-ID |
per_page | integer | Aantal per pagina (max 100, default 25) |
{
"data": [
{
"id": 1,
"factuurnummer": "F2024-001",
"status": "verzonden",
"totaal": "242.00",
"vervaldatum": "2024-02-15",
"customer": { "id": 1, "naam": "Jan Jansen" }
}
]
}
| Veld | Type | Verplicht | Beschrijving |
|---|---|---|---|
customer_id | integer | verplicht | ID van de klant |
regels | array | verplicht | Factuurregels (zie hieronder) |
vervaldatum | date | optioneel | YYYY-MM-DD (default: 30 dagen) |
notities | string | optioneel | Vrije tekst onderaan factuur |
btw_percentage | integer | optioneel | 0, 9 of 21 (default: 21) |
is_periodiek | boolean | optioneel | Maakt hier een terugkerende factuurreeks van (default: false) |
periodiek_interval | string | optioneel | wekelijks, maandelijks, kwartaal of jaarlijks — alleen relevant als is_periodiek aanstaat |
incasso_toegestaan | boolean | optioneel | Alleen relevant bij is_periodiek: staat automatische SEPA-incasso toe voor deze reeks (default: false). Zie SEPA-incasso. |
# regels-object { "omschrijving": "Webdesign - 10 uur", "aantal": 10, "prijs": "85.00", "btw": 21 }
Geeft de factuur terug als application/pdf. Je kunt de Content-Disposition header bekijken voor de bestandsnaam.
Verstuurt de factuur per e-mail naar de klant en zet de status op verzonden.
| Veld | Type | Beschrijving |
|---|---|---|
bericht | string | Optioneel persoonlijk bericht in de e-mail |
Producten
Geeft alle producten/diensten terug die zijn opgeslagen als sjabloon voor factuurregels.
| Veld | Type | Verplicht | Beschrijving |
|---|---|---|---|
naam | string | verplicht | Productnaam of dienstomschrijving |
prijs | numeric | verplicht | Prijs exclusief BTW |
btw | integer | optioneel | BTW-tarief: 0, 9 of 21 |
eenheid | string | optioneel | uur, stuk, m², etc. |
Mollie Betalingen
Via Mollie Connect (OAuth) koppelen gebruikers hun eigen Mollie-account. Na koppeling krijgt elke factuur automatisch een iDEAL/creditcard-betaalknop en wordt de status automatisch op betaald gezet zodra Mollie een geslaagde betaling meldt. Betalingen gaan rechtstreeks naar de Mollie-rekening van de gebruiker — FactuurMakenOnline treedt niet op als betaalinstellig.
betaallink op basis van IBAN (statische QR). Met koppeling bevat de response een mollie_betaallink die verwijst naar een live Mollie-betaalpagina.
Geeft de huidige Mollie-verbindingsstatus voor dit bedrijf terug.
# Verbonden { "verbonden": true, "modus": "live", "naam": "Jansen BV", "type": "oauth" } # Niet verbonden { "verbonden": false }
Geeft de Mollie OAuth-autorisatie-URL terug. De gebruiker moet vervolgens naar deze URL worden doorgestuurd om toestemming te geven. Na autorisatie stuurt Mollie de browser terug naar /api/koppelingen/mollie/callback — dit endpoint is publiek (geen Bearer token nodig, want het is een browser-redirect van Mollie).
{
"url": "https://my.mollie.com/oauth2/authorize?client_id=..."
}
Verwijdert de Mollie OAuth-tokens voor dit bedrijf. Bestaande facturen behouden hun betaalstatus. Nieuwe facturen krijgen geen Mollie-betaallink meer totdat opnieuw wordt verbonden.
{ "success": true }
Dit endpoint wordt door Mollie's servers aangeroepen zodra een betalingsstatus wijzigt. Niet bedoeld voor directe aanroep vanuit je eigen applicatie. Mollie stuurt een id (payment-ID) mee; het systeem haalt vervolgens de actuele status op bij Mollie en werkt de factuur bij. Het endpoint is publiek (geen auth) maar valideert de betaling server-side bij Mollie voordat er iets wijzigt.
# Mollie POST-body
id=tr_WDqYK6vAhe
SEPA-incasso
Naast de reguliere iDEAL/creditcard-betaalknop kun je klanten ook automatisch laten incasseren via een SEPA-machtiging (eveneens via de Mollie-koppeling van het bedrijf). Een machtiging geldt per klant; welke facturen daadwerkelijk automatisch worden geïncasseerd bepaalt de gebruiker zelf per factuur (zie incasso_toegestaan hieronder) — een machtiging dekt dus niet automatisch élke factuur.
incasso_via_mollie aanstaat (Bedrijf → Automatisering). Zonder een van beide geven onderstaande endpoints een 422 terug.
Vraagt een SEPA-incassomandaat aan bij de klant, gekoppeld aan een eerste factuur die de klant moet goedkeuren/betalen (Mollie sequenceType=first). Geeft een betaallink terug die naar de klant gestuurd moet worden — pas zodra die eerste betaling is voltooid, wordt het mandaat actief.
| Veld | Type | Verplicht | Beschrijving |
|---|---|---|---|
invoice_id | integer | verplicht | Factuur van deze klant die als eerste (handmatige) betaling dient om het mandaat te bevestigen |
{
"betaallink": "https://www.mollie.com/checkout/..."
}
Geeft 422 als de klant al een actief mandaat heeft, of als de opgegeven factuur niet bij deze klant hoort.
Incasseert een factuur direct via een al actief mandaat (sequenceType=recurring) — geen checkout-redirect nodig, de klant heeft eerder al gemachtigd. Int het openstaande bedrag (na eventuele deelbetalingen), niet blind het volledige factuurbedrag.
{
"message": "Incasso gestart, status wordt via de webhook bijgewerkt."
}
Geeft 422 als de klant nog geen actief mandaat heeft, of als de factuur al betaald is.
Trekt de SEPA-machtiging van een klant in. Toekomstige facturen van deze klant worden daarna niet meer automatisch geïncasseerd, ook niet als incasso_toegestaan op een factuur aanstaat.
{ "message": "Incassomachtiging ingetrokken." }
Automatische incasso op periodieke facturen
Voor terugkerende (periodieke) facturen kan de gebruiker per reeks incasso_toegestaan aanvinken (zichtbaar als veld op de factuur — zie POST /api/invoices hierboven). Alleen dan incasseert het systeem die reeks vanzelf, zonder tussenkomst:
- Elke ochtend wordt een verplichte SEPA-vooraankondiging gestuurd naar klanten van wie een factuur binnenkort geïncasseerd wordt (termijn instelbaar, standaard 5 dagen).
- Na het verstrijken van die termijn incasseert het systeem de factuur automatisch, via hetzelfde mandaat als hierboven.
- Facturen boven een optioneel ingesteld maximumbedrag (
incasso_max_bedragop het bedrijf) worden niet automatisch geïncasseerd — de gebruiker krijgt een melding en incasseert die zelf handmatig via het/incasseren-endpoint hierboven. - Losse eenmalige facturen (
incasso_toegestaan = false, de standaardwaarde) worden nooit automatisch geïncasseerd, ook niet als de klant een actief mandaat heeft — dit voorkomt dat een onregelmatige factuur per ongeluk stilzwijgend wordt afgeschreven.
Import & Overstappen
FactuurMakenOnline biedt twee importmethoden: een directe API-koppeling met WeFact (geen bestand nodig) en een bestandsupload voor elk ander pakket dat CSV of XML kan exporteren (Moneybird, Snelstart, Exact, Twinfield e.a.). Beide imports zijn idempotent — bestaande records worden overgeslagen.
WeFact Import
Met de WeFact-importfunctie kun je klanten, facturen en producten uit WeFact bulksgewijs importeren. De import is idempotent: bestaande records worden gematcht en overgeslagen.
Start een asynchrone import van WeFact-gegevens. Geeft direct een job_id terug waarmee je de voortgang kunt volgen.
| Veld | Type | Verplicht | Beschrijving |
|---|---|---|---|
concepten_actie | string | optioneel | skip (standaard), concept of betaald — bepaalt hoe conceptfacturen worden geïmporteerd |
# Response { "job_id": "import_1719388800_abc123", "status": "gestart", "bericht": "Import gestart — gebruik job_id om voortgang te volgen" }
Geeft de status van de lopende of meest recente import terug.
{
"status": "voltooid",
"verwerkt": 154,
"totaal": 157,
"nieuwe_klanten": 12,
"nieuwe_facturen": 142,
"nieuwe_producten": 8,
"fouten": []
}
Upload een CSV- of XML-bestand (max 10 MB). Het systeem parseert het bestand en geeft een preview terug — er wordt nog niets opgeslagen. Bevestig daarna via /api/import/bevestigen.
| Veld | Type | Beschrijving |
|---|---|---|
file | multipart/form-data | CSV of XML bestand. CSV-kolommen: factuurnummer;klant;email;datum;vervaldatum;totaal;status |
{
"token": "import_abc123",
"totaal_in_bestand": 87,
"nieuw_te_importeren": 72,
"wordt_overgeslagen_duplicaat": 15,
"unieke_klanten": 23,
"totaalbedrag": "18420.00",
"verloopt_over_minuten": 15
}
| Veld | Type | Beschrijving |
|---|---|---|
token | string | Het token uit de preview-response (15 minuten geldig) |
{
"aangemaakt": 72,
"overgeslagen": 15
}
Bankkoppeling
De bankkoppeling gebruikt GoCardless (Nordigen) als PSD2-gateway. De koppeling moet eerst worden geactiveerd via het dashboard (Beheer → Bankkoppeling). De verbinding is strikt alleen-lezen.
403 terug als de autorisatie verlopen is.
Geeft alle aan dit bedrijf gekoppelde bankrekeningen terug.
{
"data": [
{
"id": "NL91ABNA0417164300",
"iban": "NL91ABNA0417164300",
"naam": "Jansen BV",
"bank": "ABN AMRO",
"valuta": "EUR",
"autorisatie_vervalt": "2026-09-15"
}
]
}
Haalt nieuwe transacties op bij GoCardless en slaat ze op. Geeft direct het resultaat terug (synchrone call, typisch 1–3 seconden).
| Veld | Type | Beschrijving |
|---|---|---|
iban | string | Optioneel — synchroniseer alleen deze rekening. Standaard: alle gekoppelde rekeningen. |
{
"nieuwe_transacties": 7,
"nieuwe_matches": 3
}
| Query param | Type | Beschrijving |
|---|---|---|
iban | string | Filter op IBAN |
gematcht | boolean | true = alleen gematcht, false = alleen ongematcht |
van | date | Vanaf datum (YYYY-MM-DD) |
tot | date | Tot datum (YYYY-MM-DD) |
per_page | integer | Max 100, standaard 25 |
{
"data": [
{
"id": 1,
"datum": "2026-06-15",
"bedrag": "242.00",
"valuta": "EUR",
"omschrijving": "F2026-042 Jansen BV",
"tegenrekening_iban": "NL02ABNA0123456789",
"tegenrekening_naam": "Jansen BV",
"match": { "factuur_id": 17, "betrouwbaarheid": 0.97, "bevestigd": true }
}
],
"total": 42
}
Geeft onbevestigde matchsuggesties terug, gesorteerd op betrouwbaarheidsscore (hoogste eerst).
{
"data": [
{
"transactie_id": 5,
"factuur_id": 23,
"factuurnummer": "F2026-023",
"bedrag_transactie": "907.50",
"bedrag_factuur": "907.50",
"betrouwbaarheid": 0.94,
"bevestigd": false
}
]
}
Systeemstatus
Geeft de live systeemstatus terug. Zie ook status.factuurmakenonline.nl.
{
"overall": "ok",
"checks": [
{ "id": "database", "name": "Database", "status": "ok", "detail": "12 ms" },
{ "id": "cache", "name": "Cache", "status": "ok", "detail": "3 ms" }
],
"timestamp": "2026-06-26T08:00:00+02:00",
"uptime_pct": 99.98
}