API Documentatie

✦ API v1 — Stabiel

Introductie

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

ℹ️ De API is momenteel beschikbaar voor interne integraties. Publieke API-sleutels komen binnenkort beschikbaar.

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:

CodeBetekenis
200Succes
201Aangemaakt
401Niet ingelogd / ongeldig token
403Geen toegang (ander bedrijf)
422Validatiefout — zie errors in de response
413Bestand te groot / opslagquotum vol
500Serverfout
# 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.

GET /api/companies Alle bedrijven van de ingelogde gebruiker

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
  }
]
POST /api/companies/switch Actief bedrijf wisselen
VeldTypeVerplichtBeschrijving
company_idintegerverplichtID van een bedrijf waar je lid van bent

Geeft 403 als je geen lid bent van het opgegeven bedrijf.

POST /api/companies Nieuw bedrijf aanmaken
VeldTypeVerplichtBeschrijving
naamstringverplichtNaam 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

GET /api/customers Alle klanten ophalen

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
}
POST /api/customers Klant aanmaken
VeldTypeVerplichtBeschrijving
naamstringverplichtVolledige naam of contactpersoon
emailstringverplichtE-mailadres
bedrijfsnaamstringoptioneelBedrijfsnaam
btw_nummerstringoptioneelBTW-nummer (NL123456789B01)
adresstringoptioneelStraat + huisnummer
postcodestringoptioneelPostcode
stadstringoptioneelWoonplaats
landstringoptioneelLandcode (NL, BE, DE...)

Facturen

GET /api/invoices Alle facturen ophalen
Query paramTypeBeschrijving
statusstringFilter op status: concept, verzonden, betaald, verlopen
klant_idintegerFilter op klant-ID
per_pageintegerAantal 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" }
    }
  ]
}
POST /api/invoices Factuur aanmaken
VeldTypeVerplichtBeschrijving
customer_idintegerverplichtID van de klant
regelsarrayverplichtFactuurregels (zie hieronder)
vervaldatumdateoptioneelYYYY-MM-DD (default: 30 dagen)
notitiesstringoptioneelVrije tekst onderaan factuur
btw_percentageintegeroptioneel0, 9 of 21 (default: 21)
is_periodiekbooleanoptioneelMaakt hier een terugkerende factuurreeks van (default: false)
periodiek_intervalstringoptioneelwekelijks, maandelijks, kwartaal of jaarlijks — alleen relevant als is_periodiek aanstaat
incasso_toegestaanbooleanoptioneelAlleen 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
}
GET /api/invoices/{id}/pdf PDF downloaden

Geeft de factuur terug als application/pdf. Je kunt de Content-Disposition header bekijken voor de bestandsnaam.

POST /api/invoices/{id}/verzend Factuur e-mailen

Verstuurt de factuur per e-mail naar de klant en zet de status op verzonden.

VeldTypeBeschrijving
berichtstringOptioneel persoonlijk bericht in de e-mail

Producten

GET /api/products Productcatalogus ophalen

Geeft alle producten/diensten terug die zijn opgeslagen als sjabloon voor factuurregels.

POST /api/products Product aanmaken
VeldTypeVerplichtBeschrijving
naamstringverplichtProductnaam of dienstomschrijving
prijsnumericverplichtPrijs exclusief BTW
btwintegeroptioneelBTW-tarief: 0, 9 of 21
eenheidstringoptioneeluur, 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.

ℹ️ De Mollie-koppeling is optioneel. Zonder koppeling bevat elke factuur-response een betaallink op basis van IBAN (statische QR). Met koppeling bevat de response een mollie_betaallink die verwijst naar een live Mollie-betaalpagina.
GET /api/koppelingen/mollie/status Verbindingsstatus ophalen

Geeft de huidige Mollie-verbindingsstatus voor dit bedrijf terug.

# Verbonden
{
  "verbonden": true,
  "modus": "live",
  "naam": "Jansen BV",
  "type": "oauth"
}

# Niet verbonden
{ "verbonden": false }
GET /api/koppelingen/mollie/auth OAuth-URL ophalen — Bearer auth vereist

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=..."
}
DELETE /api/koppelingen/mollie Mollie ontkoppelen

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 }
POST /api/mollie/webhook Webhook — wordt aangeroepen door Mollie

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.

ℹ️ Vereist dat de functie "SEPA-incasso" voor het bedrijf is ingeschakeld (Instellingen → Functies) én dat incasso_via_mollie aanstaat (Bedrijf → Automatisering). Zonder een van beide geven onderstaande endpoints een 422 terug.
POST /api/customers/{customer}/incasso-mandaat SEPA-machtiging aanvragen

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.

VeldTypeVerplichtBeschrijving
invoice_idintegerverplichtFactuur 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.

POST /api/invoices/{invoice}/incasseren Factuur direct incasseren via bestaand mandaat

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.

DELETE /api/customers/{customer}/incasso-mandaat Machtiging intrekken

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:

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.

⚠️ De WeFact API-sleutel moet eerst worden ingesteld via Instellingen → WeFact Koppeling in het dashboard. Importverzoeken via de API vereisen een geldige geconfigureerde sleutel voor jouw bedrijf.
POST /api/wefact/import Import starten

Start een asynchrone import van WeFact-gegevens. Geeft direct een job_id terug waarmee je de voortgang kunt volgen.

VeldTypeVerplichtBeschrijving
concepten_actiestringoptioneelskip (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"
}
GET /api/wefact/import/status Importvoortgang opvragen

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": []
}
POST /api/import/preview CSV/XML bestand inlezen (preview)

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.

VeldTypeBeschrijving
filemultipart/form-dataCSV 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
}
POST /api/import/bevestigen Import definitief uitvoeren
VeldTypeBeschrijving
tokenstringHet 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.

ℹ️ De PSD2-autorisatie verloopt na 90 dagen. Requests naar bank-endpoints geven een 403 terug als de autorisatie verlopen is.
GET /api/bank/accounts Gekoppelde rekeningen ophalen

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"
    }
  ]
}
POST /api/bank/sync Transacties synchroniseren

Haalt nieuwe transacties op bij GoCardless en slaat ze op. Geeft direct het resultaat terug (synchrone call, typisch 1–3 seconden).

VeldTypeBeschrijving
ibanstringOptioneel — synchroniseer alleen deze rekening. Standaard: alle gekoppelde rekeningen.
{
  "nieuwe_transacties": 7,
  "nieuwe_matches": 3
}
GET /api/bank/transactions Transacties ophalen
Query paramTypeBeschrijving
ibanstringFilter op IBAN
gematchtbooleantrue = alleen gematcht, false = alleen ongematcht
vandateVanaf datum (YYYY-MM-DD)
totdateTot datum (YYYY-MM-DD)
per_pageintegerMax 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
}
GET /api/bank/matches Matchsuggesties ophalen

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

GET /api/status Publiek — geen auth vereist

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
}
FactuurMakenOnline · Dashboard · Status