For Agents
Give your agent a working inbox: send mail, reply in-thread, wait for the reply to a sent message, and search received and sent mail by keyword or meaning. Inbound email can trigger webhooks or deployed functions.
Use for: I need to send an email from my agent's own address, Reply to the latest inbound email in this thread, Check whether a reply has arrived for the email I sent, Search my inbox for messages from billing@acme.com with attachments
Not supported: Does not run marketing campaigns, manage mailing list subscribers, or connect to existing Gmail or Outlook mailboxes. Use for sending, receiving, and searching email at your own Primitive domains only.
The Primitive API gives AI agents their own email: it receives mail at your verified domains, sends outbound messages and threaded replies, and pushes each inbound email to webhook endpoints or serverless functions. Inbound mail can be listed, searched with structured filters such as from, subject, has_attachment, and spam_score_lt, or ranked with keyword, semantic, or hybrid semantic search across received and sent mail. Around that core it manages domain claims and DNS verification, recipient routes, filter rules, wake schedules, scheduled and repeating sends, contacts and contact policy, agent connections and registries, and x402 payment challenges.
Install Jentic One Beta
Jentic One is a self-hosted execution layer for AI agents. It lets your agent call the Primitive API, or any other public or private API you need. You set the rules, the agent never sees your credentials, and every call is logged.
Two steps, two machines. Install the instance in a safe environment, then register your agent from wherever it runs.
Step 1: Jentic One Host machine
# On the machine that will host your Jentic One instance:
curl -fsSL "https://jentic.com/install.sh?src=apis&api=%2Fapis%2Fprimitive.dev%2Fprimitive" | shStep 2: Agent machine
# On the machine where your agent runs (keep this separate from the instance):
curl -fsSL "https://jentic.com/install.sh?src=apis&api=%2Fapis%2Fprimitive.dev%2Fprimitive" | sh
jentic register # connects your agent to your Jentic One instanceJentic One is in public beta. The setup above keeps your agent separate from the instance, which is what you want before using real credentials: an agent running as the same OS user as Jentic One can read its stored keys directly. Just evaluating? A single local install is fine to start. See the secure deployment guide for the tiers.
What an agent can do with Primitive API.
Send outbound email with from, to, subject, body_text or body_html, attachments, and an optional scheduled_at time
Reply to an inbound email with threading headers and the Re: subject derived server-side
Wait for the first threaded reply to a sent email instead of polling the inbox
Search inbound mail by from, to, subject, body, has_attachment, and spam score, or run keyword, semantic, or hybrid search across received and sent mail
Claim a domain, publish the returned dns_records, verify ownership, and run on-demand DNS health checks
Deliver inbound email to webhook endpoints with signed Primitive-Signature headers, replay deliveries, or pull events without a public URL
Deploy functions that run on inbound mail, bind them to recipient routes, and read their execution logs
Patterns agents use Primitive API for, with concrete tasks.
★ Agent with its own inbox
An AI agent that coordinates with people by email needs to send, wait, and read replies without a human mail client. Through Jentic the agent searches for 'send an email', calls sendEmail with from, to, and subject, then calls awaitReply on the sent email id to long-poll for the first threaded response, and reads it with getEmailReadable. The conversation stays threaded because Primitive derives In-Reply-To and References server-side when the agent replies.
POST /send-mail with from 'agent@example.dev', to 'jane@acme.com', and subject 'Invoice question', then GET /sent-emails/{id}/reply with wait true and summarise the reply
Inbound email triggers
A support or operations workflow can react to every message that arrives at a domain. createEndpoint registers a webhook URL, optionally with rules, and each delivery is signed with a Primitive-Signature header carrying an HMAC-SHA256 of the timestamp and raw body. Failed deliveries show up in listDeliveries and can be replayed, and pullWebhookEvent lets a local process receive events with no public endpoint at all.
POST /endpoints with url 'https://example.dev/hooks/mail' and the target domain_id, then POST /endpoints/{id}/test to send a test webhook
Searching mail history
An agent asked what a vendor said about a renewal can search instead of scanning every message. GET /emails/search filters inbound mail by from, subject, date_from, date_to, has_attachment, and spam_score_lt, while POST /semantic-search ranks both received and sent mail with keyword, semantic, or hybrid mode, so the agent finds the relevant thread even when the wording differs.
POST /semantic-search with query 'contract renewal terms' and mode 'hybrid', then GET /threads/{id} for the top result
Custom domain setup
Before an agent can send and receive at a branded address, the domain has to be claimed and verified. addDomain returns the exact dns_records to publish, downloadDomainZoneFile produces an importable zone file, and verifyDomain plus checkDomainDns confirm the records are live, so setup can be scripted end to end.
POST /domains with domain 'mail.example.dev', publish the returned dns_records, then POST /domains/{id}/verify and POST /domains/{id}/dns/check
203 endpoints — the primitive api gives ai agents their own email: it receives mail at your verified domains, sends outbound messages and threaded replies, and pushes each inbound email to webhook endpoints or serverless functions.
METHOD
PATH
DESCRIPTION
/send-mail
Send outbound email
/emails/{id}/reply
Reply to an inbound email
/sent-emails/{id}/reply
Get or wait for the reply to a sent email
/emails/search
Search inbound emails
/semantic-search
Semantic search across received and sent mail
/domains
Claim a new domain
/endpoints
Create a webhook endpoint
/functions
Deploy a function
/send-mail
Send outbound email
/emails/{id}/reply
Reply to an inbound email
/sent-emails/{id}/reply
Get or wait for the reply to a sent email
/emails/search
Search inbound emails
/semantic-search
Semantic search across received and sent mail
/domains
Claim a new domain
/endpoints
Create a webhook endpoint
/functions
Deploy a function
This API is usable in Jentic One now. Its AI-readiness score against Jentic's framework shows where it stands today and where improvements would make it even easier for agents to use.
Base layer of spec validity and structural soundness.
Aggregated quality score from linter diagnostics, weighted by severity.
Percentage of `$ref` references that resolve successfully.
Checks whether the API description parses successfully and conforms to its declared specification (e.g., OpenAPI).
Structural correctness score based on schema issues using logarithmic dampening.
Clarity, completeness, and ingestion readiness for developers and tooling.
How richly the API is illustrated with examples.
Percentage of examples that conform to their schemas.
Percentage of operations with complete response definitions (success, client error, server error).
Health of API ingestion, bundling, and resolution within Jentic pipelines.
Semantic breadth, depth, and agent comprehension for AI systems.
Coverage of descriptions across API elements.
Coverage of RFC 9457 Problem Details for error responses.
Coverage, uniqueness, and casing consistency of operationIds for AI inference.
Coverage of summaries across operations/tags/info.
Functional utility, complexity comfort, and AI orchestration readiness.
Agent comfort level based on API operational and structural complexity.
Trust, risk posture, and security compliance.
Average quality of security schemes based on authentication method strength (weakest link for OAuth2).
Findability, semantic richness, and reasoning readiness.
Clarity and depth of descriptions across API elements.
Score it yourself
Every API in the directory is allowlisted, so you can re-score it with no key required.
npx @jentic/api-scorecard-cli score <openapi-url>What agents get from Jentic-routed access to this vendor.
Setup
Wiring Primitive by hand means handling three bearer token types, cursor pagination with a success, data, and meta envelope, Idempotency-Key headers on writes, and HMAC verification of signed webhook deliveries. Through Jentic you install once, import Primitive from the API Directory, store the token once, and your agent calls it.
Permission scoping
Primitive puts resource ids in the URL path (/domains/{id}, /emails/{id}, /functions/{id}), so a rule can pin your agent to a specific domain or function for those operations. Outbound recipients travel in the /send-mail request body, so for sending, rules bound which operations your agent may call, not who it writes to. You choose the operations it may call, so destructive ones like deleteDomain or rotateWebhookSecret are not included unless you add them.
Credential isolation
Your Primitive token is stored once, encrypted, by your own Jentic One instance and injected into the Authorization header at execution time. It never enters the agent's prompt, logs, or context.
Intent-based discovery
Agents search Jentic by intent such as 'send an email' or 'wait for a reply', and Jentic returns the matching Primitive operation with its input schema, so the agent finds sendEmail or awaitReply among the full surface without loading every operation up front.
Alternatives and complements available in the Jentic catalogue.
Specific to using Primitive API through Jentic.
What authentication does the Primitive API use?
Per its OpenAPI spec, the Primitive API authenticates with a bearer token in the Authorization header: an organization API key (prim_), an OAuth access token (prim_oat_), or an address-bound agent connection key (pconn_). Raw email and attachment archive downloads also accept a signed token query parameter supplied in webhook payloads. Signup, CLI login, demo, discovery, templates, public notes, and health are public endpoints that need no credential. Through Jentic the token is held by your own instance and attached at call time.
Can my agent wait for a reply to an email it sent with the Primitive API?
Yes. After POST /send-mail, call GET /sent-emails/{id}/reply with the sent email id. It returns the first threaded inbound reply, keyed by the inbound email's reply_to_sent_email_id, and with wait set it long-polls until a reply arrives or wait_timeout_ms passes, so the agent does not need its own search loop.
What are the rate limits for the Primitive API?
The OpenAPI spec states that the v1 API allows 3000 requests per 60 seconds per Developer, Power, or Platinum organization, shared across API keys, OAuth tokens, and agent keys, and 120 requests per 60 seconds for Agent-tier organizations. A rejected request gets HTTP 429 with a Retry-After header, and outbound sends carry additional limits of their own.
Is there a Primitive MCP server?
You don't need an MCP server to give your agent Primitive. Jentic connects it directly from the API Directory: import it, store your token once, and your agent discovers the send, reply, and search operations on demand instead of loading the full tool list into its context.
How do I send an email through Jentic with the Primitive API?
Search Jentic for 'send an email', load the sendEmail operation, and execute it with from, to, and subject plus body_text or body_html. Set wait to true if the agent should see the first SMTP delivery outcome before continuing. To run it on your own infrastructure, install Jentic One from its GitHub repo.
Can I limit what my agent is allowed to do with the Primitive API?
Yes. Write a rule that allows only searchEmails, getEmailReadable, and replyToEmail, so the agent can read and answer inbound mail but cannot send new messages to arbitrary recipients, rotate the webhook secret, or delete domains. Every call it makes is logged for review.
How do I verify Primitive webhook signatures?
Each delivery carries a Primitive-Signature header of the form t=<unix-seconds>,v1=<hex>. Compute an HMAC-SHA256 over the timestamp, a period, and the raw request body using your account webhook secret, and compare it to the v1 value. GET /account/webhook-secret returns the secret and POST /account/webhook-secret/rotate replaces it.
GET STARTED