Documentation
Sign inGet started

Python · FastAPI

Send your first email from a FastAPI endpoint using the Bird Python SDK's async client. Three steps: install, send, run.

1. Install the SDK

Przykład kodu
pip install bird-sdk "fastapi[standard]"
Przykład kodu
# or
uv add bird-sdk "fastapi[standard]"
poetry add bird-sdk "fastapi[standard]"
Requires Python 3.10+. The import package is bird.

2. Send an email

Export your API key — the SDK reads BIRD_API_KEY from the environment and infers the region (us1 or eu1) from the bk_us1_ / bk_eu1_ prefix, so AsyncBird() needs no arguments:
Przykład kodu
export BIRD_API_KEY="bk_us1_..."
Create main.py. Construct one AsyncBird at startup and reuse it across requests — it pools connections and is safe to share across tasks:
Przykład kodu
from bird import AsyncBird, APIError
from fastapi import FastAPI, HTTPException

app = FastAPI()
client = AsyncBird()


@app.post("/send", status_code=202)
async def send() -> dict[str, str]:
    try:
        message = await client.email.send(
            from_="onboarding@messagebird.dev",
            to=["delivered@messagebird.dev"],
            subject="Hello from Bird",
            html="<p>My first Bird email.</p>",
        )
    except APIError as err:
        raise HTTPException(status_code=502, detail=str(err))
    return {"id": message.id, "status": message.status}
from_ is the Python spelling of the from field (from is a reserved word). onboarding@messagebird.dev is Bird's shared onboarding sender — no domain verification needed — and delivered@messagebird.dev is a sandbox recipient that always delivers.
Transient failures retry automatically, and a retried send reuses one idempotency key across attempts, so it never double-applies.

3. Try it

Przykład kodu
fastapi dev main.py
curl -X POST http://localhost:8000/send
Bird accepts the message with a 202 and delivers it asynchronously; your endpoint returns the em_ id and status:
Przykład kodu
{
  "id": "em_019c1930687b7bfa8a1b2c3d4e5f6789",
  "status": "accepted"
}
Fetch the message by its em_ id with await client.email.get(...) and watch the status move from accepted to delivered.

Next steps