{"openapi":"3.1.0","info":{"title":"Aivy agent tools","version":"1.4.0","description":"Tool reference for https://aivymarketing.com/api/mcp. The REST v1 API is retired."},"paths":{"/tools/get_account":{"post":{"operationId":"get_account","description":"Read the signed-in account and the active Aivy grant. Does not include secrets.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":[],"properties":{}}}}}}},"/tools/list_brands":{"post":{"operationId":"list_brands","description":"List brands this grant may read.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":[],"properties":{}}}}}}},"/tools/get_setup_status":{"post":{"operationId":"get_setup_status","description":"Read how far a brand is through Aivy setup (Brand DNA, strategy, 12-month content plan), which step comes next as nextStep, running background jobs, and a link to the matching Aivy page. Without brandId it lists the brands, or returns step create_brand when there are none.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":[],"properties":{"brandId":{"type":"string","description":"Granted brand id."}}}}}}}},"/tools/create_brand":{"post":{"operationId":"create_brand","description":"Create a brand in the Aivy account with a name and an optional website. Returns the brand id. Spends no credits.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["name","idempotencyKey"],"properties":{"name":{"type":"string","maxLength":120},"website":{"type":"string","description":"Web address, e.g. example.com."},"idempotencyKey":{"type":"string","minLength":1,"maxLength":200}}}}}}}},"/tools/start_website_scan":{"post":{"operationId":"start_website_scan","description":"Start reading the brand website to propose its Brand DNA (logo, colors, fonts, tone, audience). Costs 9 credits from the Aivy account, counted against this connection's credit limit. Runs in the background for a few minutes; get_website_scan reads progress. An already running scan is returned instead of starting a second one.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId","idempotencyKey"],"properties":{"brandId":{"type":"string","description":"Granted brand id."},"url":{"type":"string","description":"Website to scan. Defaults to the brand website."},"idempotencyKey":{"type":"string","minLength":1,"maxLength":200}}}}}}}},"/tools/get_website_scan":{"post":{"operationId":"get_website_scan","description":"Read the status of a website scan (queued, running stages, awaiting_review, failed) and, once finished, the proposed Brand DNA.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId"],"properties":{"brandId":{"type":"string","description":"Granted brand id."},"jobId":{"type":"string","description":"Defaults to the latest scan of the brand."}}}}}}}},"/tools/get_brand_dna":{"post":{"operationId":"get_brand_dna","description":"Read the current Brand DNA (name, industry, tagline, value proposition, audience, tone, personality, key messages, colors, fonts, language, country, time zone) and whether it is proposed or approved.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId"],"properties":{"brandId":{"type":"string","description":"Granted brand id."}}}}}}}},"/tools/update_brand_dna":{"post":{"operationId":"update_brand_dna","description":"Change Brand DNA fields. Only the fields sent change. Does not approve it.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId","idempotencyKey"],"properties":{"brandId":{"type":"string","description":"Granted brand id."},"idempotencyKey":{"type":"string","minLength":1,"maxLength":200},"brandName":{"type":"string"},"industry":{"type":"string"},"tagline":{"type":"string"},"valueProposition":{"type":"string","description":"Business overview."},"targetAudience":{"type":"string"},"language":{"type":"string","description":"Language code, e.g. en or cs."},"country":{"type":"string","description":"Country code, e.g. US or CZ."},"timeZone":{"type":"string","description":"IANA time zone, e.g. Europe/Prague."},"brandHashtags":{"type":"string"},"imageryStyle":{"type":"string"},"layoutStyle":{"type":"string"},"toneOfVoice":{"type":"array","items":{"type":"string"}},"brandPersonality":{"type":"array","items":{"type":"string"},"description":"Brand values."},"keyMessages":{"type":"array","items":{"type":"string"}},"fonts":{"type":"array","items":{"type":"string"}},"primaryColors":{"type":"array","items":{"type":"string"},"description":"Hex colors."},"secondaryColors":{"type":"array","items":{"type":"string"}}}}}}}}},"/tools/approve_brand_dna":{"post":{"operationId":"approve_brand_dna","description":"Mark the current Brand DNA as approved. The strategy and content plan are built from the approved version.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId","idempotencyKey"],"properties":{"brandId":{"type":"string","description":"Granted brand id."},"dnaId":{"type":"string"},"idempotencyKey":{"type":"string","minLength":1,"maxLength":200}}}}}}}},"/tools/create_brand_dna_without_website":{"post":{"operationId":"create_brand_dna_without_website","description":"Create an empty Brand DNA for a brand that has no website, to be filled with update_brand_dna. Returns the existing one when there already is one. Spends no credits.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId","idempotencyKey"],"properties":{"brandId":{"type":"string","description":"Granted brand id."},"idempotencyKey":{"type":"string","minLength":1,"maxLength":200}}}}}}}},"/tools/get_strategy_questions":{"post":{"operationId":"get_strategy_questions","description":"Read the strategy questions in five chapters (business, customers, brand, growth, future) with their answer keys, kinds, allowed options, which are required, and the answers saved so far, including answers prefilled from the website scan. missingRequired lists the keys still needed.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId"],"properties":{"brandId":{"type":"string","description":"Granted brand id."},"chapter":{"type":"string","description":"One chapter id, e.g. business. Defaults to all."}}}}}}}},"/tools/save_strategy_answers":{"post":{"operationId":"save_strategy_answers","description":"Save answers to strategy questions by answer key. Select answers must use the listed option text exactly; multi-select answers are lists. Starts the questionnaire if needed. Returns missingRequired.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId","answers","idempotencyKey"],"properties":{"brandId":{"type":"string","description":"Granted brand id."},"answers":{"type":"object","description":"Answer key to value, e.g. {\"core_message\": \"...\"}."},"idempotencyKey":{"type":"string","minLength":1,"maxLength":200}}}}}}}},"/tools/generate_strategy":{"post":{"operationId":"generate_strategy","description":"Build the marketing strategy from the saved answers and the approved Brand DNA. Costs 5 credits from the Aivy account, counted against this connection's credit limit. Runs in the background; get_strategy_draft reads the result. Requires every required question to be answered.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId","idempotencyKey"],"properties":{"brandId":{"type":"string","description":"Granted brand id."},"planStartDate":{"type":"string","description":"YYYY-MM-DD the content plan should start. Defaults to today."},"idempotencyKey":{"type":"string","minLength":1,"maxLength":200}}}}}}}},"/tools/get_strategy_draft":{"post":{"operationId":"get_strategy_draft","description":"Read the latest marketing strategy (goals, audience, positioning, offer, messages, content pillars, channels and cadence), whether it is still being built, and whether it is approved.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId"],"properties":{"brandId":{"type":"string","description":"Granted brand id."}}}}}}}},"/tools/edit_strategy":{"post":{"operationId":"edit_strategy","description":"Change one field of the latest strategy, e.g. keyMessage or primaryGoal (editableFields in get_strategy_draft). An edited strategy needs approval again.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId","field","value","idempotencyKey"],"properties":{"brandId":{"type":"string","description":"Granted brand id."},"field":{"type":"string"},"value":{"description":"Text, or a list of texts for list fields."},"idempotencyKey":{"type":"string","minLength":1,"maxLength":200}}}}}}}},"/tools/approve_strategy":{"post":{"operationId":"approve_strategy","description":"Approve the latest strategy. The 12-month content plan can only be built from an approved strategy.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId","idempotencyKey"],"properties":{"brandId":{"type":"string","description":"Granted brand id."},"idempotencyKey":{"type":"string","minLength":1,"maxLength":200}}}}}}}},"/tools/create_content_plan":{"post":{"operationId":"create_content_plan","description":"Build the 12-month content plan from the approved strategy. Costs 14 credits from the Aivy account, counted against this connection's credit limit. Runs in the background; get_content_plan reads the result.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId","idempotencyKey"],"properties":{"brandId":{"type":"string","description":"Granted brand id."},"startDate":{"type":"string","description":"YYYY-MM-DD. Defaults to today."},"idempotencyKey":{"type":"string","minLength":1,"maxLength":200}}}}}}}},"/tools/get_content_plan":{"post":{"operationId":"get_content_plan","description":"Read the 12-month content plan: start date, which months are ready, and the items of one month (week, type, platform, title). Also says whether it is still being built.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId"],"properties":{"brandId":{"type":"string","description":"Granted brand id."},"month":{"type":"integer","minimum":1,"maximum":12,"description":"Defaults to 1."}}}}}}}},"/tools/edit_content_plan_week":{"post":{"operationId":"edit_content_plan_week","description":"Change the plan of one week: title, weekTheme, weeklyStory, weeklyGoal, mainMessage or stage (awareness, consideration, decision or retention). A week whose master content is already written cannot be changed here.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId","month","week","changes","idempotencyKey"],"properties":{"brandId":{"type":"string","description":"Granted brand id."},"month":{"type":"integer","minimum":1,"maximum":12},"week":{"type":"integer","minimum":1,"maximum":6},"changes":{"type":"object"},"idempotencyKey":{"type":"string","minLength":1,"maxLength":200}}}}}}}},"/tools/get_brand_context":{"post":{"operationId":"get_brand_context","description":"Read brand voice, identity, do and dont words, language, timezone, and visual guidelines.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId"],"properties":{"brandId":{"type":"string","description":"Granted brand id."}}}}}}}},"/tools/get_strategy":{"post":{"operationId":"get_strategy","description":"Read strategy goals, audience, positioning, content pillars with ids, and the roadmap summary (id, status, startDate, endDate). Week items are on get_pipeline_week. roadmap is null when this brand has no roadmap.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId"],"properties":{"brandId":{"type":"string","description":"Granted brand id."}}}}}}}},"/tools/list_channels":{"post":{"operationId":"list_channels","description":"List channel health, account name, handle, page or profile type, token expiry, and whether the channel can publish. Tokens are not returned.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId"],"properties":{"brandId":{"type":"string","description":"Granted brand id."}}}}}}}},"/tools/get_channel_connect_url":{"post":{"operationId":"get_channel_connect_url","description":"Return a link a person opens to connect or reconnect a channel, including Instagram. Tokens are not returned.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId","platform","idempotencyKey"],"properties":{"brandId":{"type":"string","description":"Granted brand id."},"platform":{"type":"string"},"idempotencyKey":{"type":"string","minLength":1,"maxLength":200}}}}}}}},"/tools/list_calendar":{"post":{"operationId":"list_calendar","description":"List posts in an explicit interval. A timestamp without an offset uses the brand timezone.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId","start","end"],"properties":{"brandId":{"type":"string","description":"Granted brand id."},"start":{"type":"string"},"end":{"type":"string"}}}}}}}},"/tools/list_posts":{"post":{"operationId":"list_posts","description":"List posts for one brand with optional status, platform, and cursor.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId"],"properties":{"brandId":{"type":"string","description":"Granted brand id."},"status":{"type":"string"},"platform":{"type":"string"},"cursor":{"type":"string"}}}}}}}},"/tools/get_pipeline_week":{"post":{"operationId":"get_pipeline_week","description":"Read one content-plan week for a granted brand.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":[],"properties":{"brandId":{"type":"string","description":"Granted brand id."},"weekPreset":{"type":"string"},"start":{"type":"string"},"end":{"type":"string"},"monthNumber":{"type":"integer"},"weekNumber":{"type":"integer"}}}}}}}},"/tools/get_content_item":{"post":{"operationId":"get_content_item","description":"Read one post or roadmap item in a granted brand. A post includes body, hashtags, mediaIds, media, accountKind, scheduledAt, publishedAt, permalink, providerPostId, version, and updatedAt.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId","id"],"properties":{"brandId":{"type":"string","description":"Granted brand id."},"id":{"type":"string"}}}}}}}},"/tools/get_usage":{"post":{"operationId":"get_usage","description":"Read credit balance and billing mode. This does not spend credits.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":[],"properties":{}}}}}}},"/tools/create_post_draft":{"post":{"operationId":"create_post_draft","description":"Save 1 to 5 unpublished posts. Validates platform limits before saving. Does not publish. scheduledAt is stored only.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId","idempotencyKey","variants"],"properties":{"brandId":{"type":"string","description":"Granted brand id."},"idempotencyKey":{"type":"string","minLength":1,"maxLength":200},"variants":{"type":"array","minItems":1,"maxItems":5,"items":{"type":"object","additionalProperties":false,"required":["platform","body"],"properties":{"platform":{"type":"string","description":"linkedin, facebook, instagram, or x. twitter is accepted as x."},"body":{"type":"string"},"hashtags":{"type":"array","items":{"type":"string"}},"placement":{"type":"string","description":"timeline, reels, or stories."},"format":{"type":"string","description":"feed, carousel, reel, or story."},"mediaIds":{"type":"array","items":{"type":"string"}},"scheduledAt":{"type":"string","description":"ISO 8601. An offset is absolute. A value without an offset uses the brand timezone. Stored only; call schedule_post to send it."},"accountKind":{"type":"string","description":"page or profile. Must match the connected LinkedIn account. Facebook must be a Page."},"thread":{"type":"array","items":{"type":"string"},"description":"X thread parts. More than one part is rejected because the publisher has no thread field."},"firstComment":{"type":"string","description":"Rejected. The publisher has no first-comment field."},"link":{"type":"string","description":"Rejected. The publisher has no link-preview field."}}}}}}}}}}},"/tools/update_post_draft":{"post":{"operationId":"update_post_draft","description":"Update text, hashtags, placement, format, media, or scheduledAt on an unpublished post.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId","postId","idempotencyKey"],"properties":{"brandId":{"type":"string","description":"Granted brand id."},"postId":{"type":"string"},"idempotencyKey":{"type":"string","minLength":1,"maxLength":200},"body":{"type":"string"},"hashtags":{"type":"array","items":{"type":"string"}},"placement":{"type":"string"},"format":{"type":"string"},"mediaIds":{"type":"array","items":{"type":"string"}},"scheduledAt":{"type":"string"},"accountKind":{"type":"string"},"thread":{"type":"array","items":{"type":"string"}},"firstComment":{"type":"string"},"link":{"type":"string"}}}}}}}},"/tools/duplicate_post":{"post":{"operationId":"duplicate_post","description":"Copy an unpublished or published post onto another platform as a new ready draft after validation.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId","postId","platform","idempotencyKey"],"properties":{"brandId":{"type":"string","description":"Granted brand id."},"postId":{"type":"string"},"platform":{"type":"string"},"idempotencyKey":{"type":"string","minLength":1,"maxLength":200},"accountKind":{"type":"string"}}}}}}}},"/tools/delete_post":{"post":{"operationId":"delete_post","description":"Delete an unpublished, unscheduled post. A scheduled post must be unscheduled first. A published post deletes the PostForMe record when that call succeeds. networkRemoval is unconfirmed because this does not prove the native network post was removed.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId","postId","idempotencyKey"],"properties":{"brandId":{"type":"string","description":"Granted brand id."},"postId":{"type":"string"},"idempotencyKey":{"type":"string","minLength":1,"maxLength":200}}}}}}}},"/tools/archive_post":{"post":{"operationId":"archive_post","description":"Archive an unpublished, unscheduled post. The scheduler ignores archived posts.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId","postId","idempotencyKey"],"properties":{"brandId":{"type":"string","description":"Granted brand id."},"postId":{"type":"string"},"idempotencyKey":{"type":"string","minLength":1,"maxLength":200}}}}}}}},"/tools/schedule_post":{"post":{"operationId":"schedule_post","description":"Schedule a post at least 5 minutes ahead. Requires posts.publish and allowPublish. With requireApproval, the post waits for a person in Aivy. The stored time is the scheduled_at echoed by PostForMe. dryRun returns that provider payload and does not send it.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId","postId","scheduledAt","idempotencyKey"],"properties":{"brandId":{"type":"string","description":"Granted brand id."},"postId":{"type":"string"},"scheduledAt":{"type":"string"},"idempotencyKey":{"type":"string","minLength":1,"maxLength":200},"dryRun":{"type":"boolean","description":"When true, return the provider payload and do not send it."}}}}}}}},"/tools/unschedule_post":{"post":{"operationId":"unschedule_post","description":"Cancel a scheduled provider post. If the provider cancel fails, the local post stays scheduled.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId","postId","idempotencyKey"],"properties":{"brandId":{"type":"string","description":"Granted brand id."},"postId":{"type":"string"},"idempotencyKey":{"type":"string","minLength":1,"maxLength":200}}}}}}}},"/tools/publish_post":{"post":{"operationId":"publish_post","description":"Publish a post now. Requires posts.publish and allowPublish. With requireApproval, the post waits for a person in Aivy.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId","postId","idempotencyKey"],"properties":{"brandId":{"type":"string","description":"Granted brand id."},"postId":{"type":"string"},"idempotencyKey":{"type":"string","minLength":1,"maxLength":200}}}}}}}},"/tools/get_publish_status":{"post":{"operationId":"get_publish_status","description":"Read scheduled, publishing, published, failed, or pendingApproval plus the provider id, permalink, and publishedAt. changedFields is empty unless this read synced a provider change. A published post has publishedAt and scheduledAt null.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId","postId"],"properties":{"brandId":{"type":"string","description":"Granted brand id."},"postId":{"type":"string"}}}}}}}},"/tools/upload_media":{"post":{"operationId":"upload_media","description":"Create a media id and a signed upload URL for an image or video. The secret is not a provider token.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId","filename","mimeType","idempotencyKey"],"properties":{"brandId":{"type":"string","description":"Granted brand id."},"filename":{"type":"string"},"mimeType":{"type":"string"},"altText":{"type":"string"},"idempotencyKey":{"type":"string","minLength":1,"maxLength":200}}}}}}}},"/tools/upload_media_from_url":{"post":{"operationId":"upload_media_from_url","description":"Import a public https image or video into the brand library.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId","url","idempotencyKey"],"properties":{"brandId":{"type":"string","description":"Granted brand id."},"url":{"type":"string"},"altText":{"type":"string"},"idempotencyKey":{"type":"string","minLength":1,"maxLength":200}}}}}}}},"/tools/list_media":{"post":{"operationId":"list_media","description":"List media for a granted brand.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId"],"properties":{"brandId":{"type":"string","description":"Granted brand id."}}}}}}}},"/tools/get_media":{"post":{"operationId":"get_media","description":"Read one media file, including alt text and dimensions.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId","mediaId"],"properties":{"brandId":{"type":"string","description":"Granted brand id."},"mediaId":{"type":"string"}}}}}}}},"/tools/delete_media":{"post":{"operationId":"delete_media","description":"Delete media that is not used by a scheduled or published post.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId","mediaId","idempotencyKey"],"properties":{"brandId":{"type":"string","description":"Granted brand id."},"mediaId":{"type":"string"},"idempotencyKey":{"type":"string","minLength":1,"maxLength":200}}}}}}}},"/tools/estimate_generation":{"post":{"operationId":"estimate_generation","description":"Estimate generation cost in dc. This does not spend credits.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":[],"properties":{"kind":{"type":"string"},"count":{"type":"integer"}}}}}}}},"/tools/generate_post_variants":{"post":{"operationId":"generate_post_variants","description":"Generate post text inside the grant generation ceiling.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId","brief","idempotencyKey"],"properties":{"brandId":{"type":"string","description":"Granted brand id."},"brief":{"type":"string"},"count":{"type":"integer"},"platform":{"type":"string"},"idempotencyKey":{"type":"string","minLength":1,"maxLength":200}}}}}}}},"/tools/generate_image":{"post":{"operationId":"generate_image","description":"Generate an image inside the grant generation ceiling and store it as media.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId","prompt","idempotencyKey"],"properties":{"brandId":{"type":"string","description":"Granted brand id."},"prompt":{"type":"string"},"platform":{"type":"string"},"idempotencyKey":{"type":"string","minLength":1,"maxLength":200}}}}}}}},"/tools/get_post_metrics":{"post":{"operationId":"get_post_metrics","description":"Read impressions, reach, engagement, clicks, and permalink for one post from the provider feed. Missing numbers are null. availability is not_available_yet with a reason when the provider has no metrics.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId","postId"],"properties":{"brandId":{"type":"string","description":"Granted brand id."},"postId":{"type":"string"}}}}}}}},"/tools/get_brand_metrics":{"post":{"operationId":"get_brand_metrics","description":"Read impressions, reach, engagement, clicks, and followers delta for a brand interval. start and end are required ISO timestamps. A value without an offset uses the brand timezone. When no feed row contributes, availability is not_available_yet and the numbers are null.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["brandId","start","end"],"properties":{"brandId":{"type":"string","description":"Granted brand id."},"start":{"type":"string","description":"Required ISO timestamp. A value without an offset uses the brand timezone."},"end":{"type":"string","description":"Required ISO timestamp. A value without an offset uses the brand timezone."}}}}}}}}}}