Each service has its own base URL. All endpoints require X-API-Key header.
Get your key at Dashboard - API Settings.
Core platform APIs for customer account management, authentication, team management, billing, subscriptions, and project configuration.
Base URL: https://api.searchatlas.com
Customer project management - create, list, update, delete projects and connect external app IDs
Returns all projects for the authenticated customer. Includes app data, AI summary status, and linked app IDs.
{- "count": 0,
- "next": "string",
- "previous": "string",
- "results": [
- {
- "id": 0,
- "name": "string",
- "description": "string",
- "is_active": true,
- "timezone": "America/New_York",
- "platforms_config": {
- "facebook": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "page_id": "string",
- "category": "string"
}, - "instagram": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "instagram_id": "string",
- "instagram_user_id": "string",
- "followers_count": 0,
- "follows_count": 0
}, - "twitter": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "twitter_id": "string",
- "description": "string",
- "profile_image_url": "string",
- "followers_count": 0,
- "following_count": 0,
- "tweet_count": 0,
- "verified": true
}, - "linkedin": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "author_urn": "string",
- "company_id": "string",
- "company_name": "string",
- "industry": "string",
- "followers_count": 0
}
}, - "default_approval_type": "AUTO_PUBLISH",
- "default_image_source_type": "string",
- "ai_settings": {
- "tone": "professional",
- "language": "en",
- "include_hashtags": true,
- "max_hashtags": 5,
- "include_emojis": true,
- "target_audience": "string",
- "brand_voice_guidelines": "string",
- "image_prompt": "string"
}, - "image_prompt": "string",
- "enabled_platforms": [
- "facebook",
- "instagram"
], - "posts_count": 0,
- "schedule": {
- "id": 0,
- "name": "string",
- "is_active": true,
- "frequency_config": {
- "frequency_type": "daily",
- "days_of_week": [
- 6
], - "days_of_month": [
- 1
], - "preferred_times": [
- "string"
]
}, - "next_run_at": "2019-08-24T14:15:22Z",
- "last_run_at": "2019-08-24T14:15:22Z"
}, - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
]
}Creates a new project for the authenticated customer. Validates domain uniqueness per customer
(normalized, ignoring www. prefix). Optionally skips AI Agent project creation via
create_ai_agent_project: false. Triggers AI summary generation on staging when enabled.
| name required | string <= 200 characters |
| description | string |
| is_active | boolean Default: true |
| timezone | string IANA timezone string (e.g. America/New_York) |
object (PlatformsConfig) | |
| default_approval_type | string Enum: "AUTO_PUBLISH" "APPROVE_IF_IMAGE" "AI_IMAGES_ONLY" "APPROVE_FOR_PUBLISH" |
| default_image_source_type | string or null |
object (AISettings) | |
| image_prompt | string <= 1000 characters Convenience alias - merged into ai_settings.image_prompt on save |
{- "country_code": "US",
- "keywords": [
- "seo tools",
- "rank tracker"
], - "create_ai_agent_project": true
}{- "id": 0,
- "name": "string",
- "description": "string",
- "is_active": true,
- "timezone": "America/New_York",
- "platforms_config": {
- "facebook": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "page_id": "string",
- "category": "string"
}, - "instagram": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "instagram_id": "string",
- "instagram_user_id": "string",
- "followers_count": 0,
- "follows_count": 0
}, - "twitter": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "twitter_id": "string",
- "description": "string",
- "profile_image_url": "string",
- "followers_count": 0,
- "following_count": 0,
- "tweet_count": 0,
- "verified": true
}, - "linkedin": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "author_urn": "string",
- "company_id": "string",
- "company_name": "string",
- "industry": "string",
- "followers_count": 0
}
}, - "default_approval_type": "AUTO_PUBLISH",
- "default_image_source_type": "string",
- "ai_settings": {
- "tone": "professional",
- "language": "en",
- "include_hashtags": true,
- "max_hashtags": 5,
- "include_emojis": true,
- "target_audience": "string",
- "brand_voice_guidelines": "string",
- "image_prompt": "string"
}, - "image_prompt": "string",
- "enabled_platforms": [
- "facebook",
- "instagram"
], - "posts_count": 0,
- "schedule": {
- "id": 0,
- "name": "string",
- "is_active": true,
- "frequency_config": {
- "frequency_type": "daily",
- "days_of_week": [
- 6
], - "days_of_month": [
- 1
], - "preferred_times": [
- "string"
]
}, - "next_run_at": "2019-08-24T14:15:22Z",
- "last_run_at": "2019-08-24T14:15:22Z"
}, - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Returns a single project with full app data, AI summary, and linked app IDs.
{- "id": 0,
- "name": "string",
- "description": "string",
- "is_active": true,
- "timezone": "America/New_York",
- "platforms_config": {
- "facebook": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "page_id": "string",
- "category": "string"
}, - "instagram": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "instagram_id": "string",
- "instagram_user_id": "string",
- "followers_count": 0,
- "follows_count": 0
}, - "twitter": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "twitter_id": "string",
- "description": "string",
- "profile_image_url": "string",
- "followers_count": 0,
- "following_count": 0,
- "tweet_count": 0,
- "verified": true
}, - "linkedin": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "author_urn": "string",
- "company_id": "string",
- "company_name": "string",
- "industry": "string",
- "followers_count": 0
}
}, - "default_approval_type": "AUTO_PUBLISH",
- "default_image_source_type": "string",
- "ai_settings": {
- "tone": "professional",
- "language": "en",
- "include_hashtags": true,
- "max_hashtags": 5,
- "include_emojis": true,
- "target_audience": "string",
- "brand_voice_guidelines": "string",
- "image_prompt": "string"
}, - "image_prompt": "string",
- "enabled_platforms": [
- "facebook",
- "instagram"
], - "posts_count": 0,
- "schedule": {
- "id": 0,
- "name": "string",
- "is_active": true,
- "frequency_config": {
- "frequency_type": "daily",
- "days_of_week": [
- 6
], - "days_of_month": [
- 1
], - "preferred_times": [
- "string"
]
}, - "next_run_at": "2019-08-24T14:15:22Z",
- "last_run_at": "2019-08-24T14:15:22Z"
}, - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Updates specified fields on a project. Accepts the same fields as create.
| keywords | Array of strings |
| competitors | Array of strings |
| is_starred | boolean |
| custom_report_apps | Array of strings |
| country_code | string |
| location | string or null |
| location_id | integer or null |
{- "keywords": [
- "string"
], - "competitors": [
- "string"
], - "is_starred": true,
- "custom_report_apps": [
- "string"
], - "country_code": "string",
- "location": "string",
- "location_id": 0
}{- "id": 0,
- "name": "string",
- "description": "string",
- "is_active": true,
- "timezone": "America/New_York",
- "platforms_config": {
- "facebook": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "page_id": "string",
- "category": "string"
}, - "instagram": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "instagram_id": "string",
- "instagram_user_id": "string",
- "followers_count": 0,
- "follows_count": 0
}, - "twitter": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "twitter_id": "string",
- "description": "string",
- "profile_image_url": "string",
- "followers_count": 0,
- "following_count": 0,
- "tweet_count": 0,
- "verified": true
}, - "linkedin": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "author_urn": "string",
- "company_id": "string",
- "company_name": "string",
- "industry": "string",
- "followers_count": 0
}
}, - "default_approval_type": "AUTO_PUBLISH",
- "default_image_source_type": "string",
- "ai_settings": {
- "tone": "professional",
- "language": "en",
- "include_hashtags": true,
- "max_hashtags": 5,
- "include_emojis": true,
- "target_audience": "string",
- "brand_voice_guidelines": "string",
- "image_prompt": "string"
}, - "image_prompt": "string",
- "enabled_platforms": [
- "facebook",
- "instagram"
], - "posts_count": 0,
- "schedule": {
- "id": 0,
- "name": "string",
- "is_active": true,
- "frequency_config": {
- "frequency_type": "daily",
- "days_of_week": [
- 6
], - "days_of_month": [
- 1
], - "preferred_times": [
- "string"
]
}, - "next_run_at": "2019-08-24T14:15:22Z",
- "last_run_at": "2019-08-24T14:15:22Z"
}, - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Links an external app ID to an existing project. Supported apps:
sa, se, krt, otto, gbp, local_seo, otto_v2, llmv, otto_ppc.
llmvsa, se, krt, otto, otto_v2, local_seogbp, otto_ppc| projectId required | integer |
| app required | string Enum: "sa" "se" "krt" "otto" "gbp" "local_seo" "otto_v2" "llmv" "otto_ppc" App key to connect |
| app_id | string External app ID. Integer for most apps; UUID for llmv; string for gbp/otto_ppc. |
| keywords | Array of strings |
{- "app": "se",
- "app_id": "12345",
- "keywords": [
- "seo tools"
]
}{- "id": 0,
- "name": "string",
- "description": "string",
- "is_active": true,
- "timezone": "America/New_York",
- "platforms_config": {
- "facebook": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "page_id": "string",
- "category": "string"
}, - "instagram": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "instagram_id": "string",
- "instagram_user_id": "string",
- "followers_count": 0,
- "follows_count": 0
}, - "twitter": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "twitter_id": "string",
- "description": "string",
- "profile_image_url": "string",
- "followers_count": 0,
- "following_count": 0,
- "tweet_count": 0,
- "verified": true
}, - "linkedin": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "author_urn": "string",
- "company_id": "string",
- "company_name": "string",
- "industry": "string",
- "followers_count": 0
}
}, - "default_approval_type": "AUTO_PUBLISH",
- "default_image_source_type": "string",
- "ai_settings": {
- "tone": "professional",
- "language": "en",
- "include_hashtags": true,
- "max_hashtags": 5,
- "include_emojis": true,
- "target_audience": "string",
- "brand_voice_guidelines": "string",
- "image_prompt": "string"
}, - "image_prompt": "string",
- "enabled_platforms": [
- "facebook",
- "instagram"
], - "posts_count": 0,
- "schedule": {
- "id": 0,
- "name": "string",
- "is_active": true,
- "frequency_config": {
- "frequency_type": "daily",
- "days_of_week": [
- 6
], - "days_of_month": [
- 1
], - "preferred_times": [
- "string"
]
}, - "next_run_at": "2019-08-24T14:15:22Z",
- "last_run_at": "2019-08-24T14:15:22Z"
}, - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Returns quota/credit usage history for the authenticated customer.
Results are read-only and may be served from ClickHouse (analytics) or PostgreSQL (legacy).
Includes quota_display_name for human-readable descriptions.
| quota_name | string Filter by quota name slug |
| operation_type | string Filter by operation type |
{- "count": 0,
- "next": "string",
- "previous": "string",
- "results": [
- {
- "id": 0,
- "quota_name": "string",
- "quota_display_name": "string",
- "operation_type": "string",
- "amount_changed": 0,
- "triggered_by": "string",
- "reason": "string",
- "allocation_source": "string",
- "occurred_at": "2019-08-24T14:15:22Z",
- "created": "2019-08-24T14:15:22Z"
}
]
}Returns all indexing batches for the authenticated customer.
Includes is_report_available flag (true if batch is 8+ days old and has results),
indexer_submitted_links, indexer_indexed_links, and indexation_percentage.
[- {
- "id": 0,
- "status": "string",
- "batch_name": "string",
- "indexer_submitted_links": 0,
- "indexer_indexed_links": 0,
- "request_submitted_dt": "2019-08-24T14:15:22Z",
- "is_report_available": true,
- "indexation_percentage": 0
}
]Returns all links in an indexing batch with their individual status.
| link | string Filter by link URL substring |
| status | string Enum: "pending" "indexed" "indexing" "not_indexed" "submitted" Filter by link status |
| ordering | string Enum: "link" "-link" "status" "-status" |
[- {
- "id": 0,
- "link": "string",
- "status": "pending"
}
]Creates and submits a new indexing batch. Accepts 1-1000 URLs per batch. Each URL must be a valid string up to 2000 characters.
| name required | string <= 255 characters |
| urls_to_send required | Array of strings [ 1 .. 1000 ] items [ items <= 2000 characters ] |
{- "name": "Blog Post Batch - Jan 2024",
}{- "id": 0,
- "name": "string",
- "status": "string",
- "indexing_links": [
- {
- "id": 0,
- "link": "string",
- "status": "pending"
}
]
}AI-powered content creation and optimization platform. Create SEO-optimized articles with AI, manage Brand Vaults for brand voice consistency, run content audits, use CGenius for advanced content generation pipelines, manage Domain Knowledge Networks, and publish to WordPress or external CMS platforms.
Base URL: https://ca.searchatlas.com
Create, list, retrieve, update, and delete content optimizer pages (articles)
Returns a paginated list of articles/pages for the authenticated user's account. Supports filtering by status, project, brand vault, and ordering.
| page | integer Default: 1 |
| page_size | integer Default: 10 |
| search | string Search by title or URL |
| ordering | string Field to sort by. Prefix with |
| status | string Enum: "draft" "in_progress" "ready_to_publish" "published" "archived" Filter by article status |
| project | integer Filter by project ID |
| brand_vault_uuid | string <uuid> Filter by Brand Vault UUID |
| is_repolling | boolean Default: false |
{- "count": 0,
- "results": [
- {
- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "id": 0,
- "title": "string",
- "status": "draft",
- "score": 0,
- "content_score": 0,
- "technical_score": 0,
- "word_count": 0,
- "readability_grade": "string",
- "readability_grade_range": "string",
- "version": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "project_id": 0,
- "project_name": "string",
- "brand_vault": {
- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "name": "string"
}, - "due_date": "2019-08-24",
- "tags": [
- "string"
], - "assigned_to_users": [
- "string"
], - "wp_synced": true,
- "wp_syncing_task_status": "string",
- "language": "string",
- "feature_image_alt_text": "string",
- "was_deleted": true
}
]
}Creates a new article. Optionally crawls a target URL for content, accepts a keywords list and location for SEO scoring, and can trigger AI outline generation immediately.
| title | string |
| target_url | string <uri> Live URL to crawl for existing content |
| keywords_list | Array of strings Initial target keywords |
| country_code | string ISO alpha-2 country code for keyword scoring |
| location | string Named location (city/region) - takes priority over country_code |
| location_id | integer Location ID paired with location string |
| should_use_headless_browser | boolean Default: false |
| should_generate_outline | boolean Default: false Immediately trigger AI outline generation after creation |
| mode_of_creation | string Default: "ai" Enum: "ai" "manual" |
| brand_vault_uuid | string <uuid> Associate with a Brand Vault for AI settings and context |
| project_name | string Assign to an existing project by name |
| language | string ISO 639-1 language code |
{- "title": "Best Running Shoes 2025",
- "keywords_list": [
- "running shoes",
- "best running shoes"
], - "country_code": "us",
- "mode_of_creation": "ai"
}{- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "id": 0,
- "title": "string",
- "status": "draft",
- "score": 0,
- "content_score": 0,
- "technical_score": 0,
- "word_count": 0,
- "readability_grade": "string",
- "readability_grade_range": "string",
- "version": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "project_id": 0,
- "project_name": "string",
- "brand_vault": {
- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "name": "string"
}, - "due_date": "2019-08-24",
- "tags": [
- "string"
], - "assigned_to_users": [
- "string"
], - "wp_synced": true,
- "wp_syncing_task_status": "string",
- "language": "string",
- "feature_image_alt_text": "string",
- "was_deleted": true
}Update shared fields (due_date, status, assigned_to_users, project_name, brand_vault_uuid) across multiple pages at once.
| uuids required | Array of strings <uuid> [ items <uuid > ] |
required | object |
{- "uuids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "data": {
- "due_date": "2019-08-24",
- "status": "string",
- "project_name": "string",
- "assigned_to_users": [
- "string"
], - "was_deleted": true,
- "brand_vault_uuid": "ed6573dc-c380-4a19-bc05-007c933224bc"
}
}Returns full page data including editor state, cleaned HTML, keyword data, and WP fields.
| is_repolling | boolean |
{- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "id": 0,
- "title": "string",
- "status": "draft",
- "score": 0,
- "content_score": 0,
- "technical_score": 0,
- "word_count": 0,
- "readability_grade": "string",
- "readability_grade_range": "string",
- "version": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "project_id": 0,
- "project_name": "string",
- "brand_vault": {
- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "name": "string"
}, - "due_date": "2019-08-24",
- "tags": [
- "string"
], - "assigned_to_users": [
- "string"
], - "wp_synced": true,
- "wp_syncing_task_status": "string",
- "language": "string",
- "feature_image_alt_text": "string",
- "was_deleted": true,
- "editor_state": "string",
- "cleaned_html": "string",
- "is_cleaned_html_updated": true,
- "text_preview": "string",
- "readability": "string",
- "average_readability": 0,
- "suggested_word_count_limits": {
- "lower": 0,
- "upper": 0
}, - "country_code": "string",
- "onpage_audit_country_code": "string",
- "location": "string",
- "location_id": 0,
- "status_code": 0,
- "hostname": "string",
- "meta_title": "string",
- "meta_desc": "string",
- "hero_image_alt_text": "string",
- "score_extended": { },
- "score_counts": { },
- "created_by_user": "string",
- "wp_post_status": "string",
- "wp_post_type": "string",
- "wp_synced_at": "2019-08-24T14:15:22Z",
- "wp_post_categories": [
- "string"
], - "wp_post_author_id": 0,
- "wp_sync_at_date": "2019-08-24",
- "wp_sync_at_time": "string",
- "permalink": "string",
- "applied_refiners": [
- {
- "microagent_id": 0,
- "finished_at": "2019-08-24T14:15:22Z"
}
], - "should_use_headless_browser": true
}Full update of a page. Primarily used to update the associated hostname.
| hostname | string Domain hostname to associate with this page |
{- "hostname": "string"
}{- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "id": 0,
- "title": "string",
- "status": "draft",
- "score": 0,
- "content_score": 0,
- "technical_score": 0,
- "word_count": 0,
- "readability_grade": "string",
- "readability_grade_range": "string",
- "version": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "project_id": 0,
- "project_name": "string",
- "brand_vault": {
- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "name": "string"
}, - "due_date": "2019-08-24",
- "tags": [
- "string"
], - "assigned_to_users": [
- "string"
], - "wp_synced": true,
- "wp_syncing_task_status": "string",
- "language": "string",
- "feature_image_alt_text": "string",
- "was_deleted": true,
- "editor_state": "string",
- "cleaned_html": "string",
- "is_cleaned_html_updated": true,
- "text_preview": "string",
- "readability": "string",
- "average_readability": 0,
- "suggested_word_count_limits": {
- "lower": 0,
- "upper": 0
}, - "country_code": "string",
- "onpage_audit_country_code": "string",
- "location": "string",
- "location_id": 0,
- "status_code": 0,
- "hostname": "string",
- "meta_title": "string",
- "meta_desc": "string",
- "hero_image_alt_text": "string",
- "score_extended": { },
- "score_counts": { },
- "created_by_user": "string",
- "wp_post_status": "string",
- "wp_post_type": "string",
- "wp_synced_at": "2019-08-24T14:15:22Z",
- "wp_post_categories": [
- "string"
], - "wp_post_author_id": 0,
- "wp_sync_at_date": "2019-08-24",
- "wp_sync_at_time": "string",
- "permalink": "string",
- "applied_refiners": [
- {
- "microagent_id": 0,
- "finished_at": "2019-08-24T14:15:22Z"
}
], - "should_use_headless_browser": true
}Update one or more page fields: title, editor_state, cleaned_html, status, meta_title, meta_desc, hero_image, hero_image_alt_text, language, version, etc.
| title | string |
| editor_state | string Draft.js editor state JSON |
| cleaned_html | string |
| is_cleaned_html_updated | boolean |
| status | string Enum: "draft" "in_progress" "ready_to_publish" "published" "archived" |
| meta_title | string |
| meta_desc | string |
| hero_image | string or null <uri> |
| hero_image_alt_text | string |
| language | string |
| version | string Required when updating content to prevent concurrent modification |
| brand_vault_uuid | string or null <uuid> |
| due_date | string or null <date> |
| assigned_to_users | Array of strings |
| feature_image | string or null <uri> |
| feature_image_alt_text | string or null |
{- "title": "string",
- "editor_state": "string",
- "cleaned_html": "string",
- "is_cleaned_html_updated": true,
- "status": "draft",
- "meta_title": "string",
- "meta_desc": "string",
- "hero_image_alt_text": "string",
- "language": "string",
- "version": "string",
- "brand_vault_uuid": "ed6573dc-c380-4a19-bc05-007c933224bc",
- "due_date": "2019-08-24",
- "assigned_to_users": [
- "string"
], - "feature_image_alt_text": "string"
}{- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "id": 0,
- "title": "string",
- "status": "draft",
- "score": 0,
- "content_score": 0,
- "technical_score": 0,
- "word_count": 0,
- "readability_grade": "string",
- "readability_grade_range": "string",
- "version": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "project_id": 0,
- "project_name": "string",
- "brand_vault": {
- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "name": "string"
}, - "due_date": "2019-08-24",
- "tags": [
- "string"
], - "assigned_to_users": [
- "string"
], - "wp_synced": true,
- "wp_syncing_task_status": "string",
- "language": "string",
- "feature_image_alt_text": "string",
- "was_deleted": true,
- "editor_state": "string",
- "cleaned_html": "string",
- "is_cleaned_html_updated": true,
- "text_preview": "string",
- "readability": "string",
- "average_readability": 0,
- "suggested_word_count_limits": {
- "lower": 0,
- "upper": 0
}, - "country_code": "string",
- "onpage_audit_country_code": "string",
- "location": "string",
- "location_id": 0,
- "status_code": 0,
- "hostname": "string",
- "meta_title": "string",
- "meta_desc": "string",
- "hero_image_alt_text": "string",
- "score_extended": { },
- "score_counts": { },
- "created_by_user": "string",
- "wp_post_status": "string",
- "wp_post_type": "string",
- "wp_synced_at": "2019-08-24T14:15:22Z",
- "wp_post_categories": [
- "string"
], - "wp_post_author_id": 0,
- "wp_sync_at_date": "2019-08-24",
- "wp_sync_at_time": "string",
- "permalink": "string",
- "applied_refiners": [
- {
- "microagent_id": 0,
- "finished_at": "2019-08-24T14:15:22Z"
}
], - "should_use_headless_browser": true
}Update article status using action-style endpoints (e.g. draft, published).
| status required | string Enum: "draft" "in_progress" "ready_to_publish" "published" "archived" |
| status | string |
{- "status": "string"
}Returns a lightweight snapshot of the page's SEO score, focus terms, clustered focus terms, and questions. Used to initialize the editor sidebar.
{- "score": 0,
- "focus_terms": [
- {
- "term": "string",
- "score": 0,
- "uses": 0,
- "recommended_uses": 0,
- "status": "good",
- "is_excluded": true
}
], - "focus_terms_clustered": [
- { }
], - "questions": [
- { }
], - "focus_terms_grid_data": { }
}Returns the full keyword scoring data: score, focus terms, clustered terms, questions, competitors, SERP schema, and suggested word-count range.
| should_rescore | boolean Default: false Force re-scoring of focus terms |
{- "score": 0,
- "focus_terms": [
- {
- "term": "string",
- "score": 0,
- "uses": 0,
- "recommended_uses": 0,
- "status": "good",
- "is_excluded": true
}
], - "focus_terms_clustered": [
- { }
], - "clusters": [
- { }
], - "questions": [
- { }
], - "competitors_data": { },
- "status": { },
- "focus_terms_grid_data": { },
- "keyword_suggestions_grid_data": { },
- "serps_schema": { },
- "common_citations": { },
- "target_keywords": [
- { }
], - "suggested_word_count_limits": {
- "lower": 0,
- "upper": 0
}, - "should_repoll": true
}Add a new target keyword to the page, or replace an existing one
(edited_id). Provide either country_code or location + location_id.
required | object |
{- "target_keyword": {
- "keyword": "string",
- "country_code": "string",
- "location": "string",
- "location_id": 0,
- "edited_id": 0
}
}Remove a target keyword from the page.
required | object |
{- "target_keyword": {
- "keyword": "string",
- "country_code": "string",
- "location": "string",
- "location_id": 0
}
}Returns on-page SEO analysis, technical issues, and content recommendations.
{- "technical_score": 0,
- "content_score": 0,
- "issues": [
- {
- "type": "string",
- "message": "string",
- "severity": "error"
}
], - "page_structure": { },
- "serps_schema": { }
}Returns internal link opportunities for the page based on content analysis.
| should_reprocess | boolean Default: false Force reprocessing of suggestions |
{- "results": [
- {
- "title": "string",
- "keywords": [
- "string"
], - "is_bookmarked": true,
- "domain_authority": 0
}
]
}Enhanced internal link suggestions with additional context signals. Returns 503 if the external link-suggestion service is unavailable.
| should_reprocess | boolean Default: false |
{- "results": [
- {
- "title": "string",
- "keywords": [
- "string"
], - "is_bookmarked": true,
- "domain_authority": 0
}
]
}Marks an internal link suggestion as dismissed so it no longer appears in the page's suggestion list. Both the target URL and the anchor keywords are stored to prevent the suggestion from re-appearing.
| url required | string <uri> URL of the suggested link target to dismiss |
| keywords | Array of strings Anchor keyword(s) associated with this suggestion |
{- "keywords": [
- "string"
]
}Saves an internal link suggestion to the page's bookmarked list so the user can action it later without it being dismissed.
| url required | string <uri> URL of the suggested link target to bookmark |
{
}Export articles to Google Docs / HTML / CSV; import from URL or spreadsheet
Generates and returns a CSV export for the specified page UUIDs.
| uuids required | Array of strings <uuid> [ items <uuid > ] |
{- "uuids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}Crawls the given URL and imports its HTML content into the page editor.
| url required | string <uri> |
| should_override_content | boolean Default: true Whether to overwrite existing content |
| should_use_headless_browser | boolean Default: false |
{- "should_override_content": true,
- "should_use_headless_browser": false
}Upload a CSV/XLSX file or provide a Google Sheets URL to extract article titles and keywords for bulk creation. Supports Brand Vault association.
| file | string <binary> CSV or XLSX file |
| gsheets_url | string <uri> Google Sheets public URL (alternative to file upload) |
| brand_vault_uuid | string <uuid> |
{- "rows": [
- { }
]
}Publishes the article to the connected WordPress website. Supports post types, categories, author, permalink, and scheduled publishing.
| wp_website_id required | integer WP website heartbeat ID |
| post_url | string <uri> |
| post_status | string Enum: "publish" "draft" "private" "scheduled" |
| post_type | string Enum: "post" "page" "custom" |
| permalink | string |
| post_categories | Array of strings |
| post_author | integer |
| post_parent | integer or null |
| sync_at_date | string <date> Schedule publish date (required for scheduled posts) |
| sync_at_time | string Schedule publish time (HH:MM or HH:MM:SS, optional tz offset) |
| force_override | boolean Default: false |
{- "wp_website_id": 0,
- "post_status": "publish",
- "post_type": "post",
- "permalink": "string",
- "post_categories": [
- "string"
], - "post_author": 0,
- "post_parent": 0,
- "sync_at_date": "2019-08-24",
- "sync_at_time": "string",
- "force_override": false
}Sync multiple articles to their associated WordPress websites.
| uuids | Array of strings <uuid> [ items <uuid > ] |
{- "uuids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}Returns all WordPress websites connected to the account with heartbeat status.
[- {
- "id": 0,
- "status": "string",
- "post_types": [
- "string"
], - "categories": [
- {
- "id": 0,
- "name": "string"
}
], - "authors": [
- {
- "id": 0,
- "name": "string"
}
]
}
]Update who can access the page and at what permission level.
| is_public | boolean |
Array of objects |
{- "is_public": true,
- "shared_with": [
- {
- "email": "user@example.com",
- "permission": "view"
}
]
}{- "is_public": true,
- "public_share_hash": "string",
- "shared_with": [
- {
- "email": "user@example.com",
- "permission": "view"
}
]
}Returns a set of NLP-derived focus terms, questions, and competitor data for the given query keyword, country, and language.
| query required | string Target keyword or topic |
| country required | string Country code (e.g. "us") |
| language required | string Language code (e.g. "en") |
{- "query": "string",
- "country": "string",
- "language": "string"
}{- "score": 0,
- "focus_terms": [
- {
- "term": "string",
- "score": 0,
- "uses": 0,
- "recommended_uses": 0,
- "status": "good",
- "is_excluded": true
}
], - "questions": [
- {
- "question": "string",
- "score": 0
}
], - "competitors": { },
- "should_repoll": true
}Returns suggested sentences where the given focus terms can be naturally inserted.
| focus_terms required | Array of strings |
{- "focus_terms": [
- "string"
]
}Content audit task creation, retrieval, recrawl, and completion tracking
Returns all content audit tasks for the authenticated account.
| page | integer Default: 1 |
| page_size | integer Default: 10 |
| search | string |
| ordering | string |
{- "count": 0,
- "results": [
- {
- "id": 0,
- "country_code": "string",
- "location_id": 0,
- "location": "string",
- "is_processed": true,
- "import_failed": true,
- "created_at": "2019-08-24T14:15:22Z",
- "reprocessed_at": "2019-08-24T14:15:22Z",
- "public_share_hash": "string",
- "task_status": "string",
- "is_completed": true,
- "content_score": 0,
- "technical_score": 0,
- "word_count": 0,
- "readability": "string",
- "readability_grade_range": "string",
- "should_repoll": true,
- "is_target_keyword_failed": true,
- "status_code": 0,
- "technical_score_color": "string",
- "content_score_color": "string"
}
]
}Initiates a content audit for the given URL and up to 3 target keywords. Crawls the page and computes content score, technical score, focus terms, and SERP analysis.
| url required | string <uri> URL to audit |
| target_keywords required | Array of strings [ 1 .. 3 ] items 1-3 target keywords |
| country_code | string ISO alpha-2 country code |
| location | string Named location (overrides country_code) |
| location_id | integer Location ID paired with location |
| should_use_headless_browser | boolean Default: true |
{- "target_keywords": [
- "best SEO tools",
- "SEO software"
], - "country_code": "us"
}{- "id": 0,
- "country_code": "string",
- "location_id": 0,
- "location": "string",
- "is_processed": true,
- "import_failed": true,
- "created_at": "2019-08-24T14:15:22Z",
- "reprocessed_at": "2019-08-24T14:15:22Z",
- "public_share_hash": "string",
- "task_status": "string",
- "is_completed": true,
- "content_score": 0,
- "technical_score": 0,
- "word_count": 0,
- "readability": "string",
- "readability_grade_range": "string",
- "should_repoll": true,
- "is_target_keyword_failed": true,
- "status_code": 0,
- "technical_score_color": "string",
- "content_score_color": "string"
}Returns the full audit result including technicals, content analysis, focus terms, and internal link suggestions.
{- "id": 0,
- "country_code": "string",
- "location_id": 0,
- "location": "string",
- "is_processed": true,
- "import_failed": true,
- "created_at": "2019-08-24T14:15:22Z",
- "reprocessed_at": "2019-08-24T14:15:22Z",
- "public_share_hash": "string",
- "task_status": "string",
- "is_completed": true,
- "content_score": 0,
- "technical_score": 0,
- "word_count": 0,
- "readability": "string",
- "readability_grade_range": "string",
- "should_repoll": true,
- "is_target_keyword_failed": true,
- "status_code": 0,
- "technical_score_color": "string",
- "content_score_color": "string",
- "recommended_backlinks": [
- { }
], - "technicals": { },
- "content": { },
- "page_structure": { },
- "focus_terms": [
- {
- "term": "string",
- "score": 0,
- "uses": 0,
- "recommended_uses": 0,
- "status": "good",
- "is_excluded": true
}
], - "internal_outlink_suggestions": [
- {
- "title": "string",
- "keywords": [
- "string"
], - "is_bookmarked": true,
- "domain_authority": 0
}
], - "internal_inlink_suggestions": [
- {
- "title": "string",
- "keywords": [
- "string"
], - "is_bookmarked": true,
- "domain_authority": 0
}
], - "issues": [
- { }
], - "title": "string",
- "meta_description": "string",
- "serps_schema": { },
- "page_health": { },
- "audit_duration": 0
}Triggers a fresh crawl and re-analysis of the audit's URL. Returns the updated audit record after initiating reprocessing.
{- "id": 0,
- "country_code": "string",
- "location_id": 0,
- "location": "string",
- "is_processed": true,
- "import_failed": true,
- "created_at": "2019-08-24T14:15:22Z",
- "reprocessed_at": "2019-08-24T14:15:22Z",
- "public_share_hash": "string",
- "task_status": "string",
- "is_completed": true,
- "content_score": 0,
- "technical_score": 0,
- "word_count": 0,
- "readability": "string",
- "readability_grade_range": "string",
- "should_repoll": true,
- "is_target_keyword_failed": true,
- "status_code": 0,
- "technical_score_color": "string",
- "content_score_color": "string"
}Marks an internal outlink suggestion as dismissed so it no longer appears in the audit's suggestion list.
| url required | string <uri> URL of the outlink suggestion to dismiss |
{
}Marks an internal inlink (backlink) suggestion as dismissed so it no longer appears in the audit's suggestion list.
| url required | string <uri> URL of the inlink suggestion to dismiss |
{
}Returns the user's saved target keyword research history.
[- {
- "id": 0,
- "keyword": "string",
- "country_code": "string",
- "location": "string",
- "location_id": 0,
- "sv": 0,
- "cpc": 0,
- "competition": 0,
- "kd": 0,
- "sv_top_countries": [
- { }
], - "created_at": "2019-08-24T14:15:22Z",
- "is_saved": true
}
]Initiates SERP research for a given keyword. Returns data asynchronously -
poll GET /api/target-keywords/{id}/ for results.
| keyword required | string |
| country_code | string ISO alpha-2 country code |
| location | string |
| location_id | integer |
{- "keyword": "best hiking boots",
- "country_code": "us"
}{- "id": 0,
- "keyword": "string",
- "country_code": "string",
- "location": "string",
- "location_id": 0,
- "sv": 0,
- "cpc": 0,
- "competition": 0,
- "kd": 0,
- "sv_top_countries": [
- { }
], - "created_at": "2019-08-24T14:15:22Z",
- "is_saved": true
}Returns full SERP data, competitor metrics, and content recommendations for the keyword.
{- "id": 0,
- "keyword": "string",
- "country_code": "string",
- "location": "string",
- "location_id": 0,
- "sv": 0,
- "cpc": 0,
- "competition": 0,
- "kd": 0,
- "sv_top_countries": [
- { }
], - "created_at": "2019-08-24T14:15:22Z",
- "is_saved": true,
- "serp_data": { },
- "questions": [
- { }
], - "similar_keywords": [
- { }
], - "content_recommendations": { }
}Creates a blank page, attaches the target keyword to it, and returns the new page object. Consumes 1 article quota unit.
{- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "id": 0,
- "title": "string",
- "status": "draft",
- "score": 0,
- "content_score": 0,
- "technical_score": 0,
- "word_count": 0,
- "readability_grade": "string",
- "readability_grade_range": "string",
- "version": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "project_id": 0,
- "project_name": "string",
- "brand_vault": {
- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "name": "string"
}, - "due_date": "2019-08-24",
- "tags": [
- "string"
], - "assigned_to_users": [
- "string"
], - "wp_synced": true,
- "wp_syncing_task_status": "string",
- "language": "string",
- "feature_image_alt_text": "string",
- "was_deleted": true
}Returns all article projects for the account. Optionally filter by those with topical maps.
| has_topical_map | boolean Only return projects that have a topical map |
[- {
- "id": 0,
- "name": "string",
- "description": "string",
- "is_active": true,
- "timezone": "America/New_York",
- "platforms_config": {
- "facebook": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "page_id": "string",
- "category": "string"
}, - "instagram": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "instagram_id": "string",
- "instagram_user_id": "string",
- "followers_count": 0,
- "follows_count": 0
}, - "twitter": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "twitter_id": "string",
- "description": "string",
- "profile_image_url": "string",
- "followers_count": 0,
- "following_count": 0,
- "tweet_count": 0,
- "verified": true
}, - "linkedin": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "author_urn": "string",
- "company_id": "string",
- "company_name": "string",
- "industry": "string",
- "followers_count": 0
}
}, - "default_approval_type": "AUTO_PUBLISH",
- "default_image_source_type": "string",
- "ai_settings": {
- "tone": "professional",
- "language": "en",
- "include_hashtags": true,
- "max_hashtags": 5,
- "include_emojis": true,
- "target_audience": "string",
- "brand_voice_guidelines": "string",
- "image_prompt": "string"
}, - "image_prompt": "string",
- "enabled_platforms": [
- "facebook",
- "instagram"
], - "posts_count": 0,
- "schedule": {
- "id": 0,
- "name": "string",
- "is_active": true,
- "frequency_config": {
- "frequency_type": "daily",
- "days_of_week": [
- 6
], - "days_of_month": [
- 1
], - "preferred_times": [
- "string"
]
}, - "next_run_at": "2019-08-24T14:15:22Z",
- "last_run_at": "2019-08-24T14:15:22Z"
}, - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
]Create a new project with the given name and domain. If a deleted project
with the same name exists it will be restored. Sending id + name renames the project.
| name required | string <= 200 characters |
| description | string |
| is_active | boolean Default: true |
| timezone | string IANA timezone string (e.g. America/New_York) |
object (PlatformsConfig) | |
| default_approval_type | string Enum: "AUTO_PUBLISH" "APPROVE_IF_IMAGE" "AI_IMAGES_ONLY" "APPROVE_FOR_PUBLISH" |
| default_image_source_type | string or null |
object (AISettings) | |
| image_prompt | string <= 1000 characters Convenience alias - merged into ai_settings.image_prompt on save |
{- "name": "string",
- "description": "string",
- "is_active": true,
- "timezone": "string",
- "platforms_config": {
- "facebook": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "page_id": "string",
- "category": "string"
}, - "instagram": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "instagram_id": "string",
- "instagram_user_id": "string",
- "followers_count": 0,
- "follows_count": 0
}, - "twitter": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "twitter_id": "string",
- "description": "string",
- "profile_image_url": "string",
- "followers_count": 0,
- "following_count": 0,
- "tweet_count": 0,
- "verified": true
}, - "linkedin": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "author_urn": "string",
- "company_id": "string",
- "company_name": "string",
- "industry": "string",
- "followers_count": 0
}
}, - "default_approval_type": "AUTO_PUBLISH",
- "default_image_source_type": "string",
- "ai_settings": {
- "tone": "professional",
- "language": "en",
- "include_hashtags": true,
- "max_hashtags": 5,
- "include_emojis": true,
- "target_audience": "string",
- "brand_voice_guidelines": "string",
- "image_prompt": "string"
}, - "image_prompt": "string"
}{- "id": 0,
- "name": "string",
- "description": "string",
- "is_active": true,
- "timezone": "America/New_York",
- "platforms_config": {
- "facebook": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "page_id": "string",
- "category": "string"
}, - "instagram": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "instagram_id": "string",
- "instagram_user_id": "string",
- "followers_count": 0,
- "follows_count": 0
}, - "twitter": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "twitter_id": "string",
- "description": "string",
- "profile_image_url": "string",
- "followers_count": 0,
- "following_count": 0,
- "tweet_count": 0,
- "verified": true
}, - "linkedin": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "author_urn": "string",
- "company_id": "string",
- "company_name": "string",
- "industry": "string",
- "followers_count": 0
}
}, - "default_approval_type": "AUTO_PUBLISH",
- "default_image_source_type": "string",
- "ai_settings": {
- "tone": "professional",
- "language": "en",
- "include_hashtags": true,
- "max_hashtags": 5,
- "include_emojis": true,
- "target_audience": "string",
- "brand_voice_guidelines": "string",
- "image_prompt": "string"
}, - "image_prompt": "string",
- "enabled_platforms": [
- "facebook",
- "instagram"
], - "posts_count": 0,
- "schedule": {
- "id": 0,
- "name": "string",
- "is_active": true,
- "frequency_config": {
- "frequency_type": "daily",
- "days_of_week": [
- 6
], - "days_of_month": [
- 1
], - "preferred_times": [
- "string"
]
}, - "next_run_at": "2019-08-24T14:15:22Z",
- "last_run_at": "2019-08-24T14:15:22Z"
}, - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Update AI generation settings (language, tone, content structure) for all articles in the project.
| projectId required | integer Project ID (use 0 for uncategorized articles) |
| language | string |
| tone_of_voice | string |
| point_of_view | string |
| length | string Enum: "short" "medium" "long" |
| use_list | boolean |
| use_table | boolean |
| disable_conclusion | boolean |
| enable_key_takeaways | boolean |
| table_of_contents | boolean |
| bold_terms_to_include | boolean |
| llm | string |
| images_engine | string |
| generate_metadata | boolean |
| generate_hero_image | boolean |
| generate_images | boolean |
| company_name | string |
| website_url | string |
| niche | string |
| search_intent | string |
| reading_level | string |
| writing_style | string |
{- "language": "string",
- "tone_of_voice": "string",
- "point_of_view": "string",
- "length": "short",
- "use_list": true,
- "use_table": true,
- "disable_conclusion": true,
- "enable_key_takeaways": true,
- "table_of_contents": true,
- "bold_terms_to_include": true,
- "llm": "string",
- "images_engine": "string",
- "generate_metadata": true,
- "generate_hero_image": true,
- "generate_images": true,
- "company_name": "string",
- "website_url": "string",
- "niche": "string",
- "search_intent": "string",
- "reading_level": "string",
- "writing_style": "string"
}Analyzes the domain and auto-fills AI settings (niche, tone, language, etc.) for the project.
| domain required | string Domain to analyze (e.g. "example.com") |
{- "domain": "string"
}AI content outline, heading suggestions, and first-draft generation (v1/v2)
Returns AI-generated heading suggestions and content outline for the page.
Pass should_get_history=true to retrieve previous outline generations.
Returns 406 if the page still has the default title and no content_topic is supplied.
| content_topic | string |
| terms_to_include | string |
| num_of_results | integer Default: 1 |
| should_get_history | boolean Default: false |
[- {
- "headings": [
- "string"
], - "content_type": "string",
- "keyword": "string",
- "created_at": "2019-08-24T14:15:22Z"
}
]Generates an AI content outline without requiring an existing page. Accepts the same query params as the page-linked variant.
| content_topic | string |
| terms_to_include | string |
| num_of_results | integer Default: 1 |
| should_get_history | boolean Default: false |
[- {
- "headings": [
- "string"
], - "content_type": "string",
- "keyword": "string",
- "created_at": "2019-08-24T14:15:22Z"
}
]Returns AI-generated H1/H2 heading suggestions for the page. Accepts content_topic, number_of_headings (default 6), and optional uuid override query params.
| content_topic | string Override topic for heading generation |
| number_of_headings | integer Default: 6 |
{- "h1_suggestions": [
- "string"
], - "h2_suggestions": [
- "string"
]
}Generates a short content snippet for a keyword. Use type: rewrite_content
to rewrite existing content.
| keyword required | string |
| type | string Value: "rewrite_content" Omit for new content generation |
{- "keyword": "string",
- "type": "rewrite_content"
}{- "id": 0,
- "keyword": "string",
- "result": "string",
- "task_status": "string",
- "created_at": "2019-08-24T14:15:22Z"
}Creates multiple articles from content planner data with AI-generated content.
Array of objects |
{- "pages": [
- {
- "title": "string",
- "keywords_list": [
- "string"
], - "brand_vault_uuid": "ed6573dc-c380-4a19-bc05-007c933224bc"
}
]
}Generates a structured multi-step AI content outline (First Draft Generator v2)
linked to an existing page. Pass should_get_history: true to retrieve history.
| content_topic | string |
| terms_to_include | Array of strings |
| num_of_results | integer |
| length | string Enum: "short" "medium" "long" |
| content_type | string |
| language | string |
| tone_of_voice | string |
| point_of_view | string |
| should_get_history | boolean Default: false |
{- "content_topic": "string",
- "terms_to_include": [
- "string"
], - "num_of_results": 0,
- "length": "short",
- "content_type": "string",
- "language": "string",
- "tone_of_voice": "string",
- "point_of_view": "string",
- "should_get_history": false
}{- "id": 0,
- "status": "string",
- "headings": [
- {
- "heading": "string",
- "level": 0,
- "content": "string"
}
]
}Generates a first-draft outline without requiring an existing page UUID.
| content_topic | string |
| terms_to_include | Array of strings |
| num_of_results | integer |
| length | string Enum: "short" "medium" "long" |
| content_type | string |
| language | string |
| tone_of_voice | string |
| point_of_view | string |
| should_get_history | boolean Default: false |
{- "content_topic": "string",
- "terms_to_include": [
- "string"
], - "num_of_results": 0,
- "length": "short",
- "content_type": "string",
- "language": "string",
- "tone_of_voice": "string",
- "point_of_view": "string",
- "should_get_history": false
}Returns the list of available AI template types with their input field definitions.
[- {
- "type": "string",
- "label": "string",
- "inputs": [
- {
- "field_name": "string",
- "field_label": "string",
- "max_length": 0
}
]
}
]Executes an AI template (e.g. blog intro, meta description, product description) with the provided input fields.
| type required | string Template type identifier |
Array of objects | |
| n | integer Default: 3 Number of results to generate |
| is_used_in_cg | boolean Default: false |
{- "type": "blog_intro",
- "inputs": [
- {
- "field_name": "company_name",
- "field_value": "Acme Corp"
}
], - "n": 3
}[- {
- "id": 0,
- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "type": "string",
- "label": "string",
- "inputs": [
- { }
], - "result": { },
- "is_favorite": true,
- "is_used_in_cg": true,
- "created_at": "2019-08-24T14:15:22Z"
}
]Returns previous template generation results filtered by template type.
| type required | string Template type to filter by |
[- {
- "id": 0,
- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "type": "string",
- "label": "string",
- "inputs": [
- { }
], - "result": { },
- "is_favorite": true,
- "is_used_in_cg": true,
- "created_at": "2019-08-24T14:15:22Z"
}
]Generates an AI image using the specified prompt, aspect ratio, and engine. Used for article hero images and inline images.
| prompt required | string |
| aspect_ratio | string E.g. '16:9', '1:1', '4:3' |
| is_realistic | boolean Default: false |
| return_random_choice | boolean Default: true |
| images_engine | string AI engine: 'leonardo', 'midjourney', etc. |
| is_used_in_cg | boolean Default: false |
{- "prompt": "A futuristic running shoe on a mountain trail",
- "aspect_ratio": "16:9",
- "is_realistic": true,
- "return_random_choice": true,
- "images_engine": "leonardo"
}{- "image_uuid": "81aa1675-ce1e-4227-a1b8-beadb95ef40a"
}Regenerates an existing article image using AI.
| image_uuid | string <uuid> |
| prompt | string |
{- "image_uuid": "81aa1675-ce1e-4227-a1b8-beadb95ef40a",
- "prompt": "string"
}Returns the user's default AI generation settings (language, tone, POV, content type).
{- "default_language": "string",
- "tone_of_voice": "string",
- "type_of_content": "string",
- "point_of_view": "string"
}Replaces the user's default AI generation settings.
| default_language | string ISO 639-1 language code (validated) |
| tone_of_voice | string or null |
| point_of_view | string or null |
{- "default_language": "string",
- "tone_of_voice": "string",
- "point_of_view": "string"
}{- "default_language": "string",
- "tone_of_voice": "string",
- "type_of_content": "string",
- "point_of_view": "string"
}Bulk SEO metadata batch processing and AI-generated meta-tag suggestions
Returns all bulk meta-tag generation batches for the account.
| is_repolling | boolean |
[- {
- "id": 0,
- "company_name": "string",
- "rowcount": 0,
- "processed_rowcount": 0,
- "processing_started_at": "2019-08-24T14:15:22Z",
- "processing_ended_at": "2019-08-24T14:15:22Z",
- "processing_status": "PENDING",
- "public_share_hash": "string",
- "created_at": "2019-08-24T14:15:22Z"
}
]Upload a CSV file with columns Company Name, Keywords, and Title or Page URL
to generate bulk AI meta titles and descriptions.
| company_name required | string |
| file required | string <binary> CSV file with required columns |
{- "id": 0,
- "company_name": "string",
- "rowcount": 0,
- "processed_rowcount": 0,
- "processing_started_at": "2019-08-24T14:15:22Z",
- "processing_ended_at": "2019-08-24T14:15:22Z",
- "processing_status": "PENDING",
- "public_share_hash": "string",
- "created_at": "2019-08-24T14:15:22Z"
}Returns the processing status and results of a metadata batch.
| is_repolling | boolean |
| hash | string Public share hash for anonymous access |
{- "id": 0,
- "company_name": "string",
- "rowcount": 0,
- "processed_rowcount": 0,
- "processing_started_at": "2019-08-24T14:15:22Z",
- "processing_ended_at": "2019-08-24T14:15:22Z",
- "processing_status": "PENDING",
- "public_share_hash": "string",
- "created_at": "2019-08-24T14:15:22Z"
}Generates AI-powered meta title and meta description suggestions for a given page title, keywords, and optional company info.
| title required | string Page title |
| keyword required | string Comma-separated target keywords |
| company_name | string or null |
| webpage | string or null <uri> |
{- "title": "string",
- "keyword": "string",
- "company_name": "string",
}{- "id": 0,
- "status": "string",
- "results": [
- {
- "meta_title": "string",
- "meta_description": "string"
}
], - "public_share_hash": "string"
}Returns the current status and generated meta tags for an async meta-tag generation job.
| is_repolling | boolean |
| hash | string Public share hash |
{- "id": 0,
- "status": "string",
- "results": [
- {
- "meta_title": "string",
- "meta_description": "string"
}
], - "public_share_hash": "string"
}Core Brand Vault CRUD - create, retrieve, update, delete, archive, restore, and search Brand Vaults. Each Brand Vault is tied to a customer's hostname and stores business info, AI settings, WordPress config, and content rules.
Returns all active (non-archived) Brand Vaults for the authenticated customer.
Optionally filter by hostname using the hostname query parameter to retrieve a
specific Brand Vault without knowing its UUID.
| hostname | string Filter by exact normalized hostname (e.g. |
| page | integer Default: 1 |
| page_size | integer Default: 20 |
| ordering | string Order by field. Prefix with |
{- "count": 0,
- "results": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "otto_project_uuid": "533c63db-12c5-4866-a229-0db1c3241679",
- "name": "string",
- "domain": "string",
- "status": "active",
- "has_notice": true,
- "notice_message": "string",
- "metrics": {
- "document_count": 0,
- "conversation_count": 0,
- "location_count": 0
}, - "locations": [
- {
- "uuid": "string",
- "city": "string",
- "state": "string",
- "street_address": "string",
- "postal_code": "string",
- "country": "string",
- "is_primary": true
}
], - "configuration_status": {
- "business_info": true,
- "brand_voice": true,
- "locations": true,
- "content_rules": true,
- "knowledge_graph": true,
- "style_guide": true
}, - "rag_ingestion_status": "string",
- "articles_count": 0,
- "synced_count": 0,
- "total_words": 0,
- "total_pages": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
]
}Creates a new Brand Vault for the authenticated customer. The hostname is normalized automatically (www stripped, lowercased). Triggers asynchronous RAG initialization and optional business info autofill on creation.
| hostname required | string <= 200 characters Domain hostname (will be normalized) |
| name | string or null <= 255 characters |
| otto_project_id | integer or null |
{- "hostname": "example.com",
- "name": "My Brand"
}{- "id": 0,
- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "name": "string",
- "hostname": "string",
- "status": "active",
- "archived_at": "2019-08-24T14:15:22Z",
- "otto_project_id": 0,
- "business_info": {
- "business_name": "string",
- "website": "string",
- "description": "string",
- "email": "user@example.com",
- "phone": "string",
- "street_address": "string",
- "city": "string",
- "state": "string",
- "postal_code": "string",
- "country": "string",
- "business_address": "string",
- "language_code": "string",
- "number_of_employees": 0,
- "vat_id": "string",
- "tax_id": "string",
- "iso_6523_code": "string",
- "serp_location_text": "string",
- "uvp": "string",
- "brand_identity": "string",
- "business_model_description": "string",
- "extracted_from": "string"
}, - "default_ai_settings": {
- "use_list": true,
- "use_table": true,
- "use_tease": true,
- "enable_key_takeaways": true,
- "enable_faq": false,
- "length": "short",
- "point_of_view": "first person",
- "tone_of_voice": "Professional",
- "language": "en",
- "generate_metadata": true,
- "generate_hero_image": true,
- "generate_images": true,
- "images_engine": "searchatlas",
- "images_aspect_ratio": "16:9",
- "image_prompt": "string",
- "llm": "string",
- "terms_to_exclude": [
- "string"
]
}, - "required_internal_links": [
- {
- "url": "string",
- "anchor": "string"
}
], - "optional_internal_links": [
- {
- "url": "string",
- "anchor": "string"
}
], - "required_external_links": [
- {
- "url": "string",
- "anchor": "string"
}
], - "optional_external_links": [
- {
- "url": "string",
- "anchor": "string"
}
], - "global_background": "string",
- "default_microagent_ids": [
- 0
], - "default_microagents": [
- 0
], - "business_info_task_id": "string",
- "business_info_task_status": "string",
- "business_info_started_at": "2019-08-24T14:15:22Z",
- "business_info_finished_at": "2019-08-24T14:15:22Z",
- "business_info_task_error_message": "string",
- "ai_settings_task_id": "string",
- "ai_settings_task_status": "string",
- "ai_settings_started_at": "2019-08-24T14:15:22Z",
- "ai_settings_finished_at": "2019-08-24T14:15:22Z",
- "ai_settings_task_error_message": "string",
- "brand_voice_detection_status": "pending",
- "brand_voice_detection_error_message": "string",
- "image_count": 0,
- "rag_ingestion_status": "string",
- "total_words": 0,
- "total_pages": 0,
- "crawl_error_message": "string",
- "crawl_error_link": "string",
- "has_notice": true,
- "notice_message": "string",
- "wp_website_id": 0,
- "wp_auto_upload": false,
- "wp_url_slug": "string",
- "wp_post_type": "post",
- "wp_post_status": "draft",
- "wp_post_categories": [
- "string"
], - "public_share_hash": "string",
- "is_publicly_shared": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Returns full Brand Vault object including business info, AI settings, status, and computed fields.
{- "id": 0,
- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "name": "string",
- "hostname": "string",
- "status": "active",
- "archived_at": "2019-08-24T14:15:22Z",
- "otto_project_id": 0,
- "business_info": {
- "business_name": "string",
- "website": "string",
- "description": "string",
- "email": "user@example.com",
- "phone": "string",
- "street_address": "string",
- "city": "string",
- "state": "string",
- "postal_code": "string",
- "country": "string",
- "business_address": "string",
- "language_code": "string",
- "number_of_employees": 0,
- "vat_id": "string",
- "tax_id": "string",
- "iso_6523_code": "string",
- "serp_location_text": "string",
- "uvp": "string",
- "brand_identity": "string",
- "business_model_description": "string",
- "extracted_from": "string"
}, - "default_ai_settings": {
- "use_list": true,
- "use_table": true,
- "use_tease": true,
- "enable_key_takeaways": true,
- "enable_faq": false,
- "length": "short",
- "point_of_view": "first person",
- "tone_of_voice": "Professional",
- "language": "en",
- "generate_metadata": true,
- "generate_hero_image": true,
- "generate_images": true,
- "images_engine": "searchatlas",
- "images_aspect_ratio": "16:9",
- "image_prompt": "string",
- "llm": "string",
- "terms_to_exclude": [
- "string"
]
}, - "required_internal_links": [
- {
- "url": "string",
- "anchor": "string"
}
], - "optional_internal_links": [
- {
- "url": "string",
- "anchor": "string"
}
], - "required_external_links": [
- {
- "url": "string",
- "anchor": "string"
}
], - "optional_external_links": [
- {
- "url": "string",
- "anchor": "string"
}
], - "global_background": "string",
- "default_microagent_ids": [
- 0
], - "default_microagents": [
- 0
], - "business_info_task_id": "string",
- "business_info_task_status": "string",
- "business_info_started_at": "2019-08-24T14:15:22Z",
- "business_info_finished_at": "2019-08-24T14:15:22Z",
- "business_info_task_error_message": "string",
- "ai_settings_task_id": "string",
- "ai_settings_task_status": "string",
- "ai_settings_started_at": "2019-08-24T14:15:22Z",
- "ai_settings_finished_at": "2019-08-24T14:15:22Z",
- "ai_settings_task_error_message": "string",
- "brand_voice_detection_status": "pending",
- "brand_voice_detection_error_message": "string",
- "image_count": 0,
- "rag_ingestion_status": "string",
- "total_words": 0,
- "total_pages": 0,
- "crawl_error_message": "string",
- "crawl_error_link": "string",
- "has_notice": true,
- "notice_message": "string",
- "wp_website_id": 0,
- "wp_auto_upload": false,
- "wp_url_slug": "string",
- "wp_post_type": "post",
- "wp_post_status": "draft",
- "wp_post_categories": [
- "string"
], - "public_share_hash": "string",
- "is_publicly_shared": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Partially updates a Brand Vault. Supports updating name, hostname,
and otto_project_id. WordPress integration fields are also accepted.
| name | string or null <= 255 characters |
| hostname | string <= 200 characters |
| otto_project_id | integer or null |
| wp_website_id | integer or null |
| wp_auto_upload | boolean |
| wp_url_slug | string or null <= 2000 characters |
| wp_post_type | string or null Enum: "post" "page" |
| wp_post_status | string or null Enum: "draft" "publish" |
| wp_post_categories | Array of strings |
{- "name": "string",
- "hostname": "string",
- "otto_project_id": 0,
- "wp_website_id": 0,
- "wp_auto_upload": true,
- "wp_url_slug": "string",
- "wp_post_type": "post",
- "wp_post_status": "draft",
- "wp_post_categories": [
- "string"
]
}{- "id": 0,
- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "name": "string",
- "hostname": "string",
- "status": "active",
- "archived_at": "2019-08-24T14:15:22Z",
- "otto_project_id": 0,
- "business_info": {
- "business_name": "string",
- "website": "string",
- "description": "string",
- "email": "user@example.com",
- "phone": "string",
- "street_address": "string",
- "city": "string",
- "state": "string",
- "postal_code": "string",
- "country": "string",
- "business_address": "string",
- "language_code": "string",
- "number_of_employees": 0,
- "vat_id": "string",
- "tax_id": "string",
- "iso_6523_code": "string",
- "serp_location_text": "string",
- "uvp": "string",
- "brand_identity": "string",
- "business_model_description": "string",
- "extracted_from": "string"
}, - "default_ai_settings": {
- "use_list": true,
- "use_table": true,
- "use_tease": true,
- "enable_key_takeaways": true,
- "enable_faq": false,
- "length": "short",
- "point_of_view": "first person",
- "tone_of_voice": "Professional",
- "language": "en",
- "generate_metadata": true,
- "generate_hero_image": true,
- "generate_images": true,
- "images_engine": "searchatlas",
- "images_aspect_ratio": "16:9",
- "image_prompt": "string",
- "llm": "string",
- "terms_to_exclude": [
- "string"
]
}, - "required_internal_links": [
- {
- "url": "string",
- "anchor": "string"
}
], - "optional_internal_links": [
- {
- "url": "string",
- "anchor": "string"
}
], - "required_external_links": [
- {
- "url": "string",
- "anchor": "string"
}
], - "optional_external_links": [
- {
- "url": "string",
- "anchor": "string"
}
], - "global_background": "string",
- "default_microagent_ids": [
- 0
], - "default_microagents": [
- 0
], - "business_info_task_id": "string",
- "business_info_task_status": "string",
- "business_info_started_at": "2019-08-24T14:15:22Z",
- "business_info_finished_at": "2019-08-24T14:15:22Z",
- "business_info_task_error_message": "string",
- "ai_settings_task_id": "string",
- "ai_settings_task_status": "string",
- "ai_settings_started_at": "2019-08-24T14:15:22Z",
- "ai_settings_finished_at": "2019-08-24T14:15:22Z",
- "ai_settings_task_error_message": "string",
- "brand_voice_detection_status": "pending",
- "brand_voice_detection_error_message": "string",
- "image_count": 0,
- "rag_ingestion_status": "string",
- "total_words": 0,
- "total_pages": 0,
- "crawl_error_message": "string",
- "crawl_error_link": "string",
- "has_notice": true,
- "notice_message": "string",
- "wp_website_id": 0,
- "wp_auto_upload": false,
- "wp_url_slug": "string",
- "wp_post_type": "post",
- "wp_post_status": "draft",
- "wp_post_categories": [
- "string"
], - "public_share_hash": "string",
- "is_publicly_shared": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Returns aggregated metrics for the Brand Vault dashboard: word counts, page counts, image/video counts (breakdown by source), and source processing status counts.
{- "total_words": 0,
- "total_pages": 0,
- "total_images": 0,
- "total_videos": 0,
- "images_breakdown": {
- "site_audit": 0,
- "user_uploaded": 0
}, - "videos_breakdown": {
- "site_audit": 0,
- "user_uploaded": 0
}, - "total_sources": 0,
- "processed_count": 0,
- "processing_count": 0,
- "failed_count": 0,
- "last_processed_at": "2019-08-24T14:15:22Z"
}Returns all RAG content sources associated with this Brand Vault - domain crawls, uploaded files, and URL sources. Used to populate the Sources tab.
[- {
- "uuid": "string",
- "source_id": "string",
- "source_type": "string",
- "source_type_display_name": "string",
- "name": "string",
- "status": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "sent_by": "string"
}
]Returns detailed metadata for a single Brand Vault content source.
| sourceId required | string Source UUID (from |
{- "uuid": "string",
- "source_id": "string",
- "source_type": "string",
- "source_type_display_name": "string",
- "name": "string",
- "status": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "sent_by": "string",
- "metadata": { }
}Returns the structured business information stored on this Brand Vault.
{- "business_name": "string",
- "website": "string",
- "description": "string",
- "email": "user@example.com",
- "phone": "string",
- "street_address": "string",
- "city": "string",
- "state": "string",
- "postal_code": "string",
- "country": "string",
- "business_address": "string",
- "language_code": "string",
- "number_of_employees": 0,
- "vat_id": "string",
- "tax_id": "string",
- "iso_6523_code": "string",
- "serp_location_text": "string",
- "uvp": "string",
- "brand_identity": "string",
- "business_model_description": "string",
- "extracted_from": "string"
}Partially updates the business information for the Brand Vault. Supports all business info fields including address components, tax IDs, UVP, and brand identity.
| business_name | string or null <= 500 characters Official business/company name |
| website | string or null <= 500 characters Primary website URL |
| description | string or null <= 20000 characters Business description (max 3000 words) |
string or null <email> | |
| phone | string or null <= 50 characters |
| street_address | string or null <= 300 characters |
| city | string or null <= 100 characters |
| state | string or null <= 100 characters |
| postal_code | string or null <= 20 characters |
| country | string or null <= 100 characters |
| language_code | string or null <= 10 characters Primary business language (ISO 639-1) |
| number_of_employees | integer or null >= 0 |
| vat_id | string or null <= 50 characters |
| tax_id | string or null <= 50 characters |
| iso_6523_code | string or null <= 50 characters ISO 6523 ICD code (format: XXXX:XXXXXXXXX) |
| serp_location_text | string or null <= 200 characters Location for SERP/competitor tracking |
| uvp | string or null Unique Value Proposition (max 80 words) |
| brand_identity | string or null Brand personality, tone, and style (max 80 words) |
| business_model_description | string or null How the business generates revenue (max 80 words) |
{- "business_name": "Acme Corp",
- "description": "We build great products.",
- "email": "contact@acme.com",
- "phone": "+1-555-0100"
}{- "business_name": "string",
- "website": "string",
- "description": "string",
- "email": "user@example.com",
- "phone": "string",
- "street_address": "string",
- "city": "string",
- "state": "string",
- "postal_code": "string",
- "country": "string",
- "business_address": "string",
- "language_code": "string",
- "number_of_employees": 0,
- "vat_id": "string",
- "tax_id": "string",
- "iso_6523_code": "string",
- "serp_location_text": "string",
- "uvp": "string",
- "brand_identity": "string",
- "business_model_description": "string",
- "extracted_from": "string"
}Triggers an asynchronous AI task that crawls the Brand Vault's domain and
extracts structured business information. Returns a task_id that can be polled
via GET /api/core/v1/task-results/{taskId} to get the result.
| website | string <= 500 characters Optional override URL to extract info from (defaults to Brand Vault hostname) |
{- "website": "string"
}{- "task_id": "string"
}Returns the AI content settings and link rules stored on this Brand Vault.
{- "brand_vault_id": 0,
- "brand_vault_uuid": "ed6573dc-c380-4a19-bc05-007c933224bc",
- "required_internal_links": [
- {
- "url": "string",
- "anchor": "string"
}
], - "optional_internal_links": [
- {
- "url": "string",
- "anchor": "string"
}
], - "required_external_links": [
- {
- "url": "string",
- "anchor": "string"
}
], - "optional_external_links": [
- {
- "url": "string",
- "anchor": "string"
}
], - "global_background": "string",
- "default_microagent_ids": [
- 0
], - "wp_website_id": 0,
- "wp_post_status": "string",
- "wp_post_type": "string",
- "wp_post_categories": [
- "string"
], - "wp_auto_upload": true,
- "wp_url_slug": "string",
- "updated_at": "2019-08-24T14:15:22Z"
}Updates the Content tab settings for a Brand Vault. Accepts a flat payload where
known model fields (link settings, WordPress config, global background,
default microagents) are routed to their columns and any remaining fields are
merged into the default_ai_settings JSON field.
Array of objects (LinkSetting) | |
Array of objects (LinkSetting) | |
Array of objects (LinkSetting) | |
Array of objects (LinkSetting) | |
| global_background | string or null |
| default_microagent_ids | Array of integers |
| wp_website_id | integer or null |
| wp_post_status | string or null Enum: "draft" "publish" |
| wp_post_type | string or null Enum: "post" "page" |
| wp_post_categories | Array of strings |
| wp_auto_upload | boolean or null |
| wp_url_slug | string or null <= 2000 characters |
{- "required_internal_links": [
- {
- "url": "string",
- "anchor": "string"
}
], - "optional_internal_links": [
- {
- "url": "string",
- "anchor": "string"
}
], - "required_external_links": [
- {
- "url": "string",
- "anchor": "string"
}
], - "optional_external_links": [
- {
- "url": "string",
- "anchor": "string"
}
], - "global_background": "string",
- "default_microagent_ids": [
- 0
], - "wp_website_id": 0,
- "wp_post_status": "draft",
- "wp_post_type": "post",
- "wp_post_categories": [
- "string"
], - "wp_auto_upload": true,
- "wp_url_slug": "string"
}{- "brand_vault_id": 0,
- "brand_vault_uuid": "ed6573dc-c380-4a19-bc05-007c933224bc",
- "required_internal_links": [
- {
- "url": "string",
- "anchor": "string"
}
], - "optional_internal_links": [
- {
- "url": "string",
- "anchor": "string"
}
], - "required_external_links": [
- {
- "url": "string",
- "anchor": "string"
}
], - "optional_external_links": [
- {
- "url": "string",
- "anchor": "string"
}
], - "global_background": "string",
- "default_microagent_ids": [
- 0
], - "wp_website_id": 0,
- "wp_post_status": "string",
- "wp_post_type": "string",
- "wp_post_categories": [
- "string"
], - "wp_auto_upload": true,
- "wp_url_slug": "string",
- "updated_at": "2019-08-24T14:15:22Z"
}Returns per-section completion flags for the Brand Vault setup wizard:
business_info, brand_voice, locations, content_rules, knowledge_graph,
style_guide. Also returns overall completion_percentage.
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "configuration_status": {
- "property1": {
- "completed": true,
- "label": "string"
}, - "property2": {
- "completed": true,
- "label": "string"
}
}, - "completion_percentage": 0
}Returns active (non-dismissed) notices for this Brand Vault such as crawl errors or setup warnings.
[- {
- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "type": "string",
- "severity": "string",
- "message": "string",
- "field": "string",
- "created_at": "2019-08-24T14:15:22Z"
}
]Returns the processing status, progress, and any errors for the Brand Vault initialization pipeline.
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "status": "string",
- "progress": { },
- "errors": [
- "string"
], - "started_at": "2019-08-24T14:15:22Z",
- "estimated_completion": "2019-08-24T14:15:22Z"
}Returns upload limits (file types, sizes, batch limits), tier-based quotas (max sources, max storage), and current usage counts. Used by the frontend to enforce limits and display storage warnings.
{- "allowed_file_extensions": [
- "string"
], - "allowed_mime_types": {
- "property1": "string",
- "property2": "string"
}, - "max_file_size_mb": 0,
- "max_word_count_per_file": 0,
- "max_files_per_batch": 0,
- "tier": "free",
- "max_sources": 0,
- "max_total_size_gb": 0,
- "max_pages_per_domain": 0,
- "sources_used": 0,
- "total_size_bytes_used": 0,
- "total_words_used": 0,
- "sources_remaining": 0,
- "size_remaining_bytes": 0,
- "brand_vault_storage": {
- "max_bytes": 0,
- "total_bytes_used": 0,
- "image_bytes_used": 0,
- "document_bytes_used": 0,
- "image_count": 0,
- "document_count": 0,
- "remaining_bytes": 0,
- "usage_percentage": 0.1,
- "remaining_storage_mb": 0,
- "is_storage_limit_reached": true,
- "is_storage_limit_almost_reached": true
}
}Moves the Brand Vault to archived state. Archived vaults are retained for 30 days before permanent deletion. Can be restored within that window.
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "status": "string",
- "archived_at": "2019-08-24T14:15:22Z",
- "permanent_deletion_at": "2019-08-24T14:15:22Z",
- "message": "string"
}Returns archived Brand Vaults for the authenticated customer, including days_left before permanent deletion.
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "otto_project_uuid": "533c63db-12c5-4866-a229-0db1c3241679",
- "name": "string",
- "domain": "string",
- "status": "active",
- "has_notice": true,
- "notice_message": "string",
- "metrics": {
- "document_count": 0,
- "conversation_count": 0,
- "location_count": 0
}, - "locations": [
- {
- "uuid": "string",
- "city": "string",
- "state": "string",
- "street_address": "string",
- "postal_code": "string",
- "country": "string",
- "is_primary": true
}
], - "configuration_status": {
- "business_info": true,
- "brand_voice": true,
- "locations": true,
- "content_rules": true,
- "knowledge_graph": true,
- "style_guide": true
}, - "rag_ingestion_status": "string",
- "articles_count": 0,
- "synced_count": 0,
- "total_words": 0,
- "total_pages": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "archived_at": "2019-08-24T14:15:22Z",
- "days_left": 0
}
]Autocomplete search across Brand Vault names and domains. Returns lightweight result objects with match metadata.
| q required | string Search query string |
| limit | integer Default: 10 |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "domain": "string",
- "status": "string",
- "match_type": "string",
- "matched_text": "string"
}
]Archives multiple Brand Vaults in a single request. Returns count and IDs of archived vaults.
| ids required | Array of strings <uuid> [ 1 .. 100 ] items [ items <uuid > ] |
{- "ids": [
- "550e8400-e29b-41d4-a716-446655440000",
- "6ba7b810-9dad-11d1-80b4-00c04fd430c8"
]
}{- "archived_count": 0,
- "archived_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}Returns available filter options (status counts, location availability) for the Brand Vault list view.
{- "statuses": [
- {
- "value": "string",
- "label": "string",
- "count": 0
}
], - "locations": {
- "has_locations": { },
- "no_locations": { }
}
}Uses AI to generate default_ai_settings for a Brand Vault based on the business info and domain content. This is the "Brand Vault AI" autofill for the Content tab.
| brand_vault_uuid required | string <uuid> UUID of the Brand Vault to generate settings for |
{- "brand_vault_uuid": "ed6573dc-c380-4a19-bc05-007c933224bc"
}{- "task_id": "string"
}Image management within a Brand Vault - upload, list, update alt text, tag, bulk operations, and AI-powered alt text regeneration.
Returns all images uploaded to this Brand Vault. Optionally filter by image_type.
| image_type | string Enum: "logo" "favicon" "image" Filter by image type: |
| page | integer Default: 1 |
| page_size | integer Default: 20 |
{- "count": 0,
- "results": [
- {
- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "brand_vault_uuid": "ed6573dc-c380-4a19-bc05-007c933224bc",
- "image_type": "image",
- "alt_text": "string",
- "alt_text_generation_status": "string",
- "alt_text_generated_at": "2019-08-24T14:15:22Z",
- "alt_text_generation_error": "string",
- "use_for_content_genius": true,
- "tags": [
- "string"
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
]
}Uploads a single image to the Brand Vault. Maximum 10 MB per image. Triggers asynchronous AI alt text generation after upload. Consumes storage quota.
| image required | string <binary> Image file (max 10 MB) |
| image_type | string Default: "image" Enum: "image" "logo" "favicon" |
| use_for_content_genius | boolean Default: true Whether this image should be used in AI content generation |
{- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "brand_vault_uuid": "ed6573dc-c380-4a19-bc05-007c933224bc",
- "image_type": "image",
- "alt_text": "string",
- "alt_text_generation_status": "string",
- "alt_text_generated_at": "2019-08-24T14:15:22Z",
- "alt_text_generation_error": "string",
- "use_for_content_genius": true,
- "tags": [
- "string"
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Returns metadata for a single Brand Vault image including alt text generation status.
{- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "brand_vault_uuid": "ed6573dc-c380-4a19-bc05-007c933224bc",
- "image_type": "image",
- "alt_text": "string",
- "alt_text_generation_status": "string",
- "alt_text_generated_at": "2019-08-24T14:15:22Z",
- "alt_text_generation_error": "string",
- "use_for_content_genius": true,
- "tags": [
- "string"
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Updates the alt_text and/or use_for_content_genius flag on a Brand Vault image.
| alt_text | string <= 1000 characters Alt text for the image (max 1000 chars) |
| use_for_content_genius | boolean |
{- "alt_text": "string",
- "use_for_content_genius": true
}{- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "brand_vault_uuid": "ed6573dc-c380-4a19-bc05-007c933224bc",
- "image_type": "image",
- "alt_text": "string",
- "alt_text_generation_status": "string",
- "alt_text_generated_at": "2019-08-24T14:15:22Z",
- "alt_text_generation_error": "string",
- "use_for_content_genius": true,
- "tags": [
- "string"
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Queues an AI task to regenerate the alt text for a single image. Returns the image with updated alt_text_generation_status.
{- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "brand_vault_uuid": "ed6573dc-c380-4a19-bc05-007c933224bc",
- "image_type": "image",
- "alt_text": "string",
- "alt_text_generation_status": "string",
- "alt_text_generated_at": "2019-08-24T14:15:22Z",
- "alt_text_generation_error": "string",
- "use_for_content_genius": true,
- "tags": [
- "string"
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Replaces the full tag list on an image. Tags are normalized (lowercased, trimmed, deduplicated).
| tags required | Array of strings[ items <= 50 characters ] Tags to set (normalized to lowercase) |
{- "tags": [
- "string"
]
}{- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "brand_vault_uuid": "ed6573dc-c380-4a19-bc05-007c933224bc",
- "image_type": "image",
- "alt_text": "string",
- "alt_text_generation_status": "string",
- "alt_text_generated_at": "2019-08-24T14:15:22Z",
- "alt_text_generation_error": "string",
- "use_for_content_genius": true,
- "tags": [
- "string"
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Uploads up to 100 images in a single request. Processing is dispatched asynchronously via Celery. Returns a task ID for progress polling.
| images required | Array of strings <binary> [ 1 .. 100 ] items [ items <binary > ] List of image files (max 10 MB each) |
| image_type | string Default: "image" Enum: "image" "logo" "favicon" |
| use_for_content_genius | boolean Default: true |
{- "task_id": "string",
- "queued_count": 0
}Permanently deletes up to 100 images in a single request.
| uuids required | Array of strings <uuid> [ 1 .. 100 ] items [ items <uuid > ] List of image UUIDs (max 100) |
{- "uuids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}{- "deleted_count": 0
}Queues AI alt text regeneration for up to 100 images simultaneously.
| uuids required | Array of strings <uuid> [ 1 .. 100 ] items [ items <uuid > ] List of image UUIDs (max 100) |
{- "uuids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}{- "queued_count": 0
}Adds one or more tags to up to 100 images. Existing tags are preserved (merge, not replace).
| uuids required | Array of strings <uuid> [ 1 .. 100 ] items [ items <uuid > ] |
| tags required | Array of strings[ items <= 50 characters ] |
{- "uuids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "tags": [
- "string"
]
}{- "updated_count": 0
}Physical location/address management for a Brand Vault. Supports GBP-compatible address fields including business hours, service areas, and booking links.
Returns all physical locations/addresses stored on this Brand Vault. Includes full GBP-compatible address fields.
{- "addresses": [
- {
- "uuid": "string",
- "street_address": "string",
- "address_locality": "string",
- "address_administrative_area": "string",
- "address_country": "string",
- "address_region": "string",
- "postal_code": "string",
- "timezone": "string",
- "lat": 0.1,
- "long": 0.1,
- "embedded_google_map": "string",
- "is_primary": false,
- "location_id": 0,
- "location_name": "string",
- "kg_address_id": 0,
- "gbp_location_id": 0,
- "opening_date": {
- "year": 0,
- "month": 0,
- "day": 0
}, - "open_hours": {
- "monday": {
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}, - "tuesday": {
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}, - "wednesday": {
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}, - "thursday": {
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}, - "friday": {
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}, - "saturday": {
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}, - "sunday": {
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}
}, - "special_hours": [
- {
- "start_date": {
- "year": 0,
- "month": 1,
- "day": 1
}, - "end_date": {
- "year": 0,
- "month": 1,
- "day": 1
}, - "is_closed": false,
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}
], - "service_area": {
- "business_type": "string",
- "region_code": "string",
- "places": [
- {
- "place_id": "string",
- "place_name": "string"
}
]
}, - "booking_link": "string"
}
]
}Adds a new location/address to the Brand Vault.
| uuid | string or null Auto-generated if not provided |
| street_address | string or null <= 1000 characters |
| address_locality | string or null <= 200 characters City |
| address_administrative_area | string or null <= 200 characters State/Province |
| address_country | string or null <= 50 characters Country code (e.g. US) |
| address_region | string or null <= 200 characters |
| postal_code | string or null <= 200 characters |
| timezone | string or null |
| lat | number or null <float> |
| long | number or null <float> |
| embedded_google_map | string or null <= 2000 characters |
| is_primary | boolean Default: false |
| location_id | integer or null SERP location ID |
| location_name | string or null <= 500 characters SERP location name |
| gbp_location_id | integer or null GBP Location ID for sync |
object or null | |
object or null (OpenHours) | |
Array of objects or null (SpecialHour) | |
object or null (ServiceArea) | |
| booking_link | string or null <= 2000 characters |
{- "street_address": "123 Main St",
- "address_locality": "San Francisco",
- "address_administrative_area": "CA",
- "address_country": "US",
- "postal_code": "94105",
- "is_primary": true
}{- "addresses": [
- {
- "uuid": "string",
- "street_address": "string",
- "address_locality": "string",
- "address_administrative_area": "string",
- "address_country": "string",
- "address_region": "string",
- "postal_code": "string",
- "timezone": "string",
- "lat": 0.1,
- "long": 0.1,
- "embedded_google_map": "string",
- "is_primary": false,
- "location_id": 0,
- "location_name": "string",
- "kg_address_id": 0,
- "gbp_location_id": 0,
- "opening_date": {
- "year": 0,
- "month": 0,
- "day": 0
}, - "open_hours": {
- "monday": {
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}, - "tuesday": {
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}, - "wednesday": {
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}, - "thursday": {
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}, - "friday": {
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}, - "saturday": {
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}, - "sunday": {
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}
}, - "special_hours": [
- {
- "start_date": {
- "year": 0,
- "month": 1,
- "day": 1
}, - "end_date": {
- "year": 0,
- "month": 1,
- "day": 1
}, - "is_closed": false,
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}
], - "service_area": {
- "business_type": "string",
- "region_code": "string",
- "places": [
- {
- "place_id": "string",
- "place_name": "string"
}
]
}, - "booking_link": "string"
}
]
}Partially updates a specific location by UUID.
| uuid | string or null Auto-generated if not provided |
| street_address | string or null <= 1000 characters |
| address_locality | string or null <= 200 characters City |
| address_administrative_area | string or null <= 200 characters State/Province |
| address_country | string or null <= 50 characters Country code (e.g. US) |
| address_region | string or null <= 200 characters |
| postal_code | string or null <= 200 characters |
| timezone | string or null |
| lat | number or null <float> |
| long | number or null <float> |
| embedded_google_map | string or null <= 2000 characters |
| is_primary | boolean Default: false |
| location_id | integer or null SERP location ID |
| location_name | string or null <= 500 characters SERP location name |
| gbp_location_id | integer or null GBP Location ID for sync |
object or null | |
object or null (OpenHours) | |
Array of objects or null (SpecialHour) | |
object or null (ServiceArea) | |
| booking_link | string or null <= 2000 characters |
{- "uuid": "string",
- "street_address": "string",
- "address_locality": "string",
- "address_administrative_area": "string",
- "address_country": "string",
- "address_region": "string",
- "postal_code": "string",
- "timezone": "string",
- "lat": 0.1,
- "long": 0.1,
- "embedded_google_map": "string",
- "is_primary": false,
- "location_id": 0,
- "location_name": "string",
- "gbp_location_id": 0,
- "opening_date": {
- "year": 0,
- "month": 0,
- "day": 0
}, - "open_hours": {
- "monday": {
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}, - "tuesday": {
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}, - "wednesday": {
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}, - "thursday": {
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}, - "friday": {
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}, - "saturday": {
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}, - "sunday": {
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}
}, - "special_hours": [
- {
- "start_date": {
- "year": 0,
- "month": 1,
- "day": 1
}, - "end_date": {
- "year": 0,
- "month": 1,
- "day": 1
}, - "is_closed": false,
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}
], - "service_area": {
- "business_type": "string",
- "region_code": "string",
- "places": [
- {
- "place_id": "string",
- "place_name": "string"
}
]
}, - "booking_link": "string"
}{- "addresses": [
- {
- "uuid": "string",
- "street_address": "string",
- "address_locality": "string",
- "address_administrative_area": "string",
- "address_country": "string",
- "address_region": "string",
- "postal_code": "string",
- "timezone": "string",
- "lat": 0.1,
- "long": 0.1,
- "embedded_google_map": "string",
- "is_primary": false,
- "location_id": 0,
- "location_name": "string",
- "kg_address_id": 0,
- "gbp_location_id": 0,
- "opening_date": {
- "year": 0,
- "month": 0,
- "day": 0
}, - "open_hours": {
- "monday": {
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}, - "tuesday": {
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}, - "wednesday": {
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}, - "thursday": {
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}, - "friday": {
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}, - "saturday": {
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}, - "sunday": {
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}
}, - "special_hours": [
- {
- "start_date": {
- "year": 0,
- "month": 1,
- "day": 1
}, - "end_date": {
- "year": 0,
- "month": 1,
- "day": 1
}, - "is_closed": false,
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}
], - "service_area": {
- "business_type": "string",
- "region_code": "string",
- "places": [
- {
- "place_id": "string",
- "place_name": "string"
}
]
}, - "booking_link": "string"
}
]
}Marks the specified location as the primary address, un-marking any previous primary.
{- "addresses": [
- {
- "uuid": "string",
- "street_address": "string",
- "address_locality": "string",
- "address_administrative_area": "string",
- "address_country": "string",
- "address_region": "string",
- "postal_code": "string",
- "timezone": "string",
- "lat": 0.1,
- "long": 0.1,
- "embedded_google_map": "string",
- "is_primary": false,
- "location_id": 0,
- "location_name": "string",
- "kg_address_id": 0,
- "gbp_location_id": 0,
- "opening_date": {
- "year": 0,
- "month": 0,
- "day": 0
}, - "open_hours": {
- "monday": {
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}, - "tuesday": {
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}, - "wednesday": {
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}, - "thursday": {
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}, - "friday": {
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}, - "saturday": {
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}, - "sunday": {
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}
}, - "special_hours": [
- {
- "start_date": {
- "year": 0,
- "month": 1,
- "day": 1
}, - "end_date": {
- "year": 0,
- "month": 1,
- "day": 1
}, - "is_closed": false,
- "intervals": [
- {
- "open": "string",
- "close": "string"
}
]
}
], - "service_area": {
- "business_type": "string",
- "region_code": "string",
- "places": [
- {
- "place_id": "string",
- "place_name": "string"
}
]
}, - "booking_link": "string"
}
]
}Brand voice profile management - template selection, custom voice creation (freeform or guided), auto-generation from domain content, voice preview generation, and selection/deselection.
Returns all active preset Brand Voice templates available for selection. Templates have canonical names: Professional & Credible, Friendly & Conversational, Bold & Energetic, Creative & Expressive, Luxury & Sophisticated, Educational & Informative.
[- {
- "id": 0,
- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "name": "string",
- "tagline": "string",
- "source": "string",
- "tone_summary": "string",
- "writing_style_traits": [
- {
- "title": "string",
- "description": "string"
}
], - "reading_level": "string",
- "example_sentence": "string",
- "language_preference": "string",
- "key_guidelines": "string",
- "target_audience": "string",
- "original_tone_text": "string",
- "confidence_level": "string",
- "confidence_reasoning": "string",
- "is_active": true,
- "display_order": 0,
- "generated_by_model": "string",
- "generated_at": "2019-08-24T14:15:22Z",
- "previews": [
- {
- "context": "blog",
- "text": "string"
}
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
]Returns all voice profiles (both template-based and custom) associated with this Brand Vault, including which one is currently selected.
[- {
- "id": 0,
- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "name": "string",
- "tagline": "string",
- "source": "string",
- "tone_summary": "string",
- "writing_style_traits": [
- {
- "title": "string",
- "description": "string"
}
], - "reading_level": "string",
- "example_sentence": "string",
- "language_preference": "string",
- "key_guidelines": "string",
- "target_audience": "string",
- "is_selected": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
]Generates 4 short preview text samples for a voice profile in different contexts (blog, product, cta, support). Used before selecting or saving a voice.
| name required | string <= 200 characters |
| type required | string Voice type/category |
| language required | string Language code |
| tagline | string or null <= 200 characters |
| tone_summary | string or null |
Array of objects (WritingStyleTrait) | |
| reading_level | string or null |
| example_sentence | string or null |
| target_audience | string or null |
| key_guidelines | string or null |
{- "name": "string",
- "type": "string",
- "language": "string",
- "tagline": "string",
- "tone_summary": "string",
- "writing_style_traits": [
- {
- "title": "string",
- "description": "string"
}
], - "reading_level": "string",
- "example_sentence": "string",
- "target_audience": "string",
- "key_guidelines": "string"
}{- "previews": [
- {
- "context": "blog",
- "text": "string"
}
]
}Sets the specified voice template or custom voice as the active selected voice for this Brand Vault.
| voice_uuid required | string <uuid> UUID of the BrandVoiceTemplate or custom BrandVoice to select |
{- "voice_uuid": "31573483-930c-4a3a-a292-81ca0a455b2f"
}Uses AI to detect and generate a brand voice profile by analyzing the Brand Vault's domain content. Returns a structured voice profile object with traits, reading level, and example sentence. Does not automatically select the voice.
{- "name": "string",
- "type": "string",
- "language": "string",
- "tagline": "string",
- "tone_summary": "string",
- "reading_level": "string",
- "example_sentence": "string",
- "target_audience": "string",
- "key_guidelines": "string",
- "writing_style_traits": [
- {
- "title": "string",
- "description": "string"
}
]
}Creates a custom brand voice profile from unstructured natural language instructions.
The backend uses an LLM to parse voice_instructions into structured fields (traits,
reading level, tone summary, etc.).
| name required | string <= 200 characters |
| voice_instructions required | string <= 2500 characters Unstructured voice description - the LLM parses this into structured fields |
| auto_select | boolean Default: true Automatically select this voice after creation |
{- "name": "My Brand Voice",
- "voice_instructions": "Friendly and professional tone, approachable language, avoid jargon",
- "auto_select": true
}{- "id": 0,
- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "name": "string",
- "tagline": "string",
- "source": "string",
- "tone_summary": "string",
- "writing_style_traits": [
- {
- "title": "string",
- "description": "string"
}
], - "reading_level": "string",
- "example_sentence": "string",
- "language_preference": "string",
- "key_guidelines": "string",
- "target_audience": "string",
- "is_selected": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Creates a custom brand voice profile from a structured set of fields rather than free-form text. Ideal for precise voice definition without AI parsing.
| name required | string <= 200 characters |
| tagline | string or null <= 200 characters |
| tone_summary | string or null |
Array of objects (WritingStyleTrait) | |
| reading_level | string or null <= 50 characters |
| example_sentence | string or null |
| language_preference | string or null <= 50 characters |
| key_guidelines | string or null |
| target_audience | string or null |
| auto_select | boolean Default: true |
| voice_instructions | string or null <= 2500 characters Optional original freeform instructions for reference |
{- "name": "string",
- "tagline": "string",
- "tone_summary": "string",
- "writing_style_traits": [
- {
- "title": "string",
- "description": "string"
}
], - "reading_level": "string",
- "example_sentence": "string",
- "language_preference": "string",
- "key_guidelines": "string",
- "target_audience": "string",
- "auto_select": true,
- "voice_instructions": "string"
}{- "id": 0,
- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "name": "string",
- "tagline": "string",
- "source": "string",
- "tone_summary": "string",
- "writing_style_traits": [
- {
- "title": "string",
- "description": "string"
}
], - "reading_level": "string",
- "example_sentence": "string",
- "language_preference": "string",
- "key_guidelines": "string",
- "target_audience": "string",
- "is_selected": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Re-runs LLM parsing on updated voice instructions for an existing custom voice. Replaces the structured fields with the new parsing result.
| voiceUuid required | string <uuid> UUID of the custom voice to re-parse |
| voice_instructions required | string <= 2500 characters Updated voice instructions for re-parsing |
{- "voice_instructions": "string"
}{- "id": 0,
- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "name": "string",
- "tagline": "string",
- "source": "string",
- "tone_summary": "string",
- "writing_style_traits": [
- {
- "title": "string",
- "description": "string"
}
], - "reading_level": "string",
- "example_sentence": "string",
- "language_preference": "string",
- "key_guidelines": "string",
- "target_audience": "string",
- "is_selected": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Knowledge graph settings for a Brand Vault - authorship, social media profiles, and top pages used to build structured entity data for SEO.
Returns authorship, social media profile URLs, and top pages for this Brand Vault's knowledge graph.
{- "id": 0,
- "customer": 0,
- "otto_project": 0,
- "business_name": "string",
- "description": "string",
- "phone_number": "string",
- "email_address": "user@example.com",
- "vat_id": "string",
- "tax_id": "string",
- "number_of_employees": 0,
- "iso_6523_code": "string",
- "street_address": "string",
- "address_locality": "string",
- "address_administrative_area": "string",
- "address_country": "string",
- "address_region": "string",
- "postal_code": "string",
- "timezone": "string",
- "lat": -90,
- "long": -180,
- "embedded_google_map": "string",
- "serp_location_id": "string",
- "serp_location_text": "string",
- "link_urls": [
- { }
], - "authorship_first_name": "string",
- "authorship_last_name": "string",
- "language_code": "string",
- "progress": 0,
- "gbp_sourced_fields": [
- "string"
]
}Partially updates authorship, social profiles, and/or top pages. Supports
adding/updating top pages (with UUID for existing, without UUID for new) and
deleting pages via delete_top_page_uuids.
object (Authorship) | |
object (SocialProfiles) Social media profile URLs (all 22 platforms) | |
Array of objects (TopPage) | |
| delete_top_page_uuids | Array of strings UUIDs of top pages to delete |
{- "authorship": {
- "first_name": "string",
- "last_name": "string"
}, - "social_profiles": {
- "gbp_url": "string",
- "twitter_url": "string",
- "facebook_url": "string",
- "youtube_url": "string",
- "instagram_url": "string",
- "linkedin_url": "string",
- "pinterest_url": "string",
- "crunchbase_url": "string",
- "trustpilot_url": "string",
- "googleplay_url": "string",
- "applestore_url": "string",
- "yelp_url": "string",
- "yellowpages_url": "string",
- "wikipedia_url": "string",
- "foursquare_url": "string",
- "bbb_url": "string",
- "tripadvisor_url": "string",
- "tiktok_url": "string",
- "dnb_url": "string",
- "indeed_url": "string",
- "g2_url": "string",
- "capterra_url": "string"
}, - "top_pages": [
- {
- "uuid": "string",
- "url": "string",
- "source": "user",
- "keywords": [
- "string"
], - "is_selected": false
}
], - "delete_top_page_uuids": [
- "string"
]
}{- "id": 0,
- "customer": 0,
- "otto_project": 0,
- "business_name": "string",
- "description": "string",
- "phone_number": "string",
- "email_address": "user@example.com",
- "vat_id": "string",
- "tax_id": "string",
- "number_of_employees": 0,
- "iso_6523_code": "string",
- "street_address": "string",
- "address_locality": "string",
- "address_administrative_area": "string",
- "address_country": "string",
- "address_region": "string",
- "postal_code": "string",
- "timezone": "string",
- "lat": -90,
- "long": -180,
- "embedded_google_map": "string",
- "serp_location_id": "string",
- "serp_location_text": "string",
- "link_urls": [
- { }
], - "authorship_first_name": "string",
- "authorship_last_name": "string",
- "language_code": "string",
- "progress": 0,
- "gbp_sourced_fields": [
- "string"
]
}Retrieval-Augmented Generation - upload source documents, replace uploads, and query Brand Vault knowledge for AI content generation.
Uploads one or more documents (PDF, DOCX, TXT, HTML, etc.) to a Brand Vault for RAG ingestion. Files are stored in GCS, processed asynchronously, and indexed for AI retrieval. Maximum 10 files per batch and 10 MB per file.
Returns upload IDs that can be used to track processing status or replace files.
| files required | Array of strings <binary> [ 1 .. 10 ] items [ items <binary > ] Files to upload (max 10 per batch, max 10 MB each) |
| brand_vault_uuid required | string <= 255 characters UUID of the target Brand Vault |
{- "upload_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "status": "string",
- "message": "string",
- "duplicates": [
- { }
], - "task": { },
- "replaced_upload_id": "28af72bc-af91-4210-82aa-42213019fa93"
}Replaces the content of an existing upload with a new file. The upload ID is preserved. The new file is re-processed and re-indexed. Useful for updating a document without re-adding it.
| uploadId required | string <uuid> UUID of the upload to replace |
| file required | string <binary> Replacement file |
{- "upload_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "status": "string",
- "message": "string",
- "duplicates": [
- { }
], - "task": { },
- "replaced_upload_id": "28af72bc-af91-4210-82aa-42213019fa93"
}Queries the RAG index for a Brand Vault using natural language. Optionally uses an LLM to generate a synthesized answer from retrieved chunks. Supports conversation history for multi-turn interactions.
The brand_vault_uuid must belong to the authenticated customer.
| query required | string <= 2000 characters Natural language query |
| brand_vault_uuid required | string Brand Vault UUID to query |
| k | integer [ 1 .. 20 ] Default: 5 Number of results to return |
| use_llm | boolean Default: true Whether to use LLM for answer synthesis |
Array of objects or null (ConversationMessage) Prior conversation messages for multi-turn context |
{- "query": "What are our core product features?",
- "brand_vault_uuid": "550e8400-e29b-41d4-a716-446655440000",
- "k": 5,
- "use_llm": true
}{- "success": true,
- "query": "string",
- "original_query": "string",
- "rewritten_query": "string",
- "answer": "string",
- "sources": [
- {
- "score": 0.1
}
], - "chunk_id": "string",
- "response_time_ms": 0.1,
- "error": "string"
}AI-powered multi-stage content generation pipeline. Each piece of content progresses through stages: Information Retrieval → Headings Outline → Content Brief & Citations → HTML Content Generation. Stages can be triggered individually or all at once.
Creates a new CGenius content workflow record tied to a content topic. Optionally links to an existing page or a BrandVault for AI settings. This is the initialisation step - generation stages are triggered separately.
| content_topic required | string The article topic or title to generate content for |
| type required | string Content type (e.g. "article", "blog_post", "landing_page") |
| page | integer or null Optional existing page ID to attach generation to |
| brand_vault_uuid | string or null <uuid> BrandVault UUID for AI style and voice settings (mutually exclusive with project) |
| project_id | integer or null Project ID for AI settings context (mutually exclusive with brand_vault_uuid) |
required | object (CGeniusSettingsContext) |
object Microagent ID → payload dict. Microagents run after HTML generation. |
{- "content_topic": "How to optimise landing pages for conversions",
- "type": "article",
- "settings_context": {
- "language": "en",
- "length": "optimized",
- "generate_images": true
}
}{- "id": 0,
- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "content_topic": "string",
- "type": "string",
- "page": 0,
- "settings_context": {
- "language": "en",
- "length": "short",
- "generate_images": true,
- "content_intent": "string",
- "required_internal_links": [
- "string"
], - "required_external_links": [
- "string"
], - "optional_internal_links": [
- "string"
], - "optional_external_links": [
- "string"
]
}, - "is_bulk_generation": true,
- "was_published_to_editor": true,
- "is_headings_imported": true,
- "fully_complete": true,
- "content_ready_for_preview": true,
- "word_count": 0,
- "word_count_after_microagents": 0,
- "reasoning_seconds": 0,
- "information_retrieval": { },
- "information_retrieval_task_status": "PENDING",
- "information_retrieval_started_at": "2019-08-24T14:15:22Z",
- "information_retrieval_finished_at": "2019-08-24T14:15:22Z",
- "information_retrieval_error_message": "string",
- "headings_outline": { },
- "headings_outline_raw": { },
- "headings_outline_task_status": "PENDING",
- "headings_outline_started_at": "2019-08-24T14:15:22Z",
- "headings_outline_finished_at": "2019-08-24T14:15:22Z",
- "headings_outline_error_message": "string",
- "content_brief": { },
- "content_brief_task_status": "PENDING",
- "content_brief_started_at": "2019-08-24T14:15:22Z",
- "content_brief_finished_at": "2019-08-24T14:15:22Z",
- "content_brief_error_message": "string",
- "citations": { },
- "citations_task_status": "PENDING",
- "citations_started_at": "2019-08-24T14:15:22Z",
- "citations_finished_at": "2019-08-24T14:15:22Z",
- "html_content": "string",
- "html_content_task_status": "PENDING",
- "html_content_started_at": "2019-08-24T14:15:22Z",
- "html_content_finished_at": "2019-08-24T14:15:22Z",
- "html_content_error_message": "string",
- "microagents": [
- 0
], - "microagents_task_status": "PENDING",
- "microagents_started_at": "2019-08-24T14:15:22Z",
- "microagents_finished_at": "2019-08-24T14:15:22Z",
- "microagents_error_message": "string",
- "image_generation_task_status": "PENDING",
- "links_insertion": { },
- "links_insertion_task_status": "PENDING",
- "inserted_links": { },
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "created_by_user": 0,
- "customer": 0
}Returns full CGenius content record including all stage statuses, settings context, and generated data references.
{- "id": 0,
- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "content_topic": "string",
- "type": "string",
- "page": 0,
- "settings_context": {
- "language": "en",
- "length": "short",
- "generate_images": true,
- "content_intent": "string",
- "required_internal_links": [
- "string"
], - "required_external_links": [
- "string"
], - "optional_internal_links": [
- "string"
], - "optional_external_links": [
- "string"
]
}, - "is_bulk_generation": true,
- "was_published_to_editor": true,
- "is_headings_imported": true,
- "fully_complete": true,
- "content_ready_for_preview": true,
- "word_count": 0,
- "word_count_after_microagents": 0,
- "reasoning_seconds": 0,
- "information_retrieval": { },
- "information_retrieval_task_status": "PENDING",
- "information_retrieval_started_at": "2019-08-24T14:15:22Z",
- "information_retrieval_finished_at": "2019-08-24T14:15:22Z",
- "information_retrieval_error_message": "string",
- "headings_outline": { },
- "headings_outline_raw": { },
- "headings_outline_task_status": "PENDING",
- "headings_outline_started_at": "2019-08-24T14:15:22Z",
- "headings_outline_finished_at": "2019-08-24T14:15:22Z",
- "headings_outline_error_message": "string",
- "content_brief": { },
- "content_brief_task_status": "PENDING",
- "content_brief_started_at": "2019-08-24T14:15:22Z",
- "content_brief_finished_at": "2019-08-24T14:15:22Z",
- "content_brief_error_message": "string",
- "citations": { },
- "citations_task_status": "PENDING",
- "citations_started_at": "2019-08-24T14:15:22Z",
- "citations_finished_at": "2019-08-24T14:15:22Z",
- "html_content": "string",
- "html_content_task_status": "PENDING",
- "html_content_started_at": "2019-08-24T14:15:22Z",
- "html_content_finished_at": "2019-08-24T14:15:22Z",
- "html_content_error_message": "string",
- "microagents": [
- 0
], - "microagents_task_status": "PENDING",
- "microagents_started_at": "2019-08-24T14:15:22Z",
- "microagents_finished_at": "2019-08-24T14:15:22Z",
- "microagents_error_message": "string",
- "image_generation_task_status": "PENDING",
- "links_insertion": { },
- "links_insertion_task_status": "PENDING",
- "inserted_links": { },
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "created_by_user": 0,
- "customer": 0
}Partially update fields on a CGenius content record (e.g. re-assign microagents or update settings).
object (CGeniusSettingsContext) | |
| microagents | Array of integers List of microagent IDs to associate |
{- "settings_context": {
- "language": "en",
- "length": "short",
- "generate_images": true,
- "content_intent": "string",
- "required_internal_links": [
- "string"
], - "required_external_links": [
- "string"
], - "optional_internal_links": [
- "string"
], - "optional_external_links": [
- "string"
]
}, - "microagents": [
- 0
]
}{- "id": 0,
- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "content_topic": "string",
- "type": "string",
- "page": 0,
- "settings_context": {
- "language": "en",
- "length": "short",
- "generate_images": true,
- "content_intent": "string",
- "required_internal_links": [
- "string"
], - "required_external_links": [
- "string"
], - "optional_internal_links": [
- "string"
], - "optional_external_links": [
- "string"
]
}, - "is_bulk_generation": true,
- "was_published_to_editor": true,
- "is_headings_imported": true,
- "fully_complete": true,
- "content_ready_for_preview": true,
- "word_count": 0,
- "word_count_after_microagents": 0,
- "reasoning_seconds": 0,
- "information_retrieval": { },
- "information_retrieval_task_status": "PENDING",
- "information_retrieval_started_at": "2019-08-24T14:15:22Z",
- "information_retrieval_finished_at": "2019-08-24T14:15:22Z",
- "information_retrieval_error_message": "string",
- "headings_outline": { },
- "headings_outline_raw": { },
- "headings_outline_task_status": "PENDING",
- "headings_outline_started_at": "2019-08-24T14:15:22Z",
- "headings_outline_finished_at": "2019-08-24T14:15:22Z",
- "headings_outline_error_message": "string",
- "content_brief": { },
- "content_brief_task_status": "PENDING",
- "content_brief_started_at": "2019-08-24T14:15:22Z",
- "content_brief_finished_at": "2019-08-24T14:15:22Z",
- "content_brief_error_message": "string",
- "citations": { },
- "citations_task_status": "PENDING",
- "citations_started_at": "2019-08-24T14:15:22Z",
- "citations_finished_at": "2019-08-24T14:15:22Z",
- "html_content": "string",
- "html_content_task_status": "PENDING",
- "html_content_started_at": "2019-08-24T14:15:22Z",
- "html_content_finished_at": "2019-08-24T14:15:22Z",
- "html_content_error_message": "string",
- "microagents": [
- 0
], - "microagents_task_status": "PENDING",
- "microagents_started_at": "2019-08-24T14:15:22Z",
- "microagents_finished_at": "2019-08-24T14:15:22Z",
- "microagents_error_message": "string",
- "image_generation_task_status": "PENDING",
- "links_insertion": { },
- "links_insertion_task_status": "PENDING",
- "inserted_links": { },
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "created_by_user": 0,
- "customer": 0
}Returns a lightweight summary of all pipeline stage statuses (information_retrieval, headings_outline, content_brief, html_content, microagents). Use for polling without fetching the full content payload.
{- "information_retrieval_task_status": "PENDING",
- "headings_outline_task_status": "PENDING",
- "content_brief_task_status": "PENDING",
- "html_content_task_status": "PENDING",
- "microagents_task_status": "PENDING",
- "image_generation_task_status": "PENDING",
- "fully_complete": true
}Server-Sent Events stream for real-time generation progress.
Each event carries a JSON payload with stage, status, and optional data.
The stream ends with a done event when all stages complete.
Content-Type: text/event-stream
| uuid required | string <uuid> CGenius content UUID |
Triggers async retrieval of SERP data, competitor content, and research sources
for the content topic. Sets information_retrieval_task_status to PENDING.
| keywords | Array of strings Optional override keywords for retrieval |
| search_terms | Array of strings |
{- "keywords": [
- "string"
], - "search_terms": [
- "string"
]
}{- "id": 0,
- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "content_topic": "string",
- "type": "string",
- "page": 0,
- "settings_context": {
- "language": "en",
- "length": "short",
- "generate_images": true,
- "content_intent": "string",
- "required_internal_links": [
- "string"
], - "required_external_links": [
- "string"
], - "optional_internal_links": [
- "string"
], - "optional_external_links": [
- "string"
]
}, - "is_bulk_generation": true,
- "was_published_to_editor": true,
- "is_headings_imported": true,
- "fully_complete": true,
- "content_ready_for_preview": true,
- "word_count": 0,
- "word_count_after_microagents": 0,
- "reasoning_seconds": 0,
- "information_retrieval": { },
- "information_retrieval_task_status": "PENDING",
- "information_retrieval_started_at": "2019-08-24T14:15:22Z",
- "information_retrieval_finished_at": "2019-08-24T14:15:22Z",
- "information_retrieval_error_message": "string",
- "headings_outline": { },
- "headings_outline_raw": { },
- "headings_outline_task_status": "PENDING",
- "headings_outline_started_at": "2019-08-24T14:15:22Z",
- "headings_outline_finished_at": "2019-08-24T14:15:22Z",
- "headings_outline_error_message": "string",
- "content_brief": { },
- "content_brief_task_status": "PENDING",
- "content_brief_started_at": "2019-08-24T14:15:22Z",
- "content_brief_finished_at": "2019-08-24T14:15:22Z",
- "content_brief_error_message": "string",
- "citations": { },
- "citations_task_status": "PENDING",
- "citations_started_at": "2019-08-24T14:15:22Z",
- "citations_finished_at": "2019-08-24T14:15:22Z",
- "html_content": "string",
- "html_content_task_status": "PENDING",
- "html_content_started_at": "2019-08-24T14:15:22Z",
- "html_content_finished_at": "2019-08-24T14:15:22Z",
- "html_content_error_message": "string",
- "microagents": [
- 0
], - "microagents_task_status": "PENDING",
- "microagents_started_at": "2019-08-24T14:15:22Z",
- "microagents_finished_at": "2019-08-24T14:15:22Z",
- "microagents_error_message": "string",
- "image_generation_task_status": "PENDING",
- "links_insertion": { },
- "links_insertion_task_status": "PENDING",
- "inserted_links": { },
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "created_by_user": 0,
- "customer": 0
}Triggers AI generation of the article headings/outline from information retrieval data. Requires Stage 1 (information retrieval) to be complete. Returns 400 if prerequisites are not met; 202 if already running.
No body fields required for this stage trigger
{ }{- "message": "string",
- "status": "processing"
}Triggers AI generation of the content brief (writing instructions, target audience, tone) and citation gathering from the information retrieval data. Requires Stages 1 and 2 (information retrieval + headings outline) to be complete. Returns 400 if prerequisites are not met; 202 if already running.
No body fields required for this stage trigger
{ }{- "message": "string",
- "status": "processing"
}Triggers the full HTML article generation from the approved headings outline and
content brief. This is the most compute-intensive stage.
On completion, was_published_to_editor is set to true and the page is updated.
Requires Stage 3 (content brief) to be complete. Returns 400 if prerequisites are not met; 202 if already running.
| user_prompt | string Default: "" Optional user instructions to guide HTML generation style or focus |
object Map of microagent IDs to apply during generation (key = microagent ID, value = config object) |
{- "user_prompt": "",
- "microagents": { }
}{- "message": "string",
- "status": "processing"
}Convenience endpoint that triggers all four generation stages sequentially for a single CGenius content record. Equivalent to calling each stage endpoint in sequence.
| id required | integer CGenius content ID |
{- "id": 0
}Creates up to 50 CGenius content records and immediately starts the full generation pipeline for each. Use for batch article creation from content plans or topical maps.
The settings_context (language, length, generate_images) applies to all items
unless overridden per-item. Either project_id or brand_vault_uuid must be
supplied (not both) to provide AI style settings.
required | Array of objects [ 1 .. 50 ] items |
required | object (CGeniusSettingsContext) |
object Global microagent payload dict applied to all content items | |
| project_id | integer or null Global project for all content (mutually exclusive with brand_vault_uuid) |
| brand_vault_uuid | string or null <uuid> Global BrandVault for all content (mutually exclusive with project_id) |
| has_multiple_projects | boolean Default: false Set true when each content entry carries its own project_id |
{- "contents": [
- {
- "content_topic": "Best SEO tools for 2025",
- "type": "article"
}, - {
- "content_topic": "How to rank on Google in 30 days",
- "type": "article"
}
], - "settings_context": {
- "language": "en",
- "length": "optimized",
- "generate_images": true
}, - "project_id": 123
}{- "created_count": 0,
- "ids": [
- 0
]
}Allows the user to edit the AI-generated headings outline before proceeding to content brief generation. Updated outline is used for subsequent stages.
| headings_outline | object Updated headings outline structure |
{- "headings_outline": { }
}{- "id": 0,
- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "content_topic": "string",
- "type": "string",
- "page": 0,
- "settings_context": {
- "language": "en",
- "length": "short",
- "generate_images": true,
- "content_intent": "string",
- "required_internal_links": [
- "string"
], - "required_external_links": [
- "string"
], - "optional_internal_links": [
- "string"
], - "optional_external_links": [
- "string"
]
}, - "is_bulk_generation": true,
- "was_published_to_editor": true,
- "is_headings_imported": true,
- "fully_complete": true,
- "content_ready_for_preview": true,
- "word_count": 0,
- "word_count_after_microagents": 0,
- "reasoning_seconds": 0,
- "information_retrieval": { },
- "information_retrieval_task_status": "PENDING",
- "information_retrieval_started_at": "2019-08-24T14:15:22Z",
- "information_retrieval_finished_at": "2019-08-24T14:15:22Z",
- "information_retrieval_error_message": "string",
- "headings_outline": { },
- "headings_outline_raw": { },
- "headings_outline_task_status": "PENDING",
- "headings_outline_started_at": "2019-08-24T14:15:22Z",
- "headings_outline_finished_at": "2019-08-24T14:15:22Z",
- "headings_outline_error_message": "string",
- "content_brief": { },
- "content_brief_task_status": "PENDING",
- "content_brief_started_at": "2019-08-24T14:15:22Z",
- "content_brief_finished_at": "2019-08-24T14:15:22Z",
- "content_brief_error_message": "string",
- "citations": { },
- "citations_task_status": "PENDING",
- "citations_started_at": "2019-08-24T14:15:22Z",
- "citations_finished_at": "2019-08-24T14:15:22Z",
- "html_content": "string",
- "html_content_task_status": "PENDING",
- "html_content_started_at": "2019-08-24T14:15:22Z",
- "html_content_finished_at": "2019-08-24T14:15:22Z",
- "html_content_error_message": "string",
- "microagents": [
- 0
], - "microagents_task_status": "PENDING",
- "microagents_started_at": "2019-08-24T14:15:22Z",
- "microagents_finished_at": "2019-08-24T14:15:22Z",
- "microagents_error_message": "string",
- "image_generation_task_status": "PENDING",
- "links_insertion": { },
- "links_insertion_task_status": "PENDING",
- "inserted_links": { },
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "created_by_user": 0,
- "customer": 0
}Allows the user to edit the AI-generated content brief before HTML generation.
| content_brief | object Updated content brief object |
{- "content_brief": { }
}{- "id": 0,
- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "content_topic": "string",
- "type": "string",
- "page": 0,
- "settings_context": {
- "language": "en",
- "length": "short",
- "generate_images": true,
- "content_intent": "string",
- "required_internal_links": [
- "string"
], - "required_external_links": [
- "string"
], - "optional_internal_links": [
- "string"
], - "optional_external_links": [
- "string"
]
}, - "is_bulk_generation": true,
- "was_published_to_editor": true,
- "is_headings_imported": true,
- "fully_complete": true,
- "content_ready_for_preview": true,
- "word_count": 0,
- "word_count_after_microagents": 0,
- "reasoning_seconds": 0,
- "information_retrieval": { },
- "information_retrieval_task_status": "PENDING",
- "information_retrieval_started_at": "2019-08-24T14:15:22Z",
- "information_retrieval_finished_at": "2019-08-24T14:15:22Z",
- "information_retrieval_error_message": "string",
- "headings_outline": { },
- "headings_outline_raw": { },
- "headings_outline_task_status": "PENDING",
- "headings_outline_started_at": "2019-08-24T14:15:22Z",
- "headings_outline_finished_at": "2019-08-24T14:15:22Z",
- "headings_outline_error_message": "string",
- "content_brief": { },
- "content_brief_task_status": "PENDING",
- "content_brief_started_at": "2019-08-24T14:15:22Z",
- "content_brief_finished_at": "2019-08-24T14:15:22Z",
- "content_brief_error_message": "string",
- "citations": { },
- "citations_task_status": "PENDING",
- "citations_started_at": "2019-08-24T14:15:22Z",
- "citations_finished_at": "2019-08-24T14:15:22Z",
- "html_content": "string",
- "html_content_task_status": "PENDING",
- "html_content_started_at": "2019-08-24T14:15:22Z",
- "html_content_finished_at": "2019-08-24T14:15:22Z",
- "html_content_error_message": "string",
- "microagents": [
- 0
], - "microagents_task_status": "PENDING",
- "microagents_started_at": "2019-08-24T14:15:22Z",
- "microagents_finished_at": "2019-08-24T14:15:22Z",
- "microagents_error_message": "string",
- "image_generation_task_status": "PENDING",
- "links_insertion": { },
- "links_insertion_task_status": "PENDING",
- "inserted_links": { },
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "created_by_user": 0,
- "customer": 0
}Updates the keyword list and search terms used for information retrieval. Useful when the user wants to adjust the research scope before re-running retrieval.
| keywords | Array of strings Primary target keywords |
| search_terms | Array of strings Additional search terms to inform content research |
{- "keywords": [
- "string"
], - "search_terms": [
- "string"
]
}{- "id": 0,
- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "content_topic": "string",
- "type": "string",
- "page": 0,
- "settings_context": {
- "language": "en",
- "length": "short",
- "generate_images": true,
- "content_intent": "string",
- "required_internal_links": [
- "string"
], - "required_external_links": [
- "string"
], - "optional_internal_links": [
- "string"
], - "optional_external_links": [
- "string"
]
}, - "is_bulk_generation": true,
- "was_published_to_editor": true,
- "is_headings_imported": true,
- "fully_complete": true,
- "content_ready_for_preview": true,
- "word_count": 0,
- "word_count_after_microagents": 0,
- "reasoning_seconds": 0,
- "information_retrieval": { },
- "information_retrieval_task_status": "PENDING",
- "information_retrieval_started_at": "2019-08-24T14:15:22Z",
- "information_retrieval_finished_at": "2019-08-24T14:15:22Z",
- "information_retrieval_error_message": "string",
- "headings_outline": { },
- "headings_outline_raw": { },
- "headings_outline_task_status": "PENDING",
- "headings_outline_started_at": "2019-08-24T14:15:22Z",
- "headings_outline_finished_at": "2019-08-24T14:15:22Z",
- "headings_outline_error_message": "string",
- "content_brief": { },
- "content_brief_task_status": "PENDING",
- "content_brief_started_at": "2019-08-24T14:15:22Z",
- "content_brief_finished_at": "2019-08-24T14:15:22Z",
- "content_brief_error_message": "string",
- "citations": { },
- "citations_task_status": "PENDING",
- "citations_started_at": "2019-08-24T14:15:22Z",
- "citations_finished_at": "2019-08-24T14:15:22Z",
- "html_content": "string",
- "html_content_task_status": "PENDING",
- "html_content_started_at": "2019-08-24T14:15:22Z",
- "html_content_finished_at": "2019-08-24T14:15:22Z",
- "html_content_error_message": "string",
- "microagents": [
- 0
], - "microagents_task_status": "PENDING",
- "microagents_started_at": "2019-08-24T14:15:22Z",
- "microagents_finished_at": "2019-08-24T14:15:22Z",
- "microagents_error_message": "string",
- "image_generation_task_status": "PENDING",
- "links_insertion": { },
- "links_insertion_task_status": "PENDING",
- "inserted_links": { },
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "created_by_user": 0,
- "customer": 0
}Returns a paginated list of all CGenius content records for the authenticated user's account.
| page | integer Default: 1 |
| page_size | integer Default: 20 |
| search | string Search by content_topic |
{- "count": 0,
- "results": [
- {
- "id": 0,
- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "content_topic": "string",
- "type": "string",
- "page": 0,
- "settings_context": {
- "language": "en",
- "length": "short",
- "generate_images": true,
- "content_intent": "string",
- "required_internal_links": [
- "string"
], - "required_external_links": [
- "string"
], - "optional_internal_links": [
- "string"
], - "optional_external_links": [
- "string"
]
}, - "is_bulk_generation": true,
- "was_published_to_editor": true,
- "is_headings_imported": true,
- "fully_complete": true,
- "content_ready_for_preview": true,
- "word_count": 0,
- "word_count_after_microagents": 0,
- "reasoning_seconds": 0,
- "information_retrieval": { },
- "information_retrieval_task_status": "PENDING",
- "information_retrieval_started_at": "2019-08-24T14:15:22Z",
- "information_retrieval_finished_at": "2019-08-24T14:15:22Z",
- "information_retrieval_error_message": "string",
- "headings_outline": { },
- "headings_outline_raw": { },
- "headings_outline_task_status": "PENDING",
- "headings_outline_started_at": "2019-08-24T14:15:22Z",
- "headings_outline_finished_at": "2019-08-24T14:15:22Z",
- "headings_outline_error_message": "string",
- "content_brief": { },
- "content_brief_task_status": "PENDING",
- "content_brief_started_at": "2019-08-24T14:15:22Z",
- "content_brief_finished_at": "2019-08-24T14:15:22Z",
- "content_brief_error_message": "string",
- "citations": { },
- "citations_task_status": "PENDING",
- "citations_started_at": "2019-08-24T14:15:22Z",
- "citations_finished_at": "2019-08-24T14:15:22Z",
- "html_content": "string",
- "html_content_task_status": "PENDING",
- "html_content_started_at": "2019-08-24T14:15:22Z",
- "html_content_finished_at": "2019-08-24T14:15:22Z",
- "html_content_error_message": "string",
- "microagents": [
- 0
], - "microagents_task_status": "PENDING",
- "microagents_started_at": "2019-08-24T14:15:22Z",
- "microagents_finished_at": "2019-08-24T14:15:22Z",
- "microagents_error_message": "string",
- "image_generation_task_status": "PENDING",
- "links_insertion": { },
- "links_insertion_task_status": "PENDING",
- "inserted_links": { },
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "created_by_user": 0,
- "customer": 0
}
]
}Micro-level AI agents that perform specialized content tasks (e.g. rewriting sections, generating tables, applying brand voice). Can be run on CGenius content or on existing pages.
Returns all microagents available to the authenticated user. Microagents are specialized AI agents that perform focused content tasks (e.g. "Generate Table Section", "Expand Paragraph", "Apply Brand Voice").
[- {
- "id": 0,
- "name": "string",
- "description": "string",
- "prompt": "string",
- "provider": "string",
- "llm_model": "string",
- "should_use_grounded_search": true,
- "should_use_scholar": true,
- "ordinal": 0,
- "type": "string",
- "return_type": "string",
- "icon": "string"
}
]Runs a single microagent against provided content payload. For lightweight agents
a synchronous result is returned. For heavy agents the task is queued and a task_id
is returned for polling.
| microagent_id required | integer |
required | object Dynamic fields defined by the microagent's prompt variables.
Common fields include |
{- "microagent_id": 5,
- "payload": {
- "text_before": "The following section covers on-page SEO",
- "text_after": "Always include the target keyword in the first paragraph"
}
}{- "result": "string"
}Check the result of an async microagent execution by task ID.
| task_id required | string Task ID returned from execute endpoint |
{- "task_status": "PENDING",
- "result": "string",
- "error": "string"
}Returns all previous microagent execution results associated with a page.
| page_uuid | string <uuid> Page UUID to retrieve microagent results for |
[- {
- "microagent_id": 0,
- "microagent_name": "string",
- "result": "string",
- "created_at": "2019-08-24T14:15:22Z"
}
]Applies one or more microagents to the generated HTML content of a CGenius record.
Results are merged back into the HTML. Sets microagents_task_status to PENDING.
object Microagent ID → payload dict for the microagents to run |
{- "microagents": {
- "property1": { },
- "property2": { }
}
}{- "id": 0,
- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "content_topic": "string",
- "type": "string",
- "page": 0,
- "settings_context": {
- "language": "en",
- "length": "short",
- "generate_images": true,
- "content_intent": "string",
- "required_internal_links": [
- "string"
], - "required_external_links": [
- "string"
], - "optional_internal_links": [
- "string"
], - "optional_external_links": [
- "string"
]
}, - "is_bulk_generation": true,
- "was_published_to_editor": true,
- "is_headings_imported": true,
- "fully_complete": true,
- "content_ready_for_preview": true,
- "word_count": 0,
- "word_count_after_microagents": 0,
- "reasoning_seconds": 0,
- "information_retrieval": { },
- "information_retrieval_task_status": "PENDING",
- "information_retrieval_started_at": "2019-08-24T14:15:22Z",
- "information_retrieval_finished_at": "2019-08-24T14:15:22Z",
- "information_retrieval_error_message": "string",
- "headings_outline": { },
- "headings_outline_raw": { },
- "headings_outline_task_status": "PENDING",
- "headings_outline_started_at": "2019-08-24T14:15:22Z",
- "headings_outline_finished_at": "2019-08-24T14:15:22Z",
- "headings_outline_error_message": "string",
- "content_brief": { },
- "content_brief_task_status": "PENDING",
- "content_brief_started_at": "2019-08-24T14:15:22Z",
- "content_brief_finished_at": "2019-08-24T14:15:22Z",
- "content_brief_error_message": "string",
- "citations": { },
- "citations_task_status": "PENDING",
- "citations_started_at": "2019-08-24T14:15:22Z",
- "citations_finished_at": "2019-08-24T14:15:22Z",
- "html_content": "string",
- "html_content_task_status": "PENDING",
- "html_content_started_at": "2019-08-24T14:15:22Z",
- "html_content_finished_at": "2019-08-24T14:15:22Z",
- "html_content_error_message": "string",
- "microagents": [
- 0
], - "microagents_task_status": "PENDING",
- "microagents_started_at": "2019-08-24T14:15:22Z",
- "microagents_finished_at": "2019-08-24T14:15:22Z",
- "microagents_error_message": "string",
- "image_generation_task_status": "PENDING",
- "links_insertion": { },
- "links_insertion_task_status": "PENDING",
- "inserted_links": { },
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "created_by_user": 0,
- "customer": 0
}Returns the current status of the microagents processing stage for a CGenius content record.
{- "microagents_task_status": "PENDING",
- "microagents_started_at": "2019-08-24T14:15:22Z",
- "microagents_finished_at": "2019-08-24T14:15:22Z",
- "microagents_error_message": "string"
}Applies microagents directly to a content page (not via CGenius). Used when the user wants post-generation refinements on an already-published page.
| id required | string <uuid> Page UUID |
object Microagent ID → payload dict for the microagents to run |
{- "microagents": {
- "property1": { },
- "property2": { }
}
}Grade existing page content against target keywords using AI analysis.
Submits a page for AI content grading. Grading evaluates the content against target
keywords using multiple AI signals. Either url or content (raw HTML) must be
supplied - not both.
| id required | string <uuid> Page UUID |
| keywords required | Array of strings non-empty Target keywords to grade the content against |
| url | string or null <uri> URL to fetch and grade (mutually exclusive with content) |
| content | string or null Raw HTML content to grade (mutually exclusive with url) |
| content_last_updated_at | string or null <date-time> |
{- "keywords": [
- "seo tools",
- "rank tracking"
],
}{- "id": 0,
- "keywords": [
- "string"
], - "html_analysis": {
- "id": 0,
- "url": "string"
}, - "result": { },
- "content": "string",
- "content_last_updated_at": "2019-08-24T14:15:22Z",
- "content_last_graded_at": "2019-08-24T14:15:22Z",
- "task_status": "PENDING",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Returns all AI content grader score records for the authenticated account.
| page | integer Default: 1 |
| page_size | integer Default: 20 |
{- "count": 0,
- "results": [
- {
- "id": 0,
- "keywords": [
- "string"
], - "html_analysis": {
- "id": 0,
- "url": "string"
}, - "result": { },
- "content": "string",
- "content_last_updated_at": "2019-08-24T14:15:22Z",
- "content_last_graded_at": "2019-08-24T14:15:22Z",
- "task_status": "PENDING",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
]
}Semantic SEO analysis that scores a URL or HTML document against a keyword using SERP entity and semantic analysis. Returns ensemble and per-method scores.
Returns all semantic grader records for the authenticated account, ordered by most recent.
| page | integer Default: 1 |
| page_size | integer Default: 20 |
| ordering | string Field to order by. Example: |
{- "count": 0,
- "results": [
- {
- "id": 0,
- "html_analysis": {
- "id": 0,
- "url": "string"
}, - "target_keyword": { },
- "task_status": "PENDING",
- "overall_score": 0,
- "ensemble_score": 0,
- "public_share_hash": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
]
}Initiates a semantic SEO analysis for a URL and keyword combination.
Retrieves SERP competitors, extracts entities and topics, and scores the target URL
against the semantic field of SERP results.
Processing is asynchronous - poll the detail endpoint for task_status = SUCCESS.
| url | string or null <uri> URL to analyse (mutually exclusive with html_text) |
| keyword required | string <= 160 characters Target keyword for semantic analysis |
| country_code | string or null ISO country code (e.g. "us", "gb") |
| location | string or null Location name (e.g. "United States") |
| location_id | integer or null SearchAtlas location ID (e.g. 2840 for United States) |
| html_text | string or null Raw HTML text to analyse (mutually exclusive with url) |
| process_serps | boolean Default: false Whether to process SERP competitors for scoring (consumes more quota) |
| serps_source | string Default: "google" Enum: "google" "bing" |
{- "keyword": "seo guide for beginners",
- "country_code": "us",
- "location_id": 2840,
- "process_serps": true
}{- "id": 0,
- "html_analysis": {
- "id": 0,
- "url": "string"
}, - "target_keyword": { },
- "task_status": "PENDING",
- "overall_score": 0,
- "ensemble_score": 0,
- "public_share_hash": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Returns the full semantic grader record including all scoring method results and ensemble score.
{- "id": 0,
- "html_analysis": {
- "id": 0,
- "url": "string"
}, - "target_keyword": { },
- "task_status": "PENDING",
- "overall_score": 0,
- "ensemble_score": 0,
- "public_share_hash": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "scoring_methods": { },
- "serp_data": { }
}Triggers a fresh reprocessing of the semantic analysis for this record. Consumes quota. Use when SERP data has changed or the user wants updated scores.
No body fields required - reprocessing uses the record''s existing URL and keyword
{ }{- "id": 0,
- "html_analysis": {
- "id": 0,
- "url": "string"
}, - "target_keyword": { },
- "task_status": "PENDING",
- "overall_score": 0,
- "ensemble_score": 0,
- "public_share_hash": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Hierarchical website topic structures. A DKN maps a domain's full content architecture (root → categories → subcategories → leaf pages). Nodes can trigger AI article generation.
Returns all DKN records (business info + domain configuration) for the authenticated account.
[- {
- "id": 0,
- "hostname": "string",
- "business_name": "string",
- "business_purpose": "string",
- "main_offers": "string",
- "monetization": "string",
- "target_audience": "string",
- "location": "string",
- "location_id": 0,
- "language": "string",
- "central_entity": "string",
- "central_search_intent": "string",
- "core_section_definition": "string",
- "outer_section_definition": "string",
- "topic_map_content": [ ],
- "task_status": "PENDING",
- "is_generating": true,
- "phase_1_created": true,
- "phase_2_created": true,
- "otto_project_uuid": "533c63db-12c5-4866-a229-0db1c3241679",
- "customer_id": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
]Returns aggregated metrics across pages tied to all DKNs for the account: total_pages, published_pages, pending_pages, domain_content_score, total_nodes, pending_generation.
{- "total_pages": 0,
- "published_pages": 0,
- "pending_pages": 0,
- "domain_content_score": 0,
- "total_nodes": 0,
- "pending_generation": 0
}Creates a DKN record with domain URL and business details. Triggers async site explorer processing for the domain. Phase 1 must complete before Phase 2.
| url required | string <uri> Website URL to build DKN for |
| business_name required | string |
| location required | string Business location name (e.g. "United States") |
| location_id required | integer SearchAtlas location ID (e.g. 2840) |
| language required | string Primary language code (e.g. "en") |
| otto_project_uuid | string or null <uuid> Optional OTTO project to link this DKN to |
{- "business_name": "Example Corp",
- "location": "United States",
- "location_id": 2840,
- "language": "en"
}{- "id": 0,
- "hostname": "string",
- "business_name": "string",
- "business_purpose": "string",
- "main_offers": "string",
- "monetization": "string",
- "target_audience": "string",
- "location": "string",
- "location_id": 0,
- "language": "string",
- "central_entity": "string",
- "central_search_intent": "string",
- "core_section_definition": "string",
- "outer_section_definition": "string",
- "topic_map_content": [ ],
- "task_status": "PENDING",
- "is_generating": true,
- "phase_1_created": true,
- "phase_2_created": true,
- "otto_project_uuid": "533c63db-12c5-4866-a229-0db1c3241679",
- "customer_id": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Triggers AI generation of topical maps from the DKN business context.
Creates cluster nodes representing the site architecture.
Pass ?force=true as a query parameter to force regeneration even when nodes already exist.
If nodes with valid keywords already exist and force is not set, the call is a no-op and
returns the current DKN record immediately.
| force | boolean Default: false Force full regeneration even if nodes already exist |
No body fields required - configuration is derived from the DKN record
{ }{- "id": 0,
- "hostname": "string",
- "business_name": "string",
- "business_purpose": "string",
- "main_offers": "string",
- "monetization": "string",
- "target_audience": "string",
- "location": "string",
- "location_id": 0,
- "language": "string",
- "central_entity": "string",
- "central_search_intent": "string",
- "core_section_definition": "string",
- "outer_section_definition": "string",
- "topic_map_content": [ ],
- "task_status": "PENDING",
- "is_generating": true,
- "phase_1_created": true,
- "phase_2_created": true,
- "otto_project_uuid": "533c63db-12c5-4866-a229-0db1c3241679",
- "customer_id": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Updates business info fields on a DKN (e.g. business_purpose, target_audience, language). If the URL/hostname changes, all derived fields are reset and site explorer reprocesses. Field updates to business info fields also trigger automatic DKN regeneration.
| url | string <uri> |
| business_name | string |
| business_purpose | string or null |
| main_offers | string or null |
| monetization | string or null |
| target_audience | string or null |
| location | string |
| location_id | integer |
| language | string |
| otto_project_uuid | string or null <uuid> |
{- "business_name": "string",
- "business_purpose": "string",
- "main_offers": "string",
- "monetization": "string",
- "target_audience": "string",
- "location": "string",
- "location_id": 0,
- "language": "string",
- "otto_project_uuid": "533c63db-12c5-4866-a229-0db1c3241679"
}{- "id": 0,
- "hostname": "string",
- "business_name": "string",
- "business_purpose": "string",
- "main_offers": "string",
- "monetization": "string",
- "target_audience": "string",
- "location": "string",
- "location_id": 0,
- "language": "string",
- "central_entity": "string",
- "central_search_intent": "string",
- "core_section_definition": "string",
- "outer_section_definition": "string",
- "topic_map_content": [ ],
- "task_status": "PENDING",
- "is_generating": true,
- "phase_1_created": true,
- "phase_2_created": true,
- "otto_project_uuid": "533c63db-12c5-4866-a229-0db1c3241679",
- "customer_id": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Initiates an AI-assisted DKN configuration session using a natural language prompt. Returns a transaction ID for polling the result.
| prompt required | string Natural language description of desired DKN configuration |
{- "prompt": "string"
}{- "task_id": "string"
}Polls the status and result of a DKN Vibe Code session.
| taskId required | string Vibe Code task ID |
{- "id": 0,
- "task_status": "PENDING",
- "user_prompt": "string",
- "parsed_json": { },
- "task_error_message": "string",
- "created_at": "2019-08-24T14:15:22Z"
}Returns DKN nodes for the authenticated account. Supports filtering by DKN, page type, category, subcategory, and generation status.
| domain_knowledge_network | integer Filter by DKN ID |
| page | integer Default: 1 |
| page_size | integer Default: 50 |
| is_leaf | boolean Filter to leaf nodes only (pages) |
| category | string |
| page_type | string |
{- "count": 0,
- "domain_knowledge_network": {
- "id": 0,
- "hostname": "string",
- "business_name": "string",
- "business_purpose": "string",
- "main_offers": "string",
- "monetization": "string",
- "target_audience": "string",
- "location": "string",
- "location_id": 0,
- "language": "string",
- "central_entity": "string",
- "central_search_intent": "string",
- "core_section_definition": "string",
- "outer_section_definition": "string",
- "topic_map_content": [ ],
- "task_status": "PENDING",
- "is_generating": true,
- "phase_1_created": true,
- "phase_2_created": true,
- "otto_project_uuid": "533c63db-12c5-4866-a229-0db1c3241679",
- "customer_id": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}, - "results": [
- {
- "id": 0,
- "domain_knowledge_network": {
- "id": 0,
- "hostname": "string",
- "business_name": "string",
- "business_purpose": "string",
- "main_offers": "string",
- "monetization": "string",
- "target_audience": "string",
- "location": "string",
- "location_id": 0,
- "language": "string",
- "central_entity": "string",
- "central_search_intent": "string",
- "core_section_definition": "string",
- "outer_section_definition": "string",
- "topic_map_content": [ ],
- "task_status": "PENDING",
- "is_generating": true,
- "phase_1_created": true,
- "phase_2_created": true,
- "otto_project_uuid": "533c63db-12c5-4866-a229-0db1c3241679",
- "customer_id": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}, - "parent_node": 0,
- "children_nodes": [
- { }
], - "is_root": true,
- "is_leaf": true,
- "is_category": true,
- "is_subcategory": true,
- "section": "string",
- "item": "string",
- "page_title": "string",
- "page_desc": "string",
- "slug": "string",
- "page_type": "string",
- "category": "string",
- "subcategory": "string",
- "target_keywords": [
- "string"
], - "entities": [ ],
- "query_networks": { },
- "factuality": { },
- "internal_link_structure": { },
- "content_brief": { },
- "components": { },
- "meta_tags": { },
- "article_uuid": "b834f734-af34-4e26-9bd8-f9290412b313",
- "article_status": "string",
- "otto_project_uuid": "533c63db-12c5-4866-a229-0db1c3241679",
- "depth": 0,
- "parent_path": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
]
}Returns the full hierarchical tree structure of nodes for a DKN. Uses a CTE (Common Table Expression) SQL query for efficient tree traversal. Each node contains nested children recursively.
| domain_knowledge_network required | integer DKN ID to get tree for |
{- "domain_knowledge_network": {
- "id": 0,
- "hostname": "string",
- "business_name": "string",
- "business_purpose": "string",
- "main_offers": "string",
- "monetization": "string",
- "target_audience": "string",
- "location": "string",
- "location_id": 0,
- "language": "string",
- "central_entity": "string",
- "central_search_intent": "string",
- "core_section_definition": "string",
- "outer_section_definition": "string",
- "topic_map_content": [ ],
- "task_status": "PENDING",
- "is_generating": true,
- "phase_1_created": true,
- "phase_2_created": true,
- "otto_project_uuid": "533c63db-12c5-4866-a229-0db1c3241679",
- "customer_id": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}, - "tree": [
- {
- "id": 0,
- "name": "string",
- "slug": "string",
- "page_type": "string",
- "raw_page_type": "string",
- "category": "string",
- "description": "string",
- "target_keywords": [
- "string"
], - "article_uuid": "b834f734-af34-4e26-9bd8-f9290412b313",
- "article_status": "string",
- "depth": 0,
- "parent_id": 0,
- "children_count": 0,
- "children": [
- { }
]
}
]
}Returns available filter values (categories, page types, subcategories) for the DKN node list.
| domain_knowledge_network required | integer |
{- "categories": [
- "string"
], - "page_types": [
- "string"
], - "subcategories": [
- "string"
]
}Partially update a DKN node (e.g. page_title, page_desc, target_keywords, slug, content_brief).
| page_title | string |
| page_desc | string or null |
| slug | string or null |
| target_keywords | Array of strings |
| content_brief | object or null |
| parent_node | integer or null |
| is_leaf | boolean |
| is_root | boolean |
{- "page_title": "string",
- "page_desc": "string",
- "slug": "string",
- "target_keywords": [
- "string"
], - "content_brief": { },
- "parent_node": 0,
- "is_leaf": true,
- "is_root": true
}{- "id": 0,
- "domain_knowledge_network": {
- "id": 0,
- "hostname": "string",
- "business_name": "string",
- "business_purpose": "string",
- "main_offers": "string",
- "monetization": "string",
- "target_audience": "string",
- "location": "string",
- "location_id": 0,
- "language": "string",
- "central_entity": "string",
- "central_search_intent": "string",
- "core_section_definition": "string",
- "outer_section_definition": "string",
- "topic_map_content": [ ],
- "task_status": "PENDING",
- "is_generating": true,
- "phase_1_created": true,
- "phase_2_created": true,
- "otto_project_uuid": "533c63db-12c5-4866-a229-0db1c3241679",
- "customer_id": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}, - "parent_node": 0,
- "children_nodes": [
- { }
], - "is_root": true,
- "is_leaf": true,
- "is_category": true,
- "is_subcategory": true,
- "section": "string",
- "item": "string",
- "page_title": "string",
- "page_desc": "string",
- "slug": "string",
- "page_type": "string",
- "category": "string",
- "subcategory": "string",
- "target_keywords": [
- "string"
], - "entities": [ ],
- "query_networks": { },
- "factuality": { },
- "internal_link_structure": { },
- "content_brief": { },
- "components": { },
- "meta_tags": { },
- "article_uuid": "b834f734-af34-4e26-9bd8-f9290412b313",
- "article_status": "string",
- "otto_project_uuid": "533c63db-12c5-4866-a229-0db1c3241679",
- "depth": 0,
- "parent_path": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Creates a CGenius content record and starts the full generation pipeline for a single
DKN node. The node's page_title and target_keywords are used as the content topic.
Returns the new CGeniusContent record.
Either project or brand_vault_uuid can be supplied for AI settings context
(not both).
object (CGeniusSettingsContext) | |
object Microagent ID → payload dict | |
| project | integer or null Project ID for AI settings (mutually exclusive with brand_vault_uuid) |
| brand_vault_uuid | string or null <uuid> BrandVault UUID for AI settings (mutually exclusive with project) |
| content_topic | string or null Override content topic (defaults to node page_title) |
| user_prompt | string or null Additional custom instructions for this article |
| target_keywords | Array of strings <= 3 items |
{- "settings_context": {
- "language": "en",
- "length": "optimized",
- "generate_images": true
}, - "microagents": { }
}{- "id": 0,
- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "content_topic": "string",
- "type": "string",
- "page": 0,
- "settings_context": {
- "language": "en",
- "length": "short",
- "generate_images": true,
- "content_intent": "string",
- "required_internal_links": [
- "string"
], - "required_external_links": [
- "string"
], - "optional_internal_links": [
- "string"
], - "optional_external_links": [
- "string"
]
}, - "is_bulk_generation": true,
- "was_published_to_editor": true,
- "is_headings_imported": true,
- "fully_complete": true,
- "content_ready_for_preview": true,
- "word_count": 0,
- "word_count_after_microagents": 0,
- "reasoning_seconds": 0,
- "information_retrieval": { },
- "information_retrieval_task_status": "PENDING",
- "information_retrieval_started_at": "2019-08-24T14:15:22Z",
- "information_retrieval_finished_at": "2019-08-24T14:15:22Z",
- "information_retrieval_error_message": "string",
- "headings_outline": { },
- "headings_outline_raw": { },
- "headings_outline_task_status": "PENDING",
- "headings_outline_started_at": "2019-08-24T14:15:22Z",
- "headings_outline_finished_at": "2019-08-24T14:15:22Z",
- "headings_outline_error_message": "string",
- "content_brief": { },
- "content_brief_task_status": "PENDING",
- "content_brief_started_at": "2019-08-24T14:15:22Z",
- "content_brief_finished_at": "2019-08-24T14:15:22Z",
- "content_brief_error_message": "string",
- "citations": { },
- "citations_task_status": "PENDING",
- "citations_started_at": "2019-08-24T14:15:22Z",
- "citations_finished_at": "2019-08-24T14:15:22Z",
- "html_content": "string",
- "html_content_task_status": "PENDING",
- "html_content_started_at": "2019-08-24T14:15:22Z",
- "html_content_finished_at": "2019-08-24T14:15:22Z",
- "html_content_error_message": "string",
- "microagents": [
- 0
], - "microagents_task_status": "PENDING",
- "microagents_started_at": "2019-08-24T14:15:22Z",
- "microagents_finished_at": "2019-08-24T14:15:22Z",
- "microagents_error_message": "string",
- "image_generation_task_status": "PENDING",
- "links_insertion": { },
- "links_insertion_task_status": "PENDING",
- "inserted_links": { },
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "created_by_user": 0,
- "customer": 0
}Creates CGenius content records and starts generation for 2-50 DKN nodes at once.
All nodes must belong to the authenticated customer. Either project or
brand_vault_uuid provides AI settings (mutually exclusive).
| node_ids required | Array of integers [ 2 .. 50 ] items List of DKN node IDs to generate articles for (2-50) |
| project | integer or null Project ID (mutually exclusive with brand_vault_uuid) |
| brand_vault_uuid | string or null <uuid> BrandVault UUID (mutually exclusive with project) |
| user_prompt | string or null Additional instructions applied to all articles |
{- "node_ids": [
- 101,
- 102,
- 103
], - "brand_vault_uuid": "550e8400-e29b-41d4-a716-446655440000"
}{- "created_count": 0,
- "ids": [
- 0
]
}Connect SearchAtlas to external CMS platforms (WordPress, Shopify, etc.) via UCMS plugin connectors. Push articles from the editor directly to connected CMS.
Returns CMS connectors (with connection details) that can be used to publish the given page.
| id required | integer Page ID |
[- {
- "id": 0,
- "project": 0,
- "otto_project": 0,
- "otto_project_id": 0,
- "ucmsi_plugin_id": "string",
- "ucmsi_plugin_slug": "string",
- "ucmsi_plugin_version_id": "78dff93b-21d6-4497-a70b-2513c05d86ec",
- "ucmsi_plugin_version": "string",
- "config": { },
- "is_active": true,
- "is_otto_synced": true,
- "validation_status": "valid",
- "last_validated_at": "2019-08-24T14:15:22Z",
- "health_status": "healthy",
- "last_health_check_at": "2019-08-24T14:15:22Z",
- "last_error": "string",
- "deactivated_at": "2019-08-24T14:15:22Z",
- "has_issues": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "connection": {
- "id": 0,
- "remote_page_id": "string",
- "sync_status": "string",
- "last_sync_at": "2019-08-24T14:15:22Z"
}
}
]Returns the JSON schema for the CMS push form for a specific connector. Used by the frontend to dynamically render the publishing form fields.
| uuid required | string <uuid> |
| connector_id required | integer |
{ }Publishes the page content to the connected CMS. The request body is shaped by the
connector's push form schema (retrieved via push-form-schema). Returns the remote
page ID and URL after successful publication.
| pageId required | string <uuid> |
| connector_id required | integer CMS connector ID to publish through |
| property name* additional property | any |
{- "connector_id": 0
}{- "remote_page_id": "string",
- "sync_status": "string"
}Returns dynamic custom fields schema for a connector - typically called after initial push form fields are filled to load conditional fields.
| uuid required | string <uuid> |
| connector_id required | integer |
| property name* additional property | any |
{ }{ }Generate topical authority maps for a seed keyword. Maps produce clustered keyword groups and title suggestions that seed article creation workflows.
Links or updates an article (page) to a title slot within the topical map.
Can set page_uuid, update the title name, or mark the entry for deletion.
| title_uuid required | string <uuid> UUID of the title slot within the topical map |
| page_uuid | string or null <uuid> UUID of the page/article to link to this title slot |
| wp_published_at_url | string or null <uri> URL where the article was published in WordPress |
| title_name | string or null Optional updated title text |
| should_delete | boolean or null Set true to remove this article from the title slot |
{- "title_uuid": "550e8400-e29b-41d4-a716-446655440000",
- "page_uuid": "660e8400-e29b-41d4-a716-446655440001",
- "title_name": "10 Proven SEO Strategies for 2025"
}Persists the user's selection of which title suggestions to use for article creation.
| uuids | Array of strings <uuid> [ items <uuid > ] UUIDs of selected title entries |
{- "uuids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}Creates and starts CGenius generation for multiple articles from selected topical map
title slots. Each entry can have its own settings_context override, or use the
global settings.
| uuid required | string <uuid> Topical map UUID |
object or null (CGeniusSettingsContext) | |
required | Array of objects non-empty |
{- "global_settings_context": {
- "language": "en",
- "length": "optimized",
- "generate_images": true
}, - "entries": [
- {
- "uuid": "550e8400-e29b-41d4-a716-446655440000"
}, - {
- "uuid": "660e8400-e29b-41d4-a716-446655440001",
- "settings_context": {
- "length": "long"
}
}
]
}{- "created_count": 0
}Creates AI content outlines (without full HTML generation) for multiple topical map entries.
| uuid required | string <uuid> Topical map UUID |
object or null (CGeniusSettingsContext) | |
required | Array of objects non-empty |
{- "global_settings_context": {
- "language": "en",
- "length": "short",
- "generate_images": true,
- "content_intent": "string",
- "required_internal_links": [
- "string"
], - "required_external_links": [
- "string"
], - "optional_internal_links": [
- "string"
], - "optional_external_links": [
- "string"
]
}, - "entries": [
- {
- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "settings_context": {
- "language": "en",
- "length": "short",
- "generate_images": true,
- "content_intent": "string",
- "required_internal_links": [
- "string"
], - "required_external_links": [
- "string"
], - "optional_internal_links": [
- "string"
], - "optional_external_links": [
- "string"
]
}
}
]
}Returns all topical authority maps for the authenticated account.
| page | integer Default: 1 |
| page_size | integer Default: 20 |
| project | integer Filter by project ID (use 0 for uncategorized) |
| ordering | string Field to sort by. Example: |
{- "count": 0,
- "results": [
- {
- "id": 0,
- "content_topic": "string",
- "content_page": "string",
- "clusters_count": 0,
- "keywords_count": 0,
- "titles_count": 0,
- "language_code": "string",
- "country_code": "string",
- "otto_project": "cad3e205-7af9-43d3-8cbd-65acb43e0af5",
- "project": 0,
- "folder_name": "string",
- "task_status": "PENDING",
- "formatted_data": { },
- "processing_started_at": "2019-08-24T14:15:22Z",
- "processing_ended_at": "2019-08-24T14:15:22Z",
- "brand_vault_uuid": "ed6573dc-c380-4a19-bc05-007c933224bc",
- "brand_vault_name": "string",
- "created_at": "2019-08-24T14:15:22Z"
}
]
}Generates a topical authority map for the given content topic. The map clusters related keywords and generates article title suggestions. Processing is asynchronous.
clusters_count, keywords_count, and titles_count must each be between 1 and 10.
| content_topic required | string Seed topic for the topical authority map |
| content_page | string or null Optional target page URL |
| clusters_count required | integer [ 1 .. 10 ] Number of topic clusters to generate |
| keywords_count required | integer [ 1 .. 10 ] Number of keywords per cluster |
| titles_count required | integer [ 1 .. 10 ] Number of article title suggestions per cluster |
| language_code required | string or null Language code (e.g. "en", "es") - null defaults to English |
| country_code | string or null ISO country code for localised SERP data (e.g. "us") |
| otto_project | string or null <uuid> OTTO project UUID to associate this map with |
| project | integer or null CA project ID (use 0 for uncategorized) |
| brand_vault_uuid | string or null <uuid> BrandVault UUID for AI style context |
{- "content_topic": "SEO for e-commerce",
- "clusters_count": 5,
- "keywords_count": 5,
- "titles_count": 5,
- "language_code": "en",
- "country_code": "us"
}{- "id": 0,
- "content_topic": "string",
- "content_page": "string",
- "clusters_count": 0,
- "keywords_count": 0,
- "titles_count": 0,
- "language_code": "string",
- "country_code": "string",
- "otto_project": "cad3e205-7af9-43d3-8cbd-65acb43e0af5",
- "project": 0,
- "folder_name": "string",
- "task_status": "PENDING",
- "formatted_data": { },
- "processing_started_at": "2019-08-24T14:15:22Z",
- "processing_ended_at": "2019-08-24T14:15:22Z",
- "brand_vault_uuid": "ed6573dc-c380-4a19-bc05-007c933224bc",
- "brand_vault_name": "string",
- "created_at": "2019-08-24T14:15:22Z"
}Returns the full topical map including formatted_data with clusters, keywords, and title suggestions.
{- "id": 0,
- "content_topic": "string",
- "content_page": "string",
- "clusters_count": 0,
- "keywords_count": 0,
- "titles_count": 0,
- "language_code": "string",
- "country_code": "string",
- "otto_project": "cad3e205-7af9-43d3-8cbd-65acb43e0af5",
- "project": 0,
- "folder_name": "string",
- "task_status": "PENDING",
- "formatted_data": { },
- "processing_started_at": "2019-08-24T14:15:22Z",
- "processing_ended_at": "2019-08-24T14:15:22Z",
- "brand_vault_uuid": "ed6573dc-c380-4a19-bc05-007c933224bc",
- "brand_vault_name": "string",
- "created_at": "2019-08-24T14:15:22Z"
}Update metadata fields (project, redirect_url, etc.) on an existing topical map.
| project | integer or null Project ID (use 0 for uncategorized) |
| redirect_url | string or null <uri> |
{- "project": 0,
}{- "id": 0,
- "content_topic": "string",
- "content_page": "string",
- "clusters_count": 0,
- "keywords_count": 0,
- "titles_count": 0,
- "language_code": "string",
- "country_code": "string",
- "otto_project": "cad3e205-7af9-43d3-8cbd-65acb43e0af5",
- "project": 0,
- "folder_name": "string",
- "task_status": "PENDING",
- "formatted_data": { },
- "processing_started_at": "2019-08-24T14:15:22Z",
- "processing_ended_at": "2019-08-24T14:15:22Z",
- "brand_vault_uuid": "ed6573dc-c380-4a19-bc05-007c933224bc",
- "brand_vault_name": "string",
- "created_at": "2019-08-24T14:15:22Z"
}Uploads an image file to GCP Cloud Storage and returns the public URL. Supported formats: JPEG, PNG, WEBP, GIF. Maximum file size: 5 MiB. Images can be reformatted on upload (WEBP default) and optionally constrained to an aspect ratio.
| image required | string <binary> Image file (max 5 MiB) |
| format | string Default: "WEBP" Enum: "WEBP" "JPEG" "PNG" "GIF" Output format for the stored image |
| mode | string Default: "PERSISTENT" Enum: "PERSISTENT" "TEMPORARY" PERSISTENT = stored in |
| aspect_ratio | number or null <decimal> [ 0.1 .. 5 ] Optional aspect ratio constraint (width/height) |
| validation | string or null Enum: "GBP" null Apply extra validation rules (e.g. GBP min 256px dimensions) |
{
}CMS connector management for publishing content to external platforms including WordPress, Shopify, HubSpot, Joomla, and more. Discover supported plugins, retrieve connector schemas, and manage connections.
Base URL: https://ucmsi.searchatlas.com
Returns all CMS plugins that are active and supported for content publishing. Each plugin entry includes auth types, publish modes, capabilities, and logo URL.
[- {
- "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
- "slug": "hubspot",
- "display_name": "HubSpot",
- "publish_modes": [
- "draft",
- "publish"
], - "capabilities": {
- "create": true,
- "update": true
}, - "default_auth_type": "bearer_token",
- "is_otto_supported": true,
- "default_version": {
- "id": "3fa85f64-5717-4562-b3fc-2c963f66afb7",
- "version": "1.0",
- "is_active": true,
- "is_default": true
}
}
]{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "plugin": "hubspot",
- "plugin_version": "1.0",
- "config": { },
- "otto_uuid": "string",
- "created": "2019-08-24T14:15:22Z",
- "modified": "2019-08-24T14:15:22Z"
}Partially update a saved CMS connector (credentials, config, or name).
Bearer Token (HubSpot, Joomla) (object) or Basic Auth (Drupal, Magento) (object) or API Token (Webflow) (object) or OAuth2 (Webflow) (object) or API Key (Wix) (object) or Token (Contentful) (object) or Private Token (GoHighLevel) (object) (Credentials) | |
object | |
| name | string |
{- "credentials": {
- "type": "bearer_token",
- "access_token": "string"
}, - "config": { },
- "name": "string"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "plugin": "hubspot",
- "plugin_version": "1.0",
- "config": { },
- "otto_uuid": "string",
- "created": "2019-08-24T14:15:22Z",
- "modified": "2019-08-24T14:15:22Z"
}Returns the full schema for a specific CMS plugin, including auth schemes,
credential schema, publish modes, config schema, and capabilities.
Pass ?plugin={pluginSlug} to specify the plugin (e.g. hubspot, drupal, webflow).
| plugin required | string Example: plugin=hubspot Plugin slug (e.g. |
{- "plugin": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "slug": "string",
- "display_name": "string",
- "logo_url": "string",
- "default_auth_type": "string"
}, - "version": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "version": "string",
- "is_active": true,
- "installation_markdown": "string",
- "installation_html": "string",
- "installation_json": { }
}, - "auth_schemes": [
- {
- "type": "bearer_token",
- "name": "string",
- "credential_schema": { },
- "docs_url": "string",
- "notes": "string"
}
], - "credential_schema": { },
- "publish_modes": [
- "string"
], - "config_schema": { },
- "capabilities": { }
}Access Google Search Console data including site properties, keyword and page performance metrics, search analytics, site events, page groups, and integrations with Google Analytics, Google Ads, and Facebook Ads.
Base URL: https://gsc.searchatlas.com
Returns paginated GSC site properties with performance metrics for two comparison periods. Supports filtering by active state, country code, search query, and ordering.
| period1_start required | string <date> Start date of the reference period (YYYY-MM-DD) |
| period1_end required | string <date> |
| period2_start required | string <date> |
| period2_end required | string <date> |
| page_size | integer Default: 10 |
| page_number | integer Default: 1 |
| country_code | string <= 2 characters |
| active | boolean or null |
| search | string |
| order_by | string Ordering field. Options: |
| aggregation | string Default: "daily" Enum: "daily" "weekly" |
{- "count": 0,
- "active_sites_count": 0,
- "inactive_sites_count": 0,
- "results": [
- {
- "id": 0,
- "url": "string",
- "country_code": "string",
- "sa_total_kw_count": 0,
- "total_pages": 0,
- "traffic_value": 0,
- "is_credentials_valid": true,
- "has_site_ga_credential": true,
- "active_for_current_customer": true
}
]
}Returns the current data load status for a site property's search analytics pipeline.
| selected_property required | string GSC site property URL (e.g. |
| country_code | string Default: "" |
{- "selected_property": "string",
- "status": "PENDING",
- "last_updated": "2019-08-24T14:15:22Z",
- "data_available_from": "2019-08-24"
}Returns aggregated clicks, impressions, CTR, and average position for a site property over two comparison periods. Supports keyword and page filtering.
{- "selected_property": "string",
- "period1": {
- "clicks": 0,
- "impressions": 0,
- "ctr": 0,
- "avg_position": 0,
- "clicks_change": 0,
- "impressions_change": 0,
- "ctr_change": 0,
- "position_change": 0
}, - "period2": {
- "clicks": 0,
- "impressions": 0,
- "ctr": 0,
- "avg_position": 0,
- "clicks_change": 0,
- "impressions_change": 0,
- "ctr_change": 0,
- "position_change": 0
}, - "chart_data": [
- {
- "date": "2019-08-24",
- "clicks": 0,
- "impressions": 0,
- "ctr": 0,
- "position": 0
}
]
}Returns top-level performance metrics for a site property with comparison against previous period.
| selected_property required | string |
| country_code | string Default: "" |
| limit | integer Default: 10 |
{- "selected_property": "string",
- "total_clicks": 0,
- "total_impressions": 0,
- "avg_ctr": 0,
- "avg_position": 0
}Returns paginated keyword-level GSC performance data (clicks, impressions, CTR, position) for two comparison periods. Supports keyword/page include/exclude filters.
| page | integer Default: 1 |
| page_size | integer Default: 25 |
| ordering | string Field to order by. Options: |
{- "count": 0,
- "results": [
- {
- "keyword": "string",
- "clicks": 0,
- "impressions": 0,
- "ctr": 0,
- "position": 0,
- "clicks_change": 0,
- "impressions_change": 0,
- "position_change": 0
}
]
}Replaces the branded keywords list for a site property. These keywords are used to segment branded vs non-branded traffic in reports.
| selected_property required | string GSC site property URL |
| country_code | string Default: "" |
| keywords required | Array of strings List of branded keyword strings |
{- "country_code": "",
- "keywords": [
- "example",
- "example brand"
]
}Returns keyword position distribution (positions 1, 2-5, 6-10, 11-20, etc.) for a site property.
| selected_property required | string |
| country_code | string Default: "" |
| period1_start required | string <date> |
| period1_end required | string <date> |
| period2_start required | string <date> |
| period2_end required | string <date> |
{- "period1": {
- "pos_1": 0,
- "pos_2_5": 0,
- "pos_6_10": 0,
- "pos_11_20": 0,
- "pos_21_50": 0,
- "pos_51_100": 0
}, - "period2": {
- "pos_1": 0,
- "pos_2_5": 0,
- "pos_6_10": 0,
- "pos_11_20": 0,
- "pos_21_50": 0,
- "pos_51_100": 0
}
}Returns click, impression, CTR, and position history for a specific keyword over time.
| selected_property required | string |
| country_code | string Default: "" |
| keyword required | string |
| period1_start required | string <date> |
| period1_end required | string <date> |
| period2_start required | string <date> |
| period2_end required | string <date> |
{- "chart_data": [
- {
- "date": "2019-08-24",
- "clicks": 0,
- "impressions": 0,
- "ctr": 0,
- "position": 0
}
]
}Returns keywords that gained or lost positions over a comparison period, with change magnitude.
| page | integer Default: 1 |
| page_size | integer Default: 25 |
| ordering | string |
{- "count": 0,
- "results": [
- null
]
}Returns paginated page-level GSC performance data (clicks, impressions, CTR, position) for two comparison periods with include/exclude page filtering.
| page | integer Default: 1 |
| page_size | integer Default: 25 |
| ordering | string |
{- "count": 0,
- "results": [
- {
- "page": "string",
- "clicks": 0,
- "impressions": 0,
- "ctr": 0,
- "position": 0,
- "clicks_change": 0,
- "impressions_change": 0,
- "position_change": 0
}
]
}Returns click, impression, CTR, and position history for a specific page URL over time.
| selected_property required | string |
| country_code | string Default: "" |
| page required | string Page URL to retrieve historical data for |
| period1_start required | string <date> |
| period1_end required | string <date> |
| period2_start required | string <date> |
| period2_end required | string <date> |
{- "chart_data": [
- {
- "date": "2019-08-24",
- "clicks": 0,
- "impressions": 0,
- "ctr": 0,
- "position": 0
}
]
}Returns an aggregate summary of historical performance metrics for a page with v3 date handling.
| selected_property required | string |
| country_code | string Default: "" |
| period1_start | string <date> |
| period1_end | string <date> |
| period2_start required | string <date> |
| period2_end required | string <date> |
{- "chart_data": [
- {
- "date": "2019-08-24",
- "clicks": 0,
- "impressions": 0,
- "ctr": 0,
- "position": 0
}
]
}Returns the top keywords driving traffic to a specific page, with historical position data.
| selected_property required | string |
| country_code | string Default: "" |
| period1_start | string <date> |
| period1_end | string <date> |
| period2_start required | string <date> |
| period2_end required | string <date> |
| page | integer Default: 1 |
| page_size | integer Default: 25 |
{- "count": 0,
- "results": [
- {
- "keyword": "string",
- "clicks": 0,
- "impressions": 0,
- "ctr": 0,
- "position": 0,
- "clicks_change": 0,
- "impressions_change": 0,
- "position_change": 0
}
]
}Returns all page groups configured for the authenticated user's site properties.
| selected_property | string |
[- {
- "id": 0,
- "name": "string",
- "color": "string",
- "icon": "string",
- "pages_count": 0
}
]Creates a new page group for a site property. Page groups allow you to aggregate performance metrics across a set of related pages.
| site_property required | string GSC site property URL this group belongs to |
| name required | string |
| color required | string Hex color code (e.g. |
| icon | string or null |
| pages required | Array of strings List of page URL paths to include in this group |
{- "name": "Blog Posts",
- "color": "#3B82F6",
- "icon": "document",
- "pages": [
- "/blog/",
- "/blog/post-1/"
]
}{- "id": 0,
- "name": "string",
- "color": "string",
- "icon": "string",
- "pages_count": 0
}Updates the name, color, icon, or pages list for a page group.
| name | string |
| color | string |
| icon | string or null |
| pages | Array of strings |
{- "name": "string",
- "color": "string",
- "icon": "string",
- "pages": [
- "string"
]
}{- "id": 0,
- "name": "string",
- "color": "string",
- "icon": "string",
- "pages_count": 0
}Returns all events logged for a specific site property.
| selected_property required | string |
| country_code | string Default: "" |
[- {
- "id": 0,
- "name": "string",
- "event_date": "2019-08-24",
- "event_type": "string",
- "site_property": "string",
- "country_code": "string",
- "created_at": "2019-08-24T14:15:22Z"
}
]Logs a new event (e.g., algorithm update, content change, technical fix) for a site property.
| site_property required | string GSC site property URL |
| country_code | string Default: "" |
| name required | string Descriptive event name |
| event_date required | string <date> |
| event_type required | string Event category: |
{- "country_code": "",
- "name": "Published homepage redesign",
- "event_date": "2024-03-15",
- "event_type": "content"
}{- "id": 0,
- "name": "string",
- "event_date": "2019-08-24",
- "event_type": "string",
- "site_property": "string",
- "country_code": "string",
- "created_at": "2019-08-24T14:15:22Z"
}Returns the details of a specific site property event.
{- "id": 0,
- "name": "string",
- "event_date": "2019-08-24",
- "event_type": "string",
- "site_property": "string",
- "country_code": "string",
- "created_at": "2019-08-24T14:15:22Z"
}Updates the name, date, or type of a site property event.
| site_property required | string GSC site property URL |
| country_code | string Default: "" |
| name required | string Descriptive event name |
| event_date required | string <date> |
| event_type required | string Event category: |
{- "site_property": "string",
- "country_code": "",
- "name": "string",
- "event_date": "2019-08-24",
- "event_type": "string"
}{- "id": 0,
- "name": "string",
- "event_date": "2019-08-24",
- "event_type": "string",
- "site_property": "string",
- "country_code": "string",
- "created_at": "2019-08-24T14:15:22Z"
}Returns Google Analytics 4 properties available for report builder integration.
| country_code | string <= 2 characters |
| query | string |
[- {
- "id": "string",
- "display_name": "string",
- "property_type": "string",
- "account": "string"
}
]Keyword research and analysis tools. Discover content ideas with AI-powered clustering, manage keyword lists, run keyword gap analyses against competitors, track keyword rankings over time, and analyze search query visibility with QUEST.
Base URL: https://keyword.searchatlas.com
AI-powered content idea clusters from a seed keyword and target domain
Triggers AI-powered content clustering for a seed keyword.
Returns an existing plan if one already exists for the same keyword/domain/country combination.
Processing is asynchronous - poll the detail endpoint for processing_status: SUCCESS.
| keyword required | string Seed keyword to generate content ideas for |
| domain | string or null Target domain to focus content ideas on (e.g., |
| country_code | string or null <= 2 characters ISO 2-letter country code for localized search data |
| customer_id | integer or null |
| brand_vault_id | string or null <uuid> Optional Brand Vault ID to scope content to a brand's voice |
{- "keyword": "best running shoes",
- "domain": "example.com",
- "country_code": "us"
}{- "id": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "customer_id": 0,
- "brand_vault_id": "ac6f29a7-3744-46f7-83b9-4cc2cddbafe1",
- "keyword": "string",
- "domain": "string",
- "country_code": "string",
- "cluster_count": 0,
- "public_share_hash": "string",
- "processing_completed_at": "2019-08-24T14:15:22Z",
- "processing_started_at": "2019-08-24T14:15:22Z",
- "is_archived": true,
- "searched_on": "2019-08-24T14:15:22Z",
- "processing_status": "PENDING"
}Returns full content idea plan with cluster data and processing status.
Poll until processing_status is SUCCESS.
{- "id": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "customer_id": 0,
- "brand_vault_id": "ac6f29a7-3744-46f7-83b9-4cc2cddbafe1",
- "keyword": "string",
- "domain": "string",
- "country_code": "string",
- "cluster_count": 0,
- "public_share_hash": "string",
- "processing_completed_at": "2019-08-24T14:15:22Z",
- "processing_started_at": "2019-08-24T14:15:22Z",
- "is_archived": true,
- "searched_on": "2019-08-24T14:15:22Z",
- "processing_status": "PENDING",
- "clusters": [
- {
- "id": 0,
- "cluster_title": "string",
- "intent": "string",
- "keywords": [
- {
- "keyword": "string",
- "search_volume": 0,
- "keyword_difficulty": 0,
- "cpc": 0
}
]
}
]
}Returns comprehensive keyword detail data including search volume, difficulty, CPC, SERP overview, related keywords, search intent, and historical volume trends.
| keyword required | string The keyword to look up |
| country_code | string <= 2 characters Default: "" ISO 2-letter country code (e.g., |
| site_property | string or null Optional GSC site property URL to cross-reference rankings |
| location_id | integer or null Specific geo-location ID for local SERP data |
| serp_freshness_days | integer or null Max age in days for cached SERP data |
| serp_count | integer or null Number of SERP results to include |
{- "id": 0,
- "keyword": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "public_share_hash": "string",
- "difficulty": 0,
- "search_volume": 0,
- "global_volume": 0,
- "cpc": 0,
- "search_volume_data": [
- {
- "month": "2019-08-24",
- "volume": 0
}
], - "related_keywords": [
- {
- "keyword": "string",
- "search_volume": 0,
- "keyword_difficulty": 0,
- "cpc": 0,
- "hist_sv": [
- 0
]
}
], - "autocomplete": [
- "string"
], - "questions": [
- "string"
], - "serp_overview": [
], - "task_status": "PENDING",
- "top_countries_search_volume": [
- {
- "country_code": "string",
- "volume": 0
}
]
}Returns domain authority, organic traffic, referring domains, and other metrics for a list of URLs or domains in a single request.
| urls required | Array of strings List of domain names or URLs to retrieve metrics for |
| include_location | boolean Default: false |
{- "urls": [
- "example.com",
- "competitor.com"
], - "include_location": false
}[- {
- "url": "string",
- "domain_authority": 0,
- "page_authority": 0,
- "organic_traffic": 0,
- "referring_domains": 0,
- "organic_keywords": 0,
- "traffic_value": 0
}
]Find keyword opportunities your competitors rank for but you don't
Returns all keyword gap analyses created by the authenticated user.
[- {
- "id": 0,
- "customer_id": 0,
- "primary_website": {
- "url": "string",
- "scope": "root_domain"
}, - "competitor_websites": [
- {
- "url": "string",
- "scope": "root_domain"
}
], - "country_code": "string",
- "created_at": "2019-08-24T14:15:22Z"
}
]Identifies keywords that competitor websites rank for but the primary website does not.
Accepts 1-4 competitor websites with a country code for location-specific data.
Results are fetched asynchronously - returns 202 with should_repoll: true on cache miss.
required | object (WebsiteWithScope) |
required | Array of objects (WebsiteWithScope) [ 1 .. 4 ] items Between 1 and 4 competitor websites |
| country_code | string Default: "" ISO 2-letter country code for market-specific gap analysis |
{- "primary_website": {
- "url": "example.com",
- "scope": "root_domain"
}, - "competitor_websites": [
- {
- "url": "competitor1.com",
- "scope": "root_domain"
}, - {
- "url": "competitor2.com",
- "scope": "root_domain"
}
], - "country_code": "us"
}{- "id": 0,
- "customer_id": 0,
- "primary_website": {
- "url": "string",
- "scope": "root_domain"
}, - "competitor_websites": [
- {
- "url": "string",
- "scope": "root_domain"
}
], - "country_code": "string",
- "created_at": "2019-08-24T14:15:22Z"
}Returns the keyword gap data for a specific analysis. Results may be paginated.
Returns 202 with should_repoll: true if data is still processing.
| page | integer Default: 1 |
| page_size | integer Default: 50 |
| ordering | string Order by field (e.g., |
{- "results": {
- "columns": [
- "string"
], - "values": [
- [
- null
]
]
}, - "chart_data": [
- { }
], - "total_count": 0,
- "should_repoll": true
}Returns all rank tracking projects (local SEO heatmap grids) for the authenticated customer. Each project tracks keyword positions across a geographic grid.
| search | string |
| update_frequency_days | string Enum: "DAILY" "EVERY_3_DAYS" "WEEKLY" "MONTHLY" Filter by refresh interval. Options: |
| page | integer Default: 1 |
| page_size | integer Default: 20 |
{- "count": 0,
- "results": [
- {
- "id": 0,
- "keyword": "string",
- "google_place_id": "string",
- "business_name": "string",
- "grid_size": 0,
- "spacing": 0,
- "update_frequency_days": 0,
- "grids_avg_position": 0,
- "last_refreshed_at": "2019-08-24T14:15:22Z"
}
]
}LLM Citation Visibility Analysis - generates query-related questions, collects LLM answers with cited sources, validates sources, and tracks domain citation frequency
Returns all QUEST (LLM Citation Visibility Analysis) results for the authenticated user.
[- {
- "id": 0,
- "query": "string",
- "task_status": "PENDING",
- "task_status_updated_at": "2019-08-24T14:15:22Z",
- "task_error_message": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "dpr_campaign": {
- "id": 0,
- "name": "string"
}
}
]Initiates a QUEST analysis for a search query. QUEST analyzes SERP results to understand content format, user intent, and ranking factors for the query. Processing is asynchronous - poll the detail endpoint.
| query required | string Search query to analyze with QUEST |
{- "query": "best coffee shops in brooklyn"
}{- "id": 0,
- "query": "string",
- "task_status": "PENDING",
- "task_status_updated_at": "2019-08-24T14:15:22Z",
- "task_error_message": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "dpr_campaign": {
- "id": 0,
- "name": "string"
}
}Returns full QUEST analysis data including SERP results, intent classification,
content recommendations, and linked outreach campaign if any.
Poll until task_status is SUCCESS.
{- "id": 0,
- "query": "string",
- "task_status": "PENDING",
- "task_status_updated_at": "2019-08-24T14:15:22Z",
- "task_error_message": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "dpr_campaign": {
- "id": 0,
- "name": "string"
}, - "results": {
- "serp_results": [
- {
- "position": 0,
- "title": "string",
- "word_count": 0,
- "content_type": "string"
}
], - "intent": "string",
- "recommended_format": "string"
}
}Competitor and domain research platform. Analyze any website's organic traffic, ranking keywords, backlink profile, topical authority, and Facebook ads data. Compare competitors and track brand signals.
Base URL: https://keyword.searchatlas.com
Full competitor research - create, retrieve, recrawl, and manage site explorer projects
Returns all competitor research projects for the authenticated user, with status and metadata.
| page | integer Default: 1 |
| page_size | integer Default: 20 |
| search | string |
| ordering | string Order by field. Use |
{- "count": 0,
- "results": [
- {
- "id": 0,
- "url": "string",
- "country_code": "string",
- "is_saved": true,
- "created_at": "2019-08-24T14:15:22Z",
- "processing_status": "PENDING",
- "organic_traffic": 0,
- "organic_keywords": 0,
- "domain_authority": 0,
- "referring_domains": 0,
- "traffic_value": 0
}
]
}Initiates a full competitor site analysis for the given URL. Fetches organic traffic, keywords, domain authority, backlinks, and SERP data asynchronously. Returns an existing project if the URL was recently analyzed.
| url required | string Competitor domain or URL to analyze |
| country_code | string <= 2 characters Default: "" ISO 2-letter country code for localized metrics |
{- "url": "competitor.com",
- "country_code": "us"
}{- "id": 0,
- "url": "string",
- "country_code": "string",
- "is_saved": true,
- "created_at": "2019-08-24T14:15:22Z",
- "processing_status": "PENDING",
- "organic_traffic": 0,
- "organic_keywords": 0,
- "domain_authority": 0,
- "referring_domains": 0,
- "traffic_value": 0
}Creates multiple competitor research projects in a single request.
required | Array of objects |
{- "urls": [
- {
- "url": "competitor1.com",
- "country_code": "us"
}, - {
- "url": "competitor2.com",
- "country_code": "us"
}
]
}[- {
- "id": 0,
- "url": "string",
- "country_code": "string",
- "is_saved": true,
- "created_at": "2019-08-24T14:15:22Z",
- "processing_status": "PENDING",
- "organic_traffic": 0,
- "organic_keywords": 0,
- "domain_authority": 0,
- "referring_domains": 0,
- "traffic_value": 0
}
]Returns full competitor analysis data including organic traffic, keyword counts, domain authority, backlinks, top pages, and processing status.
{- "id": 0,
- "url": "string",
- "country_code": "string",
- "is_saved": true,
- "created_at": "2019-08-24T14:15:22Z",
- "processing_status": "PENDING",
- "organic_traffic": 0,
- "organic_keywords": 0,
- "domain_authority": 0,
- "referring_domains": 0,
- "traffic_value": 0,
- "title": "string",
- "meta_desc": "string",
- "top_pages": [
- {
- "url": "string",
- "organic_traffic": 0,
- "top_keyword": "string"
}
], - "keyword_distribution": {
- "pos_1": 0,
- "pos_2_5": 0,
- "pos_6_10": 0,
- "pos_11_20": 0,
- "pos_21_50": 0,
- "pos_51_100": 0
}, - "backlinks_count": 0,
- "domain_rating": 0
}Triggers a fresh data pull for an existing competitor research project. Refreshes keyword rankings, traffic estimates, and backlink data. Consumes quota.
{- "id": 0,
- "url": "string",
- "country_code": "string",
- "is_saved": true,
- "created_at": "2019-08-24T14:15:22Z",
- "processing_status": "PENDING",
- "organic_traffic": 0,
- "organic_keywords": 0,
- "domain_authority": 0,
- "referring_domains": 0,
- "traffic_value": 0
}Returns extended data for a competitor research project including detailed keyword distributions, traffic trends, and domain-level SEO signals.
{- "traffic_trend": [
- {
- "date": "2019-08-24",
- "traffic": 0
}
], - "keyword_trend": [
- {
- "date": "2019-08-24",
- "keywords": 0
}
], - "position_distribution_history": [
- { }
], - "anchor_text_distribution": [
- {
- "anchor_text": "string",
- "count": 0,
- "percentage": 0
}
]
}Returns the topical authority breakdown for a competitor, showing which content
topics they rank for and their coverage depth. Must be requested first via
process-topical-authority-report before data is available.
{- "status": "PENDING",
- "topics": [
- {
- "topic": "string",
- "keyword_count": 0,
- "coverage_score": 0
}
]
}Calculates the competitive pressure score for a single keyword - a measure of how difficult it is to displace existing top-10 results based on domain authority, content quality, and backlink profiles.
| keyword required | string <= 300 characters Keyword to calculate competitor pressure for |
| country_code | string <= 3 characters Default: "us" |
| location_id | integer or null Optional geo-location ID for local SERP pressure |
{- "keyword": "best running shoes",
- "country_code": "us"
}{- "keyword": "string",
- "country_code": "string",
- "pressure_score": 0,
- "top_results": [
- {
- "position": 0,
- "domain": "string",
- "domain_authority": 0,
- "backlinks": 0
}
]
}Calculates competitive pressure scores for up to 100 keywords in a single request.
Results are processed asynchronously - use bulk-status to poll for completion.
| keywords required | Array of strings <= 100 items [ items <= 300 characters ] Up to 100 keywords to analyze |
| country_code | string <= 3 characters Default: "us" |
| location_id | integer or null |
{- "keywords": [
- "best running shoes",
- "trail running shoes",
- "running shoe reviews"
], - "country_code": "us"
}{- "task_id": "string",
- "message": "string"
}Returns the processing status and result for a single keyword's competitor pressure calculation.
| keyword required | string |
| country_code | string <= 3 characters Default: "us" |
| location_id | integer or null |
{- "keyword": "string",
- "status": "PENDING",
- "result": {
- "keyword": "string",
- "country_code": "string",
- "pressure_score": 0,
- "top_results": [
- {
- "position": 0,
- "domain": "string",
- "domain_authority": 0,
- "backlinks": 0
}
]
}
}Returns processing status and results for up to 100 keywords in a single request.
| keywords required | Array of strings <= 100 items |
| country_code | string <= 3 characters Default: "us" |
| location_id | integer or null |
{- "keywords": [
- "best running shoes",
- "trail running shoes"
], - "country_code": "us"
}{- "property1": {
- "keyword": "string",
- "status": "PENDING",
- "result": {
- "keyword": "string",
- "country_code": "string",
- "pressure_score": 0,
- "top_results": [
- {
- "position": 0,
- "domain": "string",
- "domain_authority": 0,
- "backlinks": 0
}
]
}
}, - "property2": {
- "keyword": "string",
- "status": "PENDING",
- "result": {
- "keyword": "string",
- "country_code": "string",
- "pressure_score": 0,
- "top_results": [
- {
- "position": 0,
- "domain": "string",
- "domain_authority": 0,
- "backlinks": 0
}
]
}
}
}Discover organic competitors, track them, and analyze shared keyword overlap
Returns trend lines showing competitor visibility, shared keywords, and traffic over time. Used to track how competitors are gaining or losing search share.
| site_property required | string GSC site property URL or domain |
| country_code | string Default: "" |
| criteria | string Default: "shared_keywords" Enum: "shared_keywords" "organic_visibility" "selected_range" |
| period1_start | string <date> |
| period1_end | string <date> |
| period2_start | string <date> |
| period2_end | string <date> |
{- "competitors": [
- {
- "domain": "string",
- "trend_data": [
- {
- "date": "2019-08-24",
- "value": 0
}
]
}
]
}Returns a ranked list of organic competitors for a site property, showing shared keywords, organic visibility overlap, and traffic index for each competitor.
| site_property required | string |
| country_code | string Default: "" |
| period1_start required | string <date> |
| period1_end required | string <date> |
| period2_start required | string <date> |
| period2_end required | string <date> |
| page | integer Default: 1 |
| page_size | integer Default: 25 |
| order_by | string |
{- "count": 0,
- "results": [
- {
- "competitor_domain": "string",
- "current_competitor_position": 0,
- "current_competitor_organic_visibility": 0,
- "current_competitor_traffic_index": 0,
- "current_keywords_1_count": 0,
- "current_keywords_1_10_count": 0,
- "current_keywords_1_50_count": 0,
- "current_competitor_top_link": "string",
- "last_crawled": "2019-08-24T14:15:22Z"
}
]
}Returns keyword usage statistics showing which keywords are shared between the site property and its top organic competitors.
| site_property required | string |
| country_code | string Default: "" |
| period1_start required | string <date> |
| period1_end required | string <date> |
| period2_start required | string <date> |
| period2_end required | string <date> |
{- "total_keywords": 0,
- "shared_keywords": 0,
- "unique_to_site": 0,
- "unique_to_competitors": 0
}Returns the top organic keywords driving traffic to a specific competitor domain.
| site_property required | string |
| competitor required | string Competitor domain to look up keywords for |
| country_code | string Default: "" |
| period1_start required | string <date> |
| period1_end required | string <date> |
| period2_start required | string <date> |
| period2_end required | string <date> |
| page | integer Default: 1 |
| page_size | integer Default: 25 |
{- "count": 0,
- "results": [
- {
- "keyword": "string",
- "search_volume": 0,
- "keyword_difficulty": 0,
- "cpc": 0,
- "position": 0
}
]
}Returns a historical view of a competitor's position changes, organic visibility, and traffic trends for comparison period analysis.
| site_property required | string |
| competitor required | string |
| country_code | string Default: "" |
| period1_start required | string <date> |
| period1_end required | string <date> |
| period2_start required | string <date> |
| period2_end required | string <date> |
| order_by | string Field to order by. Options: |
{- "count": 0,
- "results": [
- {
- "date": "2019-08-24",
- "competitor_position": 0,
- "competitor_organic_visibility": 0,
- "competitor_traffic_index": 0,
- "keywords_1_count": 0,
- "keywords_1_10_count": 0,
- "keywords_1_50_count": 0
}
]
}Returns all competitors the user has explicitly added to their tracking list for a site property.
| site_property required | string |
| country_code | string Default: "" |
[- {
- "id": 0,
- "competitor_domain": "string",
- "site_property": "string",
- "country_code": "string",
- "added_at": "2019-08-24T14:15:22Z"
}
]Adds a competitor domain to the tracking list for a specific site property.
| site_property required | string GSC site property URL |
| country_code | string Default: "" |
| competitor_domain required | string Competitor domain to track (e.g., |
{- "country_code": "",
- "competitor_domain": "competitor.com"
}Removes a competitor domain from the tracking list for a site property.
| site_property required | string GSC site property URL |
| country_code | string Default: "" |
| competitor_domain required | string Competitor domain to track (e.g., |
{- "country_code": "",
- "competitor_domain": "competitor.com"
}Analyze and submit brand signal scores for LLM visibility and citation tracking
Returns the brand signal score for a domain - measuring how well the brand appears in AI-generated responses (LLM citations), news, and social signals. Returns the most recent cached score.
| domain required | string Domain to retrieve brand signal score for |
{- "domain": "string",
- "overall_score": 0,
- "llm_citation_score": 0,
- "news_score": 0,
- "social_score": 0,
- "backlink_authority_score": 0,
- "llm_citation_trend": [
- {
- "date": "2019-08-24",
- "citation_count": 0
}
], - "last_updated": "2019-08-24T14:15:22Z"
}Triggers a fresh brand signal analysis for a domain. Checks LLM citation presence,
news mentions, social signals, and authoritative backlink signals.
Processing is asynchronous - re-fetch with retrieve after completion.
| domain required | string Domain to analyze (e.g., |
{- "domain": "example.com"
}Backlink research, monitoring, and competitive analysis. Create backlink comparison projects, research referring domains for any URL, run backlink profile comparisons across competitors, and identify link gap opportunities.
Base URL: https://backlink.searchatlas.com
Backlink comparison projects - create, list, update, delete projects with primary and competitor websites
Returns all active backlink comparison projects for the authenticated user's account.
[- {
- "id": 0,
- "name": "string",
- "description": "string",
- "is_active": true,
- "timezone": "America/New_York",
- "platforms_config": {
- "facebook": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "page_id": "string",
- "category": "string"
}, - "instagram": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "instagram_id": "string",
- "instagram_user_id": "string",
- "followers_count": 0,
- "follows_count": 0
}, - "twitter": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "twitter_id": "string",
- "description": "string",
- "profile_image_url": "string",
- "followers_count": 0,
- "following_count": 0,
- "tweet_count": 0,
- "verified": true
}, - "linkedin": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "author_urn": "string",
- "company_id": "string",
- "company_name": "string",
- "industry": "string",
- "followers_count": 0
}
}, - "default_approval_type": "AUTO_PUBLISH",
- "default_image_source_type": "string",
- "ai_settings": {
- "tone": "professional",
- "language": "en",
- "include_hashtags": true,
- "max_hashtags": 5,
- "include_emojis": true,
- "target_audience": "string",
- "brand_voice_guidelines": "string",
- "image_prompt": "string"
}, - "image_prompt": "string",
- "enabled_platforms": [
- "facebook",
- "instagram"
], - "posts_count": 0,
- "schedule": {
- "id": 0,
- "name": "string",
- "is_active": true,
- "frequency_config": {
- "frequency_type": "daily",
- "days_of_week": [
- 6
], - "days_of_month": [
- 1
], - "preferred_times": [
- "string"
]
}, - "next_run_at": "2019-08-24T14:15:22Z",
- "last_run_at": "2019-08-24T14:15:22Z"
}, - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
]Creates a new backlink comparison project with a primary website and optional competitor websites. Triggers asynchronous backlink data retrieval for all websites. Returns an error if a project with the same primary website already exists for this account.
| name required | string <= 200 characters |
| description | string |
| is_active | boolean Default: true |
| timezone | string IANA timezone string (e.g. America/New_York) |
object (PlatformsConfig) | |
| default_approval_type | string Enum: "AUTO_PUBLISH" "APPROVE_IF_IMAGE" "AI_IMAGES_ONLY" "APPROVE_FOR_PUBLISH" |
| default_image_source_type | string or null |
object (AISettings) | |
| image_prompt | string <= 1000 characters Convenience alias - merged into ai_settings.image_prompt on save |
{- "primary_website": "example.com",
- "competitor_websites": [
- "competitor1.com",
- "competitor2.com"
]
}{- "id": 0,
- "name": "string",
- "description": "string",
- "is_active": true,
- "timezone": "America/New_York",
- "platforms_config": {
- "facebook": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "page_id": "string",
- "category": "string"
}, - "instagram": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "instagram_id": "string",
- "instagram_user_id": "string",
- "followers_count": 0,
- "follows_count": 0
}, - "twitter": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "twitter_id": "string",
- "description": "string",
- "profile_image_url": "string",
- "followers_count": 0,
- "following_count": 0,
- "tweet_count": 0,
- "verified": true
}, - "linkedin": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "author_urn": "string",
- "company_id": "string",
- "company_name": "string",
- "industry": "string",
- "followers_count": 0
}
}, - "default_approval_type": "AUTO_PUBLISH",
- "default_image_source_type": "string",
- "ai_settings": {
- "tone": "professional",
- "language": "en",
- "include_hashtags": true,
- "max_hashtags": 5,
- "include_emojis": true,
- "target_audience": "string",
- "brand_voice_guidelines": "string",
- "image_prompt": "string"
}, - "image_prompt": "string",
- "enabled_platforms": [
- "facebook",
- "instagram"
], - "posts_count": 0,
- "schedule": {
- "id": 0,
- "name": "string",
- "is_active": true,
- "frequency_config": {
- "frequency_type": "daily",
- "days_of_week": [
- 6
], - "days_of_month": [
- 1
], - "preferred_times": [
- "string"
]
}, - "next_run_at": "2019-08-24T14:15:22Z",
- "last_run_at": "2019-08-24T14:15:22Z"
}, - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Returns the primary website and competitor websites with their backlink metrics.
{- "id": 0,
- "name": "string",
- "description": "string",
- "is_active": true,
- "timezone": "America/New_York",
- "platforms_config": {
- "facebook": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "page_id": "string",
- "category": "string"
}, - "instagram": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "instagram_id": "string",
- "instagram_user_id": "string",
- "followers_count": 0,
- "follows_count": 0
}, - "twitter": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "twitter_id": "string",
- "description": "string",
- "profile_image_url": "string",
- "followers_count": 0,
- "following_count": 0,
- "tweet_count": 0,
- "verified": true
}, - "linkedin": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "author_urn": "string",
- "company_id": "string",
- "company_name": "string",
- "industry": "string",
- "followers_count": 0
}
}, - "default_approval_type": "AUTO_PUBLISH",
- "default_image_source_type": "string",
- "ai_settings": {
- "tone": "professional",
- "language": "en",
- "include_hashtags": true,
- "max_hashtags": 5,
- "include_emojis": true,
- "target_audience": "string",
- "brand_voice_guidelines": "string",
- "image_prompt": "string"
}, - "image_prompt": "string",
- "enabled_platforms": [
- "facebook",
- "instagram"
], - "posts_count": 0,
- "schedule": {
- "id": 0,
- "name": "string",
- "is_active": true,
- "frequency_config": {
- "frequency_type": "daily",
- "days_of_week": [
- 6
], - "days_of_month": [
- 1
], - "preferred_times": [
- "string"
]
}, - "next_run_at": "2019-08-24T14:15:22Z",
- "last_run_at": "2019-08-24T14:15:22Z"
}, - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Returns paginated referring domains pointing to the project's primary website. Supports search, filtering by field ranges, and ordering.
| page | integer Default: 1 |
| page_size | integer Default: 10 |
| search | string Search phrase to filter by source_url or domain |
| ordering | string Field to order by. Prefix with |
| domain_rating | string Filter by domain rating range. Format: |
{- "count": 0,
- "page": 0,
- "page_size": 0,
- "results": [
- { }
], - "primary_website": "string",
- "task_status": {
- "backlinks": "string",
- "urldownload": "string"
}
}Returns referring domains for a specific competitor website within the project.
| competitor_id required | integer Competitor website ID within the project |
| page | integer Default: 1 |
| page_size | integer Default: 10 |
| search | string |
| ordering | string |
{- "count": 0,
- "page": 0,
- "page_size": 0,
- "results": [
- { }
], - "primary_website": "string",
- "task_status": {
- "backlinks": "string",
- "urldownload": "string"
}
}Check if the user has enough refdomains quota to process the given URLs. Returns per-URL refdomain counts and whether quota is sufficient.
| urls required | Array of strings List of URLs/domains to check quota for |
{- "urls": [
- "example.com",
- "competitor.com"
]
}{- "available_quota": 0,
- "has_enough_quota": true,
- "websites": [
- {
- "domain": "string",
- "refdomains_count": 0,
- "customer_has_processed": true
}
]
}Returns all backlink research entries for the authenticated user, ordered by most recent.
| search | string Search by URL |
[- {
- "id": 0,
- "searched_on": "2019-08-24T14:15:22Z",
- "customer_id": 0,
- "metrics": {
- "url": "string",
- "mode": "string",
- "domain_authority": 0,
- "page_authority": 0,
- "linking_domains": 0,
- "linking_pages": 0,
- "initial_processing_status": "string"
}
}
]Initiates backlink research for a URL. Analyzes backlinks, referring domains, anchor text distribution, and top pages. Results are processed asynchronously.
| url required | string URL or domain to research |
| mode required | string Enum: "domain" "subdomain" "target_page"
|
{- "url": "example.com",
- "mode": "domain"
}{- "id": 0,
- "searched_on": "2019-08-24T14:15:22Z",
- "customer_id": 0,
- "url": "string",
- "mode": "string",
- "public_share_hash": "string"
}Returns detailed backlink research data including domain rating, URL metrics, top anchor text, top linking domains, top linking pages, and top pages.
{- "id": 0,
- "searched_on": "2019-08-24T14:15:22Z",
- "customer_id": 0,
- "public_share_hash": "string",
- "backlink_research": {
- "id": 0,
- "url": "string",
- "mode": "string",
- "domain_rating": 0,
- "title": "string",
- "meta_desc": "string",
- "initial_processing_status": "string",
- "url_metrics": { },
- "top_anchor_text": [
- { }
], - "top_linking_domains": [
- { }
], - "top_linking_pages": [
- { }
], - "top_pages": [
- { }
]
}
}Returns detailed backlink data for a specific context type (anchor text, linking domains, linking pages, top pages) with pagination and date filtering.
| context required | string Enum: "anchor_text" "linking_domains" "linking_domains_new" "linking_domains_lost" "linking_domains_spam" "linking_pages" "linking_pages_new" "linking_pages_lost" "top_pages" Type of data to retrieve |
| page | integer Default: 1 |
| start_date | string <date> Filter by date range start (YYYY-MM-DD) |
| end_date | string <date> Filter by date range end (YYYY-MM-DD) |
{- "results": [
- { }
], - "count": 0
}Returns linking pages data for a specific linking domain or target page within a backlink research entry. Used for drawer/detail views.
| page_type required | string Enum: "linking-domain-pages" "target-page-pages" "anchor-text-pages" |
| linking_domain | string Required for linking-domain-pages |
| target_page | string Required for target-page-pages |
| anchor_text | string Required for anchor-text-pages |
| page | integer Default: 1 |
{- "count": 0,
- "results": [
- {
- "source_url": "string",
- "domain_rating": 0,
- "anchor_text": "string",
- "is_follow": true
}
]
}Returns all backlink profile analyses for the authenticated user.
| search | string |
| page | integer |
| page_size | integer |
| ordering | string Order by field. Options: |
{- "count": 0,
- "results": [
- {
- "id": 0,
- "customer_id": 0,
- "searched_on": "2019-08-24T14:15:22Z",
- "primary_website": {
- "url": "string",
- "scope": "root_domain"
}, - "competitor_websites": [
- {
- "url": "string",
- "scope": "string"
}
]
}
]
}Compares backlink profiles of a primary website against competitor websites.
Each website can be analyzed at root_domain, subdomain, or page scope.
required | object |
required | Array of objects |
{- "primary_website": {
- "url": "example.com",
- "scope": "root_domain"
}, - "competitor_websites": [
- {
- "url": "competitor1.com",
- "scope": "root_domain"
}, - {
- "url": "competitor2.com",
- "scope": "root_domain"
}
]
}{- "id": 0,
- "customer_id": 0,
- "searched_on": "2019-08-24T14:15:22Z",
- "primary_website": {
- "url": "string",
- "scope": "root_domain"
}, - "competitor_websites": [
- {
- "url": "string",
- "scope": "string"
}
]
}Returns the full backlink profile comparison data for the given analysis.
[- {
- "competitor": "string",
- "competitor_scope": "string",
- "domain_authority": 0,
- "page_authority": 0,
- "root_domains_to_root_domain": 0,
- "pages_to_root_domain": 0
}
]| search | string |
| page | integer |
| page_size | integer |
| ordering | string |
{- "count": 0,
- "results": [
- {
- "id": 0,
- "customer_id": 0,
- "searched_on": "2019-08-24T14:15:22Z",
- "primary_website": {
- "url": "string",
- "scope": "string"
}, - "competitor_websites": [
- {
- "url": "string",
- "scope": "string"
}
], - "min_matching_targets": 0,
- "scope": "root_domain"
}
]
}Finds referring domains linking to competitors but not to your primary website.
Use min_matching_targets to filter by how many competitors a referring domain must link to.
required | object |
required | Array of objects |
| min_matching_targets | integer Default: 1 Minimum number of competitors a referring domain must link to |
| scope | string Default: "root_domain" Enum: "root_domain" "page" |
{- "primary_website": {
- "url": "example.com",
- "scope": "root_domain"
}, - "competitor_websites": [
- {
- "url": "competitor1.com",
- "scope": "root_domain"
}, - {
- "url": "competitor2.com",
- "scope": "root_domain"
}
], - "min_matching_targets": 1,
- "scope": "root_domain"
}Returns paginated link gap data showing domains linking to competitors but not to you.
| page | integer Default: 1 |
| page_size | integer Default: 50 |
{- "scope": "root_domain",
- "columns": [
- {
- "column_name": "string",
- "display_name": "string"
}
], - "values": [
- [
- "string"
]
]
}Email outreach campaign management for link building and digital PR. Create campaigns, manage email templates, discover and track opportunities, manage contacts, handle inbox conversations, and configure SMTP email accounts.
Base URL: https://keyword.searchatlas.com
Returns all outreach campaigns for the authenticated user with pagination and metrics.
| page | integer Default: 1 |
| page_size | integer Default: 20 |
| search | string |
| ordering | string |
{- "count": 0,
- "results": [
- {
- "id": 0,
- "name": "string",
- "business_id": 0,
- "product_id": 0,
- "status": "string",
- "status_display": "string",
- "action": "string",
- "action_display": "string",
- "remote_id": "string",
- "remote_status": "string",
- "remote_status_display": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "campaign_budget": {
- "id": 0,
- "amount_micros": 0,
- "delivery_method": "STANDARD",
- "status": "string",
- "action": "string",
- "remote_id": "string",
- "remote_status": "string",
- "error_message": "string",
- "created_at": "2019-08-24T14:15:22Z"
}, - "ads_account": {
- "id": 0,
- "email": "user@example.com",
- "account_name": "string",
- "account_id": "string",
- "manager_id": "string",
- "status": "string",
- "developer_token": "string",
- "client_credentials": { },
- "is_selected": true,
- "is_active": true,
- "currency_code": "USD",
- "currency_symbol": "$"
}, - "negative_keywords_sync_enabled": true,
- "has_active_adgroups": true,
- "currency": {
- "currency_symbol": "string",
- "currency_code": "string"
}, - "internal_campaign_type": "SEARCH",
- "clicks": 0,
- "ctr": 0,
- "cost": 0,
- "conversions": 0,
- "impressions": 0,
- "remote_start_date": "2019-08-24",
- "activate_retargeting_auto": true,
- "landing_page_valid": true,
- "keyword_clusters_ready": true,
- "ads_created": true,
- "campaign_published": true,
- "location_criteria": [
- 0
], - "language_criteria": [
- "string"
], - "advertising_channel_type": "string",
- "store_goals_enabled": true
}
]
}Creates a new link building outreach campaign with target keywords, email configuration, and scheduling settings. Triggers async processing to find outreach opportunities.
| name required | string Campaign name |
| customer_id required | integer |
| target_keywords | Array of strings <= 20 items Up to 20 seed keywords for opportunity discovery |
| linked_email_id | integer or null Primary linked email account ID for sending |
| followup_email_ids | Array of integers or null Follow-up email account IDs |
| otto_project_id | integer or null Associate with an OTTO project for automated outreach |
| questresults_id | integer or null QUEST analysis ID to seed opportunities from |
{- "name": "Link Building - Running Shoes",
- "customer_id": 12345,
- "target_keywords": [
- "best running shoes",
- "running shoe reviews"
], - "linked_email_id": 42,
- "followup_email_ids": [
- 43,
- 44
], - "otto_project_id": null
}{- "id": 0,
- "name": "string",
- "business_id": 0,
- "product_id": 0,
- "status": "string",
- "status_display": "string",
- "action": "string",
- "action_display": "string",
- "remote_id": "string",
- "remote_status": "string",
- "remote_status_display": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "campaign_budget": {
- "id": 0,
- "amount_micros": 0,
- "delivery_method": "STANDARD",
- "status": "string",
- "action": "string",
- "remote_id": "string",
- "remote_status": "string",
- "error_message": "string",
- "created_at": "2019-08-24T14:15:22Z"
}, - "ads_account": {
- "id": 0,
- "email": "user@example.com",
- "account_name": "string",
- "account_id": "string",
- "manager_id": "string",
- "status": "string",
- "developer_token": "string",
- "client_credentials": { },
- "is_selected": true,
- "is_active": true,
- "currency_code": "USD",
- "currency_symbol": "$"
}, - "negative_keywords_sync_enabled": true,
- "has_active_adgroups": true,
- "currency": {
- "currency_symbol": "string",
- "currency_code": "string"
}, - "internal_campaign_type": "SEARCH",
- "clicks": 0,
- "ctr": 0,
- "cost": 0,
- "conversions": 0,
- "impressions": 0,
- "remote_start_date": "2019-08-24",
- "activate_retargeting_auto": true,
- "landing_page_valid": true,
- "keyword_clusters_ready": true,
- "ads_created": true,
- "campaign_published": true,
- "location_criteria": [
- 0
], - "language_criteria": [
- "string"
], - "advertising_channel_type": "string",
- "store_goals_enabled": true
}Returns all email accounts linked to the customer account for use in campaigns.
[- {
- "id": 0,
- "email_address": "user@example.com",
- "email_type": "smtp",
- "is_linked": true,
- "daily_limit_by_email": 0
}
]Updates the daily email sending limit for a specific linked email account.
| id required | integer Linked email ID |
| daily_limit_by_email required | integer New daily send limit |
{- "id": 42,
- "daily_limit_by_email": 50
}Creates a new project folder to organize outreach campaigns.
| name required | string |
| customer_id required | integer |
{- "name": "Q1 Link Building",
- "customer_id": 12345
}{- "id": 0,
- "name": "string",
- "customer_id": 0
}Replaces the global domain/email blacklist for this customer account.
| blacklisted_domains | Array of strings Full list of blacklisted domains (replaces existing) |
| blacklisted_emails | Array of strings Full list of blacklisted email addresses |
{- "blacklisted_domains": [
- "spam.com",
- "example-no-contact.com"
]
}Returns time-series performance data for a campaign (emails sent, opens, replies) for charting.
{- "chart_series": [
- {
- "date": "2019-08-24",
- "emails_sent": 0,
- "emails_replied": 0,
- "emails_opened": 0
}
]
}Updates campaign settings including name, keywords, and email configuration.
| name | string <= 255 characters |
| remote_status | string Enum: "ENABLED" "PAUSED" |
| negative_keywords_sync_enabled | boolean |
| bidding_strategy_type | string |
| target_cpa | number |
| max_cpc_bid | number |
| target_roas | number |
{- "name": "string",
- "remote_status": "ENABLED",
- "negative_keywords_sync_enabled": true,
- "bidding_strategy_type": "string",
- "target_cpa": 0,
- "max_cpc_bid": 0,
- "target_roas": 0
}{- "id": 0,
- "name": "string",
- "business_id": 0,
- "product_id": 0,
- "status": "string",
- "status_display": "string",
- "action": "string",
- "action_display": "string",
- "remote_id": "string",
- "remote_status": "string",
- "remote_status_display": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "campaign_budget": {
- "id": 0,
- "amount_micros": 0,
- "delivery_method": "STANDARD",
- "status": "string",
- "action": "string",
- "remote_id": "string",
- "remote_status": "string",
- "error_message": "string",
- "created_at": "2019-08-24T14:15:22Z"
}, - "ads_account": {
- "id": 0,
- "email": "user@example.com",
- "account_name": "string",
- "account_id": "string",
- "manager_id": "string",
- "status": "string",
- "developer_token": "string",
- "client_credentials": { },
- "is_selected": true,
- "is_active": true,
- "currency_code": "USD",
- "currency_symbol": "$"
}, - "negative_keywords_sync_enabled": true,
- "has_active_adgroups": true,
- "currency": {
- "currency_symbol": "string",
- "currency_code": "string"
}, - "internal_campaign_type": "SEARCH",
- "clicks": 0,
- "ctr": 0,
- "cost": 0,
- "conversions": 0,
- "impressions": 0,
- "remote_start_date": "2019-08-24",
- "activate_retargeting_auto": true,
- "landing_page_valid": true,
- "keyword_clusters_ready": true,
- "ads_created": true,
- "campaign_published": true,
- "location_criteria": [
- 0
], - "language_criteria": [
- "string"
], - "advertising_channel_type": "string",
- "store_goals_enabled": true
}Returns the sending schedule settings for a campaign including daily limits, active days of the week, send time window, and counts of scheduled opportunities/contacts.
{- "id": 0,
- "name": "string",
- "campaign_budget": {
- "id": 0,
- "amount_micros": 0,
- "delivery_method": "STANDARD",
- "status": "string",
- "action": "string",
- "remote_id": "string",
- "remote_status": "string",
- "error_message": "string",
- "created_at": "2019-08-24T14:15:22Z"
}, - "ads_account": {
- "id": 0,
- "email": "user@example.com",
- "account_name": "string",
- "account_id": "string",
- "manager_id": "string",
- "status": "string",
- "developer_token": "string",
- "client_credentials": { },
- "is_selected": true,
- "is_active": true,
- "currency_code": "USD",
- "currency_symbol": "$"
}, - "location_criteria": [
- 0
], - "detailed_location_criteria": [
- { }
], - "excluded_location_criteria": [
- 0
], - "detailed_excluded_location_criteria": [
- { }
], - "language_criteria": [
- "string"
], - "radius_criteria": [
- { }
], - "bidding_strategy_type": "string",
- "target_cpa": 0,
- "max_cpc_bid": 0,
- "target_roas": 0,
- "location_targeting_type": "string"
}Replaces the domain/email blacklist for a specific campaign.
| blacklisted_domains | Array of strings Full list of blacklisted domains (replaces existing) |
| blacklisted_emails | Array of strings Full list of blacklisted email addresses |
{- "blacklisted_domains": [
- "string"
], - "blacklisted_emails": [
- "string"
]
}Imports outreach opportunities into a campaign from a CSV file upload. Each row should contain at minimum a domain/URL for the outreach target.
| file required | string <binary> CSV file with domain/URL and optional contact columns |
{- "imported_count": 0,
- "skipped_count": 0
}Updates the automated sending schedule for a campaign including daily limit, send time window (send_from / send_to hours), and active days of the week.
| campaign required | integer Campaign ID |
| name | string <= 255 characters |
| location_targeting_type | string |
| location_criteria | Array of strings List of location criterion IDs or location objects with locationId and reach |
| language_criteria | Array of strings |
| bidding_strategy_type | string |
| target_cpa | number |
| max_cpc_bid | number |
| target_roas | number |
| amount_micros | integer New budget amount |
{- "is_active": true,
- "daily_limit": 20,
- "send_from": "08:00",
- "send_to": "18:00",
- "days_of_week": [
- "monday",
- "tuesday",
- "wednesday",
- "thursday",
- "friday"
]
}{- "id": 0,
- "name": "string",
- "campaign_budget": {
- "id": 0,
- "amount_micros": 0,
- "delivery_method": "STANDARD",
- "status": "string",
- "action": "string",
- "remote_id": "string",
- "remote_status": "string",
- "error_message": "string",
- "created_at": "2019-08-24T14:15:22Z"
}, - "ads_account": {
- "id": 0,
- "email": "user@example.com",
- "account_name": "string",
- "account_id": "string",
- "manager_id": "string",
- "status": "string",
- "developer_token": "string",
- "client_credentials": { },
- "is_selected": true,
- "is_active": true,
- "currency_code": "USD",
- "currency_symbol": "$"
}, - "location_criteria": [
- 0
], - "detailed_location_criteria": [
- { }
], - "excluded_location_criteria": [
- 0
], - "detailed_excluded_location_criteria": [
- { }
], - "language_criteria": [
- "string"
], - "radius_criteria": [
- { }
], - "bidding_strategy_type": "string",
- "target_cpa": 0,
- "max_cpc_bid": 0,
- "target_roas": 0,
- "location_targeting_type": "string"
}Returns all email templates available for the authenticated customer's campaigns.
[- {
- "id": 0,
- "name": "string",
- "subject": "string",
- "body": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "customer_id": 0
}
]Creates a new reusable email template. Templates support variable substitution
using {variable_name} syntax (e.g., {first_name}, {domain}, {keyword}).
| name required | string |
| subject required | string |
| body required | string |
{- "name": "Guest Post Pitch",
- "subject": "Guest post opportunity for {domain}",
- "body": "Hi {first_name},\n\nI'd love to contribute a guest post to your site..."
}{- "id": 0,
- "name": "string",
- "subject": "string",
- "body": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "customer_id": 0
}Updates an existing email template's name, subject, or body.
| template_id required | integer |
| name | string |
| subject | string |
| body | string |
{- "template_id": 0,
- "name": "string",
- "subject": "string",
- "body": "string"
}{- "id": 0,
- "name": "string",
- "subject": "string",
- "body": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "customer_id": 0
}Sends outreach emails to multiple scheduled opportunities in a campaign simultaneously.
Requires a linked email, subject, and body template. Optional context variables
are available for personalization (e.g., {first_name}, {domain}).
| opportunities required | Array of integers List of opportunity IDs to send to |
| linked_email_id required | integer |
| subject required | string |
| body required | string |
| context | object Default: {} |
{- "opportunities": [
- 101,
- 102,
- 103
], - "linked_email_id": 42,
- "subject": "Link collaboration opportunity - {domain}",
- "body": "Hi {first_name},\n\nI came across your site and thought we might collaborate...",
- "context": { }
}Marks a set of opportunities as scheduled, adding them to the campaign's automated sending queue to be sent according to the campaign's schedule settings.
| opportunities required | Array of integers List of opportunity IDs |
{- "opportunities": [
- 101,
- 102,
- 103
]
}Returns outreach opportunities (discovered websites to contact) for a campaign. Each opportunity has contact data, domain metrics, and scheduling status.
| campaign_id required | integer Campaign ID to list opportunities for |
| page | integer Default: 1 |
| page_size | integer Default: 25 |
| search | string |
| ordering | string |
| is_scheduled | boolean |
{- "count": 0,
- "results": [
- {
- "id": 0,
- "domain": "string",
- "url": "string",
- "title": "string",
- "meta_desc": "string",
- "is_scheduled": true,
- "ahrefs_dr": 0,
- "ahrefs_ok": 0,
- "ahrefs_ot": 0,
- "ahrefs_refdomains": 0,
- "contacts": 0,
- "contacted": 0,
- "found_in_other_campaigns": true
}
]
}Sends an outreach email to all contacts associated with a specific opportunity. Requires a linked email account, subject, and body. Supports variable substitution.
| linked_email_id required | integer ID of the linked email account to send from |
| subject required | string Email subject (supports |
| body required | string Email body (supports |
| context | object Default: {} Key-value pairs for variable substitution (e.g., |
{- "linked_email_id": 42,
- "subject": "Collaboration opportunity",
- "body": "Hi {first_name}, I wanted to reach out about a link exchange...",
- "context": { }
}{- "id": 0,
- "email_sender": "user@example.com",
- "email_to": "user@example.com",
- "opportunity_details": {
- "id": 0,
- "domain": "string",
- "url": "string",
- "title": "string",
- "meta_desc": "string",
- "is_scheduled": true,
- "ahrefs_dr": 0,
- "ahrefs_ok": 0,
- "ahrefs_ot": 0,
- "ahrefs_refdomains": 0
}, - "thread": [
- {
- "id": "string",
- "from": "user@example.com",
- "to": "user@example.com",
- "subject": "string",
- "body": "string",
- "sent_at": "2019-08-24T14:15:22Z",
- "is_inbound": true
}
]
}Creates a new contact associated with an outreach opportunity. Contacts are the individual people at a website who will receive outreach emails.
| opportunity_id required | integer |
| email_address required | string <email> |
| first_name | string or null |
| last_name | string or null |
| title | string or null |
| photo_url | string or null |
| linkedin_url | string or null |
| twitter_url | string or null |
| github_url | string or null |
| facebook_url | string or null |
| website_url | string or null |
| file | string or null <binary> Optional contact avatar/photo file upload |
{- "opportunity_id": 101,
- "email_address": "editor@example.com",
- "first_name": "Jane",
- "last_name": "Smith",
- "title": "Content Editor",
}{- "id": 0,
- "opportunity_id": 0,
- "email_address": "user@example.com",
- "first_name": "string",
- "last_name": "string",
- "title": "string",
- "photo_url": "string",
- "linkedin_url": "string",
- "twitter_url": "string",
- "github_url": "string",
- "facebook_url": "string",
- "website_url": "string"
}Updates the relationship milestone for an outreach conversation. Milestones track the progress of a link building negotiation.
| id required | integer Sent outreach email ID to update milestone for |
| milestone required | string Enum: "idle" "got_a_reply" "negotiation" "won" "lost" Relationship stage in the link building negotiation:
|
{- "id": 55,
- "milestone": "negotiation"
}Track and analyze your brand's visibility across AI platforms including ChatGPT, Gemini, Perplexity, Copilot, Google AI Mode, and Grok. Monitor brand mentions, sentiment trends, competitor benchmarking, topic and query management, citation sources, and simulate AI prompts.
Base URL: https://llmvis.searchatlas.com
Brand visibility analysis projects. Each project links a user to a brand domain. Projects start as system projects (shared 30-day analysis) and can be converted to user-tracked projects for dedicated per-user analysis.
Returns all non-deleted LLM visibility projects for the authenticated user. Includes both system projects (is_user_tracked=false) and user-tracked projects.
[- {
- "id": 0,
- "name": "string",
- "description": "string",
- "is_active": true,
- "timezone": "America/New_York",
- "platforms_config": {
- "facebook": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "page_id": "string",
- "category": "string"
}, - "instagram": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "instagram_id": "string",
- "instagram_user_id": "string",
- "followers_count": 0,
- "follows_count": 0
}, - "twitter": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "twitter_id": "string",
- "description": "string",
- "profile_image_url": "string",
- "followers_count": 0,
- "following_count": 0,
- "tweet_count": 0,
- "verified": true
}, - "linkedin": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "author_urn": "string",
- "company_id": "string",
- "company_name": "string",
- "industry": "string",
- "followers_count": 0
}
}, - "default_approval_type": "AUTO_PUBLISH",
- "default_image_source_type": "string",
- "ai_settings": {
- "tone": "professional",
- "language": "en",
- "include_hashtags": true,
- "max_hashtags": 5,
- "include_emojis": true,
- "target_audience": "string",
- "brand_voice_guidelines": "string",
- "image_prompt": "string"
}, - "image_prompt": "string",
- "enabled_platforms": [
- "facebook",
- "instagram"
], - "posts_count": 0,
- "schedule": {
- "id": 0,
- "name": "string",
- "is_active": true,
- "frequency_config": {
- "frequency_type": "daily",
- "days_of_week": [
- 6
], - "days_of_month": [
- 1
], - "preferred_times": [
- "string"
]
}, - "next_run_at": "2019-08-24T14:15:22Z",
- "last_run_at": "2019-08-24T14:15:22Z"
}, - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
]Creates a new LLM visibility project for the given domain. If a brand for this domain already exists, it is reused. A system-level analysis snapshot is triggered automatically.
The project starts as a system project (is_user_tracked=false). Call
POST /api/v1/projects/{projectId}/track/ to convert it to a user-tracked project.
QP integration: QP stores the returned project_id as Project.llmv_id.
| name required | string <= 200 characters |
| description | string |
| is_active | boolean Default: true |
| timezone | string IANA timezone string (e.g. America/New_York) |
object (PlatformsConfig) | |
| default_approval_type | string Enum: "AUTO_PUBLISH" "APPROVE_IF_IMAGE" "AI_IMAGES_ONLY" "APPROVE_FOR_PUBLISH" |
| default_image_source_type | string or null |
object (AISettings) | |
| image_prompt | string <= 1000 characters Convenience alias - merged into ai_settings.image_prompt on save |
{- "domain": "searchatlas.com",
- "country_code": "US",
- "source": "api"
}{- "message": "string",
- "success": true,
- "status": "string",
- "project_id": "405d8375-3514-403b-8c43-83ae74cfe0e9"
}Returns full project details for the authenticated user's project.
{- "id": 0,
- "name": "string",
- "description": "string",
- "is_active": true,
- "timezone": "America/New_York",
- "platforms_config": {
- "facebook": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "page_id": "string",
- "category": "string"
}, - "instagram": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "instagram_id": "string",
- "instagram_user_id": "string",
- "followers_count": 0,
- "follows_count": 0
}, - "twitter": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "twitter_id": "string",
- "description": "string",
- "profile_image_url": "string",
- "followers_count": 0,
- "following_count": 0,
- "tweet_count": 0,
- "verified": true
}, - "linkedin": {
- "is_enabled": false,
- "account_id": "string",
- "username": "string",
- "name": "string",
- "author_urn": "string",
- "company_id": "string",
- "company_name": "string",
- "industry": "string",
- "followers_count": 0
}
}, - "default_approval_type": "AUTO_PUBLISH",
- "default_image_source_type": "string",
- "ai_settings": {
- "tone": "professional",
- "language": "en",
- "include_hashtags": true,
- "max_hashtags": 5,
- "include_emojis": true,
- "target_audience": "string",
- "brand_voice_guidelines": "string",
- "image_prompt": "string"
}, - "image_prompt": "string",
- "enabled_platforms": [
- "facebook",
- "instagram"
], - "posts_count": 0,
- "schedule": {
- "id": 0,
- "name": "string",
- "is_active": true,
- "frequency_config": {
- "frequency_type": "daily",
- "days_of_week": [
- 6
], - "days_of_month": [
- 1
], - "preferred_times": [
- "string"
]
}, - "next_run_at": "2019-08-24T14:15:22Z",
- "last_run_at": "2019-08-24T14:15:22Z"
}, - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Converts a system project to a user-tracked project. Validates quota availability, sets custom platforms and frequency, then triggers the first dedicated analysis run immediately.
When the credit system is enabled, frequency_days and selected_platforms can be
provided. Otherwise, values are derived from the user's quota plan.
| frequency_days | integer (FrequencyDaysEnum) Enum: 1 3 7 14 30 Refresh frequency in days |
| selected_platforms | Array of strings (PlatformEnum) Items Enum: "openai" "gemini" "perplexity" "copilot" "google_ai_mode" "grok" Platforms to monitor. Must be subset of customer's allowed platforms. |
{- "frequency_days": 7,
- "selected_platforms": [
- "openai",
- "gemini",
- "perplexity"
]
}{- "message": "string",
- "success": true,
- "status": "string",
- "project_id": "405d8375-3514-403b-8c43-83ae74cfe0e9"
}Updates the platform selection and/or refresh frequency for a user-tracked project. At least one field must be provided. Recalculates credit cost after update.
| frequency_days | integer (FrequencyDaysEnum) Enum: 1 3 7 14 30 Refresh frequency in days |
| selected_platforms | Array of strings (PlatformEnum) non-empty Items Enum: "openai" "gemini" "perplexity" "copilot" "google_ai_mode" "grok" |
{- "frequency_days": 1,
- "selected_platforms": [
- "openai"
]
}{- "frequency_days": 1,
- "selected_platforms": [
- "openai"
]
}Updates only the refresh frequency for a user-tracked project.
| frequency_days required | integer (FrequencyDaysEnum) Enum: 1 3 7 14 30 Refresh frequency in days |
{- "frequency_days": 1
}Returns all competitors discovered for this project's brand, with their selection status and source (auto-discovered or manually pinned).
{- "count": 0,
- "competitors": [
- {
- "domain_name": "string",
- "is_selected": true,
- "source": "auto",
- "last_seen_in_response": "2019-08-24T14:15:22Z"
}
]
}Incrementally add/remove competitors from the deselected or pinned lists.
Use add_deselected/remove_deselected to hide/show auto-discovered competitors.
Use add_pinned/remove_pinned to manually pin specific competitor domains.
| add_deselected | Array of strings Domains to hide from charts |
| remove_deselected | Array of strings Domains to show in charts |
| add_pinned | Array of strings Domains to manually pin as competitors |
| remove_pinned | Array of strings Domains to unpin |
{- "add_deselected": [
- "string"
], - "remove_deselected": [
- "string"
], - "add_pinned": [
- "string"
], - "remove_pinned": [
- "string"
]
}{- "updated": true,
- "deselected_count": 0,
- "pinned_count": 0
}Triggers an immediate analysis run for the project using its configured platforms. Does not require a request body.
{ }{- "message": "string",
- "success": true,
- "status": "string",
- "project_id": "405d8375-3514-403b-8c43-83ae74cfe0e9"
}Uploads a CSV file to bulk-create topics and queries for the project's brand.
CSV must have two columns: topic and query. Rows sharing the same topic value
are grouped under the same topic (deduplicated). All created items have source=user_created.
CSV format:
topic,query
SEO Tools,What are the best SEO tools for small businesses?
SEO Tools,How to choose an SEO platform?
| file required | string <binary> CSV file with 'topic' and 'query' columns |
{- "message": "string",
- "topics_created": 0,
- "queries_created": 0
}Exports visibility data for topics and queries within the given time window as a CSV file. Supports platform and topic filtering.
| from_date | string <date-time> Inclusive start time. Overrides period if provided. |
| to_date | string <date-time> Exclusive end time. Defaults to now. |
| period | string Enum: "7d" "30d" "90d" Quick period selector. Ignored if from_date provided. |
| platforms | string Comma-separated platform keys (e.g., 'openai,gemini') |
| topics | string Comma-separated topic UUIDs |
{- "from_date": "2019-08-24T14:15:22Z",
- "to_date": "2019-08-24T14:15:22Z",
- "period": "7d",
- "platforms": "string",
- "topics": "string"
}Returns the credit usage log entries for a specific project.
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "action": "string",
- "credits_consumed": 0,
- "query_count": 0,
- "platform_count": 0,
- "frequency_days": 0,
- "balance_after": 0,
- "metadata": { },
- "created": "2019-08-24T14:15:22Z"
}
]Brand-level visibility metrics, trends, and sentiment analysis across LLM platforms. Includes overview data, visibility trends, sentiment trends, and topic/query breakdowns.
Returns aggregated brand visibility, sentiment, and citation metrics for a domain within the specified time window. Supports platform filtering, topic filtering, and sorting. Includes both current and previous period values for trend comparison.
Used by QP Report Builder.
| domain required | string <= 255 characters Brand domain to analyze |
| from_date | string <date-time> Inclusive start time. Overrides period. |
| to_date | string <date-time> Exclusive end time. Defaults to now. |
| period | string Enum: "7d" "30d" "90d" Quick period selector. Ignored if from_date provided. |
| platforms | string Comma-separated platform keys (e.g., 'openai,gemini'). Default: all. |
| topics | string Comma-separated topic UUIDs. Default: all topics. |
| queries | string Comma-separated query UUIDs. Default: all queries. |
| sort_by | string Sort field. Prefix with '-' for descending. |
| search | string Search term for title-based filtering. |
{- "domain": "searchatlas.com",
- "period": "30d",
- "platforms": "openai,gemini"
}{- "domain": "string",
- "filters": {
- "from_date": "2019-08-24T14:15:22Z",
- "to_date": "2019-08-24T14:15:22Z",
- "platforms": [
- "string"
]
}, - "visibility": {
- "current": 0.1,
- "previous": 0.1
}, - "sentiment": {
- "current": 0.1,
- "previous": 0.1
}, - "citations": {
- "current": 0.1,
- "previous": 0.1
}
}Returns time-series visibility data for a brand across analysis snapshots. Each data point has a timestamp and per-platform visibility score values.
Used by QP Report Builder.
| domain required | string <= 255 characters Brand domain to analyze |
| from_date | string <date-time> Inclusive start time. Overrides period. |
| to_date | string <date-time> Exclusive end time. Defaults to now. |
| period | string Enum: "7d" "30d" "90d" Quick period selector. Ignored if from_date provided. |
| platforms | string Comma-separated platform keys (e.g., 'openai,gemini'). Default: all. |
| topics | string Comma-separated topic UUIDs. Default: all topics. |
| queries | string Comma-separated query UUIDs. Default: all queries. |
| sort_by | string Sort field. Prefix with '-' for descending. |
| search | string Search term for title-based filtering. |
{- "domain": "string",
- "from_date": "2019-08-24T14:15:22Z",
- "to_date": "2019-08-24T14:15:22Z",
- "period": "7d",
- "platforms": "string",
- "topics": "string",
- "queries": "string",
- "sort_by": "string",
- "search": "string"
}[- {
- "timestamp": "2019-08-24T14:15:22Z",
- "values": {
- "property1": 0.1,
- "property2": 0.1
}
}
]Returns time-series sentiment data for a brand across analysis snapshots. Each data point has a timestamp and per-platform sentiment score values.
Used by QP Report Builder.
| domain required | string <= 255 characters Brand domain to analyze |
| from_date | string <date-time> Inclusive start time. Overrides period. |
| to_date | string <date-time> Exclusive end time. Defaults to now. |
| period | string Enum: "7d" "30d" "90d" Quick period selector. Ignored if from_date provided. |
| platforms | string Comma-separated platform keys (e.g., 'openai,gemini'). Default: all. |
| topics | string Comma-separated topic UUIDs. Default: all topics. |
| queries | string Comma-separated query UUIDs. Default: all queries. |
| sort_by | string Sort field. Prefix with '-' for descending. |
| search | string Search term for title-based filtering. |
{- "domain": "string",
- "from_date": "2019-08-24T14:15:22Z",
- "to_date": "2019-08-24T14:15:22Z",
- "period": "7d",
- "platforms": "string",
- "topics": "string",
- "queries": "string",
- "sort_by": "string",
- "search": "string"
}[- {
- "timestamp": "2019-08-24T14:15:22Z",
- "values": {
- "property1": 0.1,
- "property2": 0.1
}
}
]Returns all active topics for a brand domain, for use in filter dropdowns. Supports partial-match search by title.
| domain required | string Brand domain (e.g., 'searchatlas.com') |
| search | string Filter topics by title (case-insensitive partial match) |
{- "domain": "string",
- "topics": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "source": "auto_generated"
}
]
}Returns all active queries for a brand domain with their parent topic context, for use in filter dropdowns. Supports partial-match search.
| domain required | string Brand domain (e.g., 'searchatlas.com') |
| search | string Filter queries by title (case-insensitive partial match) |
{- "domain": "string",
- "queries": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "topic_id": "646807af-5da6-43aa-83d3-8ac1d15ab4e5",
- "topic_title": "string",
- "source": "auto_generated"
}
]
}Returns aggregated sentiment metrics grouped by topic. Includes average sentiment score, total mentions, and a list of up to 10 unique cited domains per topic.
| domain required | string <= 255 characters Brand domain to analyze |
| from_date | string <date-time> Inclusive start time. Overrides period. |
| to_date | string <date-time> Exclusive end time. Defaults to now. |
| period | string Enum: "7d" "30d" "90d" Quick period selector. Ignored if from_date provided. |
| platforms | string Comma-separated platform keys (e.g., 'openai,gemini'). Default: all. |
| topics | string Comma-separated topic UUIDs. Default: all topics. |
| queries | string Comma-separated query UUIDs. Default: all queries. |
| sort_by | string Sort field. Prefix with '-' for descending. |
| search | string Search term for title-based filtering. |
| sentiment | string Enum: "" "positive" "neutral" "negative" Filter by sentiment category. Empty string = all. |
{- "domain": "string",
- "from_date": "2019-08-24T14:15:22Z",
- "to_date": "2019-08-24T14:15:22Z",
- "period": "7d",
- "platforms": "string",
- "topics": "string",
- "queries": "string",
- "sort_by": "string",
- "search": "string",
- "sentiment": ""
}{- "count": 0,
- "results": [
- {
- "topic_id": "646807af-5da6-43aa-83d3-8ac1d15ab4e5",
- "title": "string",
- "mentions": 0,
- "sentiment_score": 0.1,
- "domains": [
- "string"
], - "domains_count": 0
}
]
}Returns sentiment metrics grouped by individual query.
| domain required | string <= 255 characters Brand domain to analyze |
| from_date | string <date-time> Inclusive start time. Overrides period. |
| to_date | string <date-time> Exclusive end time. Defaults to now. |
| period | string Enum: "7d" "30d" "90d" Quick period selector. Ignored if from_date provided. |
| platforms | string Comma-separated platform keys (e.g., 'openai,gemini'). Default: all. |
| topics | string Comma-separated topic UUIDs. Default: all topics. |
| queries | string Comma-separated query UUIDs. Default: all queries. |
| sort_by | string Sort field. Prefix with '-' for descending. |
| search | string Search term for title-based filtering. |
| sentiment | string Enum: "" "positive" "neutral" "negative" Filter by sentiment category. Empty string = all. |
{- "domain": "string",
- "from_date": "2019-08-24T14:15:22Z",
- "to_date": "2019-08-24T14:15:22Z",
- "period": "7d",
- "platforms": "string",
- "topics": "string",
- "queries": "string",
- "sort_by": "string",
- "search": "string",
- "sentiment": ""
}{- "count": 0,
- "results": [
- {
- "query_id": "6fa29c22-6bab-424a-859e-a13a5c607e72",
- "topic_id": "646807af-5da6-43aa-83d3-8ac1d15ab4e5",
- "query_text": "string",
- "mentions": 0,
- "sentiment_score": 0.1,
- "domains": [
- "string"
], - "domains_count": 0
}
]
}Returns topics organized into three sentiment categories:
positive - all queries for this topic have positive sentimentneutral - no negative queries, at least one neutralnegative - at least one query has negative sentiment| domain required | string <= 255 characters Brand domain to analyze |
| from_date | string <date-time> Inclusive start time. Overrides period. |
| to_date | string <date-time> Exclusive end time. Defaults to now. |
| period | string Enum: "7d" "30d" "90d" Quick period selector. Ignored if from_date provided. |
| platforms | string Comma-separated platform keys (e.g., 'openai,gemini'). Default: all. |
| topics | string Comma-separated topic UUIDs. Default: all topics. |
| queries | string Comma-separated query UUIDs. Default: all queries. |
| sort_by | string Sort field. Prefix with '-' for descending. |
| search | string Search term for title-based filtering. |
{- "domain": "string",
- "from_date": "2019-08-24T14:15:22Z",
- "to_date": "2019-08-24T14:15:22Z",
- "period": "7d",
- "platforms": "string",
- "topics": "string",
- "queries": "string",
- "sort_by": "string",
- "search": "string"
}{- "positive": [
- {
- "topic_id": "646807af-5da6-43aa-83d3-8ac1d15ab4e5",
- "title": "string"
}
], - "neutral": [
- {
- "topic_id": "646807af-5da6-43aa-83d3-8ac1d15ab4e5",
- "title": "string"
}
], - "negative": [
- {
- "topic_id": "646807af-5da6-43aa-83d3-8ac1d15ab4e5",
- "title": "string"
}
]
}Generates a concise AI-powered summary (headline + insights + action) for a given domain and metrics dataset. Results are cached.
Summary types: overview, visibility_trend, sentiment, citations, competitors
| domain required | string Domain being analyzed |
| summary_type required | string Enum: "overview" "visibility_trend" "sentiment" "citations" "competitors" Type of summary to generate |
required | object Metrics data for analysis (structure varies by summary_type) |
{- "domain": "string",
- "summary_type": "overview",
- "data": { }
}{- "headline": "string",
- "insights": [
- "string"
], - "action": "string",
- "cached": true,
- "summary_type": "string"
}Competitive analysis comparing brand visibility and share of voice against discovered competitors. Includes visibility rank, share of voice rank, visibility trends, and domain-level topic/query breakdowns.
Returns topic-level visibility and share of voice for any domain - brand or competitor. Useful for understanding which topics drive a domain's LLM presence.
| domain required | string <= 255 characters Brand domain to analyze |
| from_date | string <date-time> Inclusive start time. Overrides period. |
| to_date | string <date-time> Exclusive end time. Defaults to now. |
| period | string Enum: "7d" "30d" "90d" Quick period selector. Ignored if from_date provided. |
| platforms | string Comma-separated platform keys (e.g., 'openai,gemini'). Default: all. |
| topics | string Comma-separated topic UUIDs. Default: all topics. |
| queries | string Comma-separated query UUIDs. Default: all queries. |
| sort_by | string Sort field. Prefix with '-' for descending. |
| search | string Search term for title-based filtering. |
| target_domain required | string <= 255 characters Domain to analyze (brand or competitor) |
{- "domain": "string",
- "from_date": "2019-08-24T14:15:22Z",
- "to_date": "2019-08-24T14:15:22Z",
- "period": "7d",
- "platforms": "string",
- "topics": "string",
- "queries": "string",
- "sort_by": "string",
- "search": "string",
- "target_domain": "string"
}{- "count": 0,
- "results": [
- {
- "topic_id": "646807af-5da6-43aa-83d3-8ac1d15ab4e5",
- "title": "string",
- "visibility_score": 0.1,
- "share_of_voice": 0.1,
- "query_count": 0
}
]
}Returns query-level visibility and share of voice for any domain - brand or competitor.
All queries returned are of type broad.
| domain required | string <= 255 characters Brand domain to analyze |
| from_date | string <date-time> Inclusive start time. Overrides period. |
| to_date | string <date-time> Exclusive end time. Defaults to now. |
| period | string Enum: "7d" "30d" "90d" Quick period selector. Ignored if from_date provided. |
| platforms | string Comma-separated platform keys (e.g., 'openai,gemini'). Default: all. |
| topics | string Comma-separated topic UUIDs. Default: all topics. |
| queries | string Comma-separated query UUIDs. Default: all queries. |
| sort_by | string Sort field. Prefix with '-' for descending. |
| search | string Search term for title-based filtering. |
| target_domain required | string <= 255 characters |
{- "domain": "string",
- "from_date": "2019-08-24T14:15:22Z",
- "to_date": "2019-08-24T14:15:22Z",
- "period": "7d",
- "platforms": "string",
- "topics": "string",
- "queries": "string",
- "sort_by": "string",
- "search": "string",
- "target_domain": "string"
}{- "count": 0,
- "results": [
- {
- "query_id": "6fa29c22-6bab-424a-859e-a13a5c607e72",
- "title": "string",
- "query_type": "string",
- "topic_id": "646807af-5da6-43aa-83d3-8ac1d15ab4e5",
- "topic_title": "string",
- "visibility_score": 0.1,
- "share_of_voice": 0.1
}
]
}Returns a ranked list of competitor domains by average visibility score within the specified time window. Supports sorting and domain search.
Used by QP Report Builder.
| domain required | string <= 255 characters Brand domain to analyze |
| from_date | string <date-time> Inclusive start time. Overrides period. |
| to_date | string <date-time> Exclusive end time. Defaults to now. |
| period | string Enum: "7d" "30d" "90d" Quick period selector. Ignored if from_date provided. |
| platforms | string Comma-separated platform keys (e.g., 'openai,gemini'). Default: all. |
| topics | string Comma-separated topic UUIDs. Default: all topics. |
| queries | string Comma-separated query UUIDs. Default: all queries. |
| sort_by | string Sort field. Prefix with '-' for descending. |
| search | string Search term for title-based filtering. |
{- "domain": "searchatlas.com",
- "period": "30d",
- "sort_by": "-visibility_score"
}{- "count": 0,
- "results": [
- {
- "domain_name": "string",
- "visibility_score": 0.1
}
]
}Returns time-series visibility trend data for all selected competitor domains. Response is a map of domain_name → list of {timestamp, value} data points.
Used by QP Report Builder.
| domain required | string <= 255 characters Brand domain to analyze |
| from_date | string <date-time> Inclusive start time. Overrides period. |
| to_date | string <date-time> Exclusive end time. Defaults to now. |
| period | string Enum: "7d" "30d" "90d" Quick period selector. Ignored if from_date provided. |
| platforms | string Comma-separated platform keys (e.g., 'openai,gemini'). Default: all. |
| topics | string Comma-separated topic UUIDs. Default: all topics. |
| queries | string Comma-separated query UUIDs. Default: all queries. |
| sort_by | string Sort field. Prefix with '-' for descending. |
| search | string Search term for title-based filtering. |
{- "domain": "string",
- "from_date": "2019-08-24T14:15:22Z",
- "to_date": "2019-08-24T14:15:22Z",
- "period": "7d",
- "platforms": "string",
- "topics": "string",
- "queries": "string",
- "sort_by": "string",
- "search": "string"
}{- "data": {
- "property1": [
- {
- "timestamp": "2019-08-24T14:15:22Z",
- "value": 0
}
], - "property2": [
- {
- "timestamp": "2019-08-24T14:15:22Z",
- "value": 0
}
]
}
}Topic and query management for brand analysis. Topics represent research areas; queries are specific prompts sent to LLMs. Supports bulk creation, activation/deactivation, overview analytics, and trend analysis.
Returns topics for a brand domain with query count breakdown. Supports filtering by active/inactive status and title search.
| domain required | string Brand domain (e.g., 'searchatlas.com') |
| include_inactive | boolean Default: false Include inactive topics |
| search | string Filter by topic title |
| page | integer |
| page_size | integer |
{- "count": 0,
- "results": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "source": "auto_generated",
- "is_active": true,
- "query_count": {
- "total": 0,
- "auto_generated": 0,
- "user_created": 0
}
}
]
}Creates one or more user-created topics for a brand domain. Idempotent - existing topics with matching titles are reused.
| domain required | string Brand domain |
required | Array of objects non-empty |
{- "domain": "searchatlas.com",
- "topics": [
- {
- "title": "SEO Tools"
}, - {
- "title": "Content Marketing"
}
]
}{- "message": "string"
}Returns aggregated visibility metrics per topic for a brand domain. Includes rank, visibility score, share of voice, and search volume per topic. Supports time-window, platform, and query_type filtering.
Used by QP Report Builder.
| domain required | string <= 255 characters Brand domain to analyze |
| from_date | string <date-time> Inclusive start time. Overrides period. |
| to_date | string <date-time> Exclusive end time. Defaults to now. |
| period | string Enum: "7d" "30d" "90d" Quick period selector. Ignored if from_date provided. |
| platforms | string Comma-separated platform keys (e.g., 'openai,gemini'). Default: all. |
| topics | string Comma-separated topic UUIDs. Default: all topics. |
| queries | string Comma-separated query UUIDs. Default: all queries. |
| sort_by | string Sort field. Prefix with '-' for descending. |
| search | string Search term for title-based filtering. |
| query_type | string Enum: "branded" "broad" |
{- "domain": "string",
- "from_date": "2019-08-24T14:15:22Z",
- "to_date": "2019-08-24T14:15:22Z",
- "period": "7d",
- "platforms": "string",
- "topics": "string",
- "queries": "string",
- "sort_by": "string",
- "search": "string",
- "query_type": "branded"
}{- "count": 0,
- "results": [
- {
- "topic_id": "646807af-5da6-43aa-83d3-8ac1d15ab4e5",
- "title": "string",
- "rank": 0,
- "visibility_score": 0,
- "share_of_voice": 0,
- "search_volume": 0
}
]
}Returns topics that have not yet been included in any analysis snapshot.
| domain required | string |
| topics | Array of strings <uuid> [ items <uuid > ] |
| search | string |
{- "domain": "string",
- "topics": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "search": "string"
}{- "count": 0,
- "results": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "source": "auto_generated",
- "is_active": true,
- "query_count": {
- "total": 0,
- "auto_generated": 0,
- "user_created": 0
}
}
]
}Updates the display title of an existing topic.
| title required | string <= 255 characters |
{- "title": "string"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "source": "auto_generated",
- "is_active": true,
- "query_count": {
- "total": 0,
- "auto_generated": 0,
- "user_created": 0
}
}Returns queries for a brand domain with topic context. Supports filtering by topic_id, active/inactive status, and title search.
| domain required | string Brand domain |
| topic_id | string <uuid> Filter queries by topic UUID |
| include_inactive | boolean Default: false |
| page | integer |
| page_size | integer |
{- "count": 0,
- "results": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "topic_id": "646807af-5da6-43aa-83d3-8ac1d15ab4e5",
- "topic_title": "string",
- "title": "string",
- "query_type": "branded",
- "source": "auto_generated",
- "is_active": true
}
]
}Creates one or more user-created queries under a specific topic. Idempotent - existing queries with matching titles under the same topic are reused.
| domain required | string |
| topic_id required | string <uuid> |
required | Array of objects non-empty |
{- "domain": "searchatlas.com",
- "topic_id": "550e8400-e29b-41d4-a716-446655440000",
- "queries": [
- {
- "title": "What is the best SEO tool?",
- "query_type": "broad"
}
]
}{- "message": "string"
}Returns aggregated visibility metrics per query for a brand domain. Includes rank, visibility score, share of voice, search volume, and query type.
| domain required | string <= 255 characters Brand domain to analyze |
| from_date | string <date-time> Inclusive start time. Overrides period. |
| to_date | string <date-time> Exclusive end time. Defaults to now. |
| period | string Enum: "7d" "30d" "90d" Quick period selector. Ignored if from_date provided. |
| platforms | string Comma-separated platform keys (e.g., 'openai,gemini'). Default: all. |
| topics | string Comma-separated topic UUIDs. Default: all topics. |
| queries | string Comma-separated query UUIDs. Default: all queries. |
| sort_by | string Sort field. Prefix with '-' for descending. |
| search | string Search term for title-based filtering. |
| query_type | string Enum: "branded" "broad" |
{- "domain": "string",
- "from_date": "2019-08-24T14:15:22Z",
- "to_date": "2019-08-24T14:15:22Z",
- "period": "7d",
- "platforms": "string",
- "topics": "string",
- "queries": "string",
- "sort_by": "string",
- "search": "string",
- "query_type": "branded"
}{- "count": 0,
- "results": [
- {
- "query_id": "6fa29c22-6bab-424a-859e-a13a5c607e72",
- "title": "string",
- "query_type": "branded",
- "rank": 0,
- "visibility_score": 0,
- "share_of_voice": 0,
- "search_volume": 0
}
]
}Returns all analysis snapshots where the given query was successfully processed. Use to populate date selectors in trend/comparison UIs.
| query_id required | string <uuid> |
{- "query_id": "6fa29c22-6bab-424a-859e-a13a5c607e72"
}{- "query_id": "6fa29c22-6bab-424a-859e-a13a5c607e72",
- "available_dates": [
- {
- "snapshot_id": "163831af-8c1b-4992-a9cf-88c6306604c0",
- "timestamp": "2019-08-24T14:15:22Z"
}
]
}Returns time-series visibility data for a specific query across snapshots. Each point has a timestamp and per-platform visibility score values.
| query required | string <uuid> Query UUID |
| from_date | string <date-time> |
| to_date | string <date-time> |
| period | string Enum: "7d" "30d" "90d" |
| platforms | string Comma-separated platform keys |
{- "query": "f3c5bd2e-6d34-4350-ae9d-95c2f071389c",
- "from_date": "2019-08-24T14:15:22Z",
- "to_date": "2019-08-24T14:15:22Z",
- "period": "7d",
- "platforms": "string"
}[- {
- "timestamp": "2019-08-24T14:15:22Z",
- "values": {
- "property1": 0.1,
- "property2": 0.1
}
}
]Returns time-series citation data (mention counts) for a specific query across snapshots.
| query required | string <uuid> Query UUID |
| from_date | string <date-time> |
| to_date | string <date-time> |
| period | string Enum: "7d" "30d" "90d" |
| platforms | string Comma-separated platform keys |
{- "query": "f3c5bd2e-6d34-4350-ae9d-95c2f071389c",
- "from_date": "2019-08-24T14:15:22Z",
- "to_date": "2019-08-24T14:15:22Z",
- "period": "7d",
- "platforms": "string"
}[- {
- "timestamp": "2019-08-24T14:15:22Z",
- "values": {
- "property1": 0.1,
- "property2": 0.1
}
}
]Returns queries that have not yet been included in any analysis snapshot.
| domain required | string |
| topics | Array of strings <uuid> [ items <uuid > ] |
| search | string |
{- "domain": "string",
- "topics": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "search": "string"
}{- "count": 0,
- "results": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "topic_id": "646807af-5da6-43aa-83d3-8ac1d15ab4e5",
- "topic_title": "string",
- "title": "string",
- "query_type": "branded",
- "source": "auto_generated",
- "is_active": true
}
]
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "topic_id": "646807af-5da6-43aa-83d3-8ac1d15ab4e5",
- "topic_title": "string",
- "title": "string",
- "query_type": "branded",
- "source": "auto_generated",
- "is_active": true
}Updates the display title of an existing query.
| title required | string |
{- "title": "string"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "topic_id": "646807af-5da6-43aa-83d3-8ac1d15ab4e5",
- "topic_title": "string",
- "title": "string",
- "query_type": "branded",
- "source": "auto_generated",
- "is_active": true
}Returns raw LLM platform responses for a specific query within a snapshot. Supports optional platform filtering.
| query_id required | string <uuid> Query UUID to retrieve responses for |
| snapshot_id required | string <uuid> Snapshot UUID containing the responses |
| platforms | string Optional comma-separated platform list (e.g., 'openai,gemini') |
{- "query_id": "6fa29c22-6bab-424a-859e-a13a5c607e72",
- "snapshot_id": "163831af-8c1b-4992-a9cf-88c6306604c0",
- "platforms": "string"
}[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "body": "string",
- "platform": "openai"
}
]Citation analysis showing which URLs and domains LLMs cite when answering brand-related queries. Includes domain-level, URL-level, platform-level, topic-level, and query-level citation breakdowns.
Returns cited URLs/domains for a specific query within the analysis window.
| query required | string <uuid> Query UUID |
| from_date | string <date-time> |
| to_date | string <date-time> |
| period | string Enum: "7d" "30d" "90d" |
| platforms | string Comma-separated platform keys |
{- "query": "f3c5bd2e-6d34-4350-ae9d-95c2f071389c",
- "from_date": "2019-08-24T14:15:22Z",
- "to_date": "2019-08-24T14:15:22Z",
- "period": "7d",
- "platforms": "string"
}{- "count": 0,
- "results": [
- {
- "domain_name": "string",
- "mentions": 0,
- "share_of_voice": 0
}
]
}Returns a ranked list of domains cited by LLMs when answering brand-related queries. Includes total mention counts and share of voice per cited domain.
| domain required | string <= 255 characters Brand domain to analyze |
| from_date | string <date-time> Inclusive start time. Overrides period. |
| to_date | string <date-time> Exclusive end time. Defaults to now. |
| period | string Enum: "7d" "30d" "90d" Quick period selector. Ignored if from_date provided. |
| platforms | string Comma-separated platform keys (e.g., 'openai,gemini'). Default: all. |
| topics | string Comma-separated topic UUIDs. Default: all topics. |
| queries | string Comma-separated query UUIDs. Default: all queries. |
| sort_by | string Sort field. Prefix with '-' for descending. |
| search | string Search term for title-based filtering. |
| citation_domain | string <= 255 characters Filter citations for a specific domain only |
{- "domain": "string",
- "from_date": "2019-08-24T14:15:22Z",
- "to_date": "2019-08-24T14:15:22Z",
- "period": "7d",
- "platforms": "string",
- "topics": "string",
- "queries": "string",
- "sort_by": "string",
- "search": "string",
- "citation_domain": "string"
}{- "count": 0,
- "results": [
- {
- "domain_name": "string",
- "mentions": 0,
- "share_of_voice": 0
}
]
}Returns the percentage share of citations per LLM platform within the filtered window. Response is a map of platform key → mention share percentage.
| domain required | string <= 255 characters Brand domain to analyze |
| from_date | string <date-time> Inclusive start time. Overrides period. |
| to_date | string <date-time> Exclusive end time. Defaults to now. |
| period | string Enum: "7d" "30d" "90d" Quick period selector. Ignored if from_date provided. |
| platforms | string Comma-separated platform keys (e.g., 'openai,gemini'). Default: all. |
| topics | string Comma-separated topic UUIDs. Default: all topics. |
| queries | string Comma-separated query UUIDs. Default: all queries. |
| sort_by | string Sort field. Prefix with '-' for descending. |
| search | string Search term for title-based filtering. |
| citation_domain | string <= 255 characters |
{- "domain": "string",
- "from_date": "2019-08-24T14:15:22Z",
- "to_date": "2019-08-24T14:15:22Z",
- "period": "7d",
- "platforms": "string",
- "topics": "string",
- "queries": "string",
- "sort_by": "string",
- "search": "string",
- "citation_domain": "string"
}{- "values": {
- "property1": 0,
- "property2": 0
}
}Returns citation mention counts and share of voice grouped by topic.
| domain required | string <= 255 characters Brand domain to analyze |
| from_date | string <date-time> Inclusive start time. Overrides period. |
| to_date | string <date-time> Exclusive end time. Defaults to now. |
| period | string Enum: "7d" "30d" "90d" Quick period selector. Ignored if from_date provided. |
| platforms | string Comma-separated platform keys (e.g., 'openai,gemini'). Default: all. |
| topics | string Comma-separated topic UUIDs. Default: all topics. |
| queries | string Comma-separated query UUIDs. Default: all queries. |
| sort_by | string Sort field. Prefix with '-' for descending. |
| search | string Search term for title-based filtering. |
| citation_domain | string <= 255 characters |
{- "domain": "string",
- "from_date": "2019-08-24T14:15:22Z",
- "to_date": "2019-08-24T14:15:22Z",
- "period": "7d",
- "platforms": "string",
- "topics": "string",
- "queries": "string",
- "sort_by": "string",
- "search": "string",
- "citation_domain": "string"
}{- "count": 0,
- "results": [
- {
- "topic_id": "646807af-5da6-43aa-83d3-8ac1d15ab4e5",
- "topic_title": "string",
- "mentions": 0,
- "share_of_voice": 0
}
]
}Returns citation mention counts and share of voice grouped by query.
| domain required | string <= 255 characters Brand domain to analyze |
| from_date | string <date-time> Inclusive start time. Overrides period. |
| to_date | string <date-time> Exclusive end time. Defaults to now. |
| period | string Enum: "7d" "30d" "90d" Quick period selector. Ignored if from_date provided. |
| platforms | string Comma-separated platform keys (e.g., 'openai,gemini'). Default: all. |
| topics | string Comma-separated topic UUIDs. Default: all topics. |
| queries | string Comma-separated query UUIDs. Default: all queries. |
| sort_by | string Sort field. Prefix with '-' for descending. |
| search | string Search term for title-based filtering. |
| citation_domain | string <= 255 characters |
{- "domain": "string",
- "from_date": "2019-08-24T14:15:22Z",
- "to_date": "2019-08-24T14:15:22Z",
- "period": "7d",
- "platforms": "string",
- "topics": "string",
- "queries": "string",
- "sort_by": "string",
- "search": "string",
- "citation_domain": "string"
}{- "count": 0,
- "results": [
- {
- "query_id": "6fa29c22-6bab-424a-859e-a13a5c607e72",
- "query_title": "string",
- "mentions": 0,
- "share_of_voice": 0
}
]
}Returns individual URL-level citation metrics including domain, mention count, share of voice, citation score, average rank, and platforms that cited each URL.
| domain required | string <= 255 characters Brand domain to analyze |
| from_date | string <date-time> Inclusive start time. Overrides period. |
| to_date | string <date-time> Exclusive end time. Defaults to now. |
| period | string Enum: "7d" "30d" "90d" Quick period selector. Ignored if from_date provided. |
| platforms | string Comma-separated platform keys (e.g., 'openai,gemini'). Default: all. |
| topics | string Comma-separated topic UUIDs. Default: all topics. |
| queries | string Comma-separated query UUIDs. Default: all queries. |
| sort_by | string Sort field. Prefix with '-' for descending. |
| search | string Search term for title-based filtering. |
| citation_domain | string <= 255 characters |
| citation_url | string <= 2048 characters Exact URL to filter for |
{- "domain": "string",
- "from_date": "2019-08-24T14:15:22Z",
- "to_date": "2019-08-24T14:15:22Z",
- "period": "7d",
- "platforms": "string",
- "topics": "string",
- "queries": "string",
- "sort_by": "string",
- "search": "string",
- "citation_domain": "string",
- "citation_url": "string"
}{- "count": 0,
- "results": [
- {
- "domain_name": "string",
- "url": "string",
- "mentions": 0,
- "share_of_voice": 0,
- "citation_score": 0,
- "avg_rank": 0.1,
- "platforms": [
- "string"
]
}
]
}Returns which queries led to which URL citations. Enables Query → URL → Citation drilldown analysis.
| domain required | string <= 255 characters Brand domain to analyze |
| from_date | string <date-time> Inclusive start time. Overrides period. |
| to_date | string <date-time> Exclusive end time. Defaults to now. |
| period | string Enum: "7d" "30d" "90d" Quick period selector. Ignored if from_date provided. |
| platforms | string Comma-separated platform keys (e.g., 'openai,gemini'). Default: all. |
| topics | string Comma-separated topic UUIDs. Default: all topics. |
| queries | string Comma-separated query UUIDs. Default: all queries. |
| sort_by | string Sort field. Prefix with '-' for descending. |
| search | string Search term for title-based filtering. |
| citation_domain | string <= 255 characters |
| citation_url | string <= 2048 characters |
{- "domain": "string",
- "from_date": "2019-08-24T14:15:22Z",
- "to_date": "2019-08-24T14:15:22Z",
- "period": "7d",
- "platforms": "string",
- "topics": "string",
- "queries": "string",
- "sort_by": "string",
- "search": "string",
- "citation_domain": "string",
- "citation_url": "string"
}{- "count": 0,
- "results": [
- {
- "query_id": "6fa29c22-6bab-424a-859e-a13a5c607e72",
- "query_title": "string",
- "url": "string",
- "domain_name": "string",
- "mentions": 0,
- "share_of_voice": 0,
- "citation_score": 0,
- "avg_rank": 0.1
}
]
}Returns citation performance for each URL broken down by LLM platform. Useful for understanding which platforms cite specific URLs.
| domain required | string <= 255 characters Brand domain to analyze |
| from_date | string <date-time> Inclusive start time. Overrides period. |
| to_date | string <date-time> Exclusive end time. Defaults to now. |
| period | string Enum: "7d" "30d" "90d" Quick period selector. Ignored if from_date provided. |
| platforms | string Comma-separated platform keys (e.g., 'openai,gemini'). Default: all. |
| topics | string Comma-separated topic UUIDs. Default: all topics. |
| queries | string Comma-separated query UUIDs. Default: all queries. |
| sort_by | string Sort field. Prefix with '-' for descending. |
| search | string Search term for title-based filtering. |
| citation_domain | string <= 255 characters |
| citation_url | string <= 2048 characters |
{- "domain": "string",
- "from_date": "2019-08-24T14:15:22Z",
- "to_date": "2019-08-24T14:15:22Z",
- "period": "7d",
- "platforms": "string",
- "topics": "string",
- "queries": "string",
- "sort_by": "string",
- "search": "string",
- "citation_domain": "string",
- "citation_url": "string"
}{- "count": 0,
- "results": [
- {
- "url": "string",
- "domain_name": "string",
- "platform": "string",
- "mentions": 0,
- "share_of_voice": 0,
- "citation_score": 0,
- "avg_rank": 0.1
}
]
}On-demand prompt testing - submit arbitrary prompts to multiple LLM platforms and get structured analysis including brand mentions, citations, sentiment, and competitor visibility.
Returns all prompt analysis submissions for the authenticated user, ordered by most recent.
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "status": "pending",
- "platforms": [
- "string"
], - "country_code": "string",
- "prompts_count": 0,
- "responses_count": 0,
- "created": "2019-08-24T14:15:22Z",
- "completed_at": "2019-08-24T14:15:22Z",
- "target_domain": "string"
}
]Submits 1-100 prompts for execution across the specified LLM platforms.
Analysis runs asynchronously via BrightData integration. Poll the
check-status endpoint to track completion.
No quota restrictions - PS runs independently of project quota.
| prompts required | Array of strings [ 1 .. 100 ] items [ items <= 5000 characters ] List of prompt texts to execute |
| platforms required | Array of strings (PlatformEnum) non-empty Items Enum: "openai" "gemini" "perplexity" "copilot" "google_ai_mode" "grok" Platforms to execute prompts on (no duplicates) |
| country_code | string <= 2 characters Default: "US" ISO 3166-1 alpha-2 country code. Defaults to 'US'. |
| target_domain | string or null <= 255 characters Optional target domain for comparison mode |
{- "prompts": [
- "What are the best SEO tools in 2024?",
- "How does SearchAtlas compare to Semrush?"
], - "platforms": [
- "openai",
- "gemini"
], - "country_code": "US",
- "target_domain": "searchatlas.com"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "status": "pending",
- "platforms": [
- "string"
], - "country_code": "string",
- "prompts_count": 0,
- "responses_count": 0,
- "created": "2019-08-24T14:15:22Z",
- "completed_at": "2019-08-24T14:15:22Z",
- "target_domain": "string"
}Returns the current status of one or more prompt analysis submissions.
| analysis_ids required | Array of strings <uuid> [ items <uuid > ] List of analysis IDs to check |
{- "analysis_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "status": "pending",
- "platforms": [
- "string"
], - "country_code": "string",
- "prompts_count": 0,
- "responses_count": 0,
- "created": "2019-08-24T14:15:22Z",
- "completed_at": "2019-08-24T14:15:22Z",
- "target_domain": "string"
}
]Returns a flat list of individual prompt submissions with their analysis context.
[- {
- "prompt_id": "24783230-27c2-455c-9de9-95bbdbb78c3d",
- "prompt_title": "string",
- "analysis_id": "6ad457ea-9426-4897-bff8-c6f3fe690582",
- "analysis_country_code": "string",
- "analysis_target_domain": "string",
- "analysis_created": "2019-08-24T14:15:22Z",
- "platforms": [
- "string"
]
}
]Returns full analysis detail including all prompts and their raw LLM responses.
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "status": "pending",
- "platforms": [
- "string"
], - "country_code": "string",
- "prompts_count": 0,
- "responses_count": 0,
- "created": "2019-08-24T14:15:22Z",
- "completed_at": "2019-08-24T14:15:22Z",
- "target_domain": "string",
- "error_message": "string",
- "prompts": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "order": 0,
- "responses": [
- {
- "platform": "string",
- "body": "string"
}
]
}
]
}Returns individual LLM response items with brand mention metrics, citations, and competitor brands for each response.
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "platform": "string",
- "prompt_title": "string",
- "body": "string",
- "position_rank": 0,
- "citations_count": 0,
- "brands_count": 0,
- "mentioned": true,
- "brands": [
- "string"
], - "citations": [
- "string"
]
}
]Returns aggregated summary metrics for the analysis including total platforms, brand mention rate, share of voice, average position, top competitors, and most cited domains.
{- "total_platforms": 0,
- "mentioned_platforms": 0,
- "share_of_voice": 0.1,
- "average_position": 0.1,
- "top_competitors": [
- {
- "domain_name": "string",
- "visibility_score": 0.1
}
], - "common_citations": [
- {
- "domain_name": "string",
- "count": 0
}
]
}Returns competitor visibility scores for bar chart display, comparing the target brand against discovered competitors across all responses.
[- {
- "domain_name": "string",
- "visibility_score": 0.1,
- "is_target": true
}
]Credit balance management for the credit-based quota system. 1 credit = 1 query × 1 platform × 1 refresh.
Returns the credit usage log entries for a specific project.
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "action": "string",
- "credits_consumed": 0,
- "query_count": 0,
- "platform_count": 0,
- "frequency_days": 0,
- "balance_after": 0,
- "metadata": { },
- "created": "2019-08-24T14:15:22Z"
}
]Returns the customer's overall credit balance including:
{- "monthly_total": 0,
- "monthly_consumed": 0,
- "monthly_remaining": 0,
- "purchased_total": 0,
- "purchased_consumed": 0,
- "purchased_remaining": 0,
- "total_remaining": 0,
- "credit_system_enabled": true
}Estimates the credit impact for a given configuration without consuming any credits. Use this before tracking a project to show users the expected monthly cost.
Formula: credits_per_run = query_count × platform_count
Monthly estimate: credits_per_run × (30 / frequency_days)
| query_count required | integer >= 0 Number of active queries |
| platform_count required | integer [ 1 .. 6 ] Number of selected platforms |
| frequency_days required | integer (FrequencyDaysEnum) Enum: 1 3 7 14 30 Refresh frequency in days |
{- "query_count": 20,
- "platform_count": 3,
- "frequency_days": 7
}{- "credits_per_run": 0,
- "refreshes_per_month": 0,
- "estimated_monthly_credits": 0,
- "query_count": 0,
- "platform_count": 0,
- "frequency_days": 0
}Returns the total projected monthly credit usage across all user-tracked projects. Includes per-project breakdown showing cost per run, frequency, and monthly estimate.
{- "total_projected_monthly_credits": 0,
- "project_count": 0,
- "projects": [
- {
- "project_id": "405d8375-3514-403b-8c43-83ae74cfe0e9",
- "domain": "string",
- "credit_cost_per_run": 0,
- "frequency_days": 0,
- "refreshes_per_month": 0,
- "projected_monthly_credits": 0
}
]
}Returns notification data for platforms currently in a degraded or disabled state. Used to surface banners/warnings in the UI.
Note: The camelCase URL is preserved for backward compatibility.
[- {
- "platform": "string",
- "status": "degraded",
- "message": "string",
- "comments": "string"
}
]Returns the list of platforms configured for an existing project associated with the given domain. Used by QP Report Builder to populate platform filters.
QP integration: Called by QP Report Builder before generating reports.
| domain required | string Domain to get project platforms for (e.g., 'searchatlas.com') |
{- "platforms": [
- {
- "key": "openai",
- "title": "string"
}
]
}Site Explorer integration endpoints - visibility overview, LLM visibility table, sentiment table, analysis status, and query response detail.
Returns high-level visibility metrics for a domain from the latest successful analysis. Aggregates topic coverage, brand presence, and sentiment across platforms.
Used by the Site Explorer module. Supports public access via share hash.
QP integration: Used by QP for homepage dashboard brand mentions.
| domain required | string |
{- "domain": "string",
- "platforms": [
- {
- "platform": "string",
- "brand_topics_count": 0,
- "total_topics_count": 0,
- "sentiment_percentage": 0
}
], - "project_public_hash": "6caac543-81cf-491f-a6ae-ecbef367d59c"
}Returns a table of topic/query pairs with visibility scores, brand rank, citation share of voice, and potential search volume. Used to power the main LLM visibility table in Site Explorer.
| domain required | string |
| platform | string Enum: "openai" "gemini" "perplexity" "copilot" "google_ai_mode" "grok" Optional platform filter |
[- {
- "topic": "string",
- "query": "string",
- "query_id": "6fa29c22-6bab-424a-859e-a13a5c607e72",
- "visibility_score": 0.1,
- "brand_rank": 0,
- "citation_share_of_voice": 0.1,
- "potential_search_volume": 0
}
]Returns a table of topic/query pairs with sentiment scores for the domain. Supports platform and sentiment category filtering.
| domain required | string |
| platform | string Enum: "openai" "gemini" "perplexity" "copilot" "google_ai_mode" "grok" |
| sentiment | string Enum: "" "positive" "neutral" "negative" Filter by sentiment category |
[- {
- "topic": "string",
- "query": "string",
- "query_id": "6fa29c22-6bab-424a-859e-a13a5c607e72",
- "sentiment_score": 0.1
}
]Returns the current analysis status for a domain. Includes snapshot ID, project ID, platform completion tracking, and any in-progress analysis info. Used to poll for analysis readiness and display progress indicators.
| domain required | string |
{- "domain": "string",
- "status": "pending",
- "project_id": "405d8375-3514-403b-8c43-83ae74cfe0e9",
- "snapshot_id": "163831af-8c1b-4992-a9cf-88c6306604c0",
- "created": "2019-08-24T14:15:22Z",
- "modified": "2019-08-24T14:15:22Z",
- "completed_platforms": [
- "string"
], - "pending_platforms": [
- "string"
], - "total_platforms": 0,
- "latest_analysis": {
- "snapshot_id": "163831af-8c1b-4992-a9cf-88c6306604c0",
- "project_id": "405d8375-3514-403b-8c43-83ae74cfe0e9",
- "status": "string",
- "created": "2019-08-24T14:15:22Z",
- "completed_platforms": [
- "string"
], - "pending_platforms": [
- "string"
], - "total_platforms": 0
}
}Returns the raw LLM response body for a specific domain, platform, and query.
| domain required | string |
| platform required | string Enum: "openai" "gemini" "perplexity" "copilot" "google_ai_mode" "grok" |
| query_id required | string <uuid> |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "body": "string",
- "snapshot_date": "2019-08-24",
- "top_competitors": [
- "string"
], - "target_brand_domain": "string"
}Google Ads campaign management and automation platform. Connect Google Ads accounts, manage business profiles, create and optimize campaigns with AI-generated keywords and ad copy, run PPC audits across 5 pillars (campaign efficiency, keyword performance, creative quality, account health, spend efficiency), and manage retargeting audiences.
Base URL: https://otto-ppc.searchatlas.com
Returns all active Google Ads accounts associated with the authenticated user's customer account. Accounts must have a name and be marked active.
[- {
- "id": 0,
- "email": "user@example.com",
- "account_name": "string",
- "account_id": "string",
- "manager_id": "string",
- "status": "string",
- "developer_token": "string",
- "client_credentials": { },
- "is_selected": true,
- "is_active": true,
- "currency_code": "USD",
- "currency_symbol": "$"
}
]Syncs the local database with the Google Search Console (GSC) first, then returns all Google Ads accounts grouped by the user's Google email address. Includes internal selection/active status and credential metadata.
[- {
- "email": "user@example.com",
- "status": "string",
- "google_ads_accounts": [
- {
- "id": 0,
- "email": "user@example.com",
- "account_name": "string",
- "account_id": "string",
- "manager_id": "string",
- "status": "string",
- "developer_token": "string",
- "client_credentials": { },
- "is_selected": true,
- "is_active": true,
- "currency_code": "USD",
- "currency_symbol": "$"
}
]
}
]Returns all business profiles for the authenticated user's account, annotated with campaign counts, retargeting status, and currency info. Supports search by name, ordering, and campaign-type filtering.
| search | string Filter by business name |
| ordering | string Field to order results by. Prefix with |
| status | string Filter by business status |
[- {
- "id": 0,
- "name": "string",
- "status": "string",
- "common_status": "string",
- "last_operation_timestamp": 0,
- "google_ads_account": 0,
- "published_ads_count": 0,
- "target_language": "string",
- "currency": {
- "currency_symbol": "string",
- "currency_code": "string"
}, - "internal_campaigns_type": [
- "SEARCH"
], - "show_activation_modal": true,
- "all_products_retargeted": true,
- "created_campaigns_count": 0,
- "has_active_campaign": true,
- "active_campaign_count": 0,
- "description": "string",
- "revenue_model": "string",
- "brand_identity": "string",
- "value_proposition": "string",
- "brand_vault_uuid": "ed6573dc-c380-4a19-bc05-007c933224bc"
}
]Creates a new business profile linked to a Google Ads account. Triggers asynchronous background jobs to process industries, phone numbers, and competitors.
If import_campaign=true, the business is created in importing state.
If brand_vault_uuid is provided, brand strategy fields are synced from Brand Vault.
| name | string or null <= 255 characters Business name. Defaults to website_url if not provided. |
| website_url | string <= 2048 characters |
| description | string or null |
| google_ads_account required | integer Required - ID of the connected AdsAccount |
Array of objects (LocationEntry) <= 100 items | |
| revenue_model | string or null |
| brand_identity | string or null |
| value_proposition | string or null |
| specific_landing_page | string or null |
| target_language | string or null Google Ads language criterion ID |
| internal_campaigns_type | Array of strings Items Enum: "SEARCH" "IMPORTED" |
| enable_local_keywords | boolean Default: false |
| brand_vault_uuid | string or null <uuid> Link to Brand Vault profile (cannot be changed after creation) |
| import_campaign | boolean Default: false Set true to start the business in campaign-import mode |
| confirm_vault_write_back | boolean Default: false If true, writes brand strategy fields back to Brand Vault |
{- "name": "Acme Corp",
- "google_ads_account": 42,
- "description": "B2B SaaS for project management",
- "revenue_model": "Subscription",
- "brand_identity": "Professional and approachable",
- "value_proposition": "Save 10 hours a week on reporting",
- "location_data": [
- {
- "type": "location",
- "locationId": "1014044",
- "is_negative": false
}
], - "target_language": "1000",
- "internal_campaigns_type": [
- "SEARCH"
]
}{- "id": 0,
- "name": "string",
- "status": "string",
- "common_status": "string",
- "last_operation_timestamp": 0,
- "google_ads_account": 0,
- "published_ads_count": 0,
- "target_language": "string",
- "currency": {
- "currency_symbol": "string",
- "currency_code": "string"
}, - "internal_campaigns_type": [
- "SEARCH"
], - "show_activation_modal": true,
- "all_products_retargeted": true,
- "created_campaigns_count": 0,
- "has_active_campaign": true,
- "active_campaign_count": 0,
- "description": "string",
- "revenue_model": "string",
- "brand_identity": "string",
- "value_proposition": "string",
- "brand_vault_uuid": "ed6573dc-c380-4a19-bc05-007c933224bc",
- "location_data": [
- {
- "type": "location",
- "locationId": "string",
- "is_negative": false,
- "radius_targeting": {
- "country_code": "string",
- "city": "string",
- "radius": 0,
- "radius_units": "km"
}
}
], - "specific_landing_page": "string",
- "enable_local_keywords": false
}V2 version of the business list endpoint with extended product data.
| search | string |
| ordering | string |
[- {
- "id": 0,
- "name": "string",
- "status": "string",
- "common_status": "string",
- "last_operation_timestamp": 0,
- "google_ads_account": 0,
- "published_ads_count": 0,
- "target_language": "string",
- "currency": {
- "currency_symbol": "string",
- "currency_code": "string"
}, - "internal_campaigns_type": [
- "SEARCH"
], - "show_activation_modal": true,
- "all_products_retargeted": true,
- "created_campaigns_count": 0,
- "has_active_campaign": true,
- "active_campaign_count": 0,
- "description": "string",
- "revenue_model": "string",
- "brand_identity": "string",
- "value_proposition": "string",
- "brand_vault_uuid": "ed6573dc-c380-4a19-bc05-007c933224bc"
}
]Returns the full details of a single business profile including campaign metadata.
{- "id": 0,
- "name": "string",
- "status": "string",
- "common_status": "string",
- "last_operation_timestamp": 0,
- "google_ads_account": 0,
- "published_ads_count": 0,
- "target_language": "string",
- "currency": {
- "currency_symbol": "string",
- "currency_code": "string"
}, - "internal_campaigns_type": [
- "SEARCH"
], - "show_activation_modal": true,
- "all_products_retargeted": true,
- "created_campaigns_count": 0,
- "has_active_campaign": true,
- "active_campaign_count": 0,
- "description": "string",
- "revenue_model": "string",
- "brand_identity": "string",
- "value_proposition": "string",
- "brand_vault_uuid": "ed6573dc-c380-4a19-bc05-007c933224bc",
- "location_data": [
- {
- "type": "location",
- "locationId": "string",
- "is_negative": false,
- "radius_targeting": {
- "country_code": "string",
- "city": "string",
- "radius": 0,
- "radius_units": "km"
}
}
], - "specific_landing_page": "string",
- "enable_local_keywords": false
}Partially updates a business profile. Location data changes trigger automatic re-sync of local keyword geo-variants when enabled.
Note: internal_campaigns_type and brand_vault_uuid cannot be updated after creation.
| name | string <= 255 characters |
| website_url | string <= 2048 characters |
| description | string |
Array of objects (LocationEntry) <= 100 items | |
| revenue_model | string |
| brand_identity | string |
| value_proposition | string |
| specific_landing_page | string |
| target_language | string |
| enable_local_keywords | boolean |
| import_campaign | boolean |
{- "name": "string",
- "website_url": "string",
- "description": "string",
- "location_data": [
- {
- "type": "location",
- "locationId": "string",
- "is_negative": false,
- "radius_targeting": {
- "country_code": "string",
- "city": "string",
- "radius": 0,
- "radius_units": "km"
}
}
], - "revenue_model": "string",
- "brand_identity": "string",
- "value_proposition": "string",
- "specific_landing_page": "string",
- "target_language": "string",
- "enable_local_keywords": true,
- "import_campaign": true
}{- "id": 0,
- "name": "string",
- "status": "string",
- "common_status": "string",
- "last_operation_timestamp": 0,
- "google_ads_account": 0,
- "published_ads_count": 0,
- "target_language": "string",
- "currency": {
- "currency_symbol": "string",
- "currency_code": "string"
}, - "internal_campaigns_type": [
- "SEARCH"
], - "show_activation_modal": true,
- "all_products_retargeted": true,
- "created_campaigns_count": 0,
- "has_active_campaign": true,
- "active_campaign_count": 0,
- "description": "string",
- "revenue_model": "string",
- "brand_identity": "string",
- "value_proposition": "string",
- "brand_vault_uuid": "ed6573dc-c380-4a19-bc05-007c933224bc",
- "location_data": [
- {
- "type": "location",
- "locationId": "string",
- "is_negative": false,
- "radius_targeting": {
- "country_code": "string",
- "city": "string",
- "radius": 0,
- "radius_units": "km"
}
}
], - "specific_landing_page": "string",
- "enable_local_keywords": false
}Triggers an asynchronous crawl of the business website to discover new products or services that can be turned into ad campaigns. Returns a task ID to poll.
{- "task_id": "string",
- "status": "pending"
}Products are the campaign-level units within a business - each product maps to a Google Ads campaign
Returns products for the authenticated user's account with campaign performance metrics.
Filterable by business_id, campaign_id, product_id, is_approved, and
internal_campaign_type. Supports search and ordering.
| business_id | integer Filter by business ID |
| is_approved | boolean Filter by approval status |
| campaign_id | integer |
| product_id | integer |
| internal_campaign_type | string Enum: "SEARCH" "RETARGETED" |
| product_ids | string Comma-separated list of product IDs |
[- {
- "product_id": 0,
- "product_name": "string",
- "is_approved": true,
- "common_status": "string",
- "is_branded": true,
- "campaign_id": 0,
- "campaign_name": "string",
- "remote_id": "string",
- "remote_status": "ENABLED",
- "campaign_sync_status": "string",
- "campaign_sync_error_msg": "string",
- "campaign_type": "Search Campaign",
- "last_operation_timestamp": 0,
- "ads_count": 0,
- "ads_groups_count": 0,
- "campaign_budget": {
- "id": 0,
- "amount": 0,
- "currency_symbol": "string",
- "currency_code": "string",
- "amount_string": "string"
}, - "business": 0,
- "category": "string",
- "description": "string",
- "unique_selling_points": [
- "string"
], - "include_free_or_cheap_words": true,
- "include_competitors_names": true,
- "landing_page_valid": true,
- "validation_error": "string",
- "has_ai_landing_page_active": true,
- "approved_ads_count": 0,
- "approved_ad_groups_count": 0,
- "negative_keywords_sync_enabled": true,
- "negative_keyword_count": 0,
- "negative_keywords_last_synced_date": "2019-08-24T14:15:22Z",
- "bidding_strategy_type": "string",
- "target_cpa": 0,
- "max_cpc_bid": 0,
- "target_roas": 0,
- "clicks": 0,
- "conversions": 0,
- "cost": 0,
- "ctr": 0,
- "location_fraction": 0
}
]V2 version of the products list with extended keyword cluster and performance data.
| business_id | integer |
| is_approved | boolean |
| campaign_id | integer |
[- {
- "product_id": 0,
- "product_name": "string",
- "is_approved": true,
- "common_status": "string",
- "is_branded": true,
- "campaign_id": 0,
- "campaign_name": "string",
- "remote_id": "string",
- "remote_status": "ENABLED",
- "campaign_sync_status": "string",
- "campaign_sync_error_msg": "string",
- "campaign_type": "Search Campaign",
- "last_operation_timestamp": 0,
- "ads_count": 0,
- "ads_groups_count": 0,
- "campaign_budget": {
- "id": 0,
- "amount": 0,
- "currency_symbol": "string",
- "currency_code": "string",
- "amount_string": "string"
}, - "business": 0,
- "category": "string",
- "description": "string",
- "unique_selling_points": [
- "string"
], - "include_free_or_cheap_words": true,
- "include_competitors_names": true,
- "landing_page_valid": true,
- "validation_error": "string",
- "has_ai_landing_page_active": true,
- "approved_ads_count": 0,
- "approved_ad_groups_count": 0,
- "negative_keywords_sync_enabled": true,
- "negative_keyword_count": 0,
- "negative_keywords_last_synced_date": "2019-08-24T14:15:22Z",
- "bidding_strategy_type": "string",
- "target_cpa": 0,
- "max_cpc_bid": 0,
- "target_roas": 0,
- "clicks": 0,
- "conversions": 0,
- "cost": 0,
- "ctr": 0,
- "location_fraction": 0
}
]Creates a new product (and its associated campaign) for a given business. If a product with the same slugified name already exists, it is updated instead. Automatically assigns a category of "Service" if none is provided.
| business_id required | integer |
| name required | string |
| landing_page required | string <uri> |
| description required | string |
| category | string Defaults to "Service" if not provided |
| unique_selling_points | Array of strings Default: [] |
| include_free_or_cheap_words | boolean Default: false |
| include_competitors_names | boolean Default: false |
| landing_page_valid | boolean Default: false |
| validation_error | string |
{- "business_id": 12,
- "name": "Project Management Software",
- "description": "Cloud-based project management tool for teams",
- "category": "Software",
- "unique_selling_points": [
- "Free trial",
- "Integrates with Slack"
], - "include_free_or_cheap_words": false,
- "include_competitors_names": false
}{- "id": 0,
- "status": "string",
- "name": "string",
- "category": "string",
- "description": "string",
- "unique_selling_points": [
- "string"
], - "include_free_or_cheap_words": true,
- "is_branded": true,
- "include_competitors_names": true,
- "task_status": "string",
- "task_status_display": "string",
- "task_process_started_at": "2019-08-24T14:15:22Z",
- "task_process_ended_at": "2019-08-24T14:15:22Z"
}Triggers AI-powered generation of product definitions for the given business. Products are generated from the business website content. Returns a task ID.
{- "task_id": "string",
- "status": "pending"
}Adds multiple products to a business in a single request. Useful for importing product catalogs or adding multiple pages at once.
required | Array of objects (ProductCreateRequest) |
{- "products": [
- {
- "business_id": 0,
- "name": "string",
- "description": "string",
- "category": "string",
- "unique_selling_points": [ ],
- "include_free_or_cheap_words": false,
- "include_competitors_names": false,
- "landing_page_valid": false,
- "validation_error": "string"
}
]
}Partially updates a product's name, landing page, description, USPs, and targeting settings.
| name | string |
| landing_page | string <uri> |
| description | string |
| category | string |
| unique_selling_points | Array of strings |
| include_free_or_cheap_words | boolean |
| include_competitors_names | boolean |
{- "name": "string",
- "description": "string",
- "category": "string",
- "unique_selling_points": [
- "string"
], - "include_free_or_cheap_words": true,
- "include_competitors_names": true
}{- "product_id": 0,
- "product_name": "string",
- "is_approved": true,
- "common_status": "string",
- "is_branded": true,
- "campaign_id": 0,
- "campaign_name": "string",
- "remote_id": "string",
- "remote_status": "ENABLED",
- "campaign_sync_status": "string",
- "campaign_sync_error_msg": "string",
- "campaign_type": "Search Campaign",
- "last_operation_timestamp": 0,
- "ads_count": 0,
- "ads_groups_count": 0,
- "campaign_budget": {
- "id": 0,
- "amount": 0,
- "currency_symbol": "string",
- "currency_code": "string",
- "amount_string": "string"
}, - "business": 0,
- "category": "string",
- "description": "string",
- "unique_selling_points": [
- "string"
], - "include_free_or_cheap_words": true,
- "include_competitors_names": true,
- "landing_page_valid": true,
- "validation_error": "string",
- "has_ai_landing_page_active": true,
- "approved_ads_count": 0,
- "approved_ad_groups_count": 0,
- "negative_keywords_sync_enabled": true,
- "negative_keyword_count": 0,
- "negative_keywords_last_synced_date": "2019-08-24T14:15:22Z",
- "bidding_strategy_type": "string",
- "target_cpa": 0,
- "max_cpc_bid": 0,
- "target_roas": 0,
- "clicks": 0,
- "conversions": 0,
- "cost": 0,
- "ctr": 0,
- "location_fraction": 0
}Toggles the remote status of a product's campaign on Google Ads (e.g. enable/pause). Optionally propagates the status change to related ad groups and ads.
| task_status required | string Enum: "READY" "ACTIVE" "READY_NOT_ACTIVE" "PAUSED" "ENABLED" Maps to Google Ads remote status:
|
| include_related | boolean Default: true When true, propagates the status change to related ad groups and ads |
{- "task_status": "READY",
- "include_related": true
}Enables or pauses multiple products' Google Ads campaigns in one call.
| product_ids required | Array of integers |
| task_status required | string Enum: "ENABLED" "PAUSED" |
| include_related | boolean Default: true |
{- "product_ids": [
- 0
], - "task_status": "ENABLED",
- "include_related": true
}Soft-deletes (marks as removed) a product and its campaign.
Use delete_from_google=true to also remove the campaign from Google Ads.
Use delete_retargeting_campaign=true to remove any associated retargeting campaign.
| delete_from_google | boolean Default: false |
| delete_retargeting_campaign | boolean Default: false |
Soft-deletes multiple products and their campaigns in one call.
| product_ids required | Array of integers |
| delete_from_google | boolean Default: false |
{- "product_ids": [
- 0
], - "delete_from_google": false
}Returns products with their keyword clusters nested under each product.
Used for the grouped keyword view in the UI. Supports filtering by
business_id, search_intent, match_type, and approval status.
| business_id required | integer |
| ordering | string Order clusters by: relevancy_score, sv_total, cpc_avg, cmp_avg |
| search_intent | string |
| match_type | string Enum: "BROAD" "PHRASE" "EXACT" |
| approval_status | string Enum: "approved" "non_approved" |
[- {
- "product_id": 0,
- "product_name": "string",
- "is_approved": true,
- "common_status": "string",
- "category": "string",
- "description": "string",
- "keyword_clusters": [
- {
- "keyword_cluster_id": 0,
- "keyword_cluster_title": "string",
- "ad_group_id": 0,
- "ad_group_name": "string",
- "product_id": 0,
- "campaign_id": 0,
- "business_id": 0,
- "remote_id": "string",
- "remote_status": "ENABLED",
- "ad_group_sync_status": "string",
- "ad_group_sync_error_msg": "string",
- "common_status": "string",
- "is_approved": true,
- "match_type": "BROAD",
- "relevancy_score": 0,
- "search_intent": "string",
- "sv_total": 0,
- "cpc_avg": 0,
- "cmp_avg": 0,
- "ads_count": 0,
- "last_operation_timestamp": 0,
- "processing_status": "string",
- "is_ready_for_approval": true,
- "processing_status_display": "string",
- "keywords": [
- "string"
], - "keywords_with_metrics": [
- {
- "keyword": "string",
- "sv": 0,
- "cpc": 0,
- "cmp": 0
}
], - "keywords_grouped_by_category": {
- "market_opportunity": {
- "count": 0,
- "keywords": [
- {
- "keyword": "string",
- "sv": 0,
- "cpc": 0,
- "cmp": 0,
- "relevancy_score": 0,
- "match_type": "string"
}
]
}, - "demand_level": {
- "count": 0,
- "keywords": [
- {
- "keyword": "string",
- "sv": 0,
- "cpc": 0,
- "cmp": 0,
- "relevancy_score": 0,
- "match_type": "string"
}
]
}, - "competition_intensity": {
- "count": 0,
- "keywords": [
- {
- "keyword": "string",
- "sv": 0,
- "cpc": 0,
- "cmp": 0,
- "relevancy_score": 0,
- "match_type": "string"
}
]
}
}
}
]
}
]Campaign configuration, budget creation, bulk publishing, and settings management
Returns all campaigns for the authenticated user's account.
Filterable by business_id, ads_account_id, and internal_campaign_type.
| business_id | integer |
| ads_account_id | integer |
| internal_campaign_type | string Enum: "SEARCH" "RETARGETED" |
[- {
- "id": 0,
- "name": "string",
- "business_id": 0,
- "product_id": 0,
- "status": "string",
- "status_display": "string",
- "action": "string",
- "action_display": "string",
- "remote_id": "string",
- "remote_status": "string",
- "remote_status_display": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "campaign_budget": {
- "id": 0,
- "amount_micros": 0,
- "delivery_method": "STANDARD",
- "status": "string",
- "action": "string",
- "remote_id": "string",
- "remote_status": "string",
- "error_message": "string",
- "created_at": "2019-08-24T14:15:22Z"
}, - "ads_account": {
- "id": 0,
- "email": "user@example.com",
- "account_name": "string",
- "account_id": "string",
- "manager_id": "string",
- "status": "string",
- "developer_token": "string",
- "client_credentials": { },
- "is_selected": true,
- "is_active": true,
- "currency_code": "USD",
- "currency_symbol": "$"
}, - "negative_keywords_sync_enabled": true,
- "has_active_adgroups": true,
- "currency": {
- "currency_symbol": "string",
- "currency_code": "string"
}, - "internal_campaign_type": "SEARCH",
- "clicks": 0,
- "ctr": 0,
- "cost": 0,
- "conversions": 0,
- "impressions": 0,
- "remote_start_date": "2019-08-24",
- "activate_retargeting_auto": true,
- "landing_page_valid": true,
- "keyword_clusters_ready": true,
- "ads_created": true,
- "campaign_published": true,
- "location_criteria": [
- 0
], - "language_criteria": [
- "string"
], - "advertising_channel_type": "string",
- "store_goals_enabled": true
}
]Partially updates campaign fields such as name, remote_status,
negative_keywords_sync_enabled, and bidding strategy fields.
| name | string <= 255 characters |
| remote_status | string Enum: "ENABLED" "PAUSED" |
| negative_keywords_sync_enabled | boolean |
| bidding_strategy_type | string |
| target_cpa | number |
| max_cpc_bid | number |
| target_roas | number |
{- "name": "string",
- "remote_status": "ENABLED",
- "negative_keywords_sync_enabled": true,
- "bidding_strategy_type": "string",
- "target_cpa": 0,
- "max_cpc_bid": 0,
- "target_roas": 0
}{- "id": 0,
- "name": "string",
- "business_id": 0,
- "product_id": 0,
- "status": "string",
- "status_display": "string",
- "action": "string",
- "action_display": "string",
- "remote_id": "string",
- "remote_status": "string",
- "remote_status_display": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "campaign_budget": {
- "id": 0,
- "amount_micros": 0,
- "delivery_method": "STANDARD",
- "status": "string",
- "action": "string",
- "remote_id": "string",
- "remote_status": "string",
- "error_message": "string",
- "created_at": "2019-08-24T14:15:22Z"
}, - "ads_account": {
- "id": 0,
- "email": "user@example.com",
- "account_name": "string",
- "account_id": "string",
- "manager_id": "string",
- "status": "string",
- "developer_token": "string",
- "client_credentials": { },
- "is_selected": true,
- "is_active": true,
- "currency_code": "USD",
- "currency_symbol": "$"
}, - "negative_keywords_sync_enabled": true,
- "has_active_adgroups": true,
- "currency": {
- "currency_symbol": "string",
- "currency_code": "string"
}, - "internal_campaign_type": "SEARCH",
- "clicks": 0,
- "ctr": 0,
- "cost": 0,
- "conversions": 0,
- "impressions": 0,
- "remote_start_date": "2019-08-24",
- "activate_retargeting_auto": true,
- "landing_page_valid": true,
- "keyword_clusters_ready": true,
- "ads_created": true,
- "campaign_published": true,
- "location_criteria": [
- 0
], - "language_criteria": [
- "string"
], - "advertising_channel_type": "string",
- "store_goals_enabled": true
}Returns detailed campaign settings including location targeting, language criteria, budget, bidding strategy, and Google Ads URLs. Used in the campaign settings drawer.
{- "id": 0,
- "name": "string",
- "campaign_budget": {
- "id": 0,
- "amount_micros": 0,
- "delivery_method": "STANDARD",
- "status": "string",
- "action": "string",
- "remote_id": "string",
- "remote_status": "string",
- "error_message": "string",
- "created_at": "2019-08-24T14:15:22Z"
}, - "ads_account": {
- "id": 0,
- "email": "user@example.com",
- "account_name": "string",
- "account_id": "string",
- "manager_id": "string",
- "status": "string",
- "developer_token": "string",
- "client_credentials": { },
- "is_selected": true,
- "is_active": true,
- "currency_code": "USD",
- "currency_symbol": "$"
}, - "location_criteria": [
- 0
], - "detailed_location_criteria": [
- { }
], - "excluded_location_criteria": [
- 0
], - "detailed_excluded_location_criteria": [
- { }
], - "language_criteria": [
- "string"
], - "radius_criteria": [
- { }
], - "bidding_strategy_type": "string",
- "target_cpa": 0,
- "max_cpc_bid": 0,
- "target_roas": 0,
- "location_targeting_type": "string"
}Updates campaign settings from the settings drawer, including name, location targeting, language criteria, bidding strategy, and budget amount.
| name | string <= 255 characters |
| location_targeting_type | string |
| location_criteria | Array of strings List of location criterion IDs or location objects with locationId and reach |
| language_criteria | Array of strings |
| bidding_strategy_type | string |
| target_cpa | number |
| max_cpc_bid | number |
| target_roas | number |
| amount_micros | integer New budget amount |
{- "name": "string",
- "location_targeting_type": "string",
- "location_criteria": [
- "string"
], - "language_criteria": [
- "string"
], - "bidding_strategy_type": "string",
- "target_cpa": 0,
- "max_cpc_bid": 0,
- "target_roas": 0,
- "amount_micros": 0
}{- "id": 0,
- "name": "string",
- "campaign_budget": {
- "id": 0,
- "amount_micros": 0,
- "delivery_method": "STANDARD",
- "status": "string",
- "action": "string",
- "remote_id": "string",
- "remote_status": "string",
- "error_message": "string",
- "created_at": "2019-08-24T14:15:22Z"
}, - "ads_account": {
- "id": 0,
- "email": "user@example.com",
- "account_name": "string",
- "account_id": "string",
- "manager_id": "string",
- "status": "string",
- "developer_token": "string",
- "client_credentials": { },
- "is_selected": true,
- "is_active": true,
- "currency_code": "USD",
- "currency_symbol": "$"
}, - "location_criteria": [
- 0
], - "detailed_location_criteria": [
- { }
], - "excluded_location_criteria": [
- 0
], - "detailed_excluded_location_criteria": [
- { }
], - "language_criteria": [
- "string"
], - "radius_criteria": [
- { }
], - "bidding_strategy_type": "string",
- "target_cpa": 0,
- "max_cpc_bid": 0,
- "target_roas": 0,
- "location_targeting_type": "string"
}Creates or updates the campaign budget for the specified product. The budget amount is specified in the account's currency. Validates that the amount is greater than 0.
| amount_micros required | integer Daily budget in the account's base currency unit (must be > 0) |
| delivery_method | string Default: "STANDARD" Enum: "STANDARD" "ACCELERATED" |
{- "amount_micros": 50,
- "delivery_method": "STANDARD"
}{- "id": 0,
- "amount_micros": 0,
- "delivery_method": "STANDARD",
- "status": "string",
- "action": "string",
- "remote_id": "string",
- "remote_status": "string",
- "error_message": "string",
- "created_at": "2019-08-24T14:15:22Z"
}Creates or updates campaign budgets for multiple products in a single request.
| product_ids required | Array of integers |
| amount_micros required | integer Daily budget amount in the account's base currency unit (not micros despite the name) |
| delivery_method | string Default: "STANDARD" Enum: "STANDARD" "ACCELERATED" |
{- "product_ids": [
- 0
], - "amount_micros": 0,
- "delivery_method": "STANDARD"
}Publishes multiple approved campaigns to Google Ads in a single operation. Campaigns must have a valid budget and approved keywords/ads before sending. Returns a task ID for async polling.
| campaign_ids required | Array of integers List of campaign IDs to publish |
{- "campaign_ids": [
- 0
]
}{- "task_id": "string",
- "status": "pending"
}Imports existing campaigns from a connected Google Ads account into OTTO PPC. Triggers a sync from the Google Ads account to populate campaigns, ad groups, keywords, and ads into the local database.
| ads_account_id required | integer |
| business_id | integer or null |
| campaign_ids | Array of strings Optional list of specific Google Ads campaign remote IDs to import |
{- "ads_account_id": 0,
- "business_id": 0,
- "campaign_ids": [
- "string"
]
}{- "task_id": "string",
- "status": "pending"
}Enables or disables automatic negative keyword syncing for multiple campaigns. When enabled, search term waste data is periodically analyzed to add negative keywords automatically.
| enabled required | boolean True to enable negative keywords sync, false to disable |
| campaign_ids required | Array of integers non-empty |
{- "enabled": true,
- "campaign_ids": [
- 0
]
}Keyword clusters (ProductTargetKeywords), ad-group generation, and keyword operations
Returns keyword clusters (ProductTargetKeywords) for the authenticated user's account. Each cluster maps to one ad group and contains target exact, phrase, and negative keywords with SEO metrics (search volume, CPC, competition). Filterable by business, campaign, or product.
| business_id | integer |
| campaign_id | integer |
| product_id | integer |
| is_approved | boolean |
| search_intent | string |
| match_type | string Enum: "BROAD" "PHRASE" "EXACT" |
[- {
- "keyword_cluster_id": 0,
- "keyword_cluster_title": "string",
- "ad_group_id": 0,
- "ad_group_name": "string",
- "product_id": 0,
- "campaign_id": 0,
- "business_id": 0,
- "remote_id": "string",
- "remote_status": "ENABLED",
- "ad_group_sync_status": "string",
- "ad_group_sync_error_msg": "string",
- "common_status": "string",
- "is_approved": true,
- "match_type": "BROAD",
- "relevancy_score": 0,
- "search_intent": "string",
- "sv_total": 0,
- "cpc_avg": 0,
- "cmp_avg": 0,
- "ads_count": 0,
- "last_operation_timestamp": 0,
- "processing_status": "string",
- "is_ready_for_approval": true,
- "processing_status_display": "string",
- "keywords": [
- "string"
], - "keywords_with_metrics": [
- {
- "keyword": "string",
- "sv": 0,
- "cpc": 0,
- "cmp": 0
}
], - "keywords_grouped_by_category": {
- "market_opportunity": {
- "count": 0,
- "keywords": [
- {
- "keyword": "string",
- "sv": 0,
- "cpc": 0,
- "cmp": 0,
- "relevancy_score": 0,
- "match_type": "string"
}
]
}, - "demand_level": {
- "count": 0,
- "keywords": [
- {
- "keyword": "string",
- "sv": 0,
- "cpc": 0,
- "cmp": 0,
- "relevancy_score": 0,
- "match_type": "string"
}
]
}, - "competition_intensity": {
- "count": 0,
- "keywords": [
- {
- "keyword": "string",
- "sv": 0,
- "cpc": 0,
- "cmp": 0,
- "relevancy_score": 0,
- "match_type": "string"
}
]
}
}
}
]Updates the keywords in a cluster. If target_exact_keywords is set to empty,
the cluster is marked as removed. Supports match type changes which trigger
an async Google Ads sync.
| target_exact_keywords | object or null Dict of keyword → metrics. Setting to empty/null marks cluster as removed. |
| match_type | string Enum: "BROAD" "PHRASE" "EXACT" |
{- "target_exact_keywords": { },
- "match_type": "BROAD"
}Enables or pauses the ad group associated with this keyword cluster on Google Ads.
| task_status required | string Enum: "READY" "ACTIVE" "READY_NOT_ACTIVE" "PAUSED" "ENABLED" Maps to Google Ads remote status:
|
| include_related | boolean Default: true When true, propagates the status change to related ad groups and ads |
{- "task_status": "READY",
- "include_related": true
}Adds or removes a single keyword (or comma-separated list) from a keyword cluster.
For add operations, keyword metrics are fetched asynchronously. For remove,
the keyword is immediately deleted.
| keyword required | string Single keyword or comma-separated list of keywords |
| action required | string Enum: "add" "remove" |
{- "keyword": "project management software",
- "action": "add"
}Adds or removes keywords across multiple keyword clusters asynchronously. Returns a task ID for polling. Used for bulk editing keyword sets in the UI.
required | Array of objects |
{- "operations": [
- {
- "cluster_id": 0,
- "keyword": "string",
- "action": "add"
}
]
}{- "task_id": "string",
- "status": "pending"
}Triggers AI-powered regeneration of keyword clusters for the specified product. Existing unapproved clusters are replaced. Returns a task ID for async polling.
{- "task_id": "string",
- "status": "pending"
}Triggers keyword cluster generation for multiple products simultaneously.
| product_ids required | Array of integers |
{- "product_ids": [
- 0
]
}{- "task_id": "string",
- "status": "pending"
}Disapproves multiple keyword clusters at once. Pauses any that are already live on Google Ads and reverts local-only clusters to pending.
| cluster_ids required | Array of integers |
{- "cluster_ids": [
- 0
]
}Soft-deletes multiple keyword clusters. For clusters published to Google Ads, removes their ad groups and related ads remotely before deleting locally.
| cluster_ids required | Array of integers |
{- "cluster_ids": [
- 0
]
}Triggers AI generation of responsive search ads for multiple keyword clusters. Returns a task ID for async polling.
| cluster_ids required | Array of integers |
{- "cluster_ids": [
- 0
]
}{- "task_id": "string",
- "status": "pending"
}Creates a new keyword cluster and ad group for the specified campaign using AI,
either from scratch (create_manually) or seeded from provided keywords (create_from_keywords).
| campaign_id required | integer |
| ad_group_name required | string <= 255 characters |
| creation_type required | string Enum: "create_manually" "create_from_keywords" |
| ai_instructions required | string <= 1000 characters Custom instructions for AI ad group generation |
| keywords | Array of strings Required when creation_type is "create_from_keywords" |
{- "campaign_id": 55,
- "ad_group_name": "Project Management Software",
- "creation_type": "create_from_keywords",
- "ai_instructions": "Focus on enterprise teams and productivity",
- "keywords": [
- "project management tool",
- "team collaboration software"
]
}{- "task_id": "string",
- "status": "pending"
}Responsive search ads (headlines, descriptions), asset management, and approval workflows
Returns responsive search ads filterable by business_id, campaign_id,
product_id, ad_group_id, is_approved, and keyword_cluster_id.
Includes performance metrics (clicks, impressions, CTR, conversions, cost).
| business_id | integer |
| campaign_id | integer |
| product_id | integer |
| ad_group_id | integer |
| is_approved | boolean |
| keyword_cluster_id | integer |
| internal_campaign_type | string Default: "SEARCH" Enum: "SEARCH" "RETARGETED" |
[- {
- "id": 0,
- "name": "string",
- "ad_group_id": 0,
- "keyword_cluster_id": 0,
- "ad_group_name": "string",
- "display_path": [
- "string"
], - "headlines": [
- "string"
], - "primary_headline": "string",
- "descriptions": [
- "string"
], - "is_approved": true,
- "assets": {
- "sitelinks": [
- {
- "asset_id": 0,
- "asset_type_display": "string",
- "asset_type": 0,
- "asset_data": { }
}
], - "callouts": [
- {
- "asset_id": 0,
- "asset_type_display": "string",
- "asset_type": 0,
- "asset_data": { }
}
], - "structured_snippets": [
- {
- "asset_id": 0,
- "asset_type_display": "string",
- "asset_type": 0,
- "asset_data": { }
}
], - "ad_image": [
- {
- "asset_id": 0,
- "asset_type_display": "string",
- "asset_type": 0,
- "asset_data": { }
}
]
}, - "remote_id": "string",
- "remote_status": "string",
- "ad_sync_status": "string",
- "ad_sync_error_msg": "string",
- "clicks": 0,
- "ctr": 0,
- "cost": 0,
- "conversions": 0,
- "impressions": 0
}
]Updates headlines, descriptions, landing page, and/or display path for a responsive search ad. Also handles sitelink, callout, and structured snippet assets. Duplicate headlines/descriptions are automatically deduplicated.
| headlines | Array of strings <= 15 items |
| descriptions | Array of strings <= 4 items |
| landing_page | string <uri> |
| display_path | Array of strings <= 2 items |
object Campaign asset updates grouped by type |
{- "headlines": [
- "string"
], - "descriptions": [
- "string"
], - "display_path": [
- "string"
], - "assets_data": {
- "sitelinks": [
- { }
], - "callouts": [
- { }
], - "structured_snippets": [
- { }
], - "images": [
- { }
]
}
}{- "id": 0,
- "name": "string",
- "ad_group_id": 0,
- "keyword_cluster_id": 0,
- "ad_group_name": "string",
- "display_path": [
- "string"
], - "headlines": [
- "string"
], - "primary_headline": "string",
- "descriptions": [
- "string"
], - "is_approved": true,
- "assets": {
- "sitelinks": [
- {
- "asset_id": 0,
- "asset_type_display": "string",
- "asset_type": 0,
- "asset_data": { }
}
], - "callouts": [
- {
- "asset_id": 0,
- "asset_type_display": "string",
- "asset_type": 0,
- "asset_data": { }
}
], - "structured_snippets": [
- {
- "asset_id": 0,
- "asset_type_display": "string",
- "asset_type": 0,
- "asset_data": { }
}
], - "ad_image": [
- {
- "asset_id": 0,
- "asset_type_display": "string",
- "asset_type": 0,
- "asset_data": { }
}
]
}, - "remote_id": "string",
- "remote_status": "string",
- "ad_sync_status": "string",
- "ad_sync_error_msg": "string",
- "clicks": 0,
- "ctr": 0,
- "cost": 0,
- "conversions": 0,
- "impressions": 0
}Enables or pauses a specific ad on Google Ads.
| task_status required | string Enum: "READY" "ACTIVE" "READY_NOT_ACTIVE" "PAUSED" "ENABLED" Maps to Google Ads remote status:
|
| include_related | boolean Default: true When true, propagates the status change to related ad groups and ads |
{- "task_status": "READY",
- "include_related": true
}Disapproves multiple ads at once. Pauses ads already live on Google Ads and reverts local-only ads to unapproved.
| ad_content_ids required | Array of integers |
{- "ad_content_ids": [
- 0
]
}Deletes multiple ads. For ads published to Google Ads, removes them remotely before deleting locally. Returns 400 if remote deletion fails.
| ad_content_ids required | Array of integers |
| delete_from_google | boolean Default: false |
{- "ad_content_ids": [
- 0
], - "delete_from_google": false
}Returns performance metrics (impressions, clicks, CTR, cost, conversions) for ad content, with optional date range and campaign filtering.
| business_id required | integer |
| campaign_ids | string Comma-separated campaign IDs |
| start_date | string <date> |
| end_date | string <date> |
{- "selected_dates": {
- "start_date": "2019-08-24",
- "end_date": "2019-08-24"
}, - "total_count": 0,
- "total": {
- "impressions": 0,
- "clicks": 0,
- "cost": 0,
- "conversions": 0,
- "ctr": 0
}, - "results": [
- {
- "ad_id": 0,
- "name": "string",
- "campaign": "string",
- "ad_group": "string",
- "impressions": 0,
- "clicks": 0,
- "cost": 0,
- "conversions": 0,
- "ctr": 0
}
], - "available_fields": [
- "string"
]
}Returns ad groups with their associated campaign data. Filterable by
business_id, campaign_id, and product_id.
| business_id | integer |
| campaign_id | integer |
| product_id | integer |
[- {
- "id": 0,
- "name": "string",
- "campaign": {
- "id": 0,
- "name": "string",
- "business_id": 0,
- "product_id": 0,
- "status": "string",
- "status_display": "string",
- "action": "string",
- "action_display": "string",
- "remote_id": "string",
- "remote_status": "string",
- "remote_status_display": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "campaign_budget": {
- "id": 0,
- "amount_micros": 0,
- "delivery_method": "STANDARD",
- "status": "string",
- "action": "string",
- "remote_id": "string",
- "remote_status": "string",
- "error_message": "string",
- "created_at": "2019-08-24T14:15:22Z"
}, - "ads_account": {
- "id": 0,
- "email": "user@example.com",
- "account_name": "string",
- "account_id": "string",
- "manager_id": "string",
- "status": "string",
- "developer_token": "string",
- "client_credentials": { },
- "is_selected": true,
- "is_active": true,
- "currency_code": "USD",
- "currency_symbol": "$"
}, - "negative_keywords_sync_enabled": true,
- "has_active_adgroups": true,
- "currency": {
- "currency_symbol": "string",
- "currency_code": "string"
}, - "internal_campaign_type": "SEARCH",
- "clicks": 0,
- "ctr": 0,
- "cost": 0,
- "conversions": 0,
- "impressions": 0,
- "remote_start_date": "2019-08-24",
- "activate_retargeting_auto": true,
- "landing_page_valid": true,
- "keyword_clusters_ready": true,
- "ads_created": true,
- "campaign_published": true,
- "location_criteria": [
- 0
], - "language_criteria": [
- "string"
], - "advertising_channel_type": "string",
- "store_goals_enabled": true
}, - "status": "string",
- "action": "string",
- "remote_id": "string",
- "remote_status": "string",
- "error_message": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "clicks": 0,
- "ctr": 0,
- "cost": 0,
- "conversions": 0,
- "impressions": 0
}
]Returns ad groups with their ad content nested inside each group. Used for the grouped ad content view in the campaign management UI.
| business_id required | integer |
| campaign_id | integer |
| product_id | integer |
| is_approved | boolean |
[- {
- "ad_group_id": 0,
- "keyword_cluster_id": 0,
- "business_id": 0,
- "product_name": "string",
- "name": "string",
- "campaign": 0,
- "remote_id": "string",
- "remote_status": "string",
- "remote_status_display": "string",
- "common_status": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "ad_contents": [
- {
- "id": 0,
- "name": "string",
- "ad_group_id": 0,
- "keyword_cluster_id": 0,
- "ad_group_name": "string",
- "display_path": [
- "string"
], - "headlines": [
- "string"
], - "primary_headline": "string",
- "descriptions": [
- "string"
], - "is_approved": true,
- "assets": {
- "sitelinks": [
- {
- "asset_id": 0,
- "asset_type_display": "string",
- "asset_type": 0,
- "asset_data": { }
}
], - "callouts": [
- {
- "asset_id": 0,
- "asset_type_display": "string",
- "asset_type": 0,
- "asset_data": { }
}
], - "structured_snippets": [
- {
- "asset_id": 0,
- "asset_type_display": "string",
- "asset_type": 0,
- "asset_data": { }
}
], - "ad_image": [
- {
- "asset_id": 0,
- "asset_type_display": "string",
- "asset_type": 0,
- "asset_data": { }
}
]
}, - "remote_id": "string",
- "remote_status": "string",
- "ad_sync_status": "string",
- "ad_sync_error_msg": "string",
- "clicks": 0,
- "ctr": 0,
- "cost": 0,
- "conversions": 0,
- "impressions": 0
}
]
}
]Triggers a full bidirectional sync between OTTO PPC and the specified Google Ads account. Pulls campaign status, ad performance metrics, keywords, and negative keywords from Google. Returns a task ID for async polling.
{- "task_id": "string",
- "status": "pending"
}Polls the status and result of a background Celery task. All async operations
(keyword generation, campaign creation, product discovery, etc.) return a task_id
that can be polled here.
Task statuses: pending → in_progress → success | error | timeout
| taskId required | string Celery task ID returned by async endpoints |
{- "task_id": "string",
- "status": "pending",
- "result": { },
- "error": "string",
- "started_at": "2019-08-24T14:15:22Z",
- "completed_at": "2019-08-24T14:15:22Z"
}Campaign-level Google Ads performance metrics, charts, KPIs, and exports
Returns paginated campaign performance rows from Google Ads for the given date range.
Requires either business_id, campaign_ids, or ads_account_id.
Metrics are fetched live from Google Ads API and merged with local campaign data.
{- "count": 0,
- "page": 0,
- "page_size": 0,
- "results": [
- {
- "impressions": 0,
- "clicks": 0,
- "cost": 0.1,
- "conversions": 0.1,
- "ctr": 0.1,
- "average_cpc": 0.1,
- "cost_per_conversion": 0.1,
- "conversion_rate": 0.1,
- "conversions_value": 0.1,
- "roas": 0.1,
- "currency_symbol": "string",
- "remote_id": "string",
- "name": "string",
- "campaign_id": 0,
- "product_id": 0,
- "landing_page_valid": true,
- "target_cpa": 0.1,
- "target_roas": 0.1,
- "primary_status": "string",
- "status": "string"
}
], - "totals": {
- "impressions": 0,
- "clicks": 0,
- "cost": 0.1,
- "conversions": 0.1,
- "ctr": 0.1,
- "average_cpc": 0.1,
- "cost_per_conversion": 0.1,
- "conversion_rate": 0.1,
- "conversions_value": 0.1,
- "roas": 0.1,
- "currency_symbol": "string"
}
}Returns paginated ad group performance rows from Google Ads for the given date range. Supports filtering by campaign name, campaign IDs, and status filters.
| campaign_name | string Filter by campaign name substring |
{- "count": 0,
- "page": 0,
- "page_size": 0,
- "results": [
- {
- "impressions": 0,
- "clicks": 0,
- "cost": 0.1,
- "conversions": 0.1,
- "ctr": 0.1,
- "average_cpc": 0.1,
- "cost_per_conversion": 0.1,
- "conversion_rate": 0.1,
- "conversions_value": 0.1,
- "roas": 0.1,
- "currency_symbol": "string",
- "remote_id": "string",
- "name": "string",
- "campaign_name": "string",
- "campaign_id": 0,
- "ad_group_id": 0,
- "status": "string"
}
], - "totals": {
- "impressions": 0,
- "clicks": 0,
- "cost": 0.1,
- "conversions": 0.1,
- "ctr": 0.1,
- "average_cpc": 0.1,
- "cost_per_conversion": 0.1,
- "conversion_rate": 0.1,
- "conversions_value": 0.1,
- "roas": 0.1,
- "currency_symbol": "string"
}
}Audit pillar - campaign efficiency scoring and per-campaign analysis
Triggers an asynchronous audit across all 5 pillars for the given Google Ads account.
If an audit with the same parameters was run today, returns the existing audit unless
allow_duplicate is true. Returns 202 while pending, 200 if already complete.
| ads_account_id required | integer ID of the Google Ads account to audit |
| start_date required | string <date> |
| end_date required | string <date> |
| campaign_type_filter | string or null Optionally restrict audit to a specific advertising channel type |
| campaign_ids | Array of integers or null Optionally restrict audit to specific campaigns |
| campaign_status | string Default: "ACTIVE" Enum: "ACTIVE" "PAUSED" "ALL" |
| allow_duplicate | boolean Default: true If true, always create a new audit even if one exists for today |
{- "ads_account_id": 42,
- "start_date": "2025-01-01",
- "end_date": "2025-01-31",
- "campaign_status": "ACTIVE",
- "allow_duplicate": true
}