Open Source

Programmable inbound communications for AI agents

AgentOwl receives email, SMS, and voice for your tenants and delivers them as normalized webhook payloads to your AI agent stack.

How it works

Three steps to inbound AI

1

Create a tenant

Terminal
$ agentowl tenant create acme \
    --webhook https://api.acme.ai/inbound

Provision a tenant with one CLI command. Set a webhook URL where payloads will be delivered.

2

Send an email

Email
To: support@acme.agentowl.dev
From: customer@example.com
Subject: Order #1234 issue

Hi, I need help with my order...

Emails sent to *@acme.agentowl.dev are captured automatically.

3

Receive the webhook

POST /inbound
{
  "channel": "email",
  "from": "customer@example.com",
  "to": "support@acme.agentowl.dev",
  "subject": "Order #1234 issue",
  "body": "Hi, I need help..."
}

Your agent receives a normalized JSON payload via webhook. Same format for email, SMS, and voice.

Features

Everything your agents need

Inbound Email

Full SMTP server with SPF, DKIM, and DMARC validation. Receive email at any address on your tenant subdomain.

SMS & Voice

Telnyx-powered SMS and voice ingress. Provision phone numbers per tenant and receive transcribed calls.

Multi-tenant Routing

Each tenant gets its own subdomain and webhook endpoint. Route inbound traffic to separate agent stacks.

Webhook Delivery

Guaranteed delivery with exponential backoff retries. HMAC-signed payloads for verification.

Real-time Inbox

Browse messages at {tenant}.agentowl.dev. Inspect payloads, delivery status, and retry history.

CLI-first Operations

Manage tenants, inspect messages, and tail logs from the terminal. Scriptable and CI/CD-friendly.

Normalized payloads

One format, every channel

Email, SMS, and voice all arrive at your webhook in the same normalized JSON structure. No channel-specific parsing required.

Webhook Payload POST https://api.acme.ai/inbound
{
  "id": "msg_01HZ3...",
  "tenant": "acme",
  "channel": "email",
  "timestamp": "2026-03-25T14:30:00Z",
  "from": {
    "address": "customer@example.com",
    "name": "Jane Doe"
  },
  "to": "support@acme.agentowl.dev",
  "subject": "Order #1234 issue",
  "body": {
    "text": "Hi, I need help with my recent order...",
    "html": "<p>Hi, I need help...</p>"
  },
  "attachments": [],
  "headers": {
    "spf": "pass",
    "dkim": "pass",
    "dmarc": "pass"
  }
}