Skip to content
View as Markdown

FluentCRM REST API ​

Complete reference for every FluentCRM REST endpoint — 363 endpoints across 32 modules, covering FluentCRM, FluentCampaign Pro, and the Pro SMS module.

Every page is generated from the plugin's own route table and verified against live responses, so what you read here is what the code does.

Base URL ​

All requests use this base URL:

https://yourdomain.com/wp-json/fluent-crm/v2

Authentication ​

FluentCRM uses WordPress Application Passwords. Pass them via the Authorization header using Basic auth:

bash
curl -X GET "https://yourdomain.com/wp-json/fluent-crm/v2/subscribers" \
  -H "Authorization: Basic $(echo -n 'username:application_password' | base64)"

See Authentication for how to create a dedicated manager account and generate keys.

The one exception is the bounce handler, which is deliberately public — it is called by your email provider, which cannot present WordPress credentials.

Permissions ​

Every endpoint page states the capability that route actually enforces, and which policy method enforces it. FluentCRM's capabilities are module-scoped rather than one blanket permission:

CapabilityGrants
fcrm_read_contacts / fcrm_manage_contactsRead / write contacts
fcrm_manage_contacts_deleteDelete contacts
fcrm_manage_contacts_exportExport contacts
fcrm_manage_contact_catsTags, lists, companies
fcrm_manage_contact_cats_deleteDelete tags, lists, companies
fcrm_read_emails / fcrm_manage_emailsRead / write campaigns and emails
fcrm_manage_email_deleteDelete emails
fcrm_manage_email_templatesEmail templates
fcrm_read_funnels / fcrm_write_funnelsRead / write automations
fcrm_delete_funnelsDelete automations
fcrm_manage_formsForm integrations
fcrm_view_dashboardReports and dashboard
fcrm_manage_settingsSettings — the highest FluentCRM permission

A handful of routes require a core WordPress capability instead — install_plugins for the MCP adapter installer, plus manage_options and list_users elsewhere. Those are called out on the pages concerned.

Modules ​

Contacts & Segmentation ​

ModuleEndpointsDescription
Contacts32Create, update, delete contacts; notes, emails, tracking events, purchase history
Tags7Organise contacts with tags
Lists7Group contacts into mailing lists
Companies21Companies, attached contacts, notes, custom fields
Custom Fields3Define contact custom fields
Labels4Global labels for campaigns, funnels, sequences

Email & Campaigns ​

ModuleEndpointsDescription
Campaigns32Create, schedule, send, and analyse email campaigns
Templates12Email templates, smart codes, global styles
Email Patterns11Reusable block patterns for the Gutenberg email editor
Sequences19Automated email sequences Pro
Recurring Campaigns14Scheduled recurring campaigns Pro
Campaigns Pro7Resend failed emails, tag actions, dynamic content Pro
SMS25SMS campaigns and messages Pro

Automation & Analytics ​

ModuleEndpointsDescription
Funnels (Automations)32Automations with triggers, actions, benchmarks, and step reporting
Reports25Dashboard stats, email performance, contact growth, automation reports
Dynamic Segments9Condition-driven contact segments Pro
Commerce Reports2WooCommerce / EDD revenue reporting Pro
Smart Links5Trackable links that apply tags and lists Pro

Data In & Out ​

ModuleEndpointsDescription
Import6CSV upload, WP users import, third-party drivers
Export2Paged contact export Pro
Migrators5Migrate from Mailchimp, ActiveCampaign, and others
Webhooks4Inbound webhooks that create and update contacts
Forms5Fluent Forms integration and entries
Bounce Handler2Public provider webhook for bounces and complaints

Administration ​

ModuleEndpointsDescription
Settings41Global settings, double opt-in, compliance, system logs, DB health
Pro Settings11Licence, managers, SMS configuration Pro
AI7AI writing assistant configuration and generation
MCP4Model Context Protocol bridge for AI agents
Users2WordPress user and role lookup
Abandon Carts3Abandoned cart tracking and recovery
Docs & Addons3In-app documentation and addon status
Global Search1Search contacts, campaigns, and automations at once

Response Format ​

Most endpoints return a JSON object keyed by the resource name. Paginated collections use the framework's paginator envelope:

json
{
  "subscribers": {
    "total": 150,
    "per_page": 15,
    "current_page": 1,
    "last_page": 10,
    "from": 1,
    "to": 15,
    "next_page_url": "/wp-json/fluent-crm/v2/subscribers?page=2",
    "prev_page_url": null,
    "data": [{ "id": 1, "email": "john@example.com" }]
  }
}

Not every collection is a paginator

Some endpoints deliberately return a plain limit-capped array with no page metadata — the option and picker endpoints, for example. Others return counts as strings, because the value comes straight from a SQL aggregate. Each page documents what that endpoint really returns.

Conditional Response Keys ​

Many endpoints return extra keys only when you ask for them, usually through a with[] parameter: GET /funnels returns triggers only with with[]=triggers, GET /tags returns all_tags only when all_tags is sent, and so on. Anything conditional is marked as such in its property description — do not rely on a key being present unless the description says it always is.

Error Handling ​

CodeMeaning
200Success
400Bad request — missing or invalid parameters
401Not authenticated — missing or invalid credentials
403Authenticated, but the user lacks the required capability
404Resource not found
422Validation failed — the message names the offending field

Check the body, not just the status

A few endpoints signal failure inside a 200 response. The bounce handler returns {"status": false} on a bad security code, and POST /setting/db-index-health/repair returns 200 with pending: true when another repair already holds the lock.

Method Override ​

The admin app sends PUT, PATCH, and DELETE as POST with an X-HTTP-Method-Override header. Direct API clients can use the real verbs — the override exists for environments that block them.

Interactive Playground ​

Every endpoint page includes a playground where you can enter your domain and credentials, fill in parameters, and execute live requests.

Use a staging site

The playground issues real requests. Mutating endpoints permanently change your data, and campaign endpoints can send real email.

What's Next? ​

Start with Authentication, then pick a module above.