Connections
Connected networks, website and analytics.
Privacy and analytics
We use necessary technical cookies and, only with your consent, analytics and marketing pixels to improve the website and measure campaigns.
Connected networks, website and analytics.
Brand integrations (social networks, website, analytics) with their status, plus the providers available to connect. When an item has attention, say plainly which account needs reconnecting (or new permissions) and why, from attention.cause and attention.renewBy, and that a brand owner or admin fixes it in Nömad › Connections; never ask for passwords. A post on an account that stopped working, or whose access ends before its time, will not go out: before proposing a publish time, read that health in publishing.accounts.list.
| Field | Value |
|---|---|
| Kind | Read |
| HTTP method | POST /api/v1/connections.list |
| MCP tool | connections_list |
| Scope | connections.read |
| Minimum role | Admin |
| Human confirmation | No |
| Doors | Nödo, Voice, MCP, API, Chat, Screens, Apps |
| Status | Available |
| Widget | list |
Input
{
includeCatalog?: boolean // default false
}Output
{
items: Array<{
id: string // uuid
provider: string // Provider key, e.g. instagram, wordpress, google_analytics.
account: string | null
status: "connected" | "needs_attention" | "disconnected" | "pending_setup"
connectedAt: string | null
attention?: {
state: "reconnect" | "permissions" | "expiring" | "paused" | "rate_limited" // `reconnect`: it stopped working and only a new sign-in fixes it. `permissions`: some permissions are missing. `expiring`: access ends at `renewBy` unless someone signs in again. `paused`: paused in Nömad. `rate_limited`: the network paused requests until `until`; nothing to do.
cause: "password_changed" | "security_checkpoint" | "session_expired" | "app_removed" | "page_role_removed" | "missing_permissions" | "instagram_page_link" | "account_restricted" | "rate_limited" | "provider_unavailable" | "token_expiry" | "data_access_expiry" | "unknown" | null // Why, in plain terms: password_changed (the person who connected it changed their password), security_checkpoint (the network asks them to complete a security check), session_expired, app_removed (Nömad was removed from the connected apps), page_role_removed (they no longer manage the page), missing_permissions, instagram_page_link (the Instagram account is no longer linked to its Facebook page), account_restricted, token_expiry (sign-in access ends), data_access_expiry (Meta asks to confirm data access every 90 days).
renewBy: string | null // When access ends unless someone signs in again (past when it already ended).
until: string | null // When a network pause lifts.
canReconnect: boolean // A new sign-in is the way out. Only a brand owner or admin can do it, in Nömad › Connections.
}
| null // Present when the account needs a person or ends soon; null when it is fine.
}>
catalog?: Array<{
provider: string
name: string
available: boolean
}>
}Returns the provider authorization link for a person to open; credentials are never requested or accepted in the conversation. provider is the product key connections.list and connections.overview name (e.g. instagram, facebook_page, linkedin, google_analytics). From the web, the API or an agent the link starts the consent in the person's signed-in browser and comes back to Connections. From the apps (app door) the consent is bound to that installation (clientBindingHash, the base64url SHA-256 of a 32-byte secret the app keeps) and returns to nomad://integration-callback; the app then lists the accounts with connections.setup_resources and attaches them with connections.resources_attach. Products connected with a credential (WordPress, MailerLite, Brevo) refuse with conflict credential_required. Other refusals in detail: product_unavailable, provider_not_configured, mode_unavailable, variant_unavailable, revocation_pending (a disconnect still settling; try again in minutes), app_update_required.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/connections.connect |
| MCP tool | connections_connect |
| Scope | connections.write |
| Minimum role | Admin |
| Human confirmation | Yes |
| Doors | Screens, Apps, API, MCP |
| Status | Available |
| Widget | confirm |
Input
{
provider: string // ≤ 60 · Product key to connect, as connections.list / connections.overview name it.
mode?: "profile" | "organization" // LinkedIn only: the member profile or a Page.
variant?: string // ≤ 60 · Way to connect when the product offers several (Instagram); omitted = the default.
account?: string // ≤ 253 · Login hint for the provider.
platform?: "ios" | "android" // Apps only: the platform the consent returns to.
clientBindingHash?: string // Apps only: base64url SHA-256 of the secret the app keeps for this consent.
}Output
{
authorizationUrl: string // uri
expiresAt: string | null // When the started consent lapses (apps); null for a link that starts it when opened.
clientBinding: "bound" | "none" // `bound`: tied to this app installation.
}Disconnects one integration and revokes its grant. Scheduled posts on that account stop publishing.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/connections.disconnect |
| MCP tool | connections_disconnect |
| Scope | connections.write |
| Minimum role | Admin |
| Human confirmation | Yes |
| Doors | Nödo, MCP, API, Chat, Screens, Apps |
| Status | Planned |
| Widget | confirm |
Input
{
connectionId: string // uuid
}Output
{
ok: true
id?: string
revision?: integer // -9007199254740991–9007199254740991
}After consenting at the provider, the accounts and pages that authorization (grantId) reaches, to pick which to connect with connections.resources_attach. A consent an app started (connections.connect from the app door) needs that installation's proof: clientBindingSecret (the secret whose hash went to connections.connect) and integrationCode (from the nomad://integration-callback return); the first listing with it binds the authorization. Refusals in detail: grant_not_available (not_found), setup_expired, resource_token_missing, client_binding_required, client_binding_mismatch, client_binding_expired, app_update_required (conflict).
| Field | Value |
|---|---|
| Kind | Read |
| HTTP method | POST /api/v1/connections.setup_resources |
| MCP tool | connections_setup_resources |
| Scope | connections.read |
| Minimum role | Admin |
| Human confirmation | No |
| Doors | Screens, Apps |
| Status | Available |
Input
{
grantId: string // uuid
clientBindingSecret?: string
integrationCode?: string
}Output
{
resources: Array<{
id: string // uuid · Pass in `externalResourceIds` of `connections.resources_attach`.
productId: string
resourceType: string
displayName: string
handle: string | null
avatarUrl: string | null
alreadyConnected: boolean // Connected to this brand already.
unavailable: boolean // Cannot be attached here (it does not say why).
upgradesConnection: boolean
reconnectsConnection: boolean
backsUpConnection: boolean // Finishing adds this authorization as a backup («Añadir como respaldo»).
reconnectsFromOtherAccount: boolean
businessId: string | null
businessName: string | null
linkedPageId: string | null // Setup row of the Facebook Page an Instagram account is linked to, when listed.
}>
}After consenting at the provider, connects the accounts the person picked from that authorization (grantId, externalResourceIds). Instagram, Facebook Page and Threads bring their last 90 days of posts. already_connected, setup_expired and token_missing explain a refusal.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/connections.resources_attach |
| MCP tool | connections_resources_attach |
| Scope | connections.write |
| Minimum role | Admin |
| Human confirmation | Yes |
| Doors | API, MCP, Screens, Apps, Nödo |
| Status | Available |
Input
{
grantId: string // uuid
externalResourceIds: string[] // ≤ 100 items
}Output
{
connectionIds: string[]
}Disconnects one connected account and withdraws its authorization at the provider when nothing else uses it. What was scheduled on it pauses until a reconnect. Never an agent's.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/connections.integration_disconnect |
| MCP tool | connections_integration_disconnect |
| Scope | connections.write |
| Minimum role | Admin |
| Human confirmation | Yes |
| Doors | API, Screens, Apps |
| Status | Available |
Input
{
brandIntegrationId: string // uuid
}Output
{
remoteRevoked: boolean
revocation: {
revocation_status: string // `revoked`, `already_revoked`, `kept` (another account uses it) or `failed`.
} // What happened to the provider authorization.
}Discards an authorization that was given but whose accounts were never connected, and withdraws it at the provider. Never an agent's.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/connections.setup_cancel |
| MCP tool | connections_setup_cancel |
| Scope | connections.write |
| Minimum role | Admin |
| Human confirmation | Yes |
| Doors | API, Screens, Apps |
| Status | Available |
Input
{
grantId: string // uuid
}Output
{
remoteRevoked: boolean
revocation: {
revocation_status: string // `revoked`, `already_revoked`, `kept` (another account uses it) or `failed`.
} // What happened to the provider authorization.
}Removes one person's backup authorization from a connected account. It is withdrawn at the provider only when nothing else uses it (a shared consent). Never an agent's.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/connections.backup_remove |
| MCP tool | connections_backup_remove |
| Scope | connections.write |
| Minimum role | Admin |
| Human confirmation | Yes |
| Doors | API, Screens, Apps |
| Status | Available |
Input
{
brandIntegrationId: string // uuid
grantId: string // uuid
}Output
{
revocationStatus: string
}Chooses whose authorization a connected account works with. Choosing a backup switches to it now and it must be working (not_ready otherwise). switched is false when it already was the primary.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/connections.backup_primary_set |
| MCP tool | connections_backup_primary_set |
| Scope | connections.write |
| Minimum role | Admin |
| Human confirmation | Yes |
| Doors | API, MCP, Screens, Apps, Nödo |
| Status | Available |
Input
{
brandIntegrationId: string // uuid
grantId: string // uuid
}Output
{
switched: boolean
}After a reconnect, queues again every destination of this connection that failed while it was down and runs one delivery now; approvals and revisions are checked again. connection_not_ready while it is still down, nothing_to_retry when nothing failed.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/connections.posts_retry_failed |
| MCP tool | connections_posts_retry_failed |
| Scope | connections.write |
| Minimum role | Admin |
| Human confirmation | Yes |
| Doors | API, MCP, Screens, Apps, Nödo |
| Status | Available |
Input
{
connectionId: string // uuid
}Output
{
requested: integer // -9007199254740991–9007199254740991
retried: integer // -9007199254740991–9007199254740991
failed: integer // -9007199254740991–9007199254740991
}Connects the brand's MailerLite or Brevo accounts with an API key, stored encrypted. Refusals in detail: key_invalid, no_accounts, unavailable. Only from the person's own screens and apps.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/connections.email_api_key_connect |
| MCP tool | connections_email_api_key_connect |
| Scope | connections.write |
| Minimum role | Admin |
| Human confirmation | Yes |
| Doors | Screens, Apps |
| Status | Available |
Input
{
providerSlug: "mailerlite" | "brevo"
apiKey: string // ≤ 1000
accountLabel?: string // ≤ 120
}Output
{
connectionIds: string[]
}Connects a WordPress site with an application password, stored encrypted. Refusals in detail: connector_required, credentials_invalid, application_passwords_unavailable, site_unreachable. Only from the person's own screens and apps.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/connections.wordpress_connect |
| MCP tool | connections_wordpress_connect |
| Scope | connections.write |
| Minimum role | Admin |
| Human confirmation | Yes |
| Doors | Screens, Apps |
| Status | Available |
Input
{
siteUrl: string // ≤ 2048
username: string // ≤ 120
applicationPassword: string // ≤ 500
}Output
{
connectionIds: string[]
}LinkedIn's review canary: publishes one text post through the production publisher on a connected LinkedIn account and records it so it can be deleted afterwards. Only for the accounts and people the expiring canary names.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/connections.verification_linkedin_publish |
| MCP tool | connections_verification_linkedin_publish |
| Scope | connections.write |
| Minimum role | Admin |
| Human confirmation | Yes |
| Doors | Screens, Apps |
| Status | Available |
Input
{
brandIntegrationId: string // uuid
message: string // ≤ 3000
confirmed: true
}Output
{
permalink: string
remoteStatus: "published" | "processing"
auditId: string
}Deletes at LinkedIn the review canary post published before (auditId of its record) and records the deletion. Deleting it twice is harmless.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/connections.verification_linkedin_delete |
| MCP tool | connections_verification_linkedin_delete |
| Scope | connections.write |
| Minimum role | Admin |
| Human confirmation | Yes |
| Doors | Screens, Apps |
| Status | Available |
Input
{
auditId: string // ≤ 20
confirmed: true
}Output
{
ok: true
}Google's verification canary: uploads one video of the brand's Library through the production YouTube publisher, private by default (privacyStatus). Only for the accounts and people the expiring canary names.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/connections.verification_youtube_publish |
| MCP tool | connections_verification_youtube_publish |
| Scope | connections.write |
| Minimum role | Admin |
| Human confirmation | Yes |
| Doors | Screens, Apps |
| Status | Available |
Input
{
brandIntegrationId: string // uuid
brandFileId: string // uuid
title: string // ≤ 100
description?: string // ≤ 5000 · default ""
privacyStatus?: "private" | "unlisted" | "public" // default "private"
confirmed: true
}Output
{
permalink: string
remoteStatus: "published" | "processing"
}Cuts one outside app's (MCP) access to the brand, whoever granted it. When it was that person's last grant for the app, its OAuth consent and sessions end too. Never an agent's.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/connections.external_access_revoke |
| MCP tool | connections_external_access_revoke |
| Scope | connections.write |
| Minimum role | Admin |
| Human confirmation | Yes |
| Doors | Screens, Apps |
| Status | Available |
Input
{
grantId: string // uuid
}Output
{
id: string
}Gives an outside app (MCP client) the person already authorized access to this brand with the chosen scopes; each scope must be one the person can use here. Only from the person's own signed-in screen, which proves the app is theirs.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/connections.external_access_grant |
| MCP tool | connections_external_access_grant |
| Scope | connections.write |
| Minimum role | Admin |
| Human confirmation | Yes |
| Doors | Screens |
| Status | Available |
Input
{
clientId: string // ≤ 256
scopes: string[] // ≤ 20 items
}Output
{
id: string
}How many of the brand's connections stopped working or need new permissions (the shell's badge and banner); summary is null when all of them work.
| Field | Value |
|---|---|
| Kind | Read |
| HTTP method | POST /api/v1/connections.attention |
| MCP tool | connections_attention |
| Scope | connections.read |
| Minimum role | Admin |
| Human confirmation | No |
| Doors | API, MCP, Screens, Apps, Nödo |
| Status | Available |
Input
{}Output
{
summary: {
attentionCount: integer // -9007199254740991–9007199254740991
brokenCount: integer // -9007199254740991–9007199254740991
}
| null
}The brand's connections as its home groups them: how many, of what and in which state. For the list with its attention details use connections.list.
| Field | Value |
|---|---|
| Kind | Read |
| HTTP method | POST /api/v1/connections.overview |
| MCP tool | connections_overview |
| Scope | connections.read |
| Minimum role | Admin |
| Human confirmation | No |
| Doors | API, MCP, Screens, Apps, Nödo |
| Status | Available |
Input
{}Output
{
overview: {
products: Array<{
id: string
slug: string
name: string
category: string // `channel`, `ads`, `analytics`, `tag_management`, `website` or `email_marketing`.
rolloutStatus: string // `planned`, `active`, `standby` or `disabled`.
defaultAccessMode: string
providerSlug: string
providerName: string
providerRolloutStatus: string
authStrategy: string // `oauth2`, `api_key`…
linkedinModeRollout: Record<string, string> | null
linkedinModeConfigured: Record<string, boolean> | null
implemented: boolean
configured: boolean
capabilities: string[]
requiredScopes: string[]
docsUrl: string | null
connections: Array<{
id: string
grantId: string
label: string | null
status: string // `connected`, `needs_attention`, `disconnected`, `pending_setup`…
accessMode: string
resourceType: string
externalId: string
displayName: string
handle: string | null
avatarUrl: string | null
connectedAt: string
lastErrorCode: string | null
renewBy: string | null // When access ends unless someone signs in again; null when it renews by itself.
renewReason: string | null // `token_expiry` or `data_access_expiry`; null without a deadline.
}> // Current, listed connections only.
}>
connectedCount: integer // -9007199254740991–9007199254740991
needsAttentionCount: integer // -9007199254740991–9007199254740991
}
}Updated on January 1, 1970