← Files Maeve SocialARCHIVED FILE

skills/maeve-social-scheduler/references/integration-capabilities.md

11.8 KB · Oct 5, 2026 · 18:27 UTC

↓ Download file

# Integration capabilities

Quick-glance reference for the live capability catalog returned by `integrations:capabilities`.

## Contents

- Commands
- Response shape
- Settings and media metadata
- Platform matrix
- Platform settings and options
- Agent rules

## Commands

List integrations:

```bash
maeve integrations:list --workspace <workspaceId>
```

Get safe publishing requirements:

```bash
maeve integrations:capabilities --workspace <workspaceId> --integration <integrationId>
```

Fetch dynamic options returned by capabilities. Prefer MCP operation `integrations.get_options` through `maeve_read` when connected; use the CLI fallback when MCP is unavailable:

```bash
maeve integrations:options --workspace <workspaceId> --integration <integrationId> --key <optionKey>
```

Use `--json <file>` for option bodies:

```json
{ "regionCode": "AU" }
```

Supported option body fields:

- `regionCode`: optional string, max 2 characters.
- `query`: optional string, max 255 characters.
- `catalogId`: optional string, max 255 characters.
- `audioType`: required for `instagram-audio`; use `music` or `original_sound`.
- `countryCode`: required chart country for `tiktok-cml-tracks`.
- `genre`: optional TikTok chart genre, default `ALL`.
- `dateRange`: optional `1DAY`, `7DAY`, `30DAY` or `90DAY`, default `7DAY`.

## Response shape

Capabilities returns:

- `integration`: `id`, `platform`, `username`, `name`, and `status`.
- `content`: `postTypes`, `mediaTypes`, `maxMedia`, `supportsThreads`, `requiresMedia`, and `requiresTitle`.
- `rules`: live plain-text platform publishing rules from the backend. Treat this as the source of truth for platform-specific requirements.
- `settings.fields`: supported platform settings.
- `options`: dynamic option keys available for that integration.
- `capabilities`: curated provider capability data from the connection, when present.

Integration status is one of:

- `connected`
- `requires_reauth`
- `disabled`
- `auth_incomplete`

Do not mutate content through an integration unless its status is `connected`.

## Settings and media metadata

`settings.fields` contains provider publish settings only. Do not place media metadata or editor state in `settings`.

Use `contentMedia` for per-media metadata:

- `contentMedia[].crops`: optional crop data keyed by platform.
- `contentMedia[].userTags`: optional user tags where supported.
- `contentMedia[].productTags`: optional product tags where supported.
- `contentMedia[].cover.coverMediaId`: optional uploaded media ID for a cover/thumbnail where supported.
- `contentMedia[].cover.thumbOffsetMs`: optional thumbnail offset; provider execution maps this to platform API fields.

## Platform matrix

| Platform                  | Post types                | Media types                  | Max media | Threads | Requires media | Requires title |
| ------------------------- | ------------------------- | ---------------------------- | --------: | ------- | -------------- | -------------- |
| `x`                       | `post`, `thread`          | `image`, `gif`, `video`      |         4 | yes     | no             | no             |
| `linkedin`                | `post`, `article`, `poll` | `image`, `video`, `document` |        20 | no      | no             | no             |
| `linkedin-page`           | `post`, `article`, `poll` | `image`, `video`, `document` |        20 | no      | no             | no             |
| `instagram`               | `post`, `reel`, `story`   | `image`, `video`             |        10 | no      | yes            | no             |
| `facebook`                | `post`, `reel`, `story`   | `image`, `video`             |        10 | no      | no             | no             |
| `facebook-page`           | `post`, `reel`, `story`   | `image`, `video`             |        10 | no      | no             | no             |
| `threads`                 | `post`, `thread`          | `image`, `video`             |        20 | yes     | no             | no             |
| `tiktok`                  | `post`                    | `image`, `video`             |        35 | no      | yes            | no             |
| `youtube`                 | `post`, `reel`            | `video`                      |         1 | no      | yes            | yes            |
| `pinterest`               | `post`                    | `image`, `video`             |         1 | no      | yes            | yes            |
| `google-business-profile` | `post`                    | `image`                      |         1 | no      | no             | no             |

The table describes provider capabilities. Current content inputs cap attachments at ten per message, so apply the smaller input/platform limit. Read [Platform content](platform-content.md) for current model constraints and reverse states.

Unknown platforms fall back to common post types `post`, `reel`, `story`, and `thread`; media types `image`, `video`; max media 10; no required media/title; no thread support.

## Platform settings and options

### X

Settings:

- `xCommunityUrl`: optional string. Community ID is extracted from the URL.

Options: none.

### LinkedIn

Settings: none.

Options: none.

Post types: `post` (text, images, or one video), and `poll` with the top-level `poll` object (see the poll payload in content-payloads). Capabilities also advertise `article` and document media, but neither is creatable through this surface today: media upload accepts only images and videos, and the API does not accept `postType: "article"`. Treat document posts and article shares as app-only.

### Instagram

Settings:

- `collaborators`: optional string array of usernames or IDs, resolved through `instagram-collaborators`.
- `trialReel`: boolean for single-video Reels.
- `trialReelGraduationStrategy`: `manual` or `automatic`; share-to-feed is omitted while trial mode is on.
- `audio_id`: optional Reel audio asset ID from the `instagram-audio` option key. Facebook Login accounts only; single-video Reels only.
- `audio_volume` / `video_volume`: optional 0-100 volumes for the attached audio and the original video audio.

Options:

