Overzicht van de TrekMail REST API voor ontwikkelaars
Lees hoe de TrekMail REST API werkt met bearer-tokenauthenticatie, plangebaseerde toegang, snelheidslimieten en antwoordformaten.
Artikeldetails
Type, moeilijkheid, abonnementen en wanneer het laatst is bijgewerkt.
▼
Artikeldetails
Type, moeilijkheid, abonnementen en wanneer het laatst is bijgewerkt.
- Type
- Naslagwerk
- Moeilijkheid
- Gemiddeld
- Abonnementen
- Nano · Starter · Pro · Agency
- Laatst bijgewerkt
- 23 aug. 2026
Met de TrekMail API beheer je domeinen, mailboxen, doorsturen, DNS, e-mailmigraties en webmailbewerkingen vanuit een HTTP-client of AI-agent. Dat omvat e-mail lezen en verzenden, concepten, planning, mappen, contactpersonen, agenda's, identiteiten, sjablonen en geblokkeerde afzenders. Geverifieerde verzoeken gebruiken een bearer-token, antwoorden zijn in JSON en API-activiteit wordt gecontroleerd.
Wat je krijgt
- REST API v1 met een JSON-indeling voor verzoeken en antwoorden.
- Bearer-tokenauthenticatie: geen cookies of sessies voor geverifieerde API-aanroepen.
- Idempotentiesleutels bij de schrijfbewerkingen die deze vereisen, zodat opnieuw proberen geen dubbel werk veroorzaakt.
- Snelheidslimiet per token met
Retry-After-headers. - Auditlogboek zichtbaar in je dashboard onder AI Agents & API → Audit Log.
- MCP-server met een catalogus die is gefilterd op de referentie, het transport en de veiligheidsinstellingen van de huidige verbinding. Een beperkte projectverbinding ziet daarom alleen de tools die deze kan gebruiken.
- Domeinaliassen: koppel adressen die alleen ontvangen op een secundair domein aan dezelfde lokale delen op een primair domein, met opgeslagen tegenover actieve bezorgstatussen en veilige verwijdering. Zie Domeinaliassen via API en MCP.
- Architectuur met twee tokens: afzonderlijke ops-tokens voor infrastructuur en berichttokens voor volledige e-mailbewerkingen zoals lezen, verzenden, concepten, planning, contactpersonen, agenda's, identiteiten, sjablonen en mappen.
- Inzicht in uitgaande bezorging en bounces: haal het overzicht van verzonden, bezorgde, hard-bounce- en soft-bounceberichten uit het dashboard op, plus SMTP-codes en antwoorden per ontvanger. Zie Bezorging en bounces.
- Opslaggebruik van mailboxen:
list_mailboxesenget_mailboxretournerenused_mb,quota_mb,allocation_mbenis_pooled, zodat een agent zonder dashboardtoegang mailboxen kan herkennen die hun limiet naderen. - White Label-beheer: controleer de configuratie, beheer branding per domein, nodig klanten uit, beheer rollen en domeinen, schort toegang op of herstel deze en bekijk activiteit via API of MCP. Zie de brandinghandleiding en handleiding voor teambeheer.
Drive API en bestandsautomatisering
Drive maakt deel uit van het openbare API-oppervlak. Het omvat Account Drive en Drive-ruimtes van mailboxen, gebruik, bladeren door mappen, uploads, bestands- en mapbeheer, Prullenbak, bulkacties, openbare deellinks, wachtwoordbeheer voor synchronisatieapparaten en alleen-lezenstatus van de Drive Storage Add-on.
Drive gebruikt elf ops-tokenbereiken: drive:account:read, drive:account:write, drive:account:share, drive:account:purge, drive:mailbox:read, drive:mailbox:write, drive:mailbox:share, drive:mailbox:purge, drive:addon:read, drive:devices:read en drive:devices:write. Factureringsacties voor de Drive Add-on, aankoop, formaat wijzigen en annuleren, blijven alleen beschikbaar in het dashboard en worden niet aangeboden als API- of MCP-schrijfbewerkingen.
Begin met het Drive API-overzicht of de Drive API-snelstart.
Architectuur met twee tokens
De API gebruikt twee onafhankelijke tokentypen. Je kunt een of beide gebruiken, afhankelijk van je behoeften:
| Tokentype | Voorvoegsel | Wat het ontgrendelt |
|---|---|---|
| Ops-token | tm_live_ |
Account- en infrastructuurtools: White Label, domeinen, DNS, mailboxen, uitnodigingen, Drive, migraties, SMTP, tickets, facturering en Cloudflare |
| Berichttoken | tm_msg_ |
Webmailbewerkingen: berichten, mappen, bijlagen, concepten, gepland verzenden, spam/ham-rapportage, bulkacties, contactpersonen, contactgroepen, agenda, hulp bij opstellen, identiteiten, sjablonen en geblokkeerde afzenders |
Ops-tokens en berichttokens hebben afzonderlijke bereiken en snelheidslimieten. Eén agent kan beide tokens tegelijk gebruiken door ze in de MCP-serveromgeving te configureren.
Berichttokens zijn beschikbaar voor de abonnementen Pro en Agency.
Voordat je begint
- Alle abonnementen hebben API-toegang:
- Nano: Email Verifier. Voeg een Drive Storage Add-on toe voor volledige toegang tot de Drive API en MCP.
- Starter: Volledige Drive, volledige Email Verifier en alleen-lezentoegang tot de overige infrastructuurgebieden. Gebruik het dashboard voor die schrijfacties.
- Pro / Agency: Volledige toegang tot de basis-API, inclusief berichttokens. White Label-bereiken worden toegevoegd zolang de proefperiode of betaalde add-on actief is.
- Een AI-agent verbinden? Voeg
https://trekmail.net/mcptoe als externe MCP-server in een compatibele client. Als deze browserautorisatie ondersteunt, is geen handmatig token nodig. Zie AI-agenten verbinden (MCP) voor externe, CLI/desktop-, bridge- en zelfgehoste opties. - Je eigen integratie bouwen? Maak een
tm_live_-token onder AI Agents & API → Tokens → Create token en verzend dit alsAuthorization: Bearer …. Zie API-tokens maken en beheren. - Nieuw met de API? Klik bovenaan de pagina AI Agents & API op Start tour voor een korte rondleiding door verbindingsmethoden, tokenbeheer, verbonden apps en het auditlogboek.
Hoe authenticatie werkt
Elk verzoek moet je token bevatten in de Authorization-header:
Authorization: Bearer tm_live_abc123...
Ops-tokens beginnen met tm_live_ en berichttokens met tm_msg_. Beide worden bij het maken één keer weergegeven en kunnen daarna niet opnieuw worden getoond.
Als het token ontbreekt, ingetrokken of verlopen is, retourneert de API 401 met de foutcode unauthenticated.
Basis-URL en versiebeheer
Alle endpoints bevinden zich onder:
https://trekmail.net/api/v1
De basis-URL staat in je dashboard AI Agents & API onder Quick Reference. De versie staat in het URL-pad. Wanneer een v2 wordt geïntroduceerd, als dat ooit gebeurt, blijft v1 werken.
Antwoordindeling
Geslaagde antwoorden retourneren JSON met een sleutel data voor afzonderlijke resources of een gepagineerde lijst:
{
"data": [
{ "id": 1, "domain": "example.com", "status": "active" }
],
"links": { "next": "...", "prev": null },
"meta": { "current_page": 1, "last_page": 1, "total": 1 }
}
Foutantwoorden volgen een consistente structuur:
{
"error": {
"code": "unauthenticated",
"message": "Invalid or expired API token",
"hint": "Check that your token is correct and has not been revoked.",
"request_id": "req_abc123",
"retryable": false
}
}
Verzoek-ID's
Elk antwoord bevat een X-Request-Id-header. Je kunt ook een eigen waarde meegeven via X-Request-Id in het verzoek. Deze wordt teruggestuurd en vastgelegd in het auditspoor.
Snelheidslimieten
Elk token heeft een snelheidslimiet per minuut. Wanneer je de limiet bereikt, retourneert de API 429 met een Retry-After-header die aangeeft wanneer je het opnieuw kunt proberen.
Destructieve bewerkingen (verwijderintenties) hebben daarnaast een dagelijkse limiet per token en een afkoelperiode tussen opeenvolgende verwijderingen.
Schrijfbewerkingen voor migraties (starten, annuleren, opnieuw proberen) hebben een eigen snelheidslimiet van 10 verzoeken per minuut per token, plus een serverbrede gelijktijdigheidslimiet die 503 retourneert wanneer wereldwijd te veel migraties worden uitgevoerd.
Berichttokens gebruiken afzonderlijke limieten. De standaardwaarden zijn 30 leesverzoeken per minuut per token, 60 verzendverzoeken per minuut per token, 5,000 geslaagde leesbewerkingen per dag per token en 100 API-verzendingen per dag voor één mailbox. Een tweede veiligheidsteller voor verzenden staat standaard op 500 per token per dag; de lagere mailboxlimiet is normaal gesproken als eerste van toepassing. Deze API-beveiligingen vervangen de beheerde SMTP-limieten van je abonnement of de eigen limieten van een externe provider niet.
Idempotentie
Endpoints die de status wijzigen en als idempotent zijn gemarkeerd, vereisen een Idempotency-Key-header. Dit omvat maken, bijwerken, verzenden en verwijderen wanneer een automatische nieuwe poging anders dubbel werk kan veroorzaken. Leesachtige POST-acties, zoals providerdetectie of een verbindingstest, vereisen er geen; controleer de endpointtabel of OpenAPI-specificatie. Als je dezelfde sleutel met dezelfde body verzendt, speelt de API het oorspronkelijke antwoord opnieuw af zonder duplicaten te maken.
Idempotency-Key: create-mailbox-alice-2024
Als je dezelfde sleutel met een andere body verzendt, retourneert de API 409 Conflict.
Toewijzing van mailboxopslag
Elk endpoint dat een mailbox of uitnodiging maakt, POST /api/v1/mailboxes, /api/v1/mailboxes:bulk, /api/v1/mailboxes/invites, /api/v1/mailboxes/invites:bulk, accepteert een optioneel geheel getal storage_allocation_mb.
| Waarde | Betekenis |
|---|---|
Weggelaten (of null) |
De mailbox gebruikt de gedeelde accountpool (standaard). |
| Positief geheel getal (MB) | De mailbox is toegewezen. Precies die hoeveelheid wordt uit de accountpool gereserveerd voor deze mailbox. |
Toewijzingen worden gevalideerd aan de hand van de actuele pool, verminderd met bestaande toegewezen mailboxen en openstaande toegewezen uitnodigingen. Bulk-endpoints valideren daarnaast de som van de toewijzingen in de batch en wijzen de volledige batch af met 422 storage_pool_exceeded als deze te veel zou toewijzen. De pool wordt bijgewerkt wanneer een toegewezen mailbox wordt verwijderd, een uitnodiging wordt ingewisseld (de toewijzing gaat naar de nieuwe mailbox) en een openstaande uitnodiging verloopt.
Voor uitnodigingen wordt de toewijzing bij de toegangscode opgeslagen en bij het inwisselen naar de nieuwe mailbox gekopieerd. Als de pool op dat moment niet meer groot genoeg is voor de gevraagde toewijzing (bijvoorbeeld omdat een andere beheerder intussen een toegewezen hoeveelheid heeft vergroot), wordt de nieuwe mailbox soepel teruggezet naar gedeelde opslag in plaats van dat het inwisselen mislukt; de ontvanger ziet een melding op de succespagina.
Drive-toegang voor mailboxen
Elke mailbox heeft een niveau drive_access dat bepaalt hoeveel van Drive de gebruiker ervan in webmail kan bereiken. Het wordt geretourneerd in de mailboxresource en kan worden ingesteld met PATCH /api/v1/mailboxes/{id} of, voor veel mailboxen tegelijk, met POST /api/v1/mailboxes:drive-access.
| Waarde | Betekenis |
|---|---|
full |
Alles: het tabblad Drive, uploaden en delen, bestanden zoeken en synchroniseren met een computer. De standaardwaarde. |
attachments_only |
Geen Drive in webmail en geen synchronisatie. Verzenden werkt nog: een bestand boven de bijlagedrempel wordt als downloadlink verzonden en die kopie wordt na de bewaartermijn verwijderd. |
disabled |
Geen Drive en een bestand boven de drempel kan helemaal niet worden bijgevoegd. |
Opslag wordt voor het hele account gedeeld, dus hiermee bepaal je hoeveel van die pool één persoon met bestanden kan vullen.
Aanmelden bij mailbox opschorten
Aanmelden bij een mailbox kan worden opgeschort terwijl deze e-mail blijft ontvangen: webmail, IMAP, SMTP en apparaatwachtwoorden worden geweigerd en open sessies eindigen, maar de bezorging blijft onaangetast. Daardoor bouncet niets en wacht alles totdat aanmelden wordt hersteld. Stel dit in met POST /api/v1/mailboxes/{id}:suspend-login (en :resume-login) of voor meerdere mailboxen met POST /api/v1/mailboxes:login-access.
De mailboxresource meldt dit als login_suspended, login_suspended_at en login_suspended_reason. Lees login_suspended om te bepalen of de persoon zich kan aanmelden en status om te bepalen of de mailbox zelf actief is. Een opgeschorte mailbox blijft active, omdat deze nog e-mail accepteert. :pause is iets anders: dit stelt status in op disabled en stopt ook de bezorging.
Zie Aanmelden bij mailbox opschorten via API.
Het bulk-endpoint accepteert precies één selector, mailbox_ids, domain_id of all, en retourneert wat het heeft gedaan:
{ "data": { "drive_access": "attachments_only", "matched": 24, "updated": 21, "skipped_shared": 3 } }
domain_id is de geschikte selector wanneer één domein één klant vertegenwoordigt. Mailboxen die al op het gevraagde niveau staan, tellen als matched maar niet als updated, zodat de aanroep veilig kan worden herhaald.
Gedeelde mailboxen worden bij het afzonderlijke endpoint geweigerd met 422 drive_access_not_applicable en door het bulk-endpoint overgeslagen en meegeteld: ze hebben geen eigen webmailgebruiker, dus leden openen ze met hun eigen niveau en een waarde op de gedeelde rij zou niets veranderen.
De beperking geldt voor zowel de API als de interface. De Drive-ruimte van een beperkte mailbox ontbreekt in GET /api/v1/drive/spaces, de bestanden antwoorden op ID met 404 en er kan geen synchronisatieapparaat voor worden gemaakt.
Doorstuuradressen
GET /api/v1/domains/{id}/forwarding-addresses retourneert meer dan alleen de lijst, omdat twee eigenschappen van een doorstuuradres niet in het adres zelf zichtbaar zijn:
{
"data": [ { "id": 8, "address": "sales@acme.com", "local_part": "sales",
"domain_id": 4, "recipients": ["team@example.net"], "is_active": true } ],
"limits": { "used": 1, "max": 100, "recipients_per_address": 15 },
"delivery": { "active": true, "requires_plan": "pro",
"paused_until": null, "paused_reason": null }
}
limits.maxgeldt per domein en is afhankelijk van het abonnement: 100 voor Pro, 300 voor Agency en 25 opgeslagen maar inactief voor Nano of Starter.delivery.activegeeft aan of deze regels op dit moment e-mail doorsturen. Het isfalsebij een abonnement onderrequires_planenfalsezolangpaused_untilis ingesteld (het account heeft de verzendsnelheid per uur overschreden; zie Verzendlimieten per abonnement). Een regel kanis_active: truezijn en toch niet bezorgen, dus leesdelivery, niet alleenis_active, voordat je meldt dat doorsturen werkt.
Aanmaken met een abonnement dat niet kan bezorgen is toegestaan en retourneert 201: de regel wordt opgeslagen en gaat na een upgrade werken. Dit weerspiegelt het dashboard, dat zulke regels als opgeslagen en inactief toont.
Afwijzingen komen terug als 422 met error.code ingesteld op validation_error of limit_exceeded. Mogelijke oorzaken zijn een adres dat al op het domein wordt gebruikt, een ontvanger op hetzelfde domein (wat een lus zou veroorzaken), een ontvangend domein zonder werkende MX of een vol budget per domein.
POST en DELETE voor deze endpoints vereisen een Idempotency-Key; PATCH niet.
Bezorggeschiedenis
GET /api/v1/domains/{id}/forwarding-addresses/{addressId}/log retourneert wat er werkelijk met recente e-mail is gebeurd, nieuwste eerst:
{
"data": [
{ "id": 91, "occurred_at": "2026-07-27T09:12:04+00:00", "outcome": "delivered",
"from": "rfq@northgatesupply.com", "to": "sales@example.net",
"smtp_code": "2.0.0", "smtp_response": "250 2.0.0 OK" }
],
"address": "sales@acme.com",
"window": { "retention_days": 30, "max_events": 200 }
}
outcome is delivered, deferred (tijdelijke fout, nog bezig met opnieuw proberen), failed (de server van de ontvanger heeft het bericht geweigerd) of blocked. Dit laatste betekent dat ons spamfilter het bericht voor het doorsturen heeft tegengehouden, zodat het de ontvanger helemaal niet heeft bereikt. blocked als bounce behandelen zou iemand de ontvangende server laten onderzoeken voor een probleem dat op onze server ontstond.
limit (1-200, standaard 100) is de enige parameter. Het venster is de bewaartermijn van het abonnement: 30 dagen bij Agency en elders 7. Er zijn geen oudere gegevens om op te vragen, omdat doorgestuurde gebeurtenissen worden opgeschoond.
Gedeelde mailboxen (team)
Een gedeelde mailbox is een teaminbox zoals support@ of sales@ die leden openen via hun eigen gewone mailboxaccount, in Webmail en, wanneer native toegang is ingeschakeld, als gedelegeerde IMAP-map. Er is geen gedeeld wachtwoord of afzonderlijke aanmelding. Toegang is vlak: elk lid kan lezen en één vlag can_send bepaalt of dat lid als het adres kan antwoorden (true) of alleen-lezentoegang heeft (false). Er zijn geen ledenrollen.
GET /api/v1/mailboxes en GET /api/v1/mailboxes/{id} retourneren nu mailbox_type ("user" of "shared") en een Booleaanse waarde is_shared; gedeelde mailboxen bevatten ook shared_member_count. Gebruik deze velden om een teaminbox van een normale mailbox te onderscheiden voordat je de leden-endpoints aanroept.
| Endpoint | Methode | Vereist bereik | Wat het doet |
|---|---|---|---|
/api/v1/mailboxes/{id}/members |
GET | mailboxes:read |
Vermeldt leden van een gedeelde mailbox (per lid: member_mailbox_id, email, can_read, can_send) |
/api/v1/mailboxes/{id}/members |
POST | mailboxes:write |
Voegt een lid toe, body {member_mailbox_id, can_send?} (can_send is standaard true) |
/api/v1/mailboxes/{id}/members/{member} |
PATCH | mailboxes:write |
Schakelt antwoordtoegang van een lid om, body {can_send} |
/api/v1/mailboxes/{id}/members/{member} |
DELETE | mailboxes:write |
Verwijdert een lid (een gedeelde mailbox houdt altijd ten minste één lid) |
/api/v1/shared-mailboxes |
POST | mailboxes:create |
Maakt een gedeelde mailbox, body {domain_id, local_part, display_name, member_mailbox_ids[], storage_shared?, storage_mb?} |
/api/v1/mailboxes/{id}/convert-to-shared |
POST | mailboxes:write |
Zet een bestaande mailbox om in een gedeelde mailbox, body {member_mailbox_ids[]} (roteert het oude wachtwoord zodat aanmelden niet meer mogelijk is; retourneert 202 conversion_pending met automatisch opnieuw proberen als backendsynchronisatie nog niet is bevestigd) |
/api/v1/mailboxes/{id}/convert-to-regular |
POST | mailboxes:write |
Zet een gedeelde mailbox terug naar een gewone mailbox, body {password} (verwijdert leden en stelt een nieuw aanmeldwachtwoord in) |
De leden-endpoints hergebruiken je bestaande bereiken mailboxes:read / mailboxes:write. Er is geen afzonderlijk bereik voor gedeelde mailboxen.
Roep GET /api/v1/mailboxes/{member_mailbox_id}/client-setup aan voor de gewone mailbox van een lid om native toegang via e-mailapps te ontdekken. Het object shared_mailboxes meldt duurzame native gereedheid, effectieve gereedheid en reden voor Send As, exacte paden voor Inbox/Sent/Archive/Junk en toegestane bewerkingen. can_send is de toegewezen machtiging Can reply, geen bewijs dat SMTP momenteel gereed is. Het endpoint retourneert nooit een wachtwoord. Aanroepen met de ID van de gedeelde mailbox retourneert 422 direct_login_unavailable, omdat het gedeelde adres niet rechtstreeks kan worden geverifieerd.
Als een lid wordt verwijderd, can_send wordt gewijzigd of een gedeelde mailbox in een gewone mailbox wordt omgezet, worden mailservermachtigingen gesynchroniseerd wanneer native toegang is ingeschakeld. Een antwoord 503 native_access_sync_failed kan opnieuw worden geprobeerd en garandeert dat het lidmaatschap, de machtiging of het mailbox-type ongewijzigd is gebleven in plaats van de bewerking gedeeltelijk toe te passen.
Beschikbare endpoints
Drive heeft een eigen naslagwerk en wordt hier niet herhaald; zie het Drive API-overzicht. De SMTP-endpoints op accountniveau die voor achterwaartse compatibiliteit behouden zijn, worden beschreven onder SMTP-routering per domein en niet als actuele endpoints vermeld.
| Endpoint | Methode | Vereist bereik |
|---|---|---|
/api/v1/domains |
GET | domains:read |
/api/v1/domains/{id} |
GET | domains:read |
/api/v1/domains/{id}/matching-addresses |
GET | domains:read |
/api/v1/domains/{id}/matching-addresses |
PUT | domains:write |
/api/v1/domains/{id}/matching-addresses |
DELETE | domains:write |
/api/v1/domains/{id}/dns-requirements |
GET | domains:dns:read |
/api/v1/domains/{id}/dns-recheck |
POST | domains:dns:recheck |
/api/v1/domains/{id}/spam-metrics |
GET | domains:read |
/api/v1/domains/{id}/spam-metrics/summary |
GET | domains:read |
/api/v1/domains/{id}/deliverability |
GET | domains:read |
/api/v1/domains/{id}/bounces |
GET | domains:read |
/api/v1/domains/{id}/signature |
GET | domains:read |
/api/v1/domains/{id}/forwarding-addresses |
GET | domains:read |
/api/v1/domains/{id}/forwarding-addresses/{addressId}/log |
GET | domains:read |
/api/v1/dns-checks/{id} |
GET | domains:dns:read |
/api/v1/mailboxes |
GET | mailboxes:read |
/api/v1/mailboxes |
POST | mailboxes:create |
/api/v1/mailboxes/{id} |
PATCH | mailboxes:write |
/api/v1/mailboxes/invites |
POST | mailboxes:invites:create |
/api/v1/mailboxes/invites:bulk |
POST | mailboxes:invites:create |
/api/v1/mailboxes:bulk |
POST | mailboxes:create |
/api/v1/mailboxes/{id}/forwarding |
GET | mailboxes:forwarding:read |
/api/v1/mailboxes/{id}/forwarding |
PUT | mailboxes:forwarding:write |
/api/v1/mailboxes/{id}/rules |
GET | mailboxes:rules:read |
/api/v1/mailboxes/{id}/rules |
POST | mailboxes:rules:write |
/api/v1/mailboxes/{id}/rules/{ruleId} |
GET | mailboxes:rules:read |
/api/v1/mailboxes/{id}/rules/{ruleId} |
PUT | mailboxes:rules:write |
/api/v1/mailboxes/{id}/rules/{ruleId} |
DELETE | mailboxes:rules:write |
/api/v1/mailboxes/{id}/rules/reorder |
PATCH | mailboxes:rules:write |
/api/v1/mailboxes/{id}/auto-reply |
GET | mailboxes:auto-reply:read |
/api/v1/mailboxes/{id}/auto-reply |
PUT | mailboxes:auto-reply:write |
/api/v1/mailboxes/{id}/sieve |
GET | mailboxes:rules:read |
/api/v1/mailboxes/{id}/sieve |
PUT | mailboxes:rules:write |
/api/v1/mailboxes/{id}:delete-intent |
POST | mailboxes:delete |
/api/v1/delete-intents/{id}:confirm |
POST | mailboxes:delete |
/api/v1/me |
GET | (elk geldig ops-token) |
/api/v1/mailboxes/{id}/message-tokens |
POST | mailboxes:message-tokens:manage |
/api/v1/mailboxes/{id}/message-tokens |
GET | mailboxes:message-tokens:manage |
/api/v1/message-tokens/{id} |
DELETE | mailboxes:message-tokens:manage |
/api/v1/messages |
GET | messages:read (berichttoken) |
/api/v1/messages/{uid} |
GET | messages:read (berichttoken) |
/api/v1/messages/{uid} |
PATCH | messages:write (berichttoken) |
/api/v1/messages/send |
POST | messages:send (berichttoken) |
/api/v1/messages/_ping |
GET | messages:read (berichttoken, diagnostisch) |
/api/v1/messages/{uid}/attachments/{index} |
GET | messages:read (berichttoken) |
/api/v1/messages/{uid}/attachments |
GET | messages:read (berichttoken) |
/api/v1/messages/{uid}/raw |
GET | messages:read (berichttoken; retourneert raw_base64, encoding, content_type, size_bytes) |
/api/v1/messages/folders |
POST | messages:write (berichttoken) |
/api/v1/messages/folders/{path} |
PATCH | messages:write (berichttoken) |
/api/v1/messages/folders/{path} |
DELETE | messages:write (berichttoken) |
/api/v1/messages/{uid}:spam |
POST | messages:write (berichttoken) |
/api/v1/messages/{uid}:ham |
POST | messages:write (berichttoken) |
/api/v1/messages/bulk |
POST | messages:write (berichttoken) |
/api/v1/messages/folders:empty |
POST | messages:write (berichttoken) |
/api/v1/messages/drafts |
POST | messages:write (berichttoken); retourneert uid + uidvalidity |
/api/v1/messages/drafts/{uid} |
PUT | messages:write (berichttoken); vereist de uidvalidity van het concept |
/api/v1/messages/scheduled |
POST | messages:send (berichttoken) |
/api/v1/messages/scheduled |
GET | messages:read (berichttoken) |
/api/v1/messages/scheduled/{id} |
PATCH | messages:send (berichttoken) |
/api/v1/messages/scheduled/{id} |
DELETE | messages:send (berichttoken) |
/api/v1/messages/contacts |
GET | messages:read (berichttoken) |
/api/v1/messages/contacts |
POST | messages:write (berichttoken) |
/api/v1/messages/contacts/{id} |
PATCH | messages:write (berichttoken) |
/api/v1/messages/contacts/{id} |
DELETE | messages:write (berichttoken) |
/api/v1/messages/contacts/import |
POST | messages:write (berichttoken) |
/api/v1/messages/contacts/export |
GET | messages:read (berichttoken) |
/api/v1/messages/contact-groups |
GET | messages:read (berichttoken) |
/api/v1/messages/contact-groups/{id}/members |
GET | messages:read (berichttoken) |
/api/v1/messages/external-accounts |
GET | messages:read (berichttoken) |
/api/v1/messages/external-accounts |
POST | messages:write (berichttoken) |
/api/v1/messages/external-accounts/{id} |
PATCH | messages:write (berichttoken) |
/api/v1/messages/external-accounts/{id} |
DELETE | messages:write (berichttoken) |
/api/v1/messages/external-accounts/detect |
POST | messages:read (berichttoken) |
/api/v1/messages/external-accounts/test |
POST | messages:write (berichttoken) |
/api/v1/messages/external-accounts/{id}/test |
POST | messages:write (berichttoken) |
/api/v1/messages/_me |
GET | elk berichttoken (introspectie) |
/api/v1/messages/calendar/events |
GET | messages:read (berichttoken) |
/api/v1/messages/calendar/events |
POST | messages:write (berichttoken) |
/api/v1/messages/calendar/events/{id} |
PATCH | messages:write (berichttoken) |
/api/v1/messages/calendar/events/{id} |
DELETE | messages:write (berichttoken) |
/api/v1/messages/{uid}/reply |
GET | messages:read (berichttoken) |
/api/v1/messages/{uid}/reply-all |
GET | messages:read (berichttoken) |
/api/v1/messages/{uid}/forward |
GET | messages:read (berichttoken) |
/api/v1/messages/contact-groups |
POST | messages:write (berichttoken) |
/api/v1/messages/contact-groups/{id} |
PATCH | messages:write (berichttoken) |
/api/v1/messages/contact-groups/{id} |
DELETE | messages:write (berichttoken) |
/api/v1/messages/contact-groups/{id}/members |
POST | messages:write (berichttoken) |
/api/v1/messages/contact-groups/{id}/members |
DELETE | messages:write (berichttoken) |
/api/v1/messages/identities |
GET | messages:read (berichttoken) |
/api/v1/messages/identities |
POST | messages:write (berichttoken) |
/api/v1/messages/identities/reply-policy |
PATCH | messages:write (berichttoken) |
/api/v1/messages/identities/{id} |
PATCH | messages:write (berichttoken) |
/api/v1/messages/identities/{id} |
DELETE | messages:write (berichttoken) |
/api/v1/messages/templates |
GET | messages:read (berichttoken) |
/api/v1/messages/templates |
POST | messages:write (berichttoken) |
/api/v1/messages/templates/{id} |
PATCH | messages:write (berichttoken) |
/api/v1/messages/templates/{id} |
DELETE | messages:write (berichttoken) |
/api/v1/messages/blocked-senders |
GET | messages:read (berichttoken) |
/api/v1/messages/blocked-senders |
POST | messages:write (berichttoken) |
/api/v1/messages/blocked-senders/{id} |
DELETE | messages:write (berichttoken) |
/api/v1/mailboxes/{id}/enable-imap |
POST | mailboxes:write (ops-token) |
/api/v1/migrations/test-connection |
POST | migrations:write |
/api/v1/migrations |
GET | migrations:read |
/api/v1/migrations/{id} |
GET | migrations:read |
/api/v1/migrations |
POST | migrations:write |
/api/v1/migrations/{id}:cancel |
POST | migrations:write |
/api/v1/migrations/{id}:retry |
POST | migrations:write |
/api/v1/migrations/{id} |
DELETE | migrations:write |
/api/v1/migrations/bulk/preview |
POST | migrations:write |
/api/v1/migrations/bulk |
POST | migrations:write |
/api/v1/migrations/bulk |
GET | migrations:read |
/api/v1/migrations/bulk/{batch} |
GET | migrations:read |
/api/v1/migrations/bulk/{batch}:cancel |
POST | migrations:write |
/api/v1/migrations/bulk/{batch}:retry |
POST | migrations:write |
/api/v1/migrations/bulk/{batch}:resume |
POST | migrations:write |
/api/v1/migrations/bulk/{batch} |
DELETE | migrations:write |
/api/v1/migrations/bulk/{batch}/jobs/{job}/password |
PATCH | migrations:write |
/api/v1/account |
GET | account:read |
/api/v1/billing/status |
GET | billing:read |
/api/v1/billing/invoices |
GET | billing:read |
/api/v1/domains |
POST | domains:create |
/api/v1/domains/{id} |
DELETE | domains:delete |
/api/v1/domains/{id}/catch-all |
PATCH | domains:write |
/api/v1/domains/{id}/mail-hosting |
PATCH | domains:write |
/api/v1/domains/{id}/forwarding-addresses |
POST | domains:write |
/api/v1/domains/{id}/forwarding-addresses/{addressId} |
PATCH | domains:write |
/api/v1/domains/{id}/forwarding-addresses/{addressId} |
DELETE | domains:write |
/api/v1/domains/{id}/dkim:retry |
POST | domains:write |
/api/v1/domains/{id}/note |
PATCH | domains:write |
/api/v1/domains/{id}/signature |
PATCH | domains:write |
/api/v1/domains/{id}/branding |
GET | domains:read |
/api/v1/domains/{id}/branding |
PATCH | domains:write |
/api/v1/domains/{id}/branding/logo/{slot} |
PUT | domains:write |
/api/v1/domains/{id}/branding/logo/{slot} |
DELETE | domains:write |
/api/v1/domains/{id}/branding/verify-dns |
POST | domains:write |
/api/v1/domains/{id}/branding/preview |
POST | domains:write |
/api/v1/domains/{id}/branding |
DELETE | domains:write |
/api/v1/domains:bulk-add |
POST | domains:create |
/api/v1/mailboxes/{id} |
GET | mailboxes:read |
/api/v1/mailboxes/{id}/client-setup |
GET | mailboxes:read |
/api/v1/mailboxes/{id}/apple-mail-profile |
GET | mailboxes:read |
/api/v1/mailboxes/{id}/bounces |
GET | mailboxes:read |
/api/v1/mailboxes/{id}/password |
POST | mailboxes:write |
/api/v1/mailboxes/{id}/note |
PATCH | mailboxes:write |
/api/v1/mailboxes/{id}:pause |
POST | mailboxes:write |
/api/v1/mailboxes/{id}:restore |
POST | mailboxes:delete |
/api/v1/mailboxes/{id}:resume |
POST | mailboxes:write |
/api/v1/mailboxes/{id}:suspend-login |
POST | mailboxes:write |
/api/v1/mailboxes/{id}:resume-login |
POST | mailboxes:write |
/api/v1/mailboxes:login-access |
POST | mailboxes:write |
/api/v1/mailboxes:drive-access |
POST | mailboxes:write |
/api/v1/mailboxes/{id}/members |
GET | mailboxes:read |
/api/v1/mailboxes/{id}/members |
POST | mailboxes:write |
/api/v1/mailboxes/{id}/members/{member} |
PATCH | mailboxes:write |
/api/v1/mailboxes/{id}/members/{member} |
DELETE | mailboxes:write |
/api/v1/shared-mailboxes |
POST | mailboxes:create |
/api/v1/mailboxes/{id}/convert-to-shared |
POST | mailboxes:write |
/api/v1/mailboxes/{id}/convert-to-regular |
POST | mailboxes:write |
/api/v1/tickets |
GET | tickets:read |
/api/v1/tickets/{id} |
GET | tickets:read |
/api/v1/tickets/{id}/messages |
GET | tickets:read |
/api/v1/tickets |
POST | tickets:write |
/api/v1/tickets/{id}:mark-seen |
POST | tickets:write |
/api/v1/tickets/{id}/reply |
POST | tickets:write |
/api/v1/tickets/{id}:close |
POST | tickets:write |
/api/v1/domains/{id}/smtp |
GET | smtp:read |
/api/v1/domains/{id}/smtp |
PUT | smtp:write |
/api/v1/domains/{id}/smtp/profiles |
GET | smtp:read |
/api/v1/domains/{id}/smtp/profiles |
POST | smtp:write |
/api/v1/domains/{id}/smtp/profiles/{connectionId} |
PUT | smtp:write |
/api/v1/domains/{id}/smtp/profiles/{connectionId} |
DELETE | smtp:write |
/api/v1/domains/{id}/smtp:test |
POST | smtp:write |
/api/v1/domains/{id}/smtp:test-status/{jobId} |
GET | smtp:read |
/api/v1/smtp/default |
GET | smtp:read |
/api/v1/smtp/default |
PUT | smtp:write |
/api/v1/smtp (verouderd, achterwaarts compatibel) |
GET | smtp:read |
/api/v1/smtp (verouderd, achterwaarts compatibel) |
PUT | smtp:write |
/api/v1/smtp/{id} (verouderd, achterwaarts compatibel) |
DELETE | smtp:write |
/api/v1/smtp:test (verouderd, achterwaarts compatibel) |
POST | smtp:write |
/api/v1/smtp:test-status/{jobId} (verouderd, achterwaarts compatibel) |
GET | smtp:read |
/api/v1/messages/{uid} |
DELETE | messages:write (berichttoken) |
/api/v1/messages/{uid}:move |
POST | messages:write (berichttoken) |
/api/v1/messages/folders |
GET | messages:read (berichttoken) |
/api/v1/mailboxes/{id}/aliases |
GET | mailboxes:read |
/api/v1/mailboxes/{id}/aliases |
POST | mailboxes:write |
/api/v1/mailboxes/{id}/aliases/{aliasId} |
PATCH | mailboxes:write |
/api/v1/mailboxes/{id}/aliases/{aliasId} |
DELETE | mailboxes:write |
/api/v1/verify |
POST | verify:write |
/api/v1/verify/bulk |
POST | verify:write |
/api/v1/verify/bulk/{jobId} |
GET | verify:read |
/api/v1/verify/bulk/{jobId}/download |
GET | verify:read |
/api/v1/verify/credits |
GET | verify:read |
/api/v1/verify/bulk |
GET | verify:read |
/api/v1/verify/bulk/{jobId}/cancel |
POST | verify:write |
/api/v1/verify/bulk/{jobId} |
DELETE | verify:write |
/api/v1/cloudflare/validate-token |
POST | cloudflare:read |
/api/v1/cloudflare/zones |
POST | cloudflare:read |
/api/v1/cloudflare/connect |
POST | cloudflare:write |
/api/v1/cloudflare/preview |
POST | cloudflare:read |
/api/v1/cloudflare/apply |
POST | cloudflare:write |
/api/v1/cloudflare/tokens |
GET | cloudflare:read |
/api/v1/cloudflare/tokens/{id} |
DELETE | cloudflare:delete |
De Cloudflare-endpoints volgen dezelfde stroom als het dashboard: valideer een token, vermeld zones, verbind domeinen, bekijk de DNS-wijzigingen als voorbeeld en pas ze vervolgens toe. Zowel /cloudflare/preview als /cloudflare/apply accepteert twee optionele instellingen per domein:
included_records, een toelatingslijst met de records die mogen worden aangepast, met de domein-ID als sleutel:{ "123": ["mx_primary", "spf_record"] }. Weggelaten records worden overgeslagen, zodat je alleen MX en SPF kunt toepassen en later voor DKIM kunt terugkomen. Laat het veld weg om alle records toe te passen.confirmed_conflicts: wanneer het voorbeeld een bestaand record met een andere waarde markeert, vermeld je hier de record-ID (in dezelfde vorm{ domain_id: [record_ids] }) om vervanging toe te staan.
De record-ID's (mx_primary, spf_record, dkim_primary, dmarc_main, …) komen rechtstreeks uit het voorbeeldantwoord. Een normale agent vraagt dus eerst een voorbeeld op en stuurt daarna de gewenste ID's naar apply:
POST /api/v1/cloudflare/apply
{
"domain_ids": [123],
"included_records": { "123": ["mx_primary", "spf_record"] },
"confirmed_conflicts": { "123": ["dmarc_main"] }
}
SMTP-routering per domein en accountstandaard
SMTP wordt per domein geconfigureerd. Elk domein kiest een van drie routes: beheerd verzenden via het platform, een opgeslagen SMTP-profiel (je eigen provider, herbruikbaar voor meerdere domeinen) of "niet geconfigureerd". Eén standaardinstelling voor het hele account bepaalt met welke route nieuwe domeinen beginnen.
Endpoints per domein (smtp:read / smtp:write):
| Endpoint | Methode | Wat het doet |
|---|---|---|
/api/v1/domains/{id}/smtp |
GET | Huidige route: smtp_mode, effective_smtp_mode, profile, effective_profile |
/api/v1/domains/{id}/smtp |
PUT | Stelt de route in, body {smtp_mode: platform|profile|not_configured|inherit, smtp_connection_id?, set_account_default?, apply_to_all?} |
/api/v1/domains/{id}/smtp/profiles |
GET | Vermeldt de opgeslagen SMTP-profielen van het account |
/api/v1/domains/{id}/smtp/profiles/{connectionId}/usage |
GET | Vermeldt de exacte domeinen en Send As-adressen die een profiel gebruiken (geen referenties) |
/api/v1/domains/{id}/smtp/profiles |
POST | Maakt een profiel en gebruikt het voor dit domein |
/api/v1/domains/{id}/smtp/profiles/{connectionId} |
PUT | Werkt een profiel bij (heeft invloed op elk domein dat het gebruikt) |
/api/v1/domains/{id}/smtp/profiles/{connectionId} |
DELETE | Verwijdert een profiel (domeinen die het gebruiken worden toegewezen aan de accountstandaard) |
/api/v1/domains/{id}/smtp:test |
POST | Test een route, retourneert {job_id, poll_url} |
/api/v1/domains/{id}/smtp:test-status/{jobId} |
GET | Vraagt de status van een testtaak op |
Enkele opmerkingen over de body van de route:
smtp_mode=platformselecteert beheerd verzenden;smtp_mode=profilevereistsmtp_connection_id;not_configuredwist de route.- Met
smtp_mode=inheritvolgt het domein live de accountstandaard: wanneer de standaard verandert, verandert dit domein mee. De webinterface schrijft altijd concrete routes, maar de backend ondersteunt nog steedsinherit. Daarom retourneertGETde waardeeffective_smtp_mode, die laat zien waarnaarinheritop dit moment wordt omgezet. set_account_default: trueis het API-equivalent van de schakelaar Make this the account default in het dashboard (nieuwe domeinen beginnen met deze route).apply_to_all: trueis de knop Apply to all domains (een eenmalige omschakeling van elk domein naar deze route).
Endpoints voor de accountbrede standaard (smtp:read / smtp:write):
| Endpoint | Methode | Wat het doet |
|---|---|---|
/api/v1/smtp/default |
GET | Retourneert default_smtp_mode (null totdat je er een instelt), effective_default_smtp_mode (de basiswaarde van het abonnement wanneer niets is ingesteld), default_smtp_connection_id en profile |
/api/v1/smtp/default |
PUT | Stelt de standaard in, body {smtp_mode: platform|profile|not_configured, smtp_connection_id?, apply_to_all?} |
Als je een profiel verwijdert dat de accountstandaard was, wordt de standaard teruggezet naar de basiswaarde van het abonnement.
Verouderde endpoints. De GET/PUT /api/v1/smtp-endpoints op accountniveau (en DELETE /api/v1/smtp/{id}, POST /api/v1/smtp:test, GET /api/v1/smtp:test-status/{jobId}) blijven beschikbaar voor achterwaartse compatibiliteit, maar beheren niet langer routering per domein: gebruik de bovenstaande endpoints per domein en /smtp/default. De verouderde MCP-tools get_smtp_config / update_smtp_config zijn om dezelfde reden afgeschaft.
White Label-branding, klanten en teamtoegang
Branding wordt per domein geconfigureerd met branding:read / branding:write. Een domein gebruikt zijn eigen merk (mode=custom), neemt de accountstandaard over (mode=inherit) of is uitgeschakeld. Een actieve White Label-proefperiode of betaalde add-on is vereist. Na annulering behoudt de eigenaar tijdens het weergegeven respijtvenster alleen-lezentoegang voor herstel. Lees de dns_records van het domein en publiceer precies die geretourneerde records. Leid geen hostnamen of CNAME-doelen af uit een voorbeeld.
| Endpoint | Methode | Wat het doet |
|---|---|---|
/api/v1/domains/{id}/branding |
GET | Leest branding: mode, white_label_addon_active, brand, hosts, de te maken dns_records, cname_target en mail_zone |
/api/v1/domains/{id}/branding |
PATCH | Gedeeltelijke samenvoegupdate: mode, name, primary_color/accent_color, dashboard_enabled/dashboard_label, webmail_enabled/webmail_label, mail_zone_enabled, support_email, support_url, sender_email, scope |
/api/v1/domains/{id}/branding/logo/{slot} |
PUT | Uploadt een base64-logo (slot = light|dark|favicon; PNG/JPG, ICO voor favicon, ≤1 MB, geen SVG). De standaard scope=domain vereist de modus custom; expliciete scope=account_default op een inherit-domein vereist een onbeperkt token. |
/api/v1/domains/{id}/branding/logo/{slot} |
DELETE | Verwijdert een logoslot. Gebruikt dezelfde bereikregels voor domein/accountstandaard; DELETE ontvangt scope als queryparameter. |
/api/v1/domains/{id}/branding/verify-dns |
POST | Zet DNS-verificatie voor de merkhosts en de e-mailzone van het merk in de wachtrij |
/api/v1/domains/{id}/branding/preview |
POST | Maakt een kortstondige voorbeeld-URL (422 no_brand als branding niet is ingesteld) |
/api/v1/domains/{id}/branding?scope=domain|all |
DELETE | Wist branding voor dit domein of het hele account |
PATCH is een gedeeltelijke samenvoeging, dus weggelaten velden blijven behouden. Als branding momenteel uitgeschakeld is, geef je mode mee om deze opnieuw in te schakelen. Een aangepaste sender_email moet op een domein met een geverifieerde DKIM-sleutel staan. mail_zone_enabled biedt e-mailapps en DAV-synchronisatie onder het eigen domein van het merk. Het hoort bij het merk en niet bij één domein, dus het vereist mode=custom of scope=account_default; een inherit-domein retourneert 422 inherited_brand. Lees mail_zone.dns_status, mail_zone.client_hosts_status, mail_zone.records, mail_zone.dav_url en mail_zone.dav_ready om inrichting te volgen en gebruik alleen een gereed DAV-adres. Zie de White Label Branding API- en MCP-handleiding voor de volledige agentworkflow.
Het White Label-oppervlak op accountniveau voegt 13 routes toe onder /api/v1/white-label: status en configuratievoortgang, een live toegangscatalogus, ledenlijst en levenscyclusacties, accountactiviteit en actie- en aanmeldgeschiedenis per lid. Het gebruikt members:read, members:write en activity:read. Toegang is altijd het snijpunt van het accountrecht, het huidige lidmaatschap van de persoon, de verlening aan de referentie en eventuele domeinbeperking. Zie White Label-teams beheren met API en MCP voor de routetabel en statusovergangen.
De OpenAPI-specificatie is beschikbaar op /api/openapi.json voor import in Postman, Insomnia of codegeneratoren.
Snelle oplossingen
- 401 "unauthenticated": controleer of de header
Authorization: Bearer <token>aanwezig is en of het token niet is ingetrokken of verlopen. - 403 "plan_api_disabled": het gevraagde bereik valt niet onder je abonnement. Nano omvat Email Verifier (en Drive als je de Drive Storage Add-on hebt gekocht). Upgrade naar Starter of hoger voor de rest van de API.
- 403 "token_scope_blocked_by_plan": je token heeft bereiken die niet beschikbaar zijn in je huidige abonnement. Trek het token in en maak een nieuw token met toegestane bereiken.
- 403 "scope_blocked_by_entitlement": een opgeslagen White Label-verlening is niet beschikbaar omdat de add-on inactief is of omdat tijdens de respijtperiode wordt geschreven. Activeer White Label opnieuw en geef de referentie daarna opnieuw uit of autoriseer deze opnieuw.
- 403 "scope_blocked_by_membership": de huidige ledenrol is beperkter dan de gevraagde actie. Vraag de eigenaar om deze te wijzigen; opnieuw autoriseren kan het lidmaatschap op zichzelf niet verruimen.
- 422 "missing_idempotency_key": voeg een
Idempotency-Key-header toe aan de schrijfbewerking die in de endpointdocumentatie wordt genoemd. - 403 "mailbox_sending_paused": verzenden vanuit die mailbox is gestopt omdat de uitgaande e-mail niet meer van de eigenaar leek te zijn, meestal door een wachtwoord in verkeerde handen. Lezen, vermelden en alle andere endpoints blijven werken; alleen verzenden wordt geweigerd en opnieuw proberen heft de blokkering niet op. Het mailboxwachtwoord moet worden gewijzigd, waarna ondersteuning verzenden weer inschakelt. Zie Waarom kan ik geen e-mail verzenden?.
- 429 snelheidslimiet: wacht gedurende de tijd in de
Retry-After-header voordat je het opnieuw probeert.
E-mail verzenden: body, headers en bezorging
POST /api/v1/messages/send accepteert de verzoekvorm {to, subject, body: {text, html}, attachments, reply_to_message_id, headers}.
body.textenbody.htmlzijn beide optioneel, maar ten minste één is vereist. Als je alleenbody.textopgeeft, genereren we automatisch een HTML-alternatief met<p>-alinea's (lege regels scheiden alinea's; enkele nieuwe regels worden<br>), zodat het bericht in elke moderne client als gewone e-mail wordt weergegeven. Als je monospace nodig hebt, verzend je de letterlijke waarde<pre>...</pre>inbody.html.headersis een optioneel object met door de gebruiker opgegeven uitgaande headers. De toelatingslijst bestaat uitList-Unsubscribe,List-Unsubscribe-Post,Reply-Toen elke aangepaste trackingheaderX-*. Andere namen (From,Subject,Message-Id,Authentication-Resultsenzovoort) worden door het platform beheerd en met422geweigerd. Waarden met CR/LF worden ook geweigerd (bescherming tegen headerinjectie). Waarden zijn volgens RFC 2822 beperkt tot 998 tekens.- Zie voor bulk- en automatiseringstoepassingen de sectie Bezorgheaders voor bulkafzenders voor het instellen van
List-Unsubscribeen de accountbrede schakelaarauto_list_unsubscribe.
Gerelateerde artikelen
Spring naar nabije gidsen die de workflow voortzetten.