mxAURA Developer Center

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.