For developers

Your whole marketing stack, from code.

Stay in your editor. Send transactional email, SMS and fully-designed campaigns straight from your codebase — targeting template IDs your marketing team owns. A clean REST API, typed SDKs, and an MCP you OAuth into Cursor. No HTML in your repo. No design tickets in your sprint.

OAuth in · ship in minutes · your stack, not ours

send.tstypescript
import { GenieOS } from 'genieos'; const mg = new GenieOS(); // One call. Marketing already designed "welcome" —// you just target it by ID and pass the data.await mg.templates.send({  to: '[email protected]',  template: 'welcome',  variables: { first_name: 'Ada' },});
Your happy place

You shouldn’t have to leave the keyboard to send a great email.

You live in your editor — branches, types, a terminal in the corner. Marketing tools want to drag you into dashboards and WYSIWYG editors to wire up a send. GenieOS doesn’t. Everything is an API call away, with the design and the brand handled by the people whose job that is.

A clean handoff

You ship the trigger. They own the look.

You — the developer

Target a template ID. Pass the data. Done.

  • Call a typed endpoint from anywhere your code runs.
  • Reference templates by a stable ID — never copy HTML.
  • Pass only the variables; the contract validates the rest.
  • Idempotent by default, with webhooks for every outcome.

Them — the marketing team

Design the email. Hold the brand. Ship updates.

  • Build and edit templates in the GenieOS studio.
  • Own colours, voice, imagery and logos — learnt once.
  • Restyle a campaign without redeploying your app.
  • Declare the variables each template needs, as a contract.

You both point at the same template ID. They change the design; your code never moves.

From your codebase

Every channel, the same call.

Transactional

The mail your app owes its users.

Receipts, password resets, login codes, shipping updates. One typed call, an idempotency key so retries are safe, and a delivery webhook when it lands. The send most teams reach for first.

send-receipt.tstypescript
// Receipts, password resets, login codes —// fired the instant your app needs them.await mg.templates.send({  to: user.email,  template: 'order_confirm',  variables: {    first_name: user.firstName,    order_total: '£42.99',  },});

Creative, on-brand

Campaign emails, designed for you.

Your marketing team builds the launch email, the newsletter, the win-back — pixel-perfect and on brand — in the GenieOS studio. You never touch the HTML. You just fire it by its template ID, with the variables it expects.

fire-campaign.tstypescript
// A designed, on-brand campaign email, built by// marketing in the studio. You fire it by ID.await mg.templates.send({  to: user.email,  template: 'spring_launch_2026',  variables: { first_name: user.firstName },});

Messaging

SMS, the channel you're underusing.

Branded, consented SMS — sign-in codes, reminders, two-way replies — through the same API and the same schema contract. Preview the exact text and segment count before you ever send a character.

send-sms.shbash
# A branded SMS your marketing team authored —# you send it with one request.curl -X POST https://api.genieos.pro/v1/messaging/transactional \  -H "Authorization: Bearer $GENIEOS_API_KEY" \  -H "Idempotency-Key: auth_login_482915" \  -H "Content-Type: application/json" \  -d '{    "templateKey": "signin-code",    "to": "+447700900123",    "variables": { "code": "482915" }  }'
Genie MCP

A world-class MCP. Just OAuth in.

Let Cursor, Claude, Continue or Zed read and write GenieOS on your behalf. One-click install mints a scoped key and writes the config for you. Because schema contracts arrive as tool schemas, the agent literally can’t propose a malformed send.

Pick a blast radiusReadSendAuthorFull
~/.cursor/mcp.jsonjsonc
// ~/.cursor/mcp.json{  "mcpServers": {    "genieos": {      "url": "https://mcp.genieos.pro/v1",      "headers": {        "Authorization": "Bearer mg_mcp_..."      }    }  }}
SDKs & API

Typed, retried, idempotent.

Two officially-supported clients that mirror each other 1:1, or hit the REST API directly from any language — every example in the docs ships a curl tab.

Nodetypescript
// installnpm install genieos // then, anywhere fetch runsimport { GenieOS } from 'genieos';const mg = new GenieOS();
Pythonpython
# installpip install genieos # sync or async — your callfrom genieos import GenieOSmg = GenieOS()

Typed methods for every endpoint — templates, transactional, sequences, events, webhooks, audit.

Exponential-backoff retries on 408 / 429 / 5xx, honouring Retry-After.

Per-call idempotency keys, auto-generated when you don't supply one.

A webhook verifier that takes the raw body + signature and hands you a typed event.

Beta live — free while we’re in beta

Your first send is five minutes away.

Grab a sandbox key, send end-to-end without burning a real email, then flip to a live key when you’re ready.

No card required. Sandbox sends are free, forever.