Menu

API reference · Inbox

AI team positions

social_inbox · positions · 7 operations

GET/v1/social-inbox/positions

List the AI team of the Social Inbox

social_inbox.positions.list

ReadIdempotentSince 2026-11-01

Lists the AI team positions of the inbox in table order: AI Community Managers and the Sentiment Analyst, with their mode, territory, schedule (timezone, days, out_of_hours), escalations (escalate_on_complaint and escalate_on), whether they are enabled, the name of their AI brain (ai_agent_name) and who created and last edited them (created_by_name, updated_by_name). Archived positions are left out unless include_archived (they come last, with status archived). assignee_uid (ai-<position_id>, Community Managers only) is the virtual user to assign threads to with social_inbox.items.assign. Requires view access to the Social Inbox.

Scope
social_inbox:read
Permission
View the module
MCP tool
social_inbox_positions_listOn the full surface; on the compact one, mb_execute_operation with id: "social_inbox.positions.list".

Declared cost: up to 110 reads and 0 writes per call (they count against the daily quota).

Parameters

include_archivedbooleanqueryoptional

Also list archived positions (out of the table and the engine; they keep their history), after the active ones. Default false.

Default: false

Response

dataarray<object>

Errors

Example

curl "https://api.mb-suite.com/v1/social-inbox/positions" \
  -H "Authorization: Bearer $MB_API_KEY"

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl "https://api.mb-suite.com/v1/social-inbox/positions" \
  -H "Authorization: Bearer $MB_TEST_KEY"
GET/v1/social-inbox/positions/{position_id}

Get one AI team position of the Social Inbox

social_inbox.positions.get

ReadIdempotentSince 2026-11-01

Returns one active AI team position of the inbox with its full configuration (mode, territory, schedule with out_of_hours, escalate_on_complaint and escalate_on, instructions), the name of its AI brain (ai_agent_name), who created and last edited it (created_by_name, updated_by_name) and, for a Community Manager, assignee_uid. 404 inbox_position_not_found if it does not exist or was archived (archived ones come in social_inbox.positions.list with include_archived). Requires view access.

Scope
social_inbox:read
Permission
View the module
MCP tool
social_inbox_positions_getOn the full surface; on the compact one, mb_execute_operation with id: "social_inbox.positions.get".

Declared cost: up to 6 reads and 0 writes per call (they count against the daily quota).

Parameters

position_idstringpathrequired

The position id (from social_inbox.positions.list).

Response

idstring

The position id.

typeenum

community_manager (answers as the brand) or sentiment_analyst (classifies sentiment and spam; one per organization).

Values: community_manager, sentiment_analyst

namestring

Its name.

enabledboolean

Whether it is working (it uses AI on every new item while enabled).

ai_agent_idstring | null

Its AI brain: an agent of ai.agents.list or a system agent (sys_…); null = the default one.

statusstring | null

active or archived (archived positions come only with include_archived).

ordernumber | null

Its place in the table: it breaks territory ties between Community Managers.

ai_agent_namestring | null

The name of that AI brain (null when it uses the default one or the agent no longer exists).

modestring | null

Community Manager: suggest_draft (leaves a suggested reply) or auto_reply (publishes by itself).

scopeobject | null

Source → false excludes it. Absent = every source.

account_idsarray<string> | null

Only these connected accounts.

post_modestring | null

all, include (only post_ids) or exclude (all but post_ids).

post_idsarray<string> | null

The posts of post_mode.

sentimentsarray<string> | null

Only items with these sentiments (needs the Sentiment Analyst on). Absent = any.

scheduleobject | null

Community Manager only: its working hours (IANA timezone; days as {day mon…sun, from HH:mm, to HH:mm}, several per day allowed, from later than to crosses midnight) and out_of_hours (skip, draft_only or reply). Absent = always within hours.

escalate_on_complaintboolean | null

Community Manager: hand complaints to a person (needs the Sentiment Analyst).

escalate_onobject | null

Community Manager only: the escalations its AI brain decides while drafting (price, personal_data, unknown_language; only the ones turned on come, as true). Absent = none of them.

instructionsstring | null

Extra instructions for its AI brain.

assignee_uidstring

Community Manager only: ai-<position_id>, the virtual user to assign threads to it (social_inbox.items.assign).

