
Primitive · io.pilot.primitive
Primitive
Email for AI agents — provision a managed inbox in one call, then send, receive, reply, and search real email over one REST API
Communications · Live on the catalogue
$ pilotctl appstore install io.pilot.primitive- Version
- v1.0.0
- Methods
- 110
- Size
- 8.9 MB
- Permissions
- 5 declared
- Platforms
- macOS · Linux
About Primitive
Primitive gives an agent a real, working email identity with no SMTP credentials, no DNS, and no human in the loop. primitive.signup provisions a free account plus a managed *.primitive.email inbox in one call (no email, no code). The adapter caches the API key locally under ~/.pilot and injects it on every subsequent call automatically — the agent never sees, stores, or passes it. Call signup once; everything else authenticates as you.
## What you can do on the free plan - Send outbound mail, reply on-thread, and batch-send, with attachments and idempotency keys. - Receive at your managed inbox: list, get, search, download raw MIME + attachments, and follow conversations. Long-poll for new mail with ?since=<cursor>&wait=30. - Filter inbound mail, register webhook endpoints, and read inbox readiness. - Primitive Memories — durable JSON key-value state across turns, retries, and inbound messages.
## Auth model One step: primitive.signup. It mints a prim_ API key + a provisioned inbox, caches both locally, and the key is injected on every call thereafter. Idempotent — a host that already has a key keeps it. Any method called before signup soft-fails with exact activation instructions instead of erroring.
## Requires an upgrade Four families are marked in primitive.help under a free-plan disclaimer: Functions (hosted JavaScript on inbound mail), Wake schedules, x402 USDC payments over email (invite-only), and custom Domains. They ship implemented and callable, and return a plan/entitlement error until the account is upgraded at primitive.dev.
Plan & limits
Outbound send10 / hour · 50 / day (free 'agent' plan)API requests60 / minuteMailbox storage1024 MBWebhook endpoints1 (global) on the free planAccount creationrate-limited per IP (429 after several new accounts/day) — signup is idempotent, so reuse the cached keyRecipient scopereply-only: send to other Primitive-managed addresses + anyone who has mailed you; upgrade for any recipientMethods · 110
58 methods work on the free plan. The 52 below the divider need an account upgrade (paid plan, invite, or a verified custom domain).
primitive.signupProvision your own Primitive account and a managed *.primitive.email inbox in ONE call — no email, no code, no human stepprimitive.get_accountGet account infoprimitive.update_accountUpdate account settingsexample{"spam_threshold": 10, "discard_content_on_webhook_confirmed": true}primitive.get_storage_statsGet storage usageprimitive.get_webhook_secretGet webhook signing secretprimitive.rotate_webhook_secretRotate webhook signing secretprimitive.list_domainsList all domainsprimitive.update_domainUpdate domain settingsexample{"id": "<id>", "is_active": true, "spam_threshold": 10}primitive.delete_domainDelete a domainexample{"id": "<id>"}primitive.get_inbox_statusGet inbound inbox readinessprimitive.list_emailsList inbound emailsexample{"cursor": "<cursor>", "limit": 20, "domain_id": "<domain_id>", "status": "<status>", "search": "search terms", "date_from": "<date_from>", "date_to": "<date_to>"}primitive.search_emailsSearch inbound emailsexample{"q": "search terms", "from": "you@your-inbox.primitive.email", "to": "someone@example.com", "subject": "Subject line", "body": "<body>", "domain_id": "<domain_id>", "reply_to_sent_email_id": "<reply_to_sent_email_id>"}primitive.get_emailGet inbound email by idexample{"id": "<id>"}primitive.delete_emailDelete an emailexample{"id": "<id>"}primitive.download_raw_emailDownload raw emailexample{"id": "<id>", "token": "<token>"}primitive.download_attachmentsDownload email attachmentsexample{"id": "<id>", "token": "<token>"}primitive.reply_to_emailReply to an inbound emailexample{"id": "<id>", "body_text": "Plain-text body", "body_html": "<p>HTML body</p>", "from": "you@your-inbox.primitive.email", "wait": 30, "attachments": ["..."]}primitive.replay_email_webhooksReplay email webhooksexample{"id": "<id>"}primitive.discard_email_contentDiscard email contentexample{"id": "<id>"}primitive.get_conversationGet the conversation an email belongs toexample{"id": "<id>"}primitive.list_endpointsList webhook endpointsprimitive.create_endpointCreate a webhook endpointexample{"kind": "http", "url": "https://example.com/webhook", "function_id": "<function_id>", "enabled": true, "domain_id": "<domain_id>", "rules": {"...": "..."}, "is_route_target": true}primitive.update_endpointUpdate a webhook endpointexample{"id": "<id>", "url": "https://example.com/webhook", "enabled": true, "domain_id": "<domain_id>", "rules": {"...": "..."}}primitive.delete_endpointDelete a webhook endpointexample{"id": "<id>"}primitive.test_endpointSend a test webhookexample{"id": "<id>"}primitive.list_filtersList filter rulesprimitive.create_filterCreate a filter ruleexample{"type": "whitelist", "pattern": "*@example.com", "domain_id": "<domain_id>"}primitive.update_filterUpdate a filter ruleexample{"id": "<id>", "enabled": true}primitive.delete_filterDelete a filter ruleexample{"id": "<id>"}primitive.list_deliveriesList webhook deliveriesexample{"cursor": "<cursor>", "limit": 20, "email_id": "<email_id>", "status": "<status>", "date_from": "<date_from>", "date_to": "<date_to>"}primitive.replay_deliveryReplay a webhook deliveryexample{"id": "<id>"}primitive.get_send_permissionsList send-permission rulesprimitive.send_emailSend outbound emailexample{"from": "you@your-inbox.primitive.email", "to": "someone@example.com", "subject": "Subject line", "body_text": "Plain-text body", "body_html": "<p>HTML body</p>", "in_reply_to": "<message-id>", "references": ["..."]}primitive.list_sent_emailsList outbound sent emailsexample{"cursor": "<cursor>", "limit": 20, "status": "<status>", "request_id": "<request_id>", "idempotency_key": "<idempotency_key>", "date_from": "<date_from>", "date_to": "<date_to>"}primitive.get_sent_emailGet a sent email by idexample{"id": "<id>"}primitive.get_threadGet a conversation thread by idexample{"id": "<id>"}primitive.set_memorySet a memoryexample{"key": "namespace/key", "value": {"any": "json"}, "scope": {"...": "..."}, "ttl_seconds": 10, "expires_at": "<expires_at>", "clear_ttl": true, "if_absent": true}primitive.get_memoryGet a memoryexample{"key": "namespace/key", "scope_type": "<scope_type>", "scope_id": "<scope_id>"}primitive.delete_memoryDelete a memoryexample{"key": "namespace/key", "scope_type": "<scope_type>", "scope_id": "<scope_id>", "if_version": "<if_version>"}primitive.search_memoriesSearch memoriesexample{"prefix": "search terms", "cursor": "<cursor>", "limit": 20, "include_value": "<include_value>", "updated_after": "<updated_after>", "updated_before": "<updated_before>", "scope_type": "<scope_type>"}primitive.list_registriesList the registries you ownprimitive.create_registryCreate a registryexample{"slug": "<slug>", "name": "<name>", "description": "<description>", "is_public": true, "publish_policy": "<publish_policy>"}primitive.get_registryGet a public registry's metadataexample{"slug": "<slug>"}primitive.update_registryUpdate a registry you ownexample{"slug": "<slug>", "name": "<name>", "description": "<description>", "is_public": true, "publish_policy": "<publish_policy>"}primitive.delete_registryDelete a registry you ownexample{"slug": "<slug>"}primitive.list_registry_agentsList agents in a registryexample{"slug": "<slug>", "limit": 20, "cursor": "<cursor>"}primitive.publish_agentPublish an agent into a registryexample{"slug": "<slug>", "address": "someone@example.com", "handle": "<handle>", "display_name": "<display_name>", "endpoint_id": "<endpoint_id>", "title": "<title>", "description": "<description>"}primitive.resolve_registry_handleResolve a registry handle to its agentexample{"slug": "<slug>", "handle": "<handle>"}primitive.unpublish_agentUnpublish an agent from a registryexample{"slug": "<slug>", "handle": "<handle>"}primitive.list_registry_requestsList pending publication requestsexample{"slug": "<slug>", "limit": 20}primitive.decide_registry_requestApprove or reject a publication requestexample{"slug": "<slug>", "id": "<id>", "decision": "<decision>"}primitive.define_agentDefine an agent identityexample{"address": "someone@example.com", "display_name": "<display_name>", "endpoint_id": "<endpoint_id>", "title": "<title>", "description": "<description>", "tags": ["..."]}primitive.get_agentGet an agent's public profile by addressexample{"address": "someone@example.com"}primitive.list_templatesList function templatesexample{"q": "search terms", "tag": "<tag>", "cursor": "<cursor>", "limit": 20}primitive.get_templateGet a function templateexample{"id": "<id>"}primitive.send_mail_batchSend a batch of emails in one requestexample{"messages": ["..."]}primitive.askAsk about Primitive — NLWeb query (no authentication)example{"q": "search terms", "prefer": {"...": "..."}}primitive.get_healthService health checkRequires an upgrade · 52primitive.add_domainupgradeClaim a new domainrequires a custom domain whose DNS you control — the managed *.primitive.email inbox needs no domain setupexample{"domain": "<domain>", "confirmed": true, "outbound": true}primitive.verify_domainupgradeVerify domain ownershiprequires a custom domain whose DNS you controlexample{"id": "<id>"}primitive.download_domain_zone_fileupgradeDownload domain DNS zone filerequires a custom domain whose DNS you controlexample{"id": "<id>", "outbound_only": true}primitive.list_wake_schedulesupgradeList wake schedulesrequires a plan/entitlement upgrade — Wake scheduling is not on the free agent planprimitive.create_wake_scheduleupgradeCreate a wake schedulerequires a plan/entitlement upgrade — Wake scheduling is not on the free agent planexample{"from_address": "<from_address>", "target_address": "<target_address>", "command": "<command>", "cron_expr": "<cron_expr>", "args": {"...": "..."}, "timezone": "<timezone>", "note": "<note>"}primitive.get_wake_scheduleupgradeGet a wake schedulerequires a plan/entitlement upgrade — Wake scheduling is not on the free agent planexample{"id": "<id>"}primitive.update_wake_scheduleupgradeUpdate a wake schedulerequires a plan/entitlement upgrade — Wake scheduling is not on the free agent planexample{"id": "<id>", "enabled": true, "command": "<command>", "args": {"...": "..."}, "cron_expr": "<cron_expr>", "timezone": "<timezone>", "from_address": "<from_address>"}primitive.delete_wake_scheduleupgradeDelete a wake schedulerequires a plan/entitlement upgrade — Wake scheduling is not on the free agent planexample{"id": "<id>"}primitive.run_wake_scheduleupgradeRun a wake schedule nowrequires a plan/entitlement upgrade — Wake scheduling is not on the free agent planexample{"id": "<id>"}primitive.list_wake_authorizationsupgradeList wake authorizationsrequires a plan/entitlement upgrade — Wake scheduling is not on the free agent planexample{"recipient_endpoint_id": "<recipient_endpoint_id>"}primitive.create_wake_authorizationupgradeCreate a wake authorizationrequires a plan/entitlement upgrade — Wake scheduling is not on the free agent planexample{"recipient_endpoint_id": "<recipient_endpoint_id>", "allowed_sender_domain": "<allowed_sender_domain>", "allowed_sender_address": "<allowed_sender_address>", "allowed_commands": ["..."], "note": "<note>"}primitive.update_wake_authorizationupgradeUpdate a wake authorizationrequires a plan/entitlement upgrade — Wake scheduling is not on the free agent planexample{"id": "<id>", "enabled": true}primitive.delete_wake_authorizationupgradeDelete a wake authorizationrequires a plan/entitlement upgrade — Wake scheduling is not on the free agent planexample{"id": "<id>"}primitive.list_wake_dispatchesupgradeList recent wake dispatchesrequires a plan/entitlement upgrade — Wake scheduling is not on the free agent planexample{"limit": 20}primitive.list_routesupgradeList recipient routesrequires the recipient-routing feature — disabled on the free agent plan (the managed inbox routes to storage automatically)primitive.create_routeupgradeCreate a recipient routerequires the recipient-routing feature — disabled on the free agent plan (the managed inbox routes to storage automatically)example{"match_type": "to", "pattern": "*@example.com", "endpoint_id": "<endpoint_id>", "function_id": "<function_id>", "domain_id": "<domain_id>", "priority": 0, "enabled": true}primitive.reorder_routesupgradeReorder recipient routesrequires the recipient-routing feature — disabled on the free agent plan (the managed inbox routes to storage automatically)example{"updates": ["..."]}primitive.simulate_routeupgradeSimulate routing for a recipientrequires the recipient-routing feature — disabled on the free agent plan (the managed inbox routes to storage automatically)example{"recipient": "someone@example.com", "event_type": "<event_type>"}primitive.update_routeupgradeUpdate a recipient routerequires the recipient-routing feature — disabled on the free agent plan (the managed inbox routes to storage automatically)example{"id": "<id>", "match_type": "to", "pattern": "*@example.com", "endpoint_id": "<endpoint_id>", "domain_id": "<domain_id>", "priority": 0, "enabled": true}primitive.delete_routeupgradeDelete a recipient routerequires the recipient-routing feature — disabled on the free agent plan (the managed inbox routes to storage automatically)example{"id": "<id>"}primitive.semantic_searchupgradeSemantic search across received and sent mailrequires the Pro plan — semantic search over mail is not on the free agent planexample{"query": "search terms", "mode": "<mode>", "corpus": ["..."], "search_in": ["..."], "exclude": ["..."], "date_from": "<date_from>", "date_to": "<date_to>"}primitive.list_functionsupgradeList functionsrequires the developer plan — confirm an email at primitive.dev to upgrade; hosted Functions are not on the free agent planprimitive.create_functionupgradeDeploy a functionrequires the developer plan — confirm an email at primitive.dev to upgrade; hosted Functions are not on the free agent planexample{"name": "<name>", "code": "<code>", "sourceMap": "<sourceMap>", "files": {"...": "..."}}primitive.get_functionupgradeGet a functionrequires the developer plan — confirm an email at primitive.dev to upgrade; hosted Functions are not on the free agent planexample{"id": "<id>"}primitive.update_functionupgradeUpdate and redeploy a functionrequires the developer plan — confirm an email at primitive.dev to upgrade; hosted Functions are not on the free agent planexample{"id": "<id>", "code": "<code>", "sourceMap": "<sourceMap>", "files": {"...": "..."}}primitive.delete_functionupgradeDelete a functionrequires the developer plan — confirm an email at primitive.dev to upgrade; hosted Functions are not on the free agent planexample{"id": "<id>"}primitive.test_functionupgradeSend a test invocationrequires the developer plan — confirm an email at primitive.dev to upgrade; hosted Functions are not on the free agent planexample{"id": "<id>", "local_part": "<local_part>"}primitive.get_function_test_run_traceupgradeGet a function test run tracerequires the developer plan — confirm an email at primitive.dev to upgrade; hosted Functions are not on the free agent planexample{"id": "<id>", "run_id": "<run_id>"}primitive.get_org_routing_topologyupgradeGet the org's function routing topologyrequires the developer plan — confirm an email at primitive.dev to upgrade; hosted Functions are not on the free agent planprimitive.get_function_routingupgradeGet a function's current route bindingrequires the developer plan — confirm an email at primitive.dev to upgrade; hosted Functions are not on the free agent planexample{"id": "<id>"}primitive.set_function_routeupgradeBind a route to a functionrequires the developer plan — confirm an email at primitive.dev to upgrade; hosted Functions are not on the free agent planexample{"id": "<id>", "target": {"...": "..."}, "takeover": true}primitive.unset_function_routeupgradeUnbind any route from a functionrequires the developer plan — confirm an email at primitive.dev to upgrade; hosted Functions are not on the free agent planexample{"id": "<id>"}primitive.list_function_secretsupgradeList a function's secretsrequires the developer plan — confirm an email at primitive.dev to upgrade; hosted Functions are not on the free agent planexample{"id": "<id>"}primitive.create_function_secretupgradeCreate or update a secretrequires the developer plan — confirm an email at primitive.dev to upgrade; hosted Functions are not on the free agent planexample{"id": "<id>", "key": "namespace/key", "value": {"any": "json"}}primitive.set_function_secretupgradeSet a secret by keyrequires the developer plan — confirm an email at primitive.dev to upgrade; hosted Functions are not on the free agent planexample{"id": "<id>", "key": "namespace/key", "value": {"any": "json"}}primitive.delete_function_secretupgradeDelete a secretrequires the developer plan — confirm an email at primitive.dev to upgrade; hosted Functions are not on the free agent planexample{"id": "<id>", "key": "namespace/key"}primitive.list_org_secretsupgradeList org-level (global) secretsrequires the developer plan — confirm an email at primitive.dev to upgrade; hosted Functions are not on the free agent planprimitive.create_org_secretupgradeCreate or update an org secretrequires the developer plan — confirm an email at primitive.dev to upgrade; hosted Functions are not on the free agent planexample{"key": "namespace/key", "value": {"any": "json"}}primitive.set_org_secretupgradeSet an org secret by keyrequires the developer plan — confirm an email at primitive.dev to upgrade; hosted Functions are not on the free agent planexample{"key": "namespace/key", "value": {"any": "json"}}primitive.delete_org_secretupgradeDelete an org secretrequires the developer plan — confirm an email at primitive.dev to upgrade; hosted Functions are not on the free agent planexample{"key": "namespace/key"}primitive.list_function_logsupgradeList a function's execution logsrequires the developer plan — confirm an email at primitive.dev to upgrade; hosted Functions are not on the free agent planexample{"id": "<id>", "limit": 20, "cursor": "<cursor>"}primitive.register_payout_addressupgradeRegister a payout addressrequires the invite-only x402_payments + interactions_enabled entitlementsexample{"address": "someone@example.com", "network": "<network>", "signature": "<signature>", "issued_at": "<issued_at>", "label": "<label>"}primitive.list_payout_addressesupgradeList payout addressesrequires the invite-only x402_payments + interactions_enabled entitlementsprimitive.create_email_challengeupgradeCreate an email-native payment challengerequires the invite-only x402_payments + interactions_enabled entitlementsexample{"from": "you@your-inbox.primitive.email", "to": "someone@example.com", "amount": "<amount>", "network": "<network>", "expires_in": 10, "resource": "<resource>", "description": "<description>"}primitive.create_challengeupgradeCreate a payment challengerequires the invite-only x402_payments + interactions_enabled entitlementsexample{"amount": "<amount>", "network": "<network>", "payer_org": "<payer_org>", "expires_in": 10, "resource": "<resource>", "description": "<description>"}primitive.get_challengeupgradeGet a payment challengerequires the invite-only x402_payments + interactions_enabled entitlementsexample{"id": "<id>"}primitive.pay_challengeupgradePay a payment challengerequires the invite-only x402_payments + interactions_enabled entitlementsexample{"id": "<id>", "payment": {"...": "..."}}primitive.get_spend_policyupgradeGet your spend policyrequires the invite-only x402_payments + interactions_enabled entitlementsprimitive.update_spend_policyupgradeUpdate your spend policyrequires the invite-only x402_payments + interactions_enabled entitlementsexample{"paused": true, "max_per_payment": "<max_per_payment>", "max_per_day": "<max_per_day>", "allowlist": ["..."]}primitive.list_declined_paymentsupgradeList declined paymentsrequires the invite-only x402_payments + interactions_enabled entitlementsprimitive.install_templateupgradeInstall a function templaterequires the developer plan — installs a template as a hosted Functionexample{"id": "<id>", "address": "someone@example.com", "domain": "<domain>", "variables": {"...": "..."}, "secrets": {"...": "..."}}primitive.get_template_installupgradeGet template install statusrequires the developer plan — tracks a hosted Function installexample{"id": "<id>"}What’s New
v1.0.0Latest—- Initial release — Primitive's email API for agents over one byo HTTPS app: 110 methods + primitive.help.
- Emailless one-call signup (primitive.signup): mints a prim_ API key + a managed *.primitive.email inbox with no email or code; the key is cached locally and injected on every call automatically.
- Full email lifecycle on the free plan: send/reply/batch, inbound list/get/search/raw/attachments/conversations, threads, filters, webhook endpoints, and durable Memories.
- Functions, Wake schedules, x402 payments, and custom domains are implemented and marked gated until the account is upgraded.
Platform Compatibility
macOSApple Silicon4.6 MBSupportedmacOSIntel5.0 MBSupportedLinuxarm644.8 MBSupportedLinuxamd645.2 MBSupportedMore in Communications
All apps
DialA complete phone identity for your agent: calls, SMS and iMessage on a real US number.
Dead Simple EmailAn email identity your agent provisions for itself, then uses to send, receive and read its own signup codes.
AgentPhoneA real phone number for your agent: voice calls, SMS/iMessage, and conversations over REST.