Skip to main content
Every Drin capability is reachable from one account and one key. Use the typed SDK in your language, the CLI for scripts and CI, the MCP server for agents — or talk to the REST API directly from anything that speaks HTTP.
https://mintcdn.com/drin/yBW6bGNHvna53cF7/images/lang/typescript.svg?fit=max&auto=format&n=yBW6bGNHvna53cF7&q=85&s=1eb07f5f537d32ecf74206a8a172a5f6

TypeScript / Node

@drin00/sdk — typed client with retries, cursor pagination, and webhook verification.
https://mintcdn.com/drin/yBW6bGNHvna53cF7/images/lang/python.svg?fit=max&auto=format&n=yBW6bGNHvna53cF7&q=85&s=f7484c64547760eaca1c8c0180345168

Python

pip install drin — the official Python client, same surface as the TS SDK.
https://mintcdn.com/drin/yBW6bGNHvna53cF7/images/lang/go.svg?fit=max&auto=format&n=yBW6bGNHvna53cF7&q=85&s=d63537753d936b3f29b79d960b9cb707

Go

Call the REST API with the standard net/http client — worked example below.
https://mintcdn.com/drin/yBW6bGNHvna53cF7/images/lang/ruby.svg?fit=max&auto=format&n=yBW6bGNHvna53cF7&q=85&s=aad233285f87ccff1a5c9ba97d408e1f

Ruby

Use Net::HTTP or your HTTP client of choice against the REST contract.
https://mintcdn.com/drin/yBW6bGNHvna53cF7/images/lang/php.svg?fit=max&auto=format&n=yBW6bGNHvna53cF7&q=85&s=70c89b1ff5053e5054a445231800c865

PHP

A few lines of curl or Guzzle — the same JSON body as everywhere else.

cURL / REST

No dependency. The raw HTTP contract, callable from any stack.

Install

npm install @drin00/sdk

TypeScript / Node

The official client mirrors the wire contract one-to-one, with built-in retries, async-iterator pagination, typed errors, and local webhook verification.
import { DrinClient } from "@drin00/sdk";

const drin = new DrinClient({ apiKey: process.env.DRIN_API_KEY! });

const { id } = await drin.emails.send({
  from: { email: "hello@acme.com", name: "Acme" },
  to: [{ email: "customer@example.com" }],
  subject: "Welcome aboard",
  html: "<h1>You're in</h1>",
});

Python

Same surface, Pythonic names. Published to PyPI as drin.
import os
from drin import DrinClient

drin = DrinClient(api_key=os.environ["DRIN_API_KEY"])

msg = drin.emails.send(
    from_={"email": "hello@acme.com", "name": "Acme"},
    to=[{"email": "customer@example.com"}],
    subject="Welcome aboard",
    html="<h1>You're in</h1>",
)
print(msg["id"])

Any language (REST)

No SDK? Every endpoint is a plain JSON request over HTTPS. Here’s the same send in Go, Ruby, and PHP.
body, _ := json.Marshal(map[string]any{
    "from":    "Acme <hello@acme.com>",
    "to":      "customer@example.com",
    "subject": "Welcome aboard",
    "html":    "<h1>You're in</h1>",
})
req, _ := http.NewRequest("POST", "https://api.drin.run/v1/emails", bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer "+os.Getenv("DRIN_API_KEY"))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
Account-wide keys also take a sender (your project’s external id) so requests are scoped correctly. Project-scoped keys don’t need it.