Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.actionlayer.dev/llms.txt

Use this file to discover all available pages before exploring further.

This guide takes you from “I just signed up” to “my agent is reading a real email and submitting a draft for approval.”

1. Sign up

Create an account at app.actionlayer.dev. You start on Builder Pack — free, with a lifetime cap of 50 inbound and 50 outbound emails. Counters never reset. Builder Pack is for evaluating the integration, not for production. Upgrade to Pro (29/mo)orBusiness(29/mo) or Business (79/mo) when you’re ready.

2. Add a domain

Go to Onboarding and enter the domain your AI will send from.
We recommend registering a subdomain with ActionLayer rather than your main domain (e.g. ai.yourcompany.com or help.yourcompany.com). This keeps your existing Gmail/Outlook/Workspace email completely untouched — ActionLayer’s DNS records only apply to the subdomain. Your AI’s address would be mia@ai.yourcompany.com or help@ai.yourcompany.com. The dashboard suggests this automatically when it detects existing email records on the root domain.
ActionLayer gives you five DNS records to add at your registrar:
TypeNamePurpose
TXT_novacore.{subdomain}Domain-ownership token
TXT{subdomain}SPF — authorizes ActionLayer to send
TXT<selector>._domainkey.{subdomain}DKIM — signs outbound for deliverability
TXT_amazonses.{subdomain}AWS SES identity verification (required for inbound)
MX{subdomain}inbound-smtp.us-east-1.amazonaws.comRoutes inbound mail into your ActionLayer inbox
The dashboard shows the exact host and value to copy for each row. Once added, it polls DNS every 30 seconds and turns each row green (✓ OK) as it verifies. All five must be green before you can create an identity.
Some registrars (GoDaddy, Squarespace, Namecheap) auto-append the root domain to the Name field. ActionLayer accounts for this and shows registrar-relative names — paste exactly what the dashboard displays.

3. Create a sender identity

Go to Identities → New and pick a local part (e.g. assistant). The full address (assistant@yourcompany.com) becomes the From: your AI sends as. You can also do this via the API:
curl -X POST https://api.actionlayer.dev/v1/identities \
  -H "Authorization: Bearer $ACTIONLAYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "domain_id": "DOMAIN_ID",
    "local_part": "assistant",
    "display_name": "Mia (AI Assistant)"
  }'

4. Set up an approval channel

Edit the identity and pick how you want to be notified when your AI submits a draft:
  • Telegram — fastest. You get a chat message with Approve / Reject buttons.
  • Slack — posts a preview to a channel with action buttons.
  • Email — emails you a preview with one-click Approve / Reject links.
Save. ActionLayer auto-registers the Telegram webhook for you.

5. Get your API key

Go to Settings → API Keys → Create API Key. The key is shown exactly once and prefixed nc_live_. Copy it immediately — it can’t be retrieved later.
export ACTIONLAYER_API_KEY="nc_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

6. Verify auth — list threads

curl https://api.actionlayer.dev/v1/threads \
  -H "Authorization: Bearer $ACTIONLAYER_API_KEY"
You should see {"data": [], "total": 0, "limit": 20, "offset": 0}. Anything else means the key is wrong or the domain isn’t verified yet.

7. Send yourself a test inbound

Send a real email from your personal address to assistant@yourcompany.com. Within a few seconds it appears in your inbox:
curl https://api.actionlayer.dev/v1/threads?needs_review=true \
  -H "Authorization: Bearer $ACTIONLAYER_API_KEY"
Note the thread id and the id of the last inbound message — your agent needs both.

8. Submit a draft

curl -X POST https://api.actionlayer.dev/v1/drafts \
  -H "Authorization: Bearer $ACTIONLAYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "thread_id": "THREAD_ID",
    "identity_id": "IDENTITY_ID",
    "based_on_message_id": "LAST_MESSAGE_ID",
    "body_text": "Thanks for reaching out — I'll get back to you shortly.",
    "rationale": "Acknowledging receipt while I check the calendar."
  }'
based_on_message_id is required and powers stale detection: if a newer message arrives before send, the draft is blocked at delivery time. The response includes stale_warning: true if a newer message already exists. If so, re-read the thread and regenerate.

9. Approve in your channel — then send

Your approval channel pings you. Tap Approve. Then send:
curl -X POST https://api.actionlayer.dev/v1/drafts/DRAFT_ID/send \
  -H "Authorization: Bearer $ACTIONLAYER_API_KEY"
Returns 202 and queues delivery. If a newer inbound arrived since the draft, you get 409 stale_draft instead — reject the draft and start over.

Features overview

Plain-English tour of approval channels, rules, contacts, webhooks, and pricing.

MCP integration

Use ActionLayer as a native tool from Claude Code, OpenClaw, and Codex.

API reference

Full endpoint reference grouped by resource.

Code examples

End-to-end snippets in Python, TypeScript, and curl.