created_atnumber | null

When it was created (epoch ms).

created_by_idstring | null

Who created it.

created_by_namestring | null

The name of who created it.

updated_atnumber | null

Last edit (epoch ms).

updated_by_idstring | null

Who edited it last.

updated_by_namestring | null

The name of who edited it last.

Errors

Example

curl "https://api.mb-suite.com/v1/social-inbox/positions/{position_id}" \
  -H "Authorization: Bearer $MB_API_KEY"

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl "https://api.mb-suite.com/v1/social-inbox/positions/{position_id}" \
  -H "Authorization: Bearer $MB_TEST_KEY"
POST/v1/social-inbox/positions

Create an AI team position in the Social Inbox

social_inbox.positions.create

WriteSince 2026-11-01

Creates an AI team position, last in the table and turned OFF unless enabled true. A community_manager answers as the brand: mode suggest_draft (leaves a suggested reply in the composer; the default) or auto_reply (publishes by itself on the networks), within its territory (scope: source id → false excludes it, a source left out is included and an id that is not a source is 400 invalid_input; account_ids; post_mode include or exclude with post_ids; sentiments, only with the Sentiment Analyst on), its schedule (an IANA time zone that must exist; weekly slots, where from later than to crosses midnight into the next day; out_of_hours skip, draft_only or reply), its escalations (escalate_on_complaint, and escalate_on price, personal_data or unknown_language) and its instructions; ai_agent_id picks its AI brain: an agent of ai.agents.list or a system agent (null = the default one; one that does not exist is 400 ai_agent_not_found; a community_manager's must be of the social channel, or 400 ai_agent_not_eligible). The most specific territory wins (post > account > source), ties by order. A sentiment_analyst (one per organization) classifies sentiment and spam of every new item with AI. Both use AI on every new item while enabled: turning one on is a recurring AI cost, not a one-time call. A second Sentiment Analyst gives 409 analyst_exists (update the existing one); an archived one is brought back with its history. Outside the app, creating it already on (enabled true) needs a dry run and its confirm_token, like turning it on with social_inbox.positions.set_enabled; created off, it runs directly. Returns the position. Owner or admin only. With LinkedIn or TikTok, their terms limit it through the API and the MCP: what they do not allow answers 403 platform_terms_restricted (the permissions guide lists what each platform allows).

Needs confirmation: first dry_run: true (preview and confirm_token, valid 10 minutes and for one run), then the same body with confirm_token. In a few operations only with certain data: the description says when. Why and how: Dry run and confirm_token. In this one, only when: enabled is true (the new position starts using AI on every new item, a recurring cost, and a Community Manager in auto_reply mode answers on the networks by itself).

Scope
social_inbox:write
Permission
Edit in the module · Only owner, admin
MCP tool
social_inbox_positions_createOn the full surface; on the compact one, mb_execute_operation with id: "social_inbox.positions.create".

Declared cost: up to 52 reads and 1 writes per call (they count against the daily quota).

Parameters

typeenumbodyrequired

community_manager (answers as the brand) or sentiment_analyst (classifies sentiment and spam; one per organization).

Values: community_manager, sentiment_analyst

namestringbodyoptional

Its name (default: Community Manager AI or Analista de sentimiento).

enabledbooleanbodyoptional

Whether it works on new items (it uses AI on every new item while enabled).

Default: false

ai_agent_idstring | nullbodyoptional

Its AI brain: an agent id of ai.agents.list or a system agent (sys_…); null = the default one. One that does not exist is 400 ai_agent_not_found; a community_manager's must be of the social channel, or 400 ai_agent_not_eligible.

Default: null

modeenumbodyoptional

Community Manager: suggest_draft (leaves a suggested reply; the default) or auto_reply (publishes by itself on the networks).

Values: suggest_draft, auto_reply

scopeobjectbodyoptional

Community Manager territory: source → false excludes it, with the source ids fb_comment, fb_message, fb_mention, ig_comment, ig_message, ig_mention, li_comment, li_message, li_mention, tt_comment, tt_message; a source left out is included and absent = every source. An id that is not a source is 400 invalid_input (in an edit, unless the saved territory already had it).

account_idsarray<string>bodyoptional

Community Manager: only these connected accounts (account_id of social_inbox.connections.list), up to 30.

post_modeenumbodyoptional

Community Manager: all posts (the default), include (only post_ids) or exclude (all but post_ids).

Values: all, include, exclude

post_idsarray<string>bodyoptional

The posts of post_mode (root_resource_id of their items), up to 50.

scheduleobjectbodyoptional

Community Manager: its working hours and what it does out of them.

sentimentsarray<enum>bodyoptional

Community Manager: only items with these sentiments (needs the Sentiment Analyst on); all three = any.

Values: positive, neutral, negative

escalate_on_complaintbooleanbodyoptional

Community Manager: hand complaints to a person (needs the Sentiment Analyst). Default true.

escalate_onobjectbodyoptional

The escalations its AI brain decides while drafting (only true ones count).

instructionsstringbodyoptional

Extra instructions for its AI brain (up to 2,000 characters).

Response

position_idstring
positionobject

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/social-inbox/positions" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "type": "community_manager",
  "dry_run": true
}'

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl -X POST "https://api.mb-suite.com/v1/social-inbox/positions" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "type": "community_manager",
  "dry_run": true
}'
PATCH/v1/social-inbox/positions/{position_id}

