Real email inboxes for AI agents — create one, then send, receive and reply.
Project description
carlyemail
Real email inboxes for AI agents. Create one with a call, then send, receive and reply to real mail — from Gmail, Outlook, anywhere.
pip install carlyemail
Getting a key
No dashboard step. Sign-up is one unauthenticated call, which is what lets an agent create its own mailbox while it is running.
from carlyemail import CarlyEmail
signup = CarlyEmail(api_key="none").agent.sign_up(
{"human_email": "you@example.com", "username": "hello"}
)
print(signup["api_key"], signup["inbox_id"])
Confirm the six-digit code that arrives, and the account can send:
carly = CarlyEmail(api_key=signup["api_key"])
carly.agent.verify({"otp_code": "123456"})
Or from a terminal: npx carlyemail signup.
Using it
from carlyemail import CarlyEmail
carly = CarlyEmail() # reads CARLYEMAIL_API_KEY
inbox = carly.inboxes.create({"username": "hello"})
carly.messages.send(
inbox["email"],
{"to": ["you@example.com"], "subject": "Hello", "text": "From an agent."},
)
for message in carly.messages.list(inbox["email"])["messages"]:
print(message["subject"], "from", message["from"])
Replying to a message keeps the conversation together — In-Reply-To and
References are set for you, so it threads in the recipient's client instead of
starting a second exchange.
carly.messages.reply(inbox["email"], message["message_id"], {"text": "On it."})
Errors
Every error carries the message, the thing that clears it, and a documentation link. All three are on the exception.
from carlyemail import CarlyEmailError
try:
carly.inboxes.create({"username": "hello"})
except CarlyEmailError as error:
print(error.status, error.code) # 429 inbox_limit_reached
print(error.fix) # Upgrade the plan, or delete an inbox…
print(error.docs)
Resources
agent, auth, billing, inboxes, messages, threads, drafts, lists,
domains, api_keys, metrics, pods, organizations, inbox_events,
webhooks.
Every method is generated from the OpenAPI spec, so this client cannot describe an endpoint the API does not serve.
Also
- Docs — https://docs.carlyemail.com
- CLI —
npx carlyemail - MCP —
https://api.carlyemail.com/mcp, for Claude and other clients
MIT.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file carlyemail-0.1.0.tar.gz.
File metadata
- Download URL: carlyemail-0.1.0.tar.gz
- Upload date:
- Size: 8.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
711231b60d6aae5c3af99991a7251edbad174663aea0f7eaff4666b220b7fcb5
|
|
| MD5 |
e16d89005d54793346bf02176a60bfb2
|
|
| BLAKE2b-256 |
36b8d3548570de1bf6e71d55f5283c33cb05fef7a2652c2b9af8099072051231
|
File details
Details for the file carlyemail-0.1.0-py3-none-any.whl.
File metadata
- Download URL: carlyemail-0.1.0-py3-none-any.whl
- Upload date:
- Size: 9.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8849e2b51db821c43197c7805a33cdcca0510486ff998718f6dd27100bd0224d
|
|
| MD5 |
c79fd935e495f977ae9bd700cbc50b1f
|
|
| BLAKE2b-256 |
7c79c233e0b7a73d8e4929d995d8d3d7190aca224d177fda1e2a97eb8acbafb9
|