Developer documentation

Observe first. Send safely.

AllStackd runs on your Amazon SES account. You never paste SES SMTP passwords or long-lived AWS access keys into AllStackd. You install a reviewable CloudFormation stack that creates a scoped IAM role AllStackd can assume with a unique External ID.

Machine-readable reference: /openapi.json. Examples use the placeholder $ALLSTACKD_API_KEY — never commit real keys. IAM permission lists: /security.

Quick start

First 10 minutes

  1. Create an account and start the 14-day trial (no card).
  2. Create an AWS connection in Settings and download the CloudFormation template.
  3. Create the stack in your SES region, then paste RoleArn, SnsTopicArn, and ConfigurationSetName.
  4. Verify the connection and confirm the SNS subscription for SES events.
  5. Verify a sender domain (DKIM / SPF / DMARC) on Domains.
  6. Create a project, assign the connection, mint an as_ API key, and send a test email.
Before you send

1. Prepare Amazon SES in your AWS account

AllStackd does not host mail and does not issue “SES API keys.” Delivery charge stays on your AWS bill. Complete these steps in the AWS console (or equivalent IAM/SES APIs) before Control-mode traffic.

  1. Sign in to an AWS account you control and pick the region where you will send (for example eu-central-1 or us-east-1). SES quotas and sandbox status are per region.
  2. Open Amazon SES → create and verify a domain identity you own. Add the Easy DKIM CNAME records (and SPF / DMARC as recommended) at your DNS host. Do not use Gmail, Outlook, iCloud, or Yahoo as the sending domain.
  3. Check sandbox vs production. New SES accounts start in the SES sandbox: you can only mail verified recipients (and the mailbox simulator), with low daily quotas. When you are ready for real users, request production access from the SES Account dashboard (mail type: usually Transactional for product email). AWS reviews the request; AllStackd cannot approve it for you.
  4. Connect AllStackd with CloudFormation — not access keys. In AllStackd → Settings, create a connection, download the generated template, then in AWS CloudFormation choose Create stack → With new resources → Upload a template file. After the stack finishes, copy the RoleArn, SnsTopicArn, and ConfigurationSetName outputs back into AllStackd and verify. The stack embeds a unique External ID so only AllStackd’s runtime role can assume your role.
  5. Confirm the SNS subscription for SES events if AWS emails a confirmation link. AllStackd verifies signed SNS messages against the topic ARN stored on the connection.

Do not create IAM user access keys or SES SMTP credentials for AllStackd. If a guide asks you to “generate SES keys,” stop — that path is for other products. AllStackd’s path is role assumption only.

Support

Troubleshooting

CloudFormation stack rolled back
Open the failed stack events in AWS. Common causes: missing IAM permissions to create roles/topics, or an invalid SNS HTTPS endpoint. Fix the cause, delete the failed stack, and create again from a fresh AllStackd template download.
AssumeRole failed / External ID validation failed
Confirm you pasted the RoleArn from this connection’s stack, not another environment. The trust policy must name AllStackd’s runtime role and the exact External ID from Settings. Re-download the template if you recreated the connection.
SNS subscription pending
Confirm the subscription in the SNS console or via the AWS confirmation email. Until it is Confirmed, SES events will not reach AllStackd and health findings stay empty.
Still in the SES sandbox
You can only mail verified recipients until AWS approves production access. Request it from the SES Account dashboard; AllStackd cannot approve the request for you.
DKIM pending or drift
Publish the three Easy DKIM CNAMEs at your DNS host and wait for SES to show Successful. Drift findings mean a CNAME was removed or changed — restore the records SES expects.
Control mode unavailable
The connection must be active in Control permissions mode, the project must be assigned that connection, the sender domain must be verified, and the workspace needs an active trial or paid plan.
Email stuck in queue
Check Overview for dead delivery jobs and Settings for AWS connection errors. Quota, suppression, or AssumeRole failures move jobs to dead letter rather than silent drop.

2. Configure a project

After the connection is active, open Projects, assign that exact AWS connection, and switch the project to Control when you want AllStackd to queue sends. Add the sender domain in Domains (or import the SES identity), wait for DKIM / SPF / DMARC health, then create a scoped API key. Secrets use the as_ prefix and are shown once. New keys default to email:send, template:read, and template:write — choose narrower scopes when minting a key for MCP or read-only tools.

Authorization: Bearer as_...
Idempotency-Key: a-stable-operation-id
Templates

3. Publish a reusable message

Create templates in the dashboard from starters (welcome, verify-email, password-reset, magic-link, receipt) or raw HTML. Each template has a stable alias. Drafts cannot be sent — publish first. Use {{variables}} in subject and body; AllStackd fills them at send time so copy can change without a deploy.

  • GET /api/v1/templates — list
  • POST /api/v1/templates — create (HTML or starterId)
  • GET/PATCH /api/v1/templates/:idOrAlias — read / update
  • POST .../:idOrAlias?action=publish|preview — publish or preview
curl -X POST https://allstackd.com/api/v1/templates \
  -H "Authorization: Bearer $ALLSTACKD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "starterId":"welcome", "publish":true }'
POST /api/v1/emails

