# Sendbaze > Transactional email and SMS API for Africa. Send from your own domain, from servers on the continent, with webhooks, templates, suppressions and a dashboard. - [Introduction](https://docs.sendbaze.com/introduction.md): Sendbaze is the email and SMS API for businesses in Africa. - [Create an API key](https://docs.sendbaze.com/get-started/create-api-key.md): Keys authenticate every request. Create one in the dashboard, store it as an environment variable, and pick the scopes it needs. - [Send before your domain is verified](https://docs.sendbaze.com/get-started/test-without-a-domain.md): Every organisation can send a limited number of live emails from onboarding@sendbaze.com to its own addresses, so you see a real delivery before any DNS work. - [Add and verify a domain](https://docs.sendbaze.com/get-started/add-domain.md): Live keys can only send email from a domain you have proved you own. Add it, publish five DNS records, and Sendbaze verifies it in minutes. - [Email types](https://docs.sendbaze.com/get-started/email-types.md): Sendbaze treats transactional and marketing email differently. Say which one you are sending with the class field. - [Send emails with Node.js](https://docs.sendbaze.com/get-started/send-with/nodejs.md): Learn how to send your first email using the Sendbaze Node.js SDK. - [Send emails with Next.js](https://docs.sendbaze.com/get-started/send-with/nextjs.md): Learn how to send your first email from a Next.js route handler or server action using the Sendbaze SDK. - [Send emails with Python](https://docs.sendbaze.com/get-started/send-with/python.md): Learn how to send your first email using the Sendbaze Python SDK, from a script, Django, Flask or FastAPI. - [Send emails with Ruby](https://docs.sendbaze.com/get-started/send-with/ruby.md): Learn how to send your first email from Ruby or Rails with the Sendbaze REST API. - [Send emails with PHP](https://docs.sendbaze.com/get-started/send-with/php.md): Learn how to send your first email from PHP or Laravel with the Sendbaze REST API. - [Send emails with Go](https://docs.sendbaze.com/get-started/send-with/go.md): Learn how to send your first email from Go with the Sendbaze REST API and net/http. - [Send emails with cURL](https://docs.sendbaze.com/get-started/send-with/curl.md): Send your first email from any shell, and see exactly what the API expects and returns. - [How verification works](https://docs.sendbaze.com/learn/domains/verification.md): What each DNS record does, how Sendbaze checks them, and what the per-record statuses mean. - [DNS guides](https://docs.sendbaze.com/learn/domains/dns-guides.md): Where to paste the records at Cloudflare, Afrihost, Xneelo, GoDaddy and Namecheap. - [Subdomain or root domain](https://docs.sendbaze.com/learn/domains/subdomains.md): Verify a subdomain for automated mail so your reputation stays separate from the mailboxes people use every day. - [Sending email](https://docs.sendbaze.com/learn/sending/emails.md): Everything the send request accepts, how recipients, headers, tags and classes work, and what happens after you get an id back. - [Templates](https://docs.sendbaze.com/learn/sending/templates.md): Write an email once with placeholders, send it with variables, and keep every version. Edit in the dashboard or through the API. - [React Email](https://docs.sendbaze.com/learn/sending/react-email.md): Write emails as React components and let the SDK render them to HTML and plain text on the way out. - [Attachments and inline images](https://docs.sendbaze.com/learn/sending/attachments.md): Attach files as base64, embed images inline with a content id, and know the limits. - [Batch sending](https://docs.sendbaze.com/learn/sending/batch.md): Send up to 1,000 emails or SMS in one request. Each item succeeds or fails on its own. - [Idempotency](https://docs.sendbaze.com/learn/sending/idempotency.md): Retry a send safely. The same Idempotency-Key returns the same id for 24 hours instead of sending twice. - [Test mode](https://docs.sendbaze.com/learn/sending/test-mode.md): Test keys validate everything, return real-looking ids and never send. Use them in development and CI. - [Tags and logs](https://docs.sendbaze.com/learn/sending/tags-and-logs.md): Tag your sends, find them again in the dashboard or with the list endpoint, and read the timeline of every message. - [Suppressions](https://docs.sendbaze.com/learn/deliverability/suppressions.md): Addresses Sendbaze will not send to, why they got there, and how to manage the list. - [Marketing email](https://docs.sendbaze.com/learn/deliverability/marketing-email.md): What Sendbaze adds to marketing email, how one-click unsubscribe works, and the rules for sending to people who opted in. - [Reputation and the complaint monitor](https://docs.sendbaze.com/learn/deliverability/reputation.md): How Sendbaze protects the shared sending pool, what pauses an organisation, and how to get unpaused. - [Webhooks](https://docs.sendbaze.com/learn/webhooks/overview.md): Delivery is asynchronous. Webhooks tell your application what happened to each message without polling. - [Event types](https://docs.sendbaze.com/learn/webhooks/events.md): Every event Sendbaze can send to a webhook endpoint and what it means. - [Verify the signature](https://docs.sendbaze.com/learn/webhooks/verify-signature.md): Every webhook request is signed with your endpoint secret. Verify it against the raw body before you trust the event. - [Retries, ordering and the delivery log](https://docs.sendbaze.com/learn/webhooks/retries.md): What happens when your endpoint is slow or down, how to replay a delivery, and how to read the log. - [SMS](https://docs.sendbaze.com/learn/sms.md): Send transactional and marketing SMS across Africa with the same API key, routed per country, with the compliance rules built in. - [SDKs](https://docs.sendbaze.com/resources/sdks.md): The official TypeScript SDK for Node.js and edge runtimes, and how to call the API from everything else. - [Errors](https://docs.sendbaze.com/errors.md): Every error shares one envelope with a stable code. This page lists each code, its HTTP status, what it means and what to do. - [Rate limits](https://docs.sendbaze.com/resources/rate-limits.md): 100 requests per second per organisation, shared across all keys, with headers that tell you where you stand. - [Plans and limits](https://docs.sendbaze.com/resources/plans.md): What each plan includes, pay-as-you-go rates, what happens when an allowance runs out, and which limits apply to every organisation. - [Changelog](https://docs.sendbaze.com/resources/changelog.md): Changes to the API, the SDKs and this documentation. Dashboard features are announced in the product, not here. - [Introduction](https://docs.sendbaze.com/api-reference/introduction.md): Base URL, conventions, headers and response codes for the Sendbaze REST API. - [Authentication](https://docs.sendbaze.com/api-reference/authentication.md): Bearer keys with scopes. Live keys send; test keys validate and return ids without sending. - [Pagination](https://docs.sendbaze.com/api-reference/pagination.md): List endpoints return newest first with an opaque cursor that stays stable while new rows arrive. - [Errors](https://docs.sendbaze.com/api-reference/errors.md): The error envelope and how to handle each class of error in code. - [Send an email](https://docs.sendbaze.com/api-reference/emails/send-an-email.md): Validates the request, stores the message, queues it and returns the id. Requires the `emails:send` scope and, for live keys, a verified sending domain, or the shared test address `onboarding@sendbaze.com`, which delivers to your organisation's own addresses only (100 emails per organisation in tota… - [Send a batch of emails](https://docs.sendbaze.com/api-reference/emails/send-a-batch-of-emails.md): Up to 1,000 emails in one request. Each item is validated and queued on its own, so a bad item fails alone. Results come back in input order. `Idempotency-Key` applies to the whole batch. Requires `emails:send`. - [Retrieve an email](https://docs.sendbaze.com/api-reference/emails/retrieve-an-email.md): The message object with its full event timeline and attachment list. Requires `read`. - [List emails](https://docs.sendbaze.com/api-reference/emails/list-emails.md): Your emails, newest first, cursor-paged. Items are the message object without `events`; retrieve one for its timeline. Pages stay stable while new email arrives. Requires `read`. - [Create a template](https://docs.sendbaze.com/api-reference/templates/create-a-template.md): Creates version 1. The response lists the `{{variables}}` found in the subject, html and text. A duplicate name is a 409. Requires `emails:send`. - [List templates](https://docs.sendbaze.com/api-reference/templates/list-templates.md): Every template of the organisation, most recently changed first. Requires `read`. - [Retrieve a template](https://docs.sendbaze.com/api-reference/templates/retrieve-a-template.md): The current content and version. Requires `read`. - [Update a template](https://docs.sendbaze.com/api-reference/templates/update-a-template.md): Any of `name`, `subject`, `html`, `text`. Setting `html` or `text` to null removes that part; one must remain. A content change creates a new version; a rename does not. Requires `emails:send`. - [Delete a template](https://docs.sendbaze.com/api-reference/templates/delete-a-template.md): Removes the template and its versions. Email already sent is unaffected; later sends naming the id fail with 422. Requires `emails:send`. - [Preview a render](https://docs.sendbaze.com/api-reference/templates/preview-a-render.md): The subject, html and text a send with these variables would produce. Placeholders you leave out are listed under `missing` and left in place, so partial previews still render. Requires `read`. - [List template versions](https://docs.sendbaze.com/api-reference/templates/list-template-versions.md): Every version, newest first, with its full content. Requires `read`. - [Add a domain](https://docs.sendbaze.com/api-reference/domains/add-a-domain.md): Creates the sending identity and returns the DNS records to publish: three DKIM CNAMEs, an MX and an SPF TXT for the custom return-path host, and a suggested DMARC record. Adding a domain you already have returns it with 200. Requires `domains:write`. - [List domains](https://docs.sendbaze.com/api-reference/domains/list-domains.md): Newest first. Statuses are re-checked every five minutes while pending and daily once verified. Requires `read`. - [Retrieve a domain](https://docs.sendbaze.com/api-reference/domains/retrieve-a-domain.md) - [Check a domain now](https://docs.sendbaze.com/api-reference/domains/check-a-domain-now.md): Asks SES and public DNS immediately instead of waiting for the next poll, and returns the updated domain. Requires `domains:write`. - [Delete a domain](https://docs.sendbaze.com/api-reference/domains/delete-a-domain.md): Removes the identity. Sends from the domain fail with `domain_not_verified` from the next request. Requires `domains:write`. - [List suppressions](https://docs.sendbaze.com/api-reference/suppressions/list-suppressions.md): Newest first, cursor-paged. Requires `read`. - [Add a suppression](https://docs.sendbaze.com/api-reference/suppressions/add-a-suppression.md): 201 when created, 200 when the address was already listed. Requires `emails:send`. - [Remove a suppression](https://docs.sendbaze.com/api-reference/suppressions/remove-a-suppression.md): Removes one of your own entries so the address can receive email again. Global hard-bounce entries cannot be removed. Requires `emails:send`. - [Create a webhook endpoint](https://docs.sendbaze.com/api-reference/webhooks/create-a-webhook-endpoint.md): The response includes `secret` exactly once; it is stored encrypted and never returned again. Requires `webhooks:write`. - [List webhook endpoints](https://docs.sendbaze.com/api-reference/webhooks/list-webhook-endpoints.md): Every endpoint of the organisation, newest first. Requires `read`. - [Retrieve a webhook endpoint](https://docs.sendbaze.com/api-reference/webhooks/retrieve-a-webhook-endpoint.md) - [Update a webhook endpoint](https://docs.sendbaze.com/api-reference/webhooks/update-a-webhook-endpoint.md): Change the URL, description, event filter or enabled flag. Requires `webhooks:write`. - [Delete a webhook endpoint](https://docs.sendbaze.com/api-reference/webhooks/delete-a-webhook-endpoint.md): Removes the endpoint and its delivery log. Requires `webhooks:write`. - [Send a test event](https://docs.sendbaze.com/api-reference/webhooks/send-a-test-event.md): Queues a `webhook.test` event to this endpoint regardless of its filter. Requires `webhooks:write`. - [List deliveries](https://docs.sendbaze.com/api-reference/webhooks/list-deliveries.md): The delivery log, newest first, cursor-paged. Requires `read`. - [Replay a delivery](https://docs.sendbaze.com/api-reference/webhooks/replay-a-delivery.md): Sends the event again as a new delivery with a fresh signature. Requires `webhooks:write`. - [Send an SMS](https://docs.sendbaze.com/api-reference/sms/send-an-sms.md): Counts segments, checks credits, applies the compliance rules for the message class, debits credits and queues the message. Marketing SMS outside 08:00 to 20:00 SAST (or on Sundays and public holidays) is held and sent at 08:00 on the next permitted day with status `scheduled`. Requires `sms:send`. - [Send a batch of SMS](https://docs.sendbaze.com/api-reference/sms/send-a-batch-of-sms.md): Up to 1,000 messages with per-item results. If credits run out part-way, the remaining items fail with `insufficient_credits` and the earlier ones still send. Requires `sms:send`. - [Retrieve an SMS](https://docs.sendbaze.com/api-reference/sms/retrieve-an-sms.md): The message with `segments`, `credits`, `scheduledAt` and the event timeline. Requires `read`. - [SMS coverage](https://docs.sendbaze.com/api-reference/sms/sms-coverage.md): Every country Sendbaze sends SMS to, with the route that carries it, the price per segment, whether the route is live (`available`) and whether your organisation has enabled it (`enabled`). Sends to a country that is not available answer `422 destination_not_supported`; to one your organisation has… - [Retrieve usage](https://docs.sendbaze.com/api-reference/usage/retrieve-usage.md): Your plan, the current billing period, how much of each allowance is used and remaining, prepaid SMS credits and domains in use. Requires `read`. ## OpenAPI Specs - [openapi](/api-reference/openapi.yaml) ## Optional - [Dashboard](https://dashboard.sendbaze.com) - [Status](https://www.sendbaze.com/status) - [Support](mailto:support@sendbaze.com) This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.