Update an AI team position of the Social Inbox

social_inbox.positions.update

WriteIdempotentSince 2026-11-01

Updates an AI team position: updates is applied over the saved one (its type never changes) and null removes an optional part (scope, account_ids, post_ids, schedule, sentiments, escalate_on, instructions). A community_manager answers as the brand: mode suggest_draft (leaves a suggested reply in the composer; the default) or auto_reply (publishes by itself on the networks), within its territory (scope: source id → false excludes it, a source left out is included and an id that is not a source is 400 invalid_input; account_ids; post_mode include or exclude with post_ids; sentiments, only with the Sentiment Analyst on), its schedule (an IANA time zone that must exist; weekly slots, where from later than to crosses midnight into the next day; out_of_hours skip, draft_only or reply), its escalations (escalate_on_complaint, and escalate_on price, personal_data or unknown_language) and its instructions; ai_agent_id picks its AI brain: an agent of ai.agents.list or a system agent (null = the default one; one that does not exist is 400 ai_agent_not_found; a community_manager's must be of the social channel, or 400 ai_agent_not_eligible). The most specific territory wins (post > account > source), ties by order. A sentiment_analyst (one per organization) classifies sentiment and spam of every new item with AI. Both use AI on every new item while enabled: turning one on is a recurring AI cost, not a one-time call. Switching a Community Manager to auto_reply makes it answer on the networks by itself. Outside the app, a change that turns on a position that was off (updates.enabled true) or switches a Community Manager that is on to auto_reply needs a dry run and its confirm_token, like social_inbox.positions.set_enabled; any other change runs directly. 404 inbox_position_not_found if it does not exist or was archived. Returns the position. Owner or admin only. With LinkedIn or TikTok, their terms limit it through the API and the MCP: what they do not allow answers 403 platform_terms_restricted (the permissions guide lists what each platform allows).

Needs confirmation: first dry_run: true (preview and confirm_token, valid 10 minutes and for one run), then the same body with confirm_token. In a few operations only with certain data: the description says when. Why and how: Dry run and confirm_token. In this one, only when: the change turns on a position that was off, or switches a Community Manager that is on to auto_reply (as social_inbox.positions.set_enabled with enabled true does).

Scope
social_inbox:write
Permission
Edit in the module · Only owner, admin
MCP tool
social_inbox_positions_updateOn the full surface; on the compact one, mb_execute_operation with id: "social_inbox.positions.update".

Declared cost: up to 2 reads and 1 writes per call (they count against the daily quota).

Parameters

position_idstringpathrequired

The position id (from social_inbox.positions.list).

updatesobjectbodyrequired

What changes, applied over the saved position; null on scope, account_ids, post_ids, schedule, sentiments, escalate_on or instructions removes it. The type never changes.

Response

positionobject

Errors

Example

curl -X PATCH "https://api.mb-suite.com/v1/social-inbox/positions/{position_id}" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "updates": {},
  "dry_run": true
}'

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl -X PATCH "https://api.mb-suite.com/v1/social-inbox/positions/{position_id}" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "updates": {},
  "dry_run": true
}'
POST/v1/social-inbox/positions/{position_id}/enabled