4. Queue a transactional email

Pass either inline subject + html/text, or a published template reference. Prefer template: { alias, variables } so content lives in AllStackd. The API validates subscription, plan, project routing, AWS readiness, verified sender domain, suppressions, quota, and idempotency before storing encrypted content and creating a durable job. Up to 50 recipients per request.

curl -X POST https://allstackd.com/api/v1/emails \
  -H "Authorization: Bearer $ALLSTACKD_API_KEY" \
  -H "Idempotency-Key: welcome-user-42" \
  -H "Content-Type: application/json" \
  -d '{
    "from":"hello@your-verified-domain.com",
    "to":["customer@example.com"],
    "template":{
      "alias":"welcome",
      "variables":{
        "first_name":"Ada",
        "product_name":"Acme",
        "action_url":"https://app.acme.com/start"
      }
    }
  }'
curl -X POST https://allstackd.com/api/v1/emails \
  -H "Authorization: Bearer $ALLSTACKD_API_KEY" \
  -H "Idempotency-Key: order-123-welcome" \
  -H "Content-Type: application/json" \
  -d '{
    "from":"hello@your-verified-domain.com",
    "to":["customer@example.com"],
    "subject":"Welcome",
    "html":"<p>Welcome!</p>",
    "text":"Welcome!"
  }'
TypeScript SDK

5. Send from application code

Copy sdk/typescript/allstackd.ts into your app. Helpers cover send, message status, template CRUD, publish, and preview. Always pass an idempotency key for retries.

import { AllStackd } from "./allstackd";

const allstackd = new AllStackd({ apiKey: process.env.ALLSTACKD_API_KEY! });

await allstackd.createTemplate({ starterId: "welcome", publish: true });

await allstackd.send({
  from: "Acme <hello@your-verified-domain.com>",
  to: ["customer@example.com"],
  template: {
    alias: "welcome",
    variables: {
      first_name: "Ada",
      product_name: "Acme",
      action_url: "https://app.acme.com/start",
    },
  },
}, { idempotencyKey: "welcome-user-42" });
GET /api/v1/emails/:id

6. Inspect status

A 202 means queued, not delivered. Poll the returned message ID or configure a signed event webhook. Raw bodies never appear in status responses and are removed no later than 24 hours.

{
  "id": "...",
  "status": "queued | submitted | delivered | bounced | complained | failed | unconfirmed",
  "recipients": [{ "status": "delivered" }]
}

Signed customer webhooks

Settings can create public HTTPS endpoints for send, delivery, bounce, complaint, and reject events. Verify allstackd-signature as HMAC-SHA256 over timestamp + "." + rawBody, compare in constant time, reject timestamps older than five minutes, and deduplicate on allstackd-event-id.

Errors and retries

202

Durably queued

400

Invalid request

401 / 403

Key or entitlement denied

409 / 429 / 503

Conflict, quota, or dependency

Draft templates return 409 template_not_published. Retry network errors and 5xx responses with the same Idempotency-Key. Do not automatically retry validation, authentication, suppression, or plan-limit errors. If a Control send times out after the SES request may have been accepted, the message status becomes unconfirmed and AllStackd will not resubmit it. Confirm delivery before sending a replacement with a new idempotency key; a later SES event can still advance the status.

MCP beta

API-key MCP: https://allstackd.com/api/mcp (Bearer as_…). OAuth MCP for ChatGPT / Codex: https://allstackd.com/mcp (Clerk sign-in). Claude Connectors Directory listing is paused (requires Anthropic Team/Enterprise).

ToolPurposeScope
list_projectsList the API key projectany
list_domainsList sender domainsany
list_templatesList draft and published templatestemplate:read or email:send
create_templateCreate from HTML or starterIdtemplate:write
update_templateUpdate by id or aliastemplate:write
publish_templateMake a draft sendabletemplate:write
preview_templateRender with sample variablestemplate:read or email:send
get_usageDaily sending usageanalytics:read
send_emailQueue a send; supports template.aliasemail:send
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "send_email",
    "arguments": {
      "from": "hello@your-verified-domain.com",
      "to": ["customer@example.com"],
      "template": {
        "alias": "welcome",
        "variables": { "first_name": "Ada", "product_name": "Acme", "action_url": "https://app.acme.com/start" }
      }
    }
  }
}

Agent plugins

The connector pack (manifests + skill + remote MCP client config) is public at github.com/kondasviktor/allstackd-plugin. It is not the AllStackd product source. Set ALLSTACKD_API_KEY after install.

SurfaceStatusHow to use
CursorLive on cursor.directorycursor.directory/plugins/allstackd or API-key MCP
Grok BuildSubmitted to xAI plugin marketplacegrok mcp add --transport http allstackd https://allstackd.com/api/mcp until the catalog PR merges
Antigravity CLIInstall from path (no public catalog)Clone the plugin repo, then agy plugin install …/antigravity
ChatGPT / CodexOAuth MCP ready — submit via OpenAI plugin portalhttps://allstackd.com/mcp
Claude ConnectorsPausedDirectory portal requires Anthropic Team/Enterprise

Need onboarding help? Email support@allstackd.com.