Integrating with a coding assistant
The files an assistant reads instead of this site: llms.txt, every page as markdown, and an installable skill.
Most people wiring up email now are doing it through Cursor, Claude Code, Windsurf, or something similar. Those assistants do not read a documentation site the way you do: they fetch a URL, take what parses, and write code from it. So we publish the version they want rather than hoping they scrape the version you want.
The fastest path
Paste this into your assistant. It is one line, it names the file to read, and it is enough to get a working integration in most codebases.
Add transactional email to this project using emails.sh.
Read https://emails.sh/llms.txt first, then integrate it: install the right
client for this stack, put EMAILSSH_API_KEY in the env file, and write the
send call where the app needs it. Ask me for the API key when you need it.llms.txt
https://emails.sh/llms.txt is the whole API in one file: authentication, every endpoint, a complete send example, the error catalogue with what to do about each code, the domain verification flow, and the rate limits. It is written so that an assistant which fetches only that file can integrate emails.sh correctly without fetching anything else.
curl https://emails.sh/llms.txtEvery page as markdown
Add .md to any documentation URL and you get the same page as markdown, with the code samples in fenced blocks and no navigation around them. /docs.md is all of it in one document.
curl https://emails.sh/docs/sending.md # one page
curl https://emails.sh/docs.md # every page
curl https://emails.sh/openapi.json # OpenAPI 3.1The skill
A skill is a set of instructions your assistant loads when the task matches. Ours knows how to integrate emails.sh into a codebase: it detects the framework, picks the client, writes the key into the right env file and checks that file is gitignored, writes the send call in the right place, and reads you the DNS records at the end.
npx skills add emailssh/skillThen ask for what you want: "send a verification email when someone signs up". The skill covers Claude Code, Cursor, Copilot, Windsurf, Cline, and the rest of the clients the skills CLI supports.
Why the errors read the way they do
Every refusal carries a sentence of prose and a link, not just a code. An assistant reads that sentence and acts on it, which is the difference between an integration that finishes and one that stops with a 422 in the terminal.
{
"error": {
"code": "invalid_from_domain",
"message": "the domain acme.com is not verified on this workspace",
"next": "Verify it at https://emails.sh/dashboard/domains, or send from onboarding@emails.sh while you are testing."
}
}And the MCP server
The skill is knowledge. The MCP server is the ability to act: it lets the same assistant operate your emails.sh account, so adding a domain, reading back the DNS records, and checking why a message bounced all happen in the editor. See /docs/mcp.