Ontwikkelaars
De mailbox vraagt niet
wie er achter het stuur zit.
Alles wat de app doet, doet jouw code ook: 104 gedocumenteerde operaties over 68 paden, achter een OpenAPI 3.1-document dat je zonder sleutel kunt lezen. De TypeScript-client wordt bij elke build aan dat document getoetst.
Bij MCP hoef je geen sleutel te plakken. De client vindt de autorisatieserver via het endpoint, registreert zichzelf en stuurt je hierheen om in te loggen.
104
gedocumenteerde operaties
68
paden onder één host
116
SDK-methodes, die ze allemaal dekken
20
webhook-events, in drie families
Het OpenAPI 3.1-document staat op GET /openapi.json, en het lezen ervan vraagt geen sleutel.
Ingangen
Drie deuren,
één mailbox.
Een workspacesleutel bepaalt wat een aanroep mag doen en vanaf welke adressen hij mag versturen. Intrekken is een update en geen verwijdering, dus een latere aanroep krijgt te horen dat de sleutel is ingetrokken.
Een sleutel verstuurt namens maximaal 25 hele domeinen en 50 losse adressen. GET /ping leest de scopes terug die hij heeft en de scopes die zijn rol hem heeft gelaten.
Richt een client op het endpoint en log in. Er is geen sleutel om te plakken, want de client registreert zichzelf en stuurt je hierheen.
Tools worden gebouwd uit wat de aanroeper mag doen, dus een client die tot lezen beperkt is, heeft geen verzendtool. Een token reikt nog steeds tot de hele mailbox.
Registreer een https-endpoint en de mailbox post ernaartoe. Bezorgingen komen van de mailbox zelf en niet van een API-aanroep, dus opstellen in de app en posten naar de API veroorzaken dezelfde.
20 events in drie families, en tien endpoints per mailbox.
Pariteit
De client kan niet achterlopen
op de API.
Een pariteitscontrole leest bij elke build het OpenAPI-document en faalt bij drift: een methode die wijst naar een operatie die de spec niet heeft, een gedocumenteerde operatie zonder methode, of een scopelijst die niet klopt met wat de operatie vereist. Hij drukt af wat hij heeft bewezen, en vandaag staat daar 116 SDK-methodes over alle 104 gedocumenteerde operaties.
De config, het request en de aanroep zijn dezelfde operatie, op drie manieren geschreven.
Agents, API & MCP
OpenEmail is bedoeld om net zo goed door software als door mensen bediend te worden. De mailbox is in beide gevallen dezelfde.
MCP-server
Richt Claude, of elke andere MCP-client, op je mailbox.
OAuth voor externe clients
BinnenkortZelf clients registreren met PKCE, zodat een app netjes om toegang kan vragen.
Toestemming en intrekken zijn er; scope niet, dus een token reikt tot je hele mailbox in plaats van tot het deel waar een app om vroeg.
REST API
Een gedocumenteerde HTTP-API met sleutels die je kunt uitgeven, beperken en intrekken.
Snelstart
Van niets tot een verzonden bericht.
Drie stappen.
- 1
Maak een sleutel aan
Instellingen, API-sleutels, op een mailbox die van jou is. Kies de scopes en beperk waarvandaan hij mag versturen tot hele domeinen of losse adressen. Het geheim wordt één keer getoond en wat wordt opgeslagen is een eenrichtingshash.
GET /ping antwoordt met de scopes op de sleutel en de scopes die zijn rol hem heeft gelaten. export OPENEMAIL_API_KEY=oe_live_9f2c1a4b7e05d3862c1f0a44_kX7… curl https://api.openemail.uk/ping \ -H "Authorization: Bearer $OPENEMAIL_API_KEY" - 2
Installeer de client
Een TypeScript-client zonder dependencies, gepubliceerd als ESM en CommonJS, die de sleutel uit OPENEMAIL_API_KEY leest. Sla hem over als je liever zelf JSON post, want elk endpoint is gewoon HTTP.
Node 18 en hoger, Workers, Deno, Bun en de browser. bun add @openemail/sdk - 3
Versturen
Het antwoord bevat de id. GET /emails/{id} lost die op, /events heeft het spoor per ontvanger en /tracking heeft opens en kliks.
Een herhaalpoging met dezelfde Idempotency-Key geeft het eerste resultaat terug met Idempotency-Replayed: true. import { init, openemail } from '@openemail/sdk' init({ apiKey: process.env.OPENEMAIL_API_KEY }) const email = await openemail.emails.send({ from: 'Acme Billing <[email protected]>', to: '[email protected]', subject: 'Your September invoice', html: '<p>Invoice attached.</p>',}) console.log(email.id, email.status)
Afwezig
Wat het nog niet doet
voor jou.
Vijf dingen die je beter vooraf weet dan achteraf, voordat je hierop bouwt.
- Geen upload-endpoint
- Inline bijlagen gaan mee als base64 onder een totaallimiet van 5 MB. Een groter bestand verstuur je door een bestand dat al in de workspace staat bij zijn id te noemen; dat reist mee als downloadlink.
- Bounces komen niet verder dan de mailbox
- Een bezorgrapport wordt geparseerd, gekoppeld via Message-ID, op het gesprek gelabeld en als email.bounced-webhook verstuurd. Niets schrijft terug naar de verzendregel, dus via GET /emails staat een gebouncet bericht nog altijd als verzonden.
- Mail uit het opstelvenster staat niet in GET /emails
- Mail die vanuit het opstelvenster in de app wordt verstuurd, verschijnt niet in die lijst, omdat het opstelvenster niet via hetzelfde verzendpad schrijft.
- OAuth heeft toestemming, geen scope
- Een verzoek wordt getoond voordat het wordt verleend en Verbonden apps trekt het weer in, maar een token reikt tot je hele mailbox in plaats van tot het deel waar een app om vroeg.
- Geen releaseworkflow
- De client publiceren is een handmatige run van de preflight, de build en bun publish, dus een versie komt op npm wanneer iemand dat uitvoert en niet wanneer de wijziging landt.
Een bezorging verifiëren
Elke bezorging is ondertekend,
en elke herhaalpoging draagt zijn id mee.
De handtekening is een HMAC-SHA-256 over de timestamp, een punt en de ruwe body. Verifieer tegen de bytes zoals ze binnenkwamen, want parsen en opnieuw serialiseren verandert de volgorde van de sleutels en breekt hem.
X-OpenEmail-Signature: t=1758240000,v1=9f0c4b2e7d1a86c3X-OpenEmail-Event: email.deliveredX-OpenEmail-Delivery: evt_4b7e05d3862c1f0a- Replayvenster
- 300 seconden, en het afdwingen is de taak van de ontvanger. De verifier in de SDK houdt die standaard aan.
- Idempotency-Key
- Geclaimd tegen een unieke index op de sleutel en je API-sleutel samen, dus een herhaalpoging na een timeout geeft het eerste resultaat terug met Idempotency-Replayed: true in plaats van twee keer te versturen.
- Herhaalpogingen
- Vijf pogingen: op het moment van het event, daarna na 1 minuut, 5, 25 en 2 uur. Alleen een timeout, een geweigerde verbinding, 408, 425, 429 of een 5xx wordt herhaald.
- X-OpenEmail-Delivery
- De event-id wordt één keer aangemaakt en elke poging draagt hem mee, dus een ontvanger die dezelfde id twee keer ziet kan de tweede laten vallen in plaats van er opnieuw naar te handelen.
Voor wie het is
Eén mailbox.
Drie ingangen.
Een gratis adres op openemail.uk, met de client erachter.
Adressen voor iedereen, leden tellen nooit als gebruikers.
Dezelfde mailbox via een API, een SDK en MCP.
Maak een sleutel aan.
Verstuur iets.
Full API, MCP and SDK access bij elk abonnement. Free brengt 50 AI actions a day mee.