
Flodesk spent most of its life without a usable public API, and that reputation is out of date. The developer API was rebuilt and relaunched in January 2026 at https://api.flodesk.com/v1, included on every paid plan at no extra cost, alongside a first-party Model Context Protocol server that makes Flodesk one of the few design-first ESPs with native AI-agent access. The catch is what it does not do: no send endpoint, no transactional surface and no SMTP relay anywhere in the product, so the API manages people and automations rather than messages.
The practical question is therefore not “does Flodesk have an API” but “can it do the thing I need”. Subscriber sync, segmentation, workflow entry, custom fields and webhooks: yes, cleanly. Receipts, password resets and app notifications: no, you will need a companion such as Postmark or Amazon SES on the same domain.
Model Context Protocol lets an AI client such as Claude, ChatGPT or Gemini call a vendor’s tools directly instead of scraping a UI or being handed an API key in a prompt. For most marketing ESPs the 2026 answer is still “community wrappers only”. Flodesk is an exception.
Flodesk operates an official remote MCP server at https://mcp.flodesk.com/mcp, included for members at no extra cost. Setup takes roughly 2 minutes-copy the per-account connector URL from app.flodesk.com/account/integrations/mcp, paste it into your AI client’s connector settings and authorize with a Flodesk login rather than a pasted key. The tool surface is query oriented: open and click rates, subscriber inquiries, segmentation, form and checkout performance, workflow results, list management. Full account management through AI, creating and sending emails, workflows, forms and checkouts, is planned but not shipped.
One official server plus wrappers. The wrappers matter because they expose write actions the first-party server does not yet cover.
First-party remote server at https://mcp.flodesk.com/mcp. Per-account connector URL, login authorization, no API key handling. Covers analytics, subscribers, segments, forms, checkouts and workflow results.
Exposes Flodesk’s Zapier actions to agents: create or update subscriber, add or remove from segment or workflow, unsubscribe, find by email. Served from mcp.zapier.com, the practical route to agent-driven writes today.
Commercial MCP endpoint wrapping Flodesk actions through viaSocket’s integration layer. Truto offers a comparable paid connector. Useful if you already standardise on either.
Why buyers should care. MCP availability is becoming a real procurement signal. A native server means an analyst can ask which of last month’s campaigns beat a given open rate, and why, without an API key, a script or a CSV export. Two caveats: it is read-oriented, so it reports rather than acts, and it inherits the product’s hard limit, no amount of AI access creates a send endpoint that does not exist. Compare Mailchimp, Kit and MailerLite if agent-driven campaign creation is the requirement.
The v1 API is a small, conventional REST surface: JSON in, JSON out, HTTPS only, five resources, offset pagination. Nothing exotic to learn and nothing to work around, no GraphQL layer, no partial-response syntax, no bulk job queue beyond one batch endpoint.
| Base URL | https://api.flodesk.com/v1 |
| Version | 1.0.0, path-versioned as /v1 CURRENT |
| Transport | JSON over SSL (HTTPS) only, no plaintext, no SMTP |
| Response format | JSON object with a meta block and a data array on list calls |
| Pagination | Query params page (default 1) and per_page (default 20, max 100) |
| Lookup key | Flodesk ID or email address, interchangeably, in {id_or_email} paths |
| Bulk operations | POST /v1/subscribers/batch-up to 50 subscribers per call |
| Rate-limit headers | X-Fd-RateLimit-Limit and X-Fd-RateLimit-Remaining on every response |
| Webhook events | 3 documented events, managed through /v1/webhooks |
| Send endpoint | None. Sending is triggered by workflow entry, not by an API call |
| Plan requirement | Paid members only. API keys are unavailable on trial and free accounts |
Five resources carry the whole surface: subscribers (upsert, read, unsubscribe), segments (the list-equivalent, plus membership), workflows (list automations, push subscribers into them), custom fields and webhooks (full CRUD)-24 documented resource-and-method pairs. The mental model matters more than the count: a Flodesk segment is closer to a tag than a list, and an email only leaves the building when a subscriber crosses into a workflow you built in the visual editor. Your integration’s job is to get the right person into the right segment or workflow with the right custom fields attached.
Two schemes, split by who owns the account you call on behalf of. Your own account: API key. Other people’s accounts, from a product you ship: OAuth2 plus Flodesk’s approval.
The private-integration path. Create a key in account settings, then send it as the username of an HTTP Basic credential with an empty password. The trailing colon is not optional, and omitting it is the most common cause of a 401 on a first request: the encoded value is base64("YOUR_API_KEY:"). Keys are shown exactly once at creation with no retrieval screen, so store yours in a secret manager before closing the dialog.
Partner integrations use a standard authorization-code flow: authorize at https://api.flodesk.com/oauth2/authorize, exchange at https://api.flodesk.com/oauth2/token, resolve identity with GET /oauth2/userinfo. There is a single scope, all, granting full API access, no read-only variant exists, so least-privilege is not achievable through scoping. Refresh tokens are single-use: every refresh issues a new one and invalidates the old.
Two gates before you write a line of code. API keys are paid-plan only, so you cannot prototype against a free workspace. And OAuth2 partner access is not self-serve: you must be approved through Flodesk’s Partner Integration Request Form before your client credentials work. Budget calendar time if you are shipping a public connector.
Two published limits, and the headline number is not the one that bites.
| Limit | Value | Notes |
|---|---|---|
| Default request rate | 100 requests / minute | Applies across all endpoints, per account |
| Batch endpoint rate | 20 requests / minute | POST /v1/subscribers/batch only, a separate, stricter bucket |
| Batch payload size | 50 subscribers / request | Hard cap on the array length |
| Effective import ceiling | 1,000 subscribers / minute | 20 calls × 50 records |
| Page size | 100 records / page | per_page maximum on all list endpoints |
| Over-limit response | HTTP 429 | Watch X-Fd-RateLimit-Remaining before you get there |
The workaround is planning, not engineering. A 100,000-contact migration at the batch ceiling needs at least 100 minutes of continuous, correctly-throttled calls before retries, so run it as a resumable background job with a checkpoint, not a request-scoped script that dies at the load balancer timeout. Read X-Fd-RateLimit-Remaining and slow down as it drops rather than sprinting into 429s. For one-off list moves, Flodesk’s CSV import beats any API path.
There are none. Flodesk publishes no first-party client library in any language, maintains no public SDK repositories, and documents the API entirely with curl examples. This is a confirmed absence, not a documentation gap, and it says where the API sits on the roadmap: shipped and supported, not courted. The upside is that auth is plain HTTP Basic and payloads are flat JSON, so a working client is roughly 20 lines.
| Language | Package | Install | Repo |
|---|---|---|---|
| Python | None published | pip install requests | developers.flodesk.com |
| Node.js | None published | Built-in fetch on Node 18+ | developers.flodesk.com |
| PHP | None published | composer require guzzlehttp/guzzle | developers.flodesk.com |
| Ruby | None published | gem install faraday | developers.flodesk.com |
| Go | None published | Standard library net/http | developers.flodesk.com |
Plan for the absence, not around it. With no SDK there is no typed subscriber model, no version pinning and no upstream fix when a field changes shape. Write a thin wrapper with one place that builds the Basic header and one that handles 429 and 5xx, contract-test it in CI, and treat every response field as optional until you have seen it. Teams needing a maintained client library are better served by MailerLite or Mailchimp.
No maintained, independently-published Flodesk client library could be verified against an official source as of August 2026. What exists instead are platform-level clients: the official Zapier app (3 triggers, 7 actions), the official Make app (10 modules, one of them a generic authenticated API call that reaches endpoints the others do not), Pabbly Connect and Pipedream. Those are the closest thing to an SDK with someone else maintaining the auth layer.
The fifteen below are the pairs an integration actually calls; the full reference is at developers.flodesk.com. Note what is absent and stays absent: anything named /messages, /send or /transactional.
| Resource | Methods | Description |
|---|---|---|
| Subscribers /v1/subscribers | GET | List subscribers, paginated, filterable by subscription status. |
| Subscribers /v1/subscribers | POST | Create a subscriber, or update one matched on email. Upsert semantics. |
| Subscribers /v1/subscribers/batch | POST | Batch upsert up to 50 subscribers; 20 req/min bucket. |
| Subscribers /v1/subscribers/{id_or_email} | GET | Retrieve one subscriber by Flodesk ID or email address. |
| Subscribers /v1/subscribers/{id_or_email}/segments | POST | Add a subscriber to one or more segments. |
| Subscribers /v1/subscribers/{id_or_email}/segments | DELETE | Remove a subscriber from one or more segments. |
| Subscribers /v1/subscribers/{id_or_email}/unsubscribe | POST | Unsubscribe from all mailings; returns 204. |
| Segments /v1/segments | GET, POST | List segments (paginated) or create one. |
| Segments /v1/segments/{id} | GET | Retrieve a single segment by ID. |
| Segments /v1/segments/colors | GET | Colour values accepted when creating a segment. |
| Workflows /v1/workflows | GET | List automation workflows, filterable by status. |
| Workflows /v1/workflows/{workflow_id}/subscribers | POST | Push a subscriber into a workflow, triggering its sequence. The closest thing to a send call. |
| Workflows /v1/workflows/{workflow_id}/subscribers/{id_or_email} | DELETE | Remove a subscriber from a running workflow. |
| Custom fields /v1/custom-fields | GET, POST | List custom fields (paginated) or define one. /all returns the non-paginated set. |
| Webhooks /v1/webhooks | GET, POST, PUT, DELETE | Full CRUD on webhook subscriptions; /{id} for read, update, delete. |
The fastest way to confirm a key works. Remember the trailing colon: the password half of the Basic credential is deliberately empty.
# Basic auth: API key as username, empty password. curl -sS "https://api.flodesk.com/v1/segments?per_page=5" \ -H "Authorization: Basic $(printf '%s:' "$FLODESK_API_KEY" | base64)" \ -D - -o /dev/null # 200 plus X-Fd-RateLimit-Limit: 100 and X-Fd-RateLimit-Remaining: 99. # A 401 almost always means the colon after the key was omitted, or the # account is on trial/free where API keys do not exist.
import requests
from requests.auth import HTTPBasicAuth
API_KEY = "your_flodesk_api_key"
BASE = "https://api.flodesk.com/v1"
# API key is the Basic-auth username; the password is an empty string.
auth = HTTPBasicAuth(API_KEY, "")
# 1. Create or update a subscriber (upsert on email)
r = requests.post(
f"{BASE}/subscribers",
auth=auth,
json={"email": "reader@example.com", "first_name": "Alaa",
"custom_fields": {"source": "smtpedia"}},
timeout=30,
)
r.raise_for_status()
print(r.json()["id"])
# 2. Add them to a segment so your automation can pick them up
requests.post(
f"{BASE}/subscribers/reader@example.com/segments",
auth=auth,
json={"segment_ids": ["YOUR_SEGMENT_ID"]},
timeout=30,
).raise_for_status()
# 3. Page through subscribers (per_page max is 100)
page = 1
while True:
resp = requests.get(f"{BASE}/subscribers", auth=auth,
params={"page": page, "per_page": 100}, timeout=30)
if resp.status_code == 429: # watch X-Fd-RateLimit-Remaining
break
resp.raise_for_status()
rows = resp.json()["data"]
if not rows:
break
for row in rows:
print(row["email"])
page += 1
# There is no endpoint to send an arbitrary email. To make Flodesk send,
# push the subscriber into a workflow built in the UI:
# POST /v1/workflows/{workflow_id}/subscribers
// Node 18+ (built-in fetch). No official Flodesk SDK exists.
const BASE = "https://api.flodesk.com/v1";
const authHeader =
"Basic " + Buffer.from(`${process.env.FLODESK_API_KEY}:`).toString("base64");
async function flodesk(path, options = {}) {
const res = await fetch(`${BASE}${path}`, {
...options,
headers: { Authorization: authHeader, "Content-Type": "application/json" },
});
if (res.status === 429)
throw new Error(
`Rate limited. Remaining=${res.headers.get("X-Fd-RateLimit-Remaining")}`
);
if (!res.ok) throw new Error(`Flodesk ${res.status}: ${await res.text()}`);
return res.status === 204 ? null : res.json();
}
// 1. Batch upsert: up to 50 per call, 20 calls/min
await flodesk("/subscribers/batch", {
method: "POST",
body: JSON.stringify({
subscribers: [
{ email: "a@example.com", first_name: "A" },
{ email: "b@example.com", first_name: "B" },
],
}),
});
// 2. Trigger sending by entering a subscriber into a workflow
await flodesk(`/workflows/${process.env.FLODESK_WORKFLOW_ID}/subscribers`, {
method: "POST",
body: JSON.stringify({ subscriber_ids: ["SUBSCRIBER_ID"] }),
});
// There is no /messages or /send endpoint. Flodesk has no transactional API.
Developers routinely arrive expecting POST /messages, and there is none. The documented surface covers subscribers, segments, workflows, custom fields and webhooks only. To deliver an email programmatically you upsert the subscriber, then push them into a segment or a workflow via POST /v1/workflows/{workflow_id}/subscribers; the automation does the sending. Anything genuinely transactional, receipts, password resets, WP Mail SMTP, goes to a different provider on the same domain.
The headline figure is 100 requests per minute, but POST /v1/subscribers/batch sits in its own bucket throttled to 20 per minute. At 50 subscribers per call, the real import ceiling is 1,000 per minute. Sizing a migration off the 100/min number underestimates runtime by a factor of five. Treat 429 as a planning failure, not a control-flow signal.
The only scope is all, granting full access to the connected account, so least-privilege must be enforced inside your application rather than at the grant. Refresh tokens are single-use: each refresh returns a new one and invalidates the previous, so an implementation that persists the original and replays it succeeds once, then fails permanently. Store the rotated token atomically with the access token.
The first-party MCP server is genuinely official and useful, but its tool surface is read-oriented: analytics, subscriber queries, segmentation, form and checkout performance, workflow results. Full account management through AI is planned, not shipped. If you need an agent that creates and sends campaigns, use the Zapier MCP wrapper, which inherits Zapier’s action list rather than the full API.
Flodesk maintains no public changelog or release-notes feed for the API; developers.flodesk.com/changelog returns 403. The timeline below is reconstructed from Flodesk’s product blog and capability pages. Where the vendor states only a month, the entry is dated to the first of it.
No API deprecations have been announced. The surface is path-versioned at /v1 and was rebuilt recently, so a breaking change should arrive as /v2 rather than in place, but with no changelog feed to subscribe to, monitor developers.flodesk.com directly and keep contract tests in CI.
Yes. The developer API was rebuilt and relaunched in January 2026 and is served at https://api.flodesk.com/v1, documented at developers.flodesk.com. It is generally available on every paid plan, not waitlisted, not partner-gated, and covers subscribers, segments, workflows, custom fields and webhooks across 24 resource-and-method pairs. Older guidance saying Flodesk has no usable API is out of date.
Create it in your Flodesk account settings. API keys are available to paid members only-trial and free accounts cannot generate one, so you cannot prototype against a free workspace. The key is shown exactly once with no way to retrieve it later. In requests it goes in the username position of an HTTP Basic credential with an empty password: base64("YOUR_API_KEY:"). The trailing colon is required.
100 requests per minute across all endpoints. Separately, POST /v1/subscribers/batch is limited to 20 requests per minute at 50 subscribers per call, an effective import ceiling of 1,000 subscribers per minute. Every response carries X-Fd-RateLimit-Limit and X-Fd-RateLimit-Remaining; exceeding the limit returns HTTP 429. Size migrations off the batch number, not the headline.
Not directly. There is no send endpoint, no /messages resource and no transactional API. The route is indirect: upsert the subscriber with POST /v1/subscribers, then place them into a segment or push them into an automation with POST /v1/workflows/{workflow_id}/subscribers, and the workflow you built in Flodesk does the sending. For receipts, password resets and app notifications use a separate provider such as Postmark or Amazon SES.
No. Flodesk publishes no first-party client library in any language and no public SDK repositories; the docs use curl examples only. This is a confirmed absence, not a research gap. Because auth is plain HTTP Basic and payloads are flat JSON, a functional client is short in any language, see the examples above. If a maintained official SDK is a hard requirement, MailerLite and Mailchimp both ship them.
Yes, a first-party one-unusual for a design-first marketing ESP. The remote endpoint is https://mcp.flodesk.com/mcp; copy the per-account connector URL from app.flodesk.com/account/integrations/mcp, paste it into your AI client’s connector settings and authorize with a Flodesk login rather than an API key. It works with Claude, ChatGPT, Gemini and any MCP-compatible client, at no extra cost for members. The tool surface is read-oriented; write-heavy agent workflows are better served by the Zapier MCP wrapper.
This review follows our email infrastructure testing methodology. We disclose affiliate relationships in our editorial independence policy.