Skip to content

Channels

What the app calls a channel, the API calls an integration: one connected social account. Its id is what every other route takes as integrationId or integration.

GET /integrations your channels
GET /social/{integration} start connecting one (OAuth URL)
GET /is-connected check the API key
GET /integration-settings/{id} rules, maximum length, settings schema, tools
POST /integration-trigger/{id} run a provider tool
GET /find-slot/{id} next free slot of the channel
GET /groups legacy groups (see below)
DELETE /integrations/{id} disconnect
GET /integrations
Parameter Required Description
group No Only the channels of this legacy group. Not a brand: see below

Response 200:

[
{
"id": "cm4ean69r0003w8w1cdomox9n",
"name": "maltaexpat",
"identifier": "instagram-standalone",
"picture": "https://media.usenadia.com/avatar.jpg",
"disabled": false,
"profile": "maltaexpat"
}
]
Field Type Description
id string The channel id
name string As shown in the app
identifier string The platform: instagram-standalone, tiktok or youtube
picture string | null Avatar URL
disabled boolean Disconnected, or over the plan
profile string | null The handle on the platform
customer object Only present when the channel has a legacy group: id, name
GET /social/{integration}

Returns the OAuth URL to send the person to. Connecting is a browser dance: the person authorises on the platform, which sends them back to UseNadia, and the channel appears in the list above.

Parameter In Required Description
integration path Yes instagram-standalone, tiktok or youtube
refresh query No An existing channel id: the flow refreshes its token instead of creating a channel

Response 200:

{ "url": "https://www.instagram.com/oauth/authorize?client_id=…&state=…" }

The state behind the URL lives one hour. 400 when the identifier is unknown (Integration not allowed); 500 when the platform’s URL could not be generated, which is what happens for a registered platform that has no credentials here.

GET /is-connected

Answers { "connected": true } with a valid key, 401 without. Useful as a smoke test of a configuration; the MCP session and the CLI do it for you.

GET /integration-settings/{id}

Response 200:

{
"output": {
"rules": "Instagram should have at least one attachment, if it's a story, it can have only one picture",
"maxLength": 2200,
"settings": { "type": "object", "properties": { "post_type": { … } } },
"tools": []
}
}
Field Description
rules The posting rules of the platform, in a sentence
maxLength Characters allowed in the text, verification taken into account
settings The JSON schema of the provider settings, or the string No additional settings required when the platform has none
tools The provider tools POST /integration-trigger/{id} can run: methodName, description, dataSchema (key, type, description)

404 when the channel is not yours.

POST /integration-trigger/{id}
{ "methodName": "audioSearch", "data": { "q": "summer" } }

Runs a tool the provider exposes and answers 201 with { "output": … }, the raw provider answer. 404 when the channel is not yours or the tool does not exist on its platform (Tool not found); 401 when the platform’s token expired and could not be refreshed, in which case the channel is disconnected.

GET /find-slot/{id}

Walks the channel’s time slots from today and answers the first one with no post scheduled, 200:

{ "date": "2026-10-21T10:00:00.000Z" }
GET /groups

Answers [{ "id", "name" }]: the legacy groups, the Customer model of the original project. UseNadia’s interface no longer writes it, so this list is almost always empty here, and GET /integrations?group= filters on the same model.

DELETE /integrations/{id}

Deletes the channel and every post scheduled on it. Response 200: the channel row. 404 when it is not yours.