Cadenzova API
The same tools your AI uses through MCP, over plain HTTPS. OpenAPI: https://cadenzova-mcp.onrender.com/v1/openapi.json
Authentication
Create an API key in Cadenzova under More → AI agents → API keys, then send it as a Bearer token. A key has its own permission level and brands. On “Draft and approve”, posts you create wait for approval in Cadenzova.
curl -X POST https://cadenzova-mcp.onrender.com/v1/tools/get_started \
-H "Authorization: Bearer cdz_sk_…" -H "Content-Type: application/json" -d '{}'
Errors
Errors return JSON with error and message: 401 bad key, 402 plan limit (with upgrade_url),
403 permission level, 404 not found, 429 rate or daily credit limit.
Webhooks
Add endpoints under AI agents → Webhooks. Events: post.held, post.approved, post.rejected,
post.published, post.failed. Each POST carries X-Cadenzova-Signature: t=<unix>,v1=<hex>,
where v1 is HMAC-SHA256 of "<t>.<raw body>" with your signing secret. Failed deliveries are retried
after 1 minute, 10 minutes and 1 hour.
import hmac, hashlib, time
def verify(secret, body: bytes, header: str) -> bool:
parts = dict(p.split("=", 1) for p in header.split(","))
if abs(time.time() - int(parts["t"])) > 300:
return False
mac = hmac.new(secret.encode(), f"{parts['t']}.".encode() + body, hashlib.sha256).hexdigest()
return hmac.compare_digest(mac, parts["v1"])
Tools
GET/POST /v1/tools/get_started
Call this first. Returns what this connection may do, the brands it can see and what each one still needs (products, connected channels) before you can plan and post.
Arguments
{
"properties": {},
"title": "get_startedArguments",
"type": "object"
}GET/POST /v1/tools/list_brands
The brands this connection can work on, with their ids.
Arguments
{
"properties": {},
"title": "list_brandsArguments",
"type": "object"
}GET/POST /v1/tools/get_brand_brief
Who the brand is: description, niche, voice, audience and personas, content focus, the owner's standing instructions, colours, and the learned writing style when one exists. Read it before writing anything in the brand's name.
Arguments
{
"properties": {
"brand_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Brand id from list_brands. Leave out when the connection has one brand.",
"title": "Brand Id"
}
},
"title": "get_brand_briefArguments",
"type": "object"
}GET/POST /v1/tools/list_products
What the brand sells: name, description, price, link, status. Use product_id when a post is about a product, so results and revenue can be traced back to it.
Arguments
{
"properties": {
"brand_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Brand id from list_brands. Leave out when the connection has one brand.",
"title": "Brand Id"
},
"limit": {
"default": 50,
"maximum": 200,
"minimum": 1,
"title": "Limit",
"type": "integer"
},
"offset": {
"default": 0,
"minimum": 0,
"title": "Offset",
"type": "integer"
}
},
"title": "list_productsArguments",
"type": "object"
}GET/POST /v1/tools/list_channels
Every platform the brand can post to: whether it is connected and healthy, caption, title and hashtag limits, which media it accepts and whether media is required. Also the plan's usage (posts this month, channels). Check it before choosing platforms.
Arguments
{
"properties": {
"brand_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Brand id from list_brands. Leave out when the connection has one brand.",
"title": "Brand Id"
}
},
"title": "list_channelsArguments",
"type": "object"
}GET/POST /v1/tools/get_calendar
What is scheduled, waiting for approval, publishing, failed, or went out today, soonest first. Read it before planning so new posts fill gaps instead of doubling up.
Arguments
{
"properties": {
"brand_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Brand id from list_brands. Leave out when the connection has one brand.",
"title": "Brand Id"
}
},
"title": "get_calendarArguments",
"type": "object"
}GET/POST /v1/tools/get_performance
Results across platforms for the last N days against the N days before: posts, engagement and impressions per platform, best hours and days, top content types and the top posts. 'measured' is how many posts have numbers; a low count means weak evidence.
Arguments
{
"properties": {
"brand_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Brand id from list_brands. Leave out when the connection has one brand.",
"title": "Brand Id"
},
"days": {
"default": 30,
"maximum": 90,
"minimum": 1,
"title": "Days",
"type": "integer"
}
},
"title": "get_performanceArguments",
"type": "object"
}GET/POST /v1/tools/get_playbook
For one platform: Cadenzova's playbook for it (what the platform rewards, formats, hooks) and what this brand's own history shows: best content types, timing, which products are over- or under-promoted, and what to make next. Use it to decide what to post.
Arguments
{
"properties": {
"platform": {
"description": "pinterest, instagram, tiktok, youtube, facebook, x, bluesky, linkedin or threads",
"title": "Platform",
"type": "string"
},
"brand_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Brand id from list_brands. Leave out when the connection has one brand.",
"title": "Brand Id"
}
},
"required": [
"platform"
],
"title": "get_playbookArguments",
"type": "object"
}GET/POST /v1/tools/get_best_times
The next good slot for a platform. 'learned' is true when it comes from this brand's own results, false when it is a general default.
Arguments
{
"properties": {
"platform": {
"title": "Platform",
"type": "string"
},
"brand_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Brand id from list_brands. Leave out when the connection has one brand.",
"title": "Brand Id"
}
},
"required": [
"platform"
],
"title": "get_best_timesArguments",
"type": "object"
}GET/POST /v1/tools/search_media
The brand's media library, newest first: the user's uploads, product photos, or media Cadenzova generated. Returns asset ids to attach to posts and short-lived preview links.
Arguments
{
"properties": {
"brand_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Brand id from list_brands. Leave out when the connection has one brand.",
"title": "Brand Id"
},
"source": {
"default": "uploads",
"description": "uploads, products or generated",
"title": "Source",
"type": "string"
}
},
"title": "search_mediaArguments",
"type": "object"
}GET/POST /v1/tools/get_notes
Notes kept for this brand by you or any other assistant the user connected: strategy, decisions, what was tried and learned. Read them at the start of a session.
Arguments
{
"properties": {
"brand_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Brand id from list_brands. Leave out when the connection has one brand.",
"title": "Brand Id"
}
},
"title": "get_notesArguments",
"type": "object"
}POST /v1/tools/save_note
Keep something for future sessions and other assistants: the strategy you agreed, a decision and why, a lesson from results. One topic per key; saving the same key again replaces it. An empty body deletes the note. Never store passwords or personal data.
Arguments
{
"properties": {
"key": {
"description": "Short topic name, e.g. 'strategy' or 'q4-campaign'",
"maxLength": 80,
"minLength": 1,
"title": "Key",
"type": "string"
},
"body": {
"maxLength": 8000,
"title": "Body",
"type": "string"
},
"brand_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Brand id from list_brands. Leave out when the connection has one brand.",
"title": "Brand Id"
}
},
"required": [
"key",
"body"
],
"title": "save_noteArguments",
"type": "object"
}GET/POST /v1/tools/get_usage
The account's plan, posts used this month against the limit, connected channels, AI credits left and where to upgrade. Check it before a large batch.
Arguments
{
"properties": {},
"title": "get_usageArguments",
"type": "object"
}GET/POST /v1/tools/validate_post
Dry run. Checks a post against each platform's rules (length, media, required fields, connection) and warns about wording that reads as AI-written, near-repeats of recent posts and weak openings. Writes nothing. Run it before create_post and fix what it reports.
Arguments
{
"$defs": {
"Pinterest": {
"properties": {
"board": {
"description": "Board name, from list_boards",
"title": "Board",
"type": "string"
},
"title": {
"anyOf": [
{
"maxLength": 100,
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Title"
},
"link": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "https:// link the pin opens",
"title": "Link"
}
},
"required": [
"board"
],
"title": "Pinterest",
"type": "object"
},
"Post": {
"description": "One piece of content and every place it goes.",
"properties": {
"platforms": {
"description": "Connected platform ids from list_channels",
"items": {
"type": "string"
},
"minItems": 1,
"title": "Platforms",
"type": "array"
},
"caption": {
"default": "",
"description": "Caption for every platform, hashtags included",
"title": "Caption",
"type": "string"
},
"captions": {
"anyOf": [
{
"additionalProperties": {
"type": "string"
},
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"description": "Per-platform captions that replace `caption`, e.g. {'x': '\u2026'}",
"title": "Captions"
},
"image_asset_ids": {
"description": "From search_media or the media tools",
"items": {
"type": "string"
},
"title": "Image Asset Ids",
"type": "array"
},
"video_asset_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Video Asset Id"
},
"cover_asset_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Cover image; required for a Pinterest video pin",
"title": "Cover Asset Id"
},
"scheduled_at": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 with a timezone, e.g. 2026-12-01T09:30:00+00:00",
"title": "Scheduled At"
},
"product_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "The product this post promotes, from list_products",
"title": "Product Id"
},
"pinterest": {
"anyOf": [
{
"$ref": "#/$defs/Pinterest"
},
{
"type": "null"
}
],
"default": null
},
"youtube_title": {
"anyOf": [
{
"maxLength": 100,
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Youtube Title"
},
"tiktok": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"description": "TikTok needs {privacy_level, allow_comment, allow_duet, allow_stitch}",
"title": "Tiktok"
},
"first_comment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Instagram first comment",
"title": "First Comment"
},
"alt_text": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Image description (Bluesky and Pinterest)",
"title": "Alt Text"
}
},
"required": [
"platforms"
],
"title": "Post",
"type": "object"
}
},
"properties": {
"post": {
"$ref": "#/$defs/Post"
},
"brand_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Brand id from list_brands. Leave out when the connection has one brand.",
"title": "Brand Id"
}
},
"required": [
"post"
],
"title": "validate_postArguments",
"type": "object"
}POST /v1/tools/create_post
Create one post for one or more platforms. when: 'queue' = the brand's next free posting time, 'schedule' = at scheduled_at, 'now' = publish immediately, 'draft' = leave it for the user. On a 'Draft and approve' connection the post is always HELD for the user's approval and the result says so; do not retry it. One post counts once against the monthly limit however many platforms it goes to. Safe to retry: the same content is never written twice.
Arguments
{
"$defs": {
"Pinterest": {
"properties": {
"board": {
"description": "Board name, from list_boards",
"title": "Board",
"type": "string"
},
"title": {
"anyOf": [
{
"maxLength": 100,
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Title"
},
"link": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "https:// link the pin opens",
"title": "Link"
}
},
"required": [
"board"
],
"title": "Pinterest",
"type": "object"
},
"Post": {
"description": "One piece of content and every place it goes.",
"properties": {
"platforms": {
"description": "Connected platform ids from list_channels",
"items": {
"type": "string"
},
"minItems": 1,
"title": "Platforms",
"type": "array"
},
"caption": {
"default": "",
"description": "Caption for every platform, hashtags included",
"title": "Caption",
"type": "string"
},
"captions": {
"anyOf": [
{
"additionalProperties": {
"type": "string"
},
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"description": "Per-platform captions that replace `caption`, e.g. {'x': '\u2026'}",
"title": "Captions"
},
"image_asset_ids": {
"description": "From search_media or the media tools",
"items": {
"type": "string"
},
"title": "Image Asset Ids",
"type": "array"
},
"video_asset_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Video Asset Id"
},
"cover_asset_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Cover image; required for a Pinterest video pin",
"title": "Cover Asset Id"
},
"scheduled_at": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 with a timezone, e.g. 2026-12-01T09:30:00+00:00",
"title": "Scheduled At"
},
"product_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "The product this post promotes, from list_products",
"title": "Product Id"
},
"pinterest": {
"anyOf": [
{
"$ref": "#/$defs/Pinterest"
},
{
"type": "null"
}
],
"default": null
},
"youtube_title": {
"anyOf": [
{
"maxLength": 100,
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Youtube Title"
},
"tiktok": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"description": "TikTok needs {privacy_level, allow_comment, allow_duet, allow_stitch}",
"title": "Tiktok"
},
"first_comment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Instagram first comment",
"title": "First Comment"
},
"alt_text": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Image description (Bluesky and Pinterest)",
"title": "Alt Text"
}
},
"required": [
"platforms"
],
"title": "Post",
"type": "object"
}
},
"properties": {
"post": {
"$ref": "#/$defs/Post"
},
"when": {
"anyOf": [
{
"enum": [
"draft",
"queue",
"schedule",
"now"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "When"
},
"brand_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Brand id from list_brands. Leave out when the connection has one brand.",
"title": "Brand Id"
},
"idempotency_key": {
"anyOf": [
{
"pattern": "^[A-Za-z0-9_-]{8,64}$",
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Idempotency Key"
}
},
"required": [
"post"
],
"title": "create_postArguments",
"type": "object"
}POST /v1/tools/create_posts
Create up to 30 posts in one call, each with its own scheduled_at: the way to plan a week. All or nothing: if one post is invalid, none are written and the error names it. On a 'Draft and approve' connection they are all HELD for approval. The free plan takes 5 per call.
Arguments
{
"$defs": {
"Pinterest": {
"properties": {
"board": {
"description": "Board name, from list_boards",
"title": "Board",
"type": "string"
},
"title": {
"anyOf": [
{
"maxLength": 100,
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Title"
},
"link": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "https:// link the pin opens",
"title": "Link"
}
},
"required": [
"board"
],
"title": "Pinterest",
"type": "object"
},
"Post": {
"description": "One piece of content and every place it goes.",
"properties": {
"platforms": {
"description": "Connected platform ids from list_channels",
"items": {
"type": "string"
},
"minItems": 1,
"title": "Platforms",
"type": "array"
},
"caption": {
"default": "",
"description": "Caption for every platform, hashtags included",
"title": "Caption",
"type": "string"
},
"captions": {
"anyOf": [
{
"additionalProperties": {
"type": "string"
},
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"description": "Per-platform captions that replace `caption`, e.g. {'x': '\u2026'}",
"title": "Captions"
},
"image_asset_ids": {
"description": "From search_media or the media tools",
"items": {
"type": "string"
},
"title": "Image Asset Ids",
"type": "array"
},
"video_asset_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Video Asset Id"
},
"cover_asset_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Cover image; required for a Pinterest video pin",
"title": "Cover Asset Id"
},
"scheduled_at": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 with a timezone, e.g. 2026-12-01T09:30:00+00:00",
"title": "Scheduled At"
},
"product_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "The product this post promotes, from list_products",
"title": "Product Id"
},
"pinterest": {
"anyOf": [
{
"$ref": "#/$defs/Pinterest"
},
{
"type": "null"
}
],
"default": null
},
"youtube_title": {
"anyOf": [
{
"maxLength": 100,
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Youtube Title"
},
"tiktok": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"description": "TikTok needs {privacy_level, allow_comment, allow_duet, allow_stitch}",
"title": "Tiktok"
},
"first_comment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Instagram first comment",
"title": "First Comment"
},
"alt_text": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Image description (Bluesky and Pinterest)",
"title": "Alt Text"
}
},
"required": [
"platforms"
],
"title": "Post",
"type": "object"
}
},
"properties": {
"posts": {
"items": {
"$ref": "#/$defs/Post"
},
"maxItems": 30,
"minItems": 1,
"title": "Posts",
"type": "array"
},
"brand_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Brand id from list_brands. Leave out when the connection has one brand.",
"title": "Brand Id"
},
"idempotency_key": {
"anyOf": [
{
"pattern": "^[A-Za-z0-9_-]{8,64}$",
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Idempotency Key"
}
},
"required": [
"posts"
],
"title": "create_postsArguments",
"type": "object"
}GET/POST /v1/tools/get_post
The current state of one post on every platform it goes to: held, scheduled, publishing, published (with its link) or failed (with the reason).
Arguments
{
"properties": {
"post_id": {
"description": "post_id from create_post, create_posts or get_calendar",
"title": "Post Id",
"type": "string"
}
},
"required": [
"post_id"
],
"title": "get_postArguments",
"type": "object"
}POST /v1/tools/update_post
Change the caption of a post that has not gone out yet: `caption` for every platform, or `captions` per platform. Pinterest title and link can be changed too.
Arguments
{
"properties": {
"post_id": {
"description": "post_id from create_post, create_posts or get_calendar",
"title": "Post Id",
"type": "string"
},
"caption": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Caption"
},
"captions": {
"anyOf": [
{
"additionalProperties": {
"type": "string"
},
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"title": "Captions"
},
"pinterest_title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Pinterest Title"
},
"pinterest_link": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Pinterest Link"
}
},
"required": [
"post_id"
],
"title": "update_postArguments",
"type": "object"
}POST /v1/tools/move_post
Change when a post goes out. A held post keeps waiting for approval with the new time.
Arguments
{
"properties": {
"post_id": {
"description": "post_id from create_post, create_posts or get_calendar",
"title": "Post Id",
"type": "string"
},
"scheduled_at": {
"description": "ISO 8601 with a timezone, in the future",
"title": "Scheduled At",
"type": "string"
}
},
"required": [
"post_id",
"scheduled_at"
],
"title": "move_postArguments",
"type": "object"
}POST /v1/tools/delete_post
Remove a post that has not gone out yet from every platform it was going to. Cannot be undone. A 'Draft and approve' connection can delete only posts still waiting for approval.
Arguments
{
"properties": {
"post_id": {
"description": "post_id from create_post, create_posts or get_calendar",
"title": "Post Id",
"type": "string"
}
},
"required": [
"post_id"
],
"title": "delete_postArguments",
"type": "object"
}GET/POST /v1/tools/list_boards
The Pinterest boards this brand can pin to. A pin must name one.
Arguments
{
"properties": {
"brand_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Brand id from list_brands. Leave out when the connection has one brand.",
"title": "Brand Id"
}
},
"title": "list_boardsArguments",
"type": "object"
}POST /v1/tools/import_media
Bring one image into the brand's library from a public https link and get an asset id to use in a post. Images only; the user uploads videos in Cadenzova.
Arguments
{
"properties": {
"url": {
"title": "Url",
"type": "string"
},
"brand_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Brand id from list_brands. Leave out when the connection has one brand.",
"title": "Brand Id"
}
},
"required": [
"url"
],
"title": "import_mediaArguments",
"type": "object"
}GET/POST /v1/tools/list_pin_templates
The free Pinterest pin layouts render_pin_template can make, with what each needs.
Arguments
{
"properties": {},
"title": "list_pin_templatesArguments",
"type": "object"
}POST /v1/tools/render_pin_template
Lay out a Pinterest pin (1000×1500) from the brand's own photos, a title and optional subtitle and footer, in the brand's colours. Free. Returns an image asset id.
Arguments
{
"properties": {
"template": {
"title": "Template",
"type": "string"
},
"title": {
"title": "Title",
"type": "string"
},
"image_asset_ids": {
"default": [],
"items": {
"type": "string"
},
"maxItems": 4,
"title": "Image Asset Ids",
"type": "array"
},
"subtitle": {
"default": "",
"title": "Subtitle",
"type": "string"
},
"footer": {
"default": "",
"title": "Footer",
"type": "string"
},
"brand_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Brand id from list_brands. Leave out when the connection has one brand.",
"title": "Brand Id"
}
},
"required": [
"template",
"title"
],
"title": "render_pin_templateArguments",
"type": "object"
}POST /v1/tools/create_video
Render a vertical video from the brand's own material. style 'slideshow': up to 10 photos with optional text per photo. style 'kinetic': up to 8 lines of animated text. Costs 10 credits. Returns a job_id: poll get_job until it is done, then use result.video_asset_id (and cover_asset_id) in a post.
Arguments
{
"properties": {
"style": {
"enum": [
"slideshow",
"kinetic"
],
"title": "Style",
"type": "string"
},
"texts": {
"default": [],
"items": {
"type": "string"
},
"title": "Texts",
"type": "array"
},
"image_asset_ids": {
"default": [],
"items": {
"type": "string"
},
"maxItems": 10,
"title": "Image Asset Ids",
"type": "array"
},
"seconds_per_slide": {
"default": 2.5,
"maximum": 8,
"minimum": 1,
"title": "Seconds Per Slide",
"type": "number"
},
"with_music": {
"default": true,
"title": "With Music",
"type": "boolean"
},
"brand_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Brand id from list_brands. Leave out when the connection has one brand.",
"title": "Brand Id"
}
},
"required": [
"style"
],
"title": "create_videoArguments",
"type": "object"
}POST /v1/tools/generate_image
Make one new image from a description, in the brand's visual style, and add it to the library. Photographic and text-free: for words on an image use render_pin_template. Costs 21 credits. Returns a job_id: poll get_job until it is done, then use result.asset_id in a post. Prefer the brand's own photos (search_media) when they fit.
Arguments
{
"properties": {
"prompt": {
"maxLength": 1500,
"minLength": 10,
"title": "Prompt",
"type": "string"
},
"orientation": {
"default": "square",
"enum": [
"square",
"portrait",
"story"
],
"title": "Orientation",
"type": "string"
},
"style": {
"anyOf": [
{
"maxLength": 400,
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Replaces the brand's saved image style",
"title": "Style"
},
"brand_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Brand id from list_brands. Leave out when the connection has one brand.",
"title": "Brand Id"
}
},
"required": [
"prompt"
],
"title": "generate_imageArguments",
"type": "object"
}GET/POST /v1/tools/get_job
Progress of a job started by another tool (video render, publishing). status is queued, running, done or failed; `result` holds the output when done.
Arguments
{
"properties": {
"job_id": {
"title": "Job Id",
"type": "string"
}
},
"required": [
"job_id"
],
"title": "get_jobArguments",
"type": "object"
}POST /v1/tools/suggest_captions
Optional: have Cadenzova write one caption per platform in the brand's voice from your draft and/or an image. Costs 3 credits. You can write captions yourself for free; use this only when the user asks for Cadenzova's version.
Arguments
{
"properties": {
"platforms": {
"items": {
"type": "string"
},
"title": "Platforms",
"type": "array"
},
"draft": {
"default": "",
"title": "Draft",
"type": "string"
},
"image_asset_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Image Asset Id"
},
"brand_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Brand id from list_brands. Leave out when the connection has one brand.",
"title": "Brand Id"
}
},
"required": [
"platforms"
],
"title": "suggest_captionsArguments",
"type": "object"
}POST /v1/tools/ask_strategist
Optional second opinion: ask Cadenzova's own strategist a question about this brand's results or what to post next. It answers from the brand's data. Costs 3 credits. You are not bound by its answer.
Arguments
{
"properties": {
"question": {
"maxLength": 2000,
"minLength": 3,
"title": "Question",
"type": "string"
},
"brand_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Brand id from list_brands. Leave out when the connection has one brand.",
"title": "Brand Id"
}
},
"required": [
"question"
],
"title": "ask_strategistArguments",
"type": "object"
}