Build call, SMS and chat features
on the Hello by Flow API.
The Hello by Flow API powers a multi-tenant cloud calling platform: external Twilio voice and SMS, free internal team chat, peer-to-peer WebRTC meetings, and an admin console for managing customer organizations. Production-ready, REST, OpenAPI 3.1.
Quickstart
Three steps to your first API call. Use the demo credentials below, or grab your own from /signup.
- 1
Authenticate
cURLcurl -X POST https://hellobyflow.com/api/auth/login \ -H "Content-Type: application/json" \ -d '{"email":"admin@hellobyflow.com","password":"admin123"}' - 2
Make your first call
cURLcurl -X POST https://hellobyflow.com/api/calls/start \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{"to_number":"+13072402137","to_name":"Hana Park","direction":"outbound"}' - 3
Send your first SMS
Python (SDK)from hellobyflow import HelloByFlowClient client = HelloByFlowClient(base_url="https://hellobyflow.com") client.login(email="you@example.com", password="your-password") client.send_sms(body={"to_number": "+13072402137", "body": "Hello!"})TypeScript (SDK)import { HelloByFlowClient } from "@hellobyflow/sdk"; const client = new HelloByFlowClient({ baseUrl: "https://hellobyflow.com" }); await client.login({ email: "you@example.com", password: "your-password" }); await client.sendSms({ body: { to_number: "+13072402137", body: "Hello!" } });
Authentication
Every protected endpoint accepts two equivalent auth schemes. Pick whichever fits your runtime — the server treats them identically.
POST /api/auth/login sets an HttpOnly access_token cookie (12h TTL) automatically — no client-side token handling needed for same-site requests.
Read access_token from the login response and send Authorization: Bearer <jwt> on every protected request. The token encodes user id, email and role.
Roles
| Role | Visibility |
|---|---|
| owner | Cross-org. Runs /api/owner/* platform console. |
| admin | Full control of own organization. |
| supervisor | Read-only across org (calls, recordings, analytics). |
| agent | Only their own contacts / calls / SMS. |
Official SDKs
Both SDKs are auto-generated from the same OpenAPI spec the server publishes — they regenerate on every backend boot, so they never drift from the API.
Python
httpx145.8 KB · 7/31/2026, 7:06:54 PM
Download .tar.gzcurl -L -o hbf-sdk-python.tar.gz https://hellobyflow.com/api/developers/sdk/python.tar.gz
tar xzf hbf-sdk-python.tar.gz
cd hbf-sdk-python && pip install -e .TypeScript
fetch95.0 KB · 7/31/2026, 7:06:54 PM
Download .tar.gzcurl -L -o hbf-sdk-typescript.tar.gz https://hellobyflow.com/api/developers/sdk/typescript.tar.gz
tar xzf hbf-sdk-typescript.tar.gz
cd hbf-sdk-typescript && npm install && npm run buildNeed a Ruby, Go, or PHP client? Feed the OpenAPI spec into openapi-generator-cli or your favorite generator — the spec has rich tags, summaries, and examples ready.
Postman Collection
One-click collection with every endpoint pre-organized by tag. Set the email and password environment variables once — the included pre-request script auto-fetches an access token before every request.
Webhooks
Hello by Flow exposes Twilio's standard callback endpoints so you can self-host PSTN routing. All webhook URLs are public (no auth) — Twilio signs requests with X-Twilio-Signature; we verify it via providers/twilio.validate_signature().
| Event | URL (POST) | Effect |
|---|---|---|
| voice | /api/twilio/voice | TwiML — rings agents (inbound) or dials out (outbound). |
| voice-inbound | /api/twilio/voice-inbound | Legacy inbound for older purchased numbers. |
| status | /api/twilio/status | Updates final status, duration, ended_at. |
| recording | /api/twilio/recording | Persists the recording URL + duration. |
| sms-inbound | /api/twilio/sms-inbound | Stores inbound SMS, auto-links contact by phone. |
Pointing your own Twilio account at these URLs? Replace hellobyflow.com with your custom subdomain.
API Reference
The full operation reference — every endpoint with examples, response schemas, and a "Try it out" button.
Errors & Status Codes
Every error uses the same JSON envelope:
{ "detail": "Admin only" }| Code | Meaning | When |
|---|---|---|
| 400 | Bad request | Validation or business rule violation. |
| 401 | Unauthorized | Missing or invalid token / cookie. |
| 403 | Forbidden | Authenticated but lacks the role/scope. |
| 404 | Not found | Resource missing or not visible to you. |
| 422 | Unprocessable Entity | Pydantic body failed schema validation. |
| 429 | Too Many Requests | Brute-force lockout — 5 failed logins / 15 min. |
| 503 | Service Unavailable | A dependency (Twilio, storage, LLM) is down. |
Rate Limits & Lockout
We don't currently enforce a global request quota. Two specific protections are in place:
- Login lockout: 5 failed attempts on the same identifier triggers a 15-minute cooldown returning
429. - Attachment uploads are capped at 25 MB per file (
413if exceeded).
Need higher limits? Email partners@hellobyflow.com.
Support
Stuck on an integration? Two ways to reach us — both real humans.