REST + SDKs
An OpenAPI-documented API, from which the Node, Python, Java, Go and .NET SDKs are generated. Ready-made recipes for Playwright, Cypress, Selenium and Robot Framework.
Email testing
A dedicated SMTP server per inbox, an API that waits for the message on your behalf, and everything inside it already broken out.
// Several criteria, ALL or ANY matching.
const messages = await facteur.messages.search({
inbox: 'j3k9x2mq',
match: 'all',
sentTo: address,
subject: 'Your invoice',
receivedAfter: startOfTest,
});
// Full MIME, nothing hidden.
const [message] = messages;
message.subject; // 'Your July invoice'
message.html.body; // raw HTML body
message.text.body; // text equivalent
message.headers['message-id'];
message.attachments[0].filename;
// .eml export to replay the message elsewhere.
const eml = await facteur.messages.eml(message.id);// Extracted on arrival, not by your regex.
message.otp; // '265279'
message.links; // [{ href, text }, ...]
message.codes; // every code detected
message.images; // [{ src, alt }, ...]
// A full 2FA journey with no phone.
const device = await facteur.authenticator.create();
const secret = device.sharedSecret;
await page.getByLabel('Secret key').fill(secret);
await page.getByLabel('Code').fill(await device.otp());Reception
Any address ending in the inbox domain lands there. You generate a unique address per test, with no API call and no risk of collision between parallel runs.
The API holds the connection open until a message matching your criteria arrives, with a timeout you set. Your tests no longer contain an arbitrary sleep, so they stop being flaky.
HTML, text, complete headers, encoding, attachments, and .eml export. What arrived on port 25 is what you read.
OTP codes, links, buttons and images are pulled out of the body on arrival. No more brittle regex copied into every test suite.
Reply to a message, forward it to a verified external address, or send an email from an inbox address to test an inbound loop.
Use your own domain rather than ours, when your tests depend on the recipient domain — spam filters, allow lists, personalisation.
From 1 to 90 days depending on your plan. In performance mode the content is never written to disk: we confirm reception and drop the message.
Each inbox has its own access list, quotas and API keys. Team A’s CI neither sees nor consumes team B’s.
Connectivity
The REST API covers everything, but your existing tools do not need rewriting for that.
An OpenAPI-documented API, from which the Node, Python, Java, Go and .NET SDKs are generated. Ready-made recipes for Playwright, Cypress, Selenium and Robot Framework.
Credentials per inbox. Point a real mail client at a test inbox, or let a tool that only speaks POP3 read it.
Every message received can trigger an HMAC-signed HTTP call to your system, with retries and a delivery log.
The free plan asks for no card. If you are migrating from Mailosaur, the compatibility layer saves you from rewriting your tests.