Turn an AI team position on or off

social_inbox.positions.set_enabled

WriteIdempotentSince 2026-11-01

Turns an AI team position on (enabled true: it starts acting on new items, using AI on every new item from then on: a recurring cost; a Community Manager in auto_reply mode also answers on the networks by itself) or off (false) without touching the rest of its configuration. Outside the app, turning one on needs a dry run and its confirm_token; turning it off runs directly. 404 inbox_position_not_found if it does not exist or was archived. Returns the position. Owner or admin only. With LinkedIn or TikTok, their terms limit it through the API and the MCP: what they do not allow answers 403 platform_terms_restricted (the permissions guide lists what each platform allows).

Needs confirmation: first dry_run: true (preview and confirm_token, valid 10 minutes and for one run), then the same body with confirm_token. In a few operations only with certain data: the description says when. Why and how: Dry run and confirm_token. In this one, only when: enabled is true (from then on the position uses AI on every new item, a recurring cost, and a Community Manager in auto_reply mode answers on the networks by itself).

Scope
social_inbox:write
Permission
Edit in the module · Only owner, admin
MCP tool
social_inbox_positions_set_enabledOn the full surface; on the compact one, mb_execute_operation with id: "social_inbox.positions.set_enabled".

Declared cost: up to 1 reads and 1 writes per call (they count against the daily quota).

Parameters

position_idstringpathrequired

The position id (from social_inbox.positions.list).

enabledbooleanbodyrequired

true turns it on (it then uses AI on every new item), false off.

Response

positionobject

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/social-inbox/positions/{position_id}/enabled" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "enabled": true,
  "dry_run": true
}'

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl -X POST "https://api.mb-suite.com/v1/social-inbox/positions/{position_id}/enabled" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "enabled": true,
  "dry_run": true
}'
POST/v1/social-inbox/positions/reorder

Reorder the AI team of the Social Inbox

social_inbox.positions.reorder

WriteIdempotentSince 2026-11-01

Sets the table order of the AI team: position_ids in the new order (position = index). The order breaks ties when two Community Managers cover the same item with the same specificity. Ids that no longer exist are skipped. Owner or admin only.

Scope
social_inbox:write
Permission
Edit in the module · Only owner, admin
MCP tool
social_inbox_positions_reorderOn the full surface; on the compact one, mb_execute_operation with id: "social_inbox.positions.reorder".

Declared cost: up to 50 reads and 50 writes per call (they count against the daily quota).

Parameters

position_idsarray<string>bodyrequired

Every position id in the new order (from social_inbox.positions.list): position = index; ids that no longer exist are skipped.

Response

updatednumber
skippednumber

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/social-inbox/positions/reorder" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "position_ids": [
    "POSITION_ID"
  ]
}'

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl -X POST "https://api.mb-suite.com/v1/social-inbox/positions/reorder" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "position_ids": [
    "POSITION_ID"
  ]
}'
POST/v1/social-inbox/positions/{position_id}/archive

Archive an AI team position of the Social Inbox

social_inbox.positions.archive

WriteIdempotentSince 2026-11-01

Archives an AI team position: it is turned off and leaves the table and the engine; its history stays and the threads it handled keep their assignment. Archiving an archived position changes nothing (changed false). An archived Sentiment Analyst comes back with social_inbox.positions.create. Archived positions are not deleted (neither from the screen): social_inbox.positions.list shows them with include_archived. 404 inbox_position_not_found if it does not exist. Owner or admin only.

Scope
social_inbox:write
Permission
Edit in the module · Only owner, admin
MCP tool
social_inbox_positions_archiveOn the full surface; on the compact one, mb_execute_operation with id: "social_inbox.positions.archive".

Declared cost: up to 1 reads and 1 writes per call (they count against the daily quota).

Parameters

position_idstringpathrequired

The position id (from social_inbox.positions.list).

Response

oktrue
changedboolean

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/social-inbox/positions/{position_id}/archive" \
  -H "Authorization: Bearer $MB_API_KEY"

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl -X POST "https://api.mb-suite.com/v1/social-inbox/positions/{position_id}/archive" \
  -H "Authorization: Bearer $MB_TEST_KEY"