- `instagram-collaborators`: requires an exact username in `query`.
- `instagram-catalogs`: no input required.
- `instagram-products`: requires `catalogId`; optional `query`.
- `instagram-audio`: requires `audioType` (`music` or `original_sound`); optional `query`, omit for recommended audio. Returns `audio_id`, title, artist, duration, and a preview link per track.

Fetch flow for products:

```bash
# MCP preferred: execute integrations.get_options through maeve_read with optionKey instagram-catalogs, then instagram-products.
maeve integrations:options --workspace <workspaceId> --integration <integrationId> --key instagram-catalogs
maeve integrations:options --workspace <workspaceId> --integration <integrationId> --key instagram-products --json product-options.json
```

Fetch flow for Reel audio:

```bash
# MCP preferred: execute integrations.get_options through maeve_read with optionKey instagram-audio.
maeve integrations:options --workspace <workspaceId> --integration <integrationId> --key instagram-audio --json audio-options.json
# audio-options.json: { "audioType": "music", "query": "upbeat" }
```

### Facebook and Facebook Page

Settings:

- `facebookLinkUrl`: optional feed link URL. Required when `facebookCtaType` is a CTA button.
- `facebookCtaType`: optional CTA button type. Use `NO_BUTTON` or omit for no CTA.
- `facebookLocationId`: optional Facebook Page location ID.

Options: none.

### Threads

Settings:

- `locationId`: optional string, use option key `locations`.
- `topicTag`: optional string.
- `linkAttachment`: optional string URL, used only when the root has no media.
- `replyControl`: `everyone`, `accounts_you_follow`, `mentioned_only`, `parent_post_author_only` or `followers_only`. These settings apply only to the root.

Options:

- `locations`: requires `query`.

### TikTok

Settings:

- `privacy_level`: string, use option key `tiktok-creator-info`.
- `disable_comment`: boolean.
- `disable_duet`: boolean.
- `disable_stitch`: boolean.
- `brand_content_toggle`: boolean.
- `brand_organic_toggle`: boolean.
- `is_aigc`: boolean.
- `photo_cover_index`: number.
- `auto_add_music`: boolean.
- `tiktok_post_to_drafts`: boolean.
- `tiktok_music`: selected Commercial Music Library clip for Business direct video publishing; use the live schema and `tiktok-cml-tracks` options.

When `privacy_level` is omitted, Maeve publishes `PUBLIC_TO_EVERYONE`. `SELF_ONLY` is forced only while the TikTok app is unaudited.

Options:

- `tiktok-creator-info`: no input required.
- `tiktok-cml-tracks`: required `countryCode`; optional `genre` and `dateRange`. The chart country is not a licensing guarantee. See [Platform content](platform-content.md) for selection and delivery-mode limits.

### YouTube

Settings:

- `privacyStatus`: `public`, `unlisted`, or `private`.
- `tags`: string array.
- `categoryId`: string, use option key `youtube-video-categories`.
- `madeForKids`: boolean.
- `notifySubscribers`: boolean.
- `embeddable`: boolean.
- `license`: `youtube` or `creativeCommon`.

When `privacyStatus` is omitted, Maeve publishes `public`.

Options:

- `youtube-video-categories`: optional `regionCode`, for example `US` or `AU`.

### Pinterest

Settings:

- `boardId`: required string, use option key `pinterest-boards`.
- `link`: optional outbound link string.
- `altText`: optional media alt text string.
- Video pins require an image cover. Set `contentMedia[0].cover.coverMediaId` to an uploaded image media ID unless the uploaded video already has a stored thumbnail.

Options:

- `pinterest-boards`: no input required.
- Pinterest does not identify Sandbox boards in the board-list response. Production pins cannot use Sandbox boards. If Pinterest returns provider code `15`, select a production board and create a newly confirmed publish attempt.

### Google Business Profile

Settings:

- `googlePostType`: `standard`, `event`, or `offer`. Defaults to `standard`.
- `googleCallToActionType`: optional `book`, `order`, `shop`, `learn_more`, `sign_up`, or `call`. Do not use a CTA on offer posts.
- `googleCallToActionUrl`: required for every CTA except `call`, which uses the location phone number.
- `googleEventTitle`: required for event and offer posts.
- `googleEventStartAt`: required for event and offer posts. Use an ISO 8601 local timestamp such as `2026-08-01T09:00`.
- `googleEventEndAt`: required for event and offer posts. It must be after `googleEventStartAt`.
- `googleOfferCouponCode`: optional offer-only coupon code.
- `googleOfferRedeemOnlineUrl`: optional offer-only redemption URL.
- `googleOfferTerms`: optional offer-only terms and conditions.
- `googleLanguageCode`: optional BCP-47 language code override.

Options: none.

Posts may contain text only or one HTTPS image. Follow the live `rules` returned by capabilities for image size, dimensions, caption length, and event or offer requirements. Google Business Profile Local Posts do not support recurrence or a separate provider-side scheduled time through these settings.

## Agent rules

- Call `integrations:capabilities` before platform-specific settings.
- Read and follow the live `rules` string returned by capabilities; do not rely on static prose for platform-specific publishing requirements.
- When a settings field has `optionKey`, execute MCP `integrations.get_options` through `maeve_read` before choosing a value, or use CLI `integrations:options` as the fallback.
- If `requiresMedia` is true, attach uploaded media before scheduling or publishing.
- If `requiresTitle` is true, include `publishTitle` before scheduling or publishing.
- Respect both `maxMedia` and the current input limit when building `contentMedia`.
- Use the top-level `postType` only. Do not send platform-specific post type override settings.
- Do not expose tokens, scopes, stored provider settings, or raw provider payloads; capabilities and options are the safe discovery surface.

SHA-256: 2fa9926c9e8607a6be00aab5b274d2fb16c8cf872d164511bcb7897fbe112bfb