Encrypted at rest
Your agent’s conversations are encrypted in storage, with keys unique to your organization.
Give your agents their own email addresses. Create multiple inboxes on your domain or ours.
EU-hosted mailbox storage, encrypted with keys unique to your organization.
Verified domains, signed email, and bounce protection built in.
Give your app or agent an inbox with a few lines of code. Build it yourself, or let AI guide the integration and setup.
const response = await fetch("https://api.mailactor.com/v1/inboxes", {
method: "POST",
headers: {
"content-type": "application/json",
"x-api-key": process.env.MAILACTOR_API_KEY,
},
body: JSON.stringify({ localPart: "research-agent" }),
});
if (!response.ok) throw new Error(`Mailactor returned ${response.status}`);
const inbox = await response.json();
console.log(inbox.address);export async function POST() {
const response = await fetch("https://api.mailactor.com/v1/inboxes", {
method: "POST",
headers: {
"content-type": "application/json",
"x-api-key": process.env.MAILACTOR_API_KEY,
},
body: JSON.stringify({ localPart: "research-agent" }),
});
const body = await response.json();
return Response.json(body, { status: response.status });
}import express from "express";
const app = express();
app.post("/inboxes", async (_request, reply) => {
const response = await fetch("https://api.mailactor.com/v1/inboxes", {
method: "POST",
headers: {
"content-type": "application/json",
"x-api-key": process.env.MAILACTOR_API_KEY,
},
body: JSON.stringify({ localPart: "research-agent" }),
});
reply.status(response.status).json(await response.json());
});import json, os, urllib.request
body = json.dumps({"localPart": "research-agent"}).encode()
headers = {
"Content-Type": "application/json",
"x-api-key": os.environ["MAILACTOR_API_KEY"],
}
request = urllib.request.Request(
"https://api.mailactor.com/v1/inboxes",
data=body,
headers=headers,
method="POST",
)
with urllib.request.urlopen(request) as response:
inbox = json.load(response)
print(inbox["address"])import json, os, urllib.request
from flask import Flask, jsonify
app = Flask(__name__)
@app.post("/inboxes")
def create_inbox():
request = urllib.request.Request(
"https://api.mailactor.com/v1/inboxes",
data=json.dumps({"localPart": "research-agent"}).encode(),
headers={"Content-Type": "application/json", "x-api-key": os.environ["MAILACTOR_API_KEY"]},
method="POST",
)
with urllib.request.urlopen(request) as response:
return jsonify(json.load(response)), response.statusimport json, os, urllib.request
from fastapi import FastAPI
app = FastAPI()
@app.post("/inboxes")
def create_inbox():
request = urllib.request.Request(
"https://api.mailactor.com/v1/inboxes",
data=json.dumps({"localPart": "research-agent"}).encode(),
headers={"Content-Type": "application/json", "x-api-key": os.environ["MAILACTOR_API_KEY"]},
method="POST",
)
with urllib.request.urlopen(request) as response:
return json.load(response)<?php
$client = curl_init("https://api.mailactor.com/v1/inboxes");
curl_setopt_array($client, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ["Content-Type: application/json", "x-api-key: " . getenv("MAILACTOR_API_KEY")],
CURLOPT_POSTFIELDS => json_encode(["localPart" => "research-agent"]),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FAILONERROR => true,
]);
$result = curl_exec($client);
if ($result === false) throw new RuntimeException("Mailactor request failed");
$inbox = json_decode($result, true, flags: JSON_THROW_ON_ERROR);
echo $inbox["address"];use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Route;
Route::post("/inboxes", function () {
$response = Http::withHeaders([
"x-api-key" => env("MAILACTOR_API_KEY"),
])->post("https://api.mailactor.com/v1/inboxes", [
"localPart" => "research-agent",
]);
$response->throw();
return response()->json($response->json(), $response->status());
});package main
import ("bytes"; "encoding/json"; "fmt"; "net/http"; "os")
func main() {
body := bytes.NewBufferString(`{"localPart":"research-agent"}`)
request, _ := http.NewRequest("POST", "https://api.mailactor.com/v1/inboxes", body)
request.Header.Set("Content-Type", "application/json")
request.Header.Set("x-api-key", os.Getenv("MAILACTOR_API_KEY"))
response, err := http.DefaultClient.Do(request)
if err != nil || response.StatusCode >= 400 { panic("Mailactor request failed") }
defer response.Body.Close()
var inbox struct { Address string `json:"address"` }
if err := json.NewDecoder(response.Body).Decode(&inbox); err != nil { panic(err) }
fmt.Println(inbox.Address)
}package main
import ("bytes"; "io"; "net/http"; "os"; "github.com/gin-gonic/gin")
func main() {
router := gin.Default()
router.POST("/inboxes", func(context *gin.Context) {
body := bytes.NewBufferString(`{"localPart":"research-agent"}`)
request, _ := http.NewRequest("POST", "https://api.mailactor.com/v1/inboxes", body)
request.Header.Set("Content-Type", "application/json")
request.Header.Set("x-api-key", os.Getenv("MAILACTOR_API_KEY"))
response, err := http.DefaultClient.Do(request)
if err != nil { context.JSON(502, gin.H{"error": "Mailactor unavailable"}); return }
defer response.Body.Close()
payload, _ := io.ReadAll(response.Body)
context.Data(response.StatusCode, "application/json", payload)
})
router.Run(":8080")
}curl --fail-with-body --silent --show-error \
"https://api.mailactor.com/v1/inboxes" \
-H "x-api-key: $MAILACTOR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"localPart":"research-agent"}'Read https://docs.mailactor.com/llms.txt and its linked quickstart. Add a server-side workflow that creates a Mailactor inbox, reads incoming threads, and prepares replies to an explicitly selected message. Use MAILACTOR_API_KEY from the environment and follow the documented idempotency and pagination rules.Use https://docs.mailactor.com/llms.txt and the linked quickstart as the source of truth. Build a server-side Mailactor integration that creates an inbox, reads new messages through threads, and prepares a reply to the chosen message. Read MAILACTOR_API_KEY from the environment and preserve the documented safety checks.Read https://docs.mailactor.com/llms.txt before changing code. Implement a server-side workflow that creates a Mailactor inbox, reads incoming thread and message data, and prepares a reply only for the message the user selects. Use MAILACTOR_API_KEY from the environment and follow the documented pagination and idempotency rules.Your agent’s conversations are encrypted in storage, with keys unique to your organization.
Mailactor’s servers and mailbox storage are hosted in the European Union.
Structured messages and threads give your agent context, without parsing raw email.