Resource reference
Every path below is relative to https://api.mxaura.ai/v1. {id} is a UUID.
The scope column is what the credential must hold; read for GET, write
for everything else unless noted. Request and response schemas are in the
OpenAPI document at /v1/openapi.json; this page is the map.
Ids of objects that do not belong to your account behave as if they do not
exist (404), never as 403 — the API does not confirm what it will not show.
Me
| Method | Path | Scope | Notes |
|---|---|---|---|
| GET | /me |
any | The credential: key id, account, scopes, limit, status |
Components — components.*
Six component types share one shape: messages, headers, summaries,
signatures, senders, templates.
| Method | Path | Notes |
|---|---|---|
| GET | /{type} |
List (paginated) |
| POST | /{type} |
Create |
| GET | /{type}/{id} |
One |
| PUT | /{type}/{id} |
Update |
| DELETE | /{type} |
Bulk delete; body { "ids": [...] } |
| GET | /{type}/{id}/dependencies |
What uses this component (pools, messages) — check before deleting |
A header holds one value per field; the API refuses multi-value fields
(400). A template is the HubSpot email template the message renders
into; hs_template_id ties it to the portal.
Brandings — brandings.*
| Method | Path | Notes |
|---|---|---|
| GET / POST | /brandings |
List / create |
| GET / PUT | /brandings/{id} |
One / update |
| DELETE | /brandings |
Bulk; { "ids": [...] } |
/brandings/provision and /deprovision (HubSpot theme provisioning) are app-only.
Pools — pools.*
| Method | Path | Notes |
|---|---|---|
| GET / POST | /pools |
List / create |
| GET / PUT | /pools/{id} |
One / update |
| GET | /pools/{id}/messages |
The ordered messages composed into the pool, with positions and component refs |
| POST | /pools/{id}/messages |
Compose a message into the pool at the next position |
| PUT / DELETE | /pools/{id}/messages/{messageId} |
Update / remove a composed message |
| GET | /pools/{id}/dependencies |
Campaigns and flows that draw from this pool |
| PUT | /pools/{id}/metadata |
Name, description, pool type, nurture mode |
| POST | /pools/{id}/summary-preview |
Render a summary variant (read-only) |
/pools/{id}/test-deploy is app-only.
Campaigns — campaigns.*
| Method | Path | Notes |
|---|---|---|
| GET / POST | /campaigns |
List / create |
| GET / PUT | /campaigns/{id} |
One / update (enabled is the switch HubSpot respects) |
| DELETE | /campaigns |
Bulk |
| GET / POST | /campaigns/{id}/pools |
Pools assigned to the campaign / assign one |
| PUT / DELETE | /campaigns/{id}/pools/{poolId} |
Update assignment (sender, branding, position) / unassign |
| POST | /campaigns/{id}/pools/reorder |
{ "order": [poolId, …] } |
| GET | /campaigns/{id}/clients |
Agency: which client accounts this campaign is assigned to |
| GET | /campaigns/{id}/dependencies |
Flows and workflows referencing it |
| POST | /campaigns/{id}/preview |
Render a message as a given contact would receive it (read-only) |
| POST | /preview/simulate-campaign |
The full cascade journey for a contact — see below |
Simulate a campaign
POST /preview/simulate-campaign runs the same engine dispatch uses and
returns the ordered steps a contact would receive. Read-only.
{ "campaignId": "…", "contactId": "124303957916", "maxSteps": 5, "maxDays": 30 }
contactId is optional; without it the simulation uses the pool defaults
and no contact-specific filters. The response lists each step's pool,
message, position, resolved sender/branding and the reason it was chosen
(or skipped: filtered, exhausted, window closed).
Flows — flows.*, enrollments — enrollments.write
A flow governs a contact's journey through campaigns. Enrolling a contact causes real dispatches — HubSpot property writes and real email. It is a separate scope on purpose and it is capped per hour.
| Method | Path | Scope | Notes |
|---|---|---|---|
| GET / POST | /flows |
flows | List / create |
| GET / PUT | /flows/{id} |
flows | One / update |
| PUT | /flows/{id}/status |
flows.write | active / paused / archived |
| GET | /flows/{id}/enrollments |
flows.read | Contacts in the flow, with position and next send |
| GET | /flows/{id}/stats |
flows.read | Daily enrolled / sent / opened / clicked / completed |
| POST | /flows/{id}/preview-next |
flows.read | What a given contact would get next (read-only) |
| GET | /flows/by-campaign/{campaignId} |
flows.read | Flows that use a campaign |
| POST | /flows/{id}/enroll |
enrollments.write | { "hs_contact_id": "…" } — sends email; counts toward the hourly cap |
| POST | /flows/{id}/unenroll |
enrollments.write | { "hs_contact_id": "…" } |
Flow blueprints (agencies)
| Method | Path | Notes |
|---|---|---|
| GET / POST | /flow-blueprints |
An agency's reusable flow definitions |
| GET / PUT | /flow-blueprints/{id} |
|
| GET | /flow-blueprints/{id}/assignments |
Which client accounts have it |
| POST | /flow-blueprints/{id}/assign · /unassign |
{ "client_account_id": "…" } |
/flows/scan/run is app-only.
Dispatch & activity — dispatch.read
Read-only. What was sent, to whom, with what outcome.
| Method | Path | Notes |
|---|---|---|
| GET | /activity/dispatches |
The dispatch log: campaign, pool, message, contact, status (success / no_message / filtered / blocked / throttled / write_failed / error), latency. Filters: ?campaign_id= ?pool_id= ?dispatch_status= ?days= or ?date_from=&date_to=, ?recipient= |
| GET | /activity/feed |
Human-readable account activity (who did what in the app). Filters: ?category= ?event_type= ?days= |
A blocked dispatch carries a reason_code: no_sender, no_branding,
reauth_required, campaign_disabled. These are the ones a customer must
act on; the dispatch.blocked webhook fires for them.
Hubs — hubs.*
A hub is an embeddable library of articles, served to sites through an embed key. The family is split into four scopes so a key can hold the content library without the ability to hand out embed keys or spend model budget.
Hubs themselves — hubs.*
| Method | Path | Notes |
|---|---|---|
| GET / POST | /hubs |
List / create. Each hub carries default_key, preview_url, embed_url, feed_url |
| GET / PUT | /hubs/{id} |
One (settings, layouts, subscriptions, site path) / update |
| GET | /hubs/{id}/stats |
Views per article and per embedding site, 30 days |
| GET / PUT | /hubs/{id}/fields |
The hub's field configuration |
| GET / POST | /hubs/{id}/layouts |
Layouts (gallery / entry HTML+CSS) |
| PUT / DELETE | /hubs/{id}/layouts/{layoutId} |
|
| POST | /hubs/{id}/layouts/preset |
Apply a named preset |
| GET | /hubs/{id}/library |
Articles available to place |
| GET / POST | /hubs/types · /hubs/types/{id} · /hubs/types/{id}/fields |
Content types and their fields |
| GET | /hubs/subscribed · /hubs/subscribed/{id} |
Hubs this account embeds from other accounts |
DELETE /hubs/{id} is app-only (it cascades into every client site).
/hubs/scheduler/run is app-only.
Articles & authors — articles.*
| Method | Path | Notes |
|---|---|---|
| GET / POST | /hubs/articles |
List (`?status=draft |
| GET / PUT | /hubs/articles/{id} |
One / update. Includes placements, SEO fields, stats |
| GET | /hubs/articles/{id}/stats |
Views by day |
| GET / POST | /hubs/authors · /hubs/authors/{id} |
Authors (name, bio, avatar) |
Publishing — publishing.*
Anything that changes what the public can see.
| Method | Path | Notes |
|---|---|---|
| GET | /hubs/{id}/entries |
Articles placed in the hub with placement status |
| POST | /hubs/{id}/entries |
Place an article: { "article_id": "…", "featured": 0 } |
| POST | /hubs/{id}/entries/{articleId}/publish · unpublish · schedule · feature · unfeature |
schedule takes { "publish_at": "…", "unpublish_at": "…" } |
| POST | /hubs/{id}/entries/bulk |
Place / unplace many |
| POST | /hubs/articles/{id}/publish · unpublish · retire · activate · deactivate |
Article-level state |
| POST | /hubs/{id}/preview |
{ "minutes": 60 } opens a preview window: drafts become visible on the live key for that long, with noindex and no caching. { "minutes": 0 } closes it. |
Subscribers — subscribers.*
Who may embed.
| Method | Path | Notes |
|---|---|---|
| GET / POST | /hubs/{id}/subscriptions |
Subscriptions = embed keys for this hub (own site or a client's) |
| PUT / DELETE | /hubs/{id}/subscriptions/{subId} |
Layout pins, origins, status |
| GET / POST | /hubs/site-keys · /hubs/site-keys/{id} |
Site keys: one key a client site uses for every hub assigned to it |
| GET / POST / DELETE | /hubs/assignments · /hubs/assignments/{id} |
Assign a hub to a client account |
POST /hubs/site-keys/{id}/rotate is app-only (revokes every live embed).
Public rendering (no credential)
https://hubs.mxaura.ai/e/{embed_key}/ renders a hub; …/feed.json is its
feed; …/{slug}/ an entry. ?published=1 forces published-only even when a
preview window is open. Embed with:
<script src="https://hubs.mxaura.ai/embed.js" data-mxa-hub="EMBED_KEY"></script>
or, for a client site, data-mxa-site="SITE_KEY".
AI — ai.write
Calls that spend model budget. Metered per account; 429 with the budget
state when exhausted.
| Method | Path | Notes |
|---|---|---|
| POST | /hubs/articles/{id}/ai/seo |
Title/description/keywords suggestions |
| POST | /hubs/articles/{id}/ai/hero-spec |
Hero image spec + generation |
| POST | /hubs/{id}/ai/seo-batch |
SEO for every article in a hub |
| POST | /identity/intake · /identity/sources/refresh · /identity/sources/extract |
Identity generation |
| POST | /advisor/* |
Advisor generation and plans |
Identity — identity.*
The account's messaging identity: audience, value proposition, persona, voice — what every message and article composes from.
| Method | Path | Notes |
|---|---|---|
| GET | /identity |
Frameworks |
| GET / PUT | /identity/{id} |
One framework (DELETE is app-only) |
| GET | /identity/challenges |
Challenge log |
| GET | /identity/sources · /identity/sources/{id} |
Source documents and extracts |
Folders — folders.*
| Method | Path |
|---|---|
| GET / POST | /folders |
| GET / PUT / DELETE | /folders/{id} |
Media — media.*
The account's own library in R2. Third-party drives (/media/providers) are
app-only; /media/usage too.
| Method | Path | Notes |
|---|---|---|
| GET | /media/files |
?folder_id= ?category= ?q= — paginated by the worker (page, limit) |
| POST | /media/files |
Multipart upload |
| GET / PUT / DELETE | /media/files/{id} |
Rename, move, delete |
| GET / POST | /media/folders · /media/folders/{id} |
Webhooks — webhooks.*
| Method | Path | Notes |
|---|---|---|
| GET / POST | /webhooks |
List / register an endpoint. Create returns the signing secret once |
| PUT / DELETE | /webhooks/{id} |
Change url/events/status; remove |
| POST | /webhooks/{id}/test |
Send a webhook.test event now |
| POST | /webhooks/{id}/rotate-secret |
New secret; old one stops immediately |
| GET | /webhooks/{id}/deliveries |
Last 100 deliveries with status, attempt, HTTP code, latency |
Details, payloads and verification in Webhooks.