Quickstart
Send your first transactional email in five minutes — curl, Node, or Python.
This walkthrough takes a brand-new GenieOS workspace and sends a transactional email from your machine. It assumes nothing — no SDK installed, no domain configured, no credit card on file. We use the sandbox key so you can run every command end-to-end without burning a real send.
Create a sandbox key
Go to app.genieos.pro → Settings → API keys, click New key, and
choose Sandbox. Copy the key (gos_test_...); it will only be shown once.
Why sandbox?
Sandbox keys exercise the entire API — validation, schema contract, webhooks, audit log — but skip the actual SMTP/connector hop. Your inbox doesn\u2019t move; your tests stay green; your billing stays at zero.
Set the key in your shell
export GENIEOS_API_KEY="gos_test_..."For long-lived setups, use a .env file or your secrets manager. Never
commit a key — see Authentication for rotation.
Send your first email
curl https://api.genieos.pro/v1/transactional/send \
-H "Authorization: Bearer $GENIEOS_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"to": "you@example.com",
"template": "welcome",
"variables": {
"first_name": "Ada"
}
}'import { GenieOS } from 'genieos';
const mg = new GenieOS();
const res = await mg.templates.send({
to: 'you@example.com',
template: 'welcome',
variables: { first_name: 'Ada' },
});
console.log(res.id);npm install genieos
# pnpm add genieos
# yarn add genieos
# bun add genieos
# deno add npm:genieos
node --env-file=.env --import tsx src/send.tsfrom genieos import GenieOS
mg = GenieOS()
res = mg.templates.send(
to="you@example.com",
template="welcome",
variables={"first_name": "Ada"},
)
print(res.id)pip install genieos
# uv add genieos
# poetry add genieos
# pdm add genieos
python send.pyInspect the result
Open app.genieos.pro → Events. You\u2019ll see a fresh
transactional.queued row with the same id the API returned. Because you
used a sandbox key, no transactional.delivered will follow — sandbox stops
at queued.
You can also tail this from the terminal:
genie events tail(See the CLI docs for installing genie.)
Subscribe a webhook
Pick any HTTPS URL you can hit — for local dev, ngrok,
cloudflared, or a
webhook.site URL all work.
curl https://api.genieos.pro/v1/webhooks \
-H "Authorization: Bearer $GENIEOS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://your-tunnel.example/genieos",
"events": ["transactional.delivered", "transactional.bounced"],
"description": "Local dev"
}'The response includes a signing_secret that begins whsec_.... Save
it: you\u2019ll need it to verify the signature on every payload. See
Webhooks for a 5-line verifier in any language.
Promote to production
When you\u2019re ready, swap the sandbox key for a gos_live_* key and point
your app at production. The two keys share the same workspace, so templates,
sequences, and webhooks you set up against sandbox automatically work in
production.
What just happened
You went from zero to a working integration in five steps. Under the hood:
- Authentication — bearer token with workspace scope; see Authentication.
- Idempotency — every mutating request carries an
Idempotency-Keyso retries are safe; see Idempotency. - Schema contract — your
welcometemplate declaredfirst_name: stringas a required variable; the API validated it before enqueuing; see Schema contract. - Events + webhooks —
transactional.queuedis the first of a small, fixed set of events; see Webhooks.
Next: pick a language SDK, install the MCP for your AI editor, or jump straight to the API reference.