Primitive
pilotctl appstore install io.pilot.primitive 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
Methods · 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.signup primitive.get_account primitive.update_account example{"spam_threshold": 10, "discard_content_on_webhook_confirmed": true} primitive.get_storage_stats primitive.get_webhook_secret primitive.rotate_webhook_secret primitive.list_domains primitive.update_domain example{"id": "<id>", "is_active": true, "spam_threshold": 10} primitive.delete_domain example{"id": "<id>"} primitive.get_inbox_status primitive.list_emails example{"cursor": "<cursor>", "limit": 20, "domain_id": "<domain_id>", "status": "<status>", "search": "search terms", "date_from": "<date_from>", "date_to": "<date_to>"} primitive.search_emails example{"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_email example{"id": "<id>"} primitive.delete_email example{"id": "<id>"} primitive.download_raw_email example{"id": "<id>", "token": "<token>"} primitive.download_attachments example{"id": "<id>", "token": "<token>"} primitive.reply_to_email example{"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_webhooks example{"id": "<id>"} primitive.discard_email_content example{"id": "<id>"} primitive.get_conversation example{"id": "<id>"} primitive.list_endpoints primitive.create_endpoint example{"kind": "http", "url": "https://example.com/webhook", "function_id": "<function_id>", "enabled": true, "domain_id": "<domain_id>", "rules": {"...": "..."}, "is_route_target": true} primitive.update_endpoint example{"id": "<id>", "url": "https://example.com/webhook", "enabled": true, "domain_id": "<domain_id>", "rules": {"...": "..."}} primitive.delete_endpoint example{"id": "<id>"} primitive.test_endpoint example{"id": "<id>"} primitive.list_filters primitive.create_filter example{"type": "whitelist", "pattern": "*@example.com", "domain_id": "<domain_id>"} primitive.update_filter example{"id": "<id>", "enabled": true} primitive.delete_filter example{"id": "<id>"} primitive.list_deliveries example{"cursor": "<cursor>", "limit": 20, "email_id": "<email_id>", "status": "<status>", "date_from": "<date_from>", "date_to": "<date_to>"} primitive.replay_delivery example{"id": "<id>"} primitive.get_send_permissions primitive.send_email example{"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_emails example{"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_email example{"id": "<id>"} primitive.get_thread example{"id": "<id>"} primitive.set_memory example{"key": "namespace/key", "value": {"any": "json"}, "scope": {"...": "..."}, "ttl_seconds": 10, "expires_at": "<expires_at>", "clear_ttl": true, "if_absent": true} primitive.get_memory example{"key": "namespace/key", "scope_type": "<scope_type>", "scope_id": "<scope_id>"} primitive.delete_memory example{"key": "namespace/key", "scope_type": "<scope_type>", "scope_id": "<scope_id>", "if_version": "<if_version>"} primitive.search_memories example{"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_registries primitive.create_registry example{"slug": "<slug>", "name": "<name>", "description": "<description>", "is_public": true, "publish_policy": "<publish_policy>"} primitive.get_registry example{"slug": "<slug>"} primitive.update_registry example{"slug": "<slug>", "name": "<name>", "description": "<description>", "is_public": true, "publish_policy": "<publish_policy>"} primitive.delete_registry example{"slug": "<slug>"} primitive.list_registry_agents example{"slug": "<slug>", "limit": 20, "cursor": "<cursor>"} primitive.publish_agent example{"slug": "<slug>", "address": "someone@example.com", "handle": "<handle>", "display_name": "<display_name>", "endpoint_id": "<endpoint_id>", "title": "<title>", "description": "<description>"} primitive.resolve_registry_handle example{"slug": "<slug>", "handle": "<handle>"} primitive.unpublish_agent example{"slug": "<slug>", "handle": "<handle>"} primitive.list_registry_requests example{"slug": "<slug>", "limit": 20} primitive.decide_registry_request example{"slug": "<slug>", "id": "<id>", "decision": "<decision>"} primitive.define_agent example{"address": "someone@example.com", "display_name": "<display_name>", "endpoint_id": "<endpoint_id>", "title": "<title>", "description": "<description>", "tags": ["..."]} primitive.get_agent example{"address": "someone@example.com"} primitive.list_templates example{"q": "search terms", "tag": "<tag>", "cursor": "<cursor>", "limit": 20} primitive.get_template example{"id": "<id>"} primitive.send_mail_batch example{"messages": ["..."]} primitive.ask example{"q": "search terms", "prefer": {"...": "..."}} primitive.get_health primitive.add_domain upgrade example{"domain": "<domain>", "confirmed": true, "outbound": true} primitive.verify_domain upgrade example{"id": "<id>"} primitive.download_domain_zone_file upgrade example{"id": "<id>", "outbound_only": true} primitive.list_wake_schedules upgrade primitive.create_wake_schedule upgrade example{"from_address": "<from_address>", "target_address": "<target_address>", "command": "<command>", "cron_expr": "<cron_expr>", "args": {"...": "..."}, "timezone": "<timezone>", "note": "<note>"} primitive.get_wake_schedule upgrade example{"id": "<id>"} primitive.update_wake_schedule upgrade example{"id": "<id>", "enabled": true, "command": "<command>", "args": {"...": "..."}, "cron_expr": "<cron_expr>", "timezone": "<timezone>", "from_address": "<from_address>"} primitive.delete_wake_schedule upgrade example{"id": "<id>"} primitive.run_wake_schedule upgrade example{"id": "<id>"} primitive.list_wake_authorizations upgrade example{"recipient_endpoint_id": "<recipient_endpoint_id>"} primitive.create_wake_authorization upgrade example{"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_authorization upgrade example{"id": "<id>", "enabled": true} primitive.delete_wake_authorization upgrade example{"id": "<id>"} primitive.list_wake_dispatches upgrade example{"limit": 20} primitive.list_routes upgrade primitive.create_route upgrade 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_routes upgrade example{"updates": ["..."]} primitive.simulate_route upgrade example{"recipient": "someone@example.com", "event_type": "<event_type>"} primitive.update_route upgrade example{"id": "<id>", "match_type": "to", "pattern": "*@example.com", "endpoint_id": "<endpoint_id>", "domain_id": "<domain_id>", "priority": 0, "enabled": true} primitive.delete_route upgrade example{"id": "<id>"} primitive.semantic_search upgrade example{"query": "search terms", "mode": "<mode>", "corpus": ["..."], "search_in": ["..."], "exclude": ["..."], "date_from": "<date_from>", "date_to": "<date_to>"} primitive.list_functions upgrade primitive.create_function upgrade example{"name": "<name>", "code": "<code>", "sourceMap": "<sourceMap>", "files": {"...": "..."}} primitive.get_function upgrade example{"id": "<id>"} primitive.update_function upgrade example{"id": "<id>", "code": "<code>", "sourceMap": "<sourceMap>", "files": {"...": "..."}} primitive.delete_function upgrade example{"id": "<id>"} primitive.test_function upgrade example{"id": "<id>", "local_part": "<local_part>"} primitive.get_function_test_run_trace upgrade example{"id": "<id>", "run_id": "<run_id>"} primitive.get_org_routing_topology upgrade primitive.get_function_routing upgrade example{"id": "<id>"} primitive.set_function_route upgrade example{"id": "<id>", "target": {"...": "..."}, "takeover": true} primitive.unset_function_route upgrade example{"id": "<id>"} primitive.list_function_secrets upgrade example{"id": "<id>"} primitive.create_function_secret upgrade example{"id": "<id>", "key": "namespace/key", "value": {"any": "json"}} primitive.set_function_secret upgrade example{"id": "<id>", "key": "namespace/key", "value": {"any": "json"}} primitive.delete_function_secret upgrade example{"id": "<id>", "key": "namespace/key"} primitive.list_org_secrets upgrade primitive.create_org_secret upgrade example{"key": "namespace/key", "value": {"any": "json"}} primitive.set_org_secret upgrade example{"key": "namespace/key", "value": {"any": "json"}} primitive.delete_org_secret upgrade example{"key": "namespace/key"} primitive.list_function_logs upgrade example{"id": "<id>", "limit": 20, "cursor": "<cursor>"} primitive.register_payout_address upgrade example{"address": "someone@example.com", "network": "<network>", "signature": "<signature>", "issued_at": "<issued_at>", "label": "<label>"} primitive.list_payout_addresses upgrade primitive.create_email_challenge upgrade example{"from": "you@your-inbox.primitive.email", "to": "someone@example.com", "amount": "<amount>", "network": "<network>", "expires_in": 10, "resource": "<resource>", "description": "<description>"} primitive.create_challenge upgrade example{"amount": "<amount>", "network": "<network>", "payer_org": "<payer_org>", "expires_in": 10, "resource": "<resource>", "description": "<description>"} primitive.get_challenge upgrade example{"id": "<id>"} primitive.pay_challenge upgrade example{"id": "<id>", "payment": {"...": "..."}} primitive.get_spend_policy upgrade primitive.update_spend_policy upgrade example{"paused": true, "max_per_payment": "<max_per_payment>", "max_per_day": "<max_per_day>", "allowlist": ["..."]} primitive.list_declined_payments upgrade primitive.install_template upgrade example{"id": "<id>", "address": "someone@example.com", "domain": "<domain>", "variables": {"...": "..."}, "secrets": {"...": "..."}} primitive.get_template_install upgrade example{"id": "<id>"} What’s New
- 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.