API Documentation

29 articles Camilo Aponte By Camilo Aponte

⚡ Integrate Search Atlas APIs with Custom Dashboards

🔑 Fix External API 403 Scope Errors in Search Atlas

🔍 Overview If every External API call — including the token/validate endpoint — returns an HTTP 403 error with the message "Invalid scope provided. Check API Key permissions on your Press Releases account!", your API key is missing the press-release scope required by the Search Atlas External API (used by Signal Genesys). This article explains what causes the error and walks you through the steps to fix it. ⚠️ Understanding the Error The 403 response is a permissions error, not an authentication failure. Your API key is recognized, but it has not been granted the scopes needed to access press release endpoints. Common reasons this happens include: - The API key was created before the press-release scope was added to your plan. - The key was generated with default or limited permissions. - Your account plan does not currently include External API / press-release access. 🛠️ Step-by-Step: Check and Update Your API Key Permissions 1. Log in to your Search Atlas account and navigate to your Account Settings (click your profile icon in the top-right corner). 2. Go to the API Keys or Integrations section within Account Settings. 3. Locate the API key you are using for your External API or Signal Genesys integration. 4. Click Edit or Manage Permissions on that key. 5. Look for the press-release scope (sometimes listed as External API or Press Releases) and ensure it is enabled. 6. Save your changes. 7. Re-run your API call to confirm the 403 error is resolved. If you do not see a press-release or External API scope option on the key, proceed to the next section. 📋 If the Scope Option Is Not Available The press-release scope may not be visible if it is not included in your current subscription plan. In that case, the scope cannot be enabled from within the API key settings alone — it must be unlocked at the account or plan level first. Here is what to check: - Plan eligibility: Confirm that your Search Atlas plan includes External API and Press Release access. Refer to your plan details in Account Settings under Billing or Subscription. - Regenerate the key: If the plan is correct but the scope is still missing, try deleting the existing API key and generating a new one. Newly created keys inherit the latest permissions tied to your account. - Existing keys: Keys created before a plan upgrade may not automatically receive new scopes. A fresh key should resolve this. 🔗 Reconnecting Signal Genesys After Fixing Permissions Once the correct scopes are in place, update the API key in your Signal Genesys configuration so the integration uses the updated credentials: 1. Copy your updated or newly generated API key from Search Atlas Account Settings. 2. Open your Signal Genesys settings and navigate to the Search Atlas API or External API connection section. 3. Replace the old API key with the new one. 4. Save and test the connection using the token/validate endpoint to confirm a successful 200 OK response. ✅ Verifying the Fix After updating your key and permissions, verify that the integration is working correctly: - The token/validate endpoint should return HTTP 200 instead of 403. - Press release submissions and other External API actions should complete without scope-related errors. - If you still receive a 403 after following all steps, the issue may require a backend scope assignment on your account that cannot be self-served. 💬 Still Seeing the 403 Error? If you have completed all the steps above and the error persists, the press-release scope may need to be manually enabled on your account by our team. If you need further assistance, open the chat widget in the bottom-right corner of the platform and type human teammate to be connected with a member of our team.

🔑 Troubleshoot Customer API Key 401 Errors

🔍 What a 401 error means A 401 Unauthorized response with "Bad API key" means Search Atlas could not authenticate the credential sent with the request. This usually results from an incorrect key, an unsupported header format, a hidden character, or using a key from the wrong environment. ✅ Check the API key and request format 1. Locate your API key in your Search Atlas account settings. 2. Confirm you copied the complete production key. Do not include quotation marks, spaces, line breaks, or other surrounding characters. 3. Review the endpoint documentation and use the required authentication header exactly as shown. Do not substitute a JWT, session token, or an older authentication format. 4. Confirm the request is sent over HTTPS and that your HTTP client is not removing or rewriting the authentication header. 5. Test with a simple request from a tool such as cURL or Postman before testing through your application. 🧪 Test with a clean request Create a new request using one documented endpoint and the current production base URL. Add only the required headers, including the API key header specified in the documentation. Avoid copying headers from a browser session, cached environment variables, or another integration. If the request works in cURL or Postman but fails in your application, compare the final outgoing request. Check for an empty environment variable, truncated value, extra whitespace, incorrect capitalization, or middleware that replaces the API key. 🔄 Rotate the key safely If the key still returns 401, generate a new API key from your Search Atlas account settings and update the integration. Store it securely as a secret, then retry the request. Do not publish API keys in source code, browser-side scripts, screenshots, logs, or support messages. After confirming the new key works, remove or revoke the old key if it is no longer needed. When rotating keys in production, update all services that use the credential before disabling the previous key. ⚠️ Check endpoint and account access API key authentication is supported on customer-facing endpoints documented for API-key access. Some specialized actions or connectors may require a different authentication method or may not support API keys. Verify that the endpoint, HTTP method, account, and production environment match the documentation. 🛠️ When to contact Search Atlas If newly generated production keys continue to return 401 on documented endpoints after completing these checks, have the following ready when you reach out: the endpoint path, HTTP method, response status, response message, and a redacted request example showing only the header names (never the key values). This information allows the team to investigate your account's API access quickly. If you need further assistance, open the chat widget in the bottom-right corner of the platform and type human teammate to be connected with a member of our team.

🔑 OTTO Pixel WordPress Plugin API Key Setup

🧩 Overview If the OTTO pixel shows Not Installed even after reinstalling the plugin and clearing your cache, the most common root cause is a missing or incorrectly entered API key in your WordPress plugin settings. This article walks you through the complete setup so your OTTO pixel verifies successfully. 🔍 Step 1: Locate Your OTTO API Key in Search Atlas 1. Log in to your Search Atlas account. 2. In the left sidebar, click OTTO SEO, then open SEO Automation. The URL will change to /seo-automation-v3. 3. Open the OTTO dashboard for the website you are connecting. 4. Click Settings or the pixel/installation section within OTTO. 5. Copy the unique API key displayed for your site. Keep this tab open — you will paste the key into WordPress in the next steps. ⚙️ Step 2: Enter the API Key in Your WordPress Plugin Settings 1. Log in to your WordPress admin panel (yoursite.com/wp-admin). 2. In the left menu, go to Search Atlas → Settings. 3. Locate the API Key field. This field is required and must not be left blank. 4. Paste the Search Atlas API key you copied into this field. 5. Paste the OTTO Pixel UUID. 6. Click Save Changes. Important: The API key is unique to each website. If you manage multiple sites, make sure you are using the correct key for the domain you are configuring. 🗑️ Step 3: Clear All Caches After Saving Caching layers can prevent the pixel from being detected even when the plugin is configured correctly. After saving your API key, clear caches in this order: 1. WordPress caching plugins — Go to your caching plugin (such as WP Rocket, W3 Total Cache, or LiteSpeed Cache) and purge all caches. 2. Hosting-level cache — Log in to your hosting control panel and clear any server-side or CDN cache. Refer to your host's documentation if needed. 3. Browser cache — In your browser, press Ctrl + Shift + Delete (Windows) or Cmd + Shift + Delete (Mac), select cached images and files, and clear them. 🔄 Step 4: Trigger a Sync and Verify the Pixel 1. Return to the OTTO dashboard in Search Atlas (click OTTO SEO in the left sidebar, then open SEO Automation). 2. Click Verify Installation or Check Pixel Status for your site. 3. Wait up to 2 minutes for the verification to complete. The status should change from Not Installed to Installed. 4. If the status does not update after 2 minutes, click Re-check or refresh the page. ⚠️ Common Reasons the Pixel Still Shows Not Installed After Setup - Wrong API key used — Double-check that the key in WordPress matches exactly what is shown in the OTTO dashboard for that specific domain. - Plugin not activated — Confirm the MetaSync (SearchAtlas) plugin status shows Active in WordPress, not Inactive or Deactivated. - Conflicting plugins — Security or firewall plugins (such as Wordfence) can block pixel scripts. Temporarily disable them to test, then whitelist the OTTO script if needed. - Cache not fully cleared — If you use a CDN such as Cloudflare, purge the CDN cache in addition to your WordPress and hosting caches. - API key field saved with extra spaces — When pasting your API key, ensure there are no leading or trailing spaces in the field before saving. ✅ Quick Checklist Before Contacting Support - API key copied from the correct OTTO site dashboard and pasted into WordPress plugin settings - Changes saved in WordPress - WordPress caching plugin cache cleared - Hosting and CDN cache cleared - Browser cache cleared - Pixel verification re-run in Search Atlas - Plugin shows as Active in WordPress If you have completed every step above and the pixel still shows Not Installed, open the chat widget in the bottom-right corner of the platform and type human teammate to be connected with a member of our team.

📡📣 Press Release API — Search Atlas (Part 2 of 2)

← Back to Part 1 — Part 2 of 2 🧩 Press Release Endpoints (cont'd 9/11) 📦 8. Check Press Release Worthiness Validate if content is worthy of being a press release using AI assessment. Endpoint: POST /api/cg/v1/press-release/check-worthiness/ Request Body: headline (string, max 80 chars): Main headline blog\_headline (string): Alternative blog-style headline summary (string): Brief summary (15-35 words) blog\_summary (string): Alternative blog-style summary content (string): Full press release content (1500-2000 words recommended) cURL Example: curl -X POST "https://ca.searchatlas.com/api/cg/v1/press-release/check-worthiness/" \ -H "Authorization: Bearer YOUR_JWT_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "headline": "Company XYZ Launches Revolutionary AI Platform", "blog_headline": "How Company XYZ is Transforming AI Analytics", "summary": "Company XYZ today announced the launch of its groundbreaking AI-powered analytics platform, designed to help businesses make data-driven decisions in real-time.", "blog_summary": "Discover how Company XYZ new AI platform is changing the game for businesses seeking real-time analytics and insights.", "content": "FOR IMMEDIATE RELEASE\n\nCompany XYZ Unveils Revolutionary AI-Powered Analytics Platform\n\n[CITY, STATE] – January 28, 2025 – Company XYZ, a leader in business intelligence solutions, today announced the launch of..." }' Success Response (202 Accepted): { "task_id": "c3d4e5f6-a7b8-9012-cdef-123456789012" } Task Result (After Polling): { "is_valid": true, "score": 0.85, "confidence": 0.92, "reasoning": "This press release announces a significant product launch with clear business value. It includes specific features, target audience, and demonstrates innovation in the AI analytics space. The content is well-structured and newsworthy.", "suggestions": [ "Include specific metrics or statistics to strengthen credibility", "Add a quote from a customer or industry analyst", "Mention partnerships or integrations with known platforms" ] } 🧩 Press Release Endpoints (cont'd 10/11) 🔧 9. Export Press Release Links Export media links from press release distribution channels to an Excel file. Endpoint: POST /api/cg/v1/press-release/export-links/ Rate Limit: 100 requests per day per customer Request Body: - • press\_releases (array, required): List of press release export items - • id (UUID, required): Press release ID - • channel\_ids (array of integers, optional): Specific channel IDs to export (empty = all channels) cURL Example: curl -X POST "https://ca.searchatlas.com/api/cg/v1/press-release/export-links/" \ -H "Authorization: Bearer YOUR_JWT_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "press_releases": [ { "id": "550e8400-e29b-41d4-a716-446655440000", "channel_ids": [1, 3, 5] }, { "id": "6ba7b810-9dad-11d1-80b4-00c04fd430c8", "channel_ids": [] } ] }' Success Response (202 Accepted): { "task_id": "d4e5f6a7-b8c9-0123-def0-123456789013" } Task Result (After Polling): { "file_name": "customer_123-press_release-20250128T143022_a1b2c3d4.xlsx", "file_url": "https://storage.googleapis.com/ca-images-persistent/customer_123-press_release-20250128T143022_a1b2c3d4.xlsx" } 🧩 Press Release Endpoints (cont'd 11/11) 🗂️ 10. Get Press Release Channels Retrieve all distribution channels and their media URLs for a specific press release. Endpoint: GET /api/cg/v1/press-release/{uuid}/channels/ Path Parameters: uuid (UUID): Press release ID cURL Example: curl -X GET "https://ca.searchatlas.com/api/cg/v1/press-release/550e8400-e29b-41d4-a716-446655440000/channels/" \ -H "Authorization: Bearer YOUR_JWT_TOKEN" \ -H "Content-Type: application/json" Success Response (200 OK): { "count": 3, "next": null, "previous": null, "results": [ { "id": 1, "distribution": { "id": 5, "display_name": "TechCrunch", "provider": "SIGNAL_GENESYS", "icon": "https://storage.googleapis.com/bucket/techcrunch-icon.png", "links_approx": "3-5", "is_coming_soon": false, "credits_cost": 50, "created_at": "2024-01-01T00:00:00Z" }, "press_release": "550e8400-e29b-41d4-a716-446655440000", "variation": "550e8400-e29b-41d4-a716-446655440000", "media_urls": [ { "url": "https://techcrunch.example.com/article/12345", "hits": 0, "indexed": true, "last_checked_at": "2025-01-28T10:00:00Z", "check_method": "linkgraph", "error": null, "batch_id": 789 }, { "url": "https://techcrunch.example.com/article/12346", "hits": 0, "indexed": false, "last_checked_at": null, "check_method": null, "error": null, "batch_id": null } ], "indexed_media_urls": [ "https://techcrunch.example.com/article/12345" ] }, { "id": 2, "distribution": { "id": 7, "display_name": "Forbes", "provider": "SIGNAL_GENESYS", "icon": "https://storage.googleapis.com/bucket/forbes-icon.png", "links_approx": "5-10", "is_coming_soon": false, "credits_cost": 75, "created_at": "2024-01-01T00:00:00Z" }, "press_release": "550e8400-e29b-41d4-a716-446655440000", "variation": "7c8d9e0f-1a2b-3c4d-5e6f-7890abcdef12", "media_urls": [ "https://forbes.example.com/sites/article-abc" ], "indexed_media_urls": [] } ] } Channel Object Fields: id: Channel ID distribution: Distribution channel details (name, provider, cost, etc.) press\_release: Parent press release UUID variation: Press release variation UUID (can be the same as parent or a variation) media\_urls: Array of URLs where content was published (with indexation metadata) indexed\_media\_urls: Subset of URLs confirmed as indexed by search engines 📊 Distribution Endpoints ✍️ List Distributions Get all available press release distribution channels. Endpoint: GET /api/cg/v1/press-release/distributions/ Query Parameters: page (integer, optional): Page number page\_size (integer, optional): Results per page cURL Example: curl -X GET "https://ca.searchatlas.com/api/cg/v1/press-release/distributions/" \ -H "Authorization: Bearer YOUR_JWT_TOKEN" \ -H "Content-Type: application/json" Success Response (200 OK): { "count": 25, "next": null, "previous": null, "results": [ { "id": 1, "display_name": "TechCrunch", "provider": "SIGNAL_GENESYS", "icon": "https://storage.googleapis.com/bucket/techcrunch-icon.png", "links_approx": "3-5", "is_coming_soon": false, "credits_cost": 50, "created_at": "2024-01-01T00:00:00Z" }, { "id": 2, "display_name": "Forbes", "provider": "SIGNAL_GENESYS", "icon": "https://storage.googleapis.com/bucket/forbes-icon.png", "links_approx": "5-10", "is_coming_soon": false, "credits_cost": 75, "created_at": "2024-01-01T00:00:00Z" }, { "id": 3, "display_name": "Business Insider", "provider": "SIGNAL_GENESYS", "icon": "https://storage.googleapis.com/bucket/business-insider-icon.png", "links_approx": "2-4", "is_coming_soon": false, "credits_cost": 60, "created_at": "2024-01-01T00:00:00Z" }, { "id": 10, "display_name": "Wall Street Journal", "provider": "SIGNAL_GENESYS", "icon": "https://storage.googleapis.com/bucket/wsj-icon.png", "links_approx": "10-15", "is_coming_soon": true, "credits_cost": 150, "created_at": "2024-06-01T00:00:00Z" } ] } Distribution Fields: id: Distribution channel ID (use in deployment) display\_name: Human-readable channel name provider: Always "SIGNAL_GENESYS" (only provider currently supported) icon: Logo/icon URL for the channel links\_approx: Approximate number of backlinks generated is\_coming\_soon: If true, channel is not yet available credits\_cost: Number of credits required to use this channel created\_at: When the distribution was added to the system 🛠️ Task Polling Many endpoints return HTTP 202 with a task\_id. Use the Core API to poll for task completion. Endpoint: GET /api/core/v1/tasks/{task\_id}/ cURL Example: curl -X GET "https://ca.searchatlas.com/api/core/v1/tasks/a1b2c3d4-e5f6-7890-abcd-ef1234567890/" \ -H "Authorization: Bearer YOUR_JWT_TOKEN" Response - Task Pending: { "task_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "status": "PENDING" } Response - Task In Progress: { "task_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "status": "STARTED" } Response - Task Success: { "task_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "status": "SUCCESS", "result": { "file_name": "customer_123-press_release-20250128T143022_a1b2c3d4.xlsx", "file_url": "https://storage.googleapis.com/ca-images-persistent/customer_123-press_release-20250128T143022_a1b2c3d4.xlsx" } } Response - Task Failed: { "task_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "status": "FAILURE", "error": "Quota exceeded: Insufficient credits for press release generation" } Task Statuses: PENDING: Task queued but not started STARTED: Task is currently executing SUCCESS: Task completed successfully (check result field) FAILURE: Task failed (check error field) RETRY: Task failed but will retry automatically Polling Strategy: Poll every 2-5 seconds for short tasks (build, deploy) Poll every 10-30 seconds for long tasks (export) Stop polling after SUCCESS or FAILURE Implement exponential backoff for production use 🧱 Error Responses 🧩 400 Bad Request Invalid input data or validation errors. { "target_url": ["Invalid Target URL: URL responded with status code 404 (Not Found)"], "target_keywords": ["This field is required."] } 📰 401 Unauthorized Missing or invalid authentication token. { "detail": "Authentication credentials were not provided." } 📄 403 Forbidden User does not have permission to access the resource. { "detail": "You do not have permission to perform this action." } 🔗 404 Not Found Resource does not exist. { "detail": "Not found." } 📤 422 Unprocessable Entity Business logic validation failure. { "detail": "Otto Project is frozen" } 🔍 429 Too Many Requests Rate limit exceeded. { "detail": "Request was throttled. Expected available in 86400 seconds." } 📦 500 Internal Server Error Server-side error. { "detail": "An error occurred while processing your request." } 📈 Rate Limits 🔧 Press Release Export Limit: 100 requests per day per customer Endpoint: POST /api/cg/v1/press-release/export-links/ Response when exceeded: HTTP 429 🗂️ General API Limits Standard rate limits apply per customer account Contact support for rate limit increases 🧱✍️ Press Release Statuses Draft: Created but not yet processed Generating: AI content generation in progress Generated: Content generated successfully Publishing: Deployment to channels in progress Publish Stuck: Deployment encountered issues Publish Failed: Deployment failed permanently Published: Successfully deployed to all channels 🔁 Workflow Examples 📰 Complete Press Release Workflow Step 1: Create press release PR_ID=$(curl -s -X POST "https://ca.searchatlas.com/api/cg/v1/press-release/" \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{ "otto_project": 123, "target_url": "https://example.com/product", "target_keywords": ["AI", "innovation"], "input_prompt": "Announce our new AI product" }' | jq -r '.id') echo "Created PR: $PR_ID" Step 2: Generate content BUILD_TASK=$(curl -s -X POST "https://ca.searchatlas.com/api/cg/v1/press-release/$PR_ID/build/" \ -H "Authorization: Bearer $TOKEN" | jq -r '.[0]') echo "Build task: $BUILD_TASK" Step 3: Poll for completion while true; do STATUS=$(curl -s "https://ca.searchatlas.com/api/core/v1/tasks/$BUILD_TASK/" \ -H "Authorization: Bearer $TOKEN" | jq -r '.status') if [ "$STATUS" = "SUCCESS" ]; then echo "Build complete!" break elif [ "$STATUS" = "FAILURE" ]; then echo "Build failed!" exit 1 fi echo "Status: $STATUS, waiting..." sleep 5 done Step 4: Deploy to channels DEPLOY_TASK=$(curl -s -X POST "https://ca.searchatlas.com/api/cg/v1/press-release/$PR_ID/deploy/signal-genesys/" \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{ "genesys_category_id": "technology", "distribution_ids": [1, 2, 3], "variations": true }' | jq -r '.task_id') echo "Deploy task: $DEPLOY_TASK" Step 5: Export links after deployment completes curl -X POST "https://ca.searchatlas.com/api/cg/v1/press-release/export-links/" \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d "{ "press_releases": [ {"id": "$PR_ID", "channel_ids": []} ] }" 💡 Support & Resources Swagger/OpenAPI Docs: https://ca.searchatlas.com/schema/swagger/ Base URL: https://ca.searchatlas.com/api/cg/v1 Support: Contact your Search Atlas account manager API Version: v1. (stable) ❓FAQs ❓ Can I use the API without authentication? 💡 No. All requests must include a valid JWT token or API key. ❓ What happens if I send both otto_project and knowledge_graph? ⚡ The API will return a 400 Bad Request error. You must include only one. ❓ How can I check publication status in Signal Genesys? 💡 Review the signal_genesys.genesys_status field in the press release response. The Press Release API enables teams to automate every step of their press release workflow — from creation and generation to publication and analysis. If you need additional examples or support, our API team is here to help.

⚙️ SEO Audit API Constraints and Supported Workflows

🎯 What This Article Covers Some customers want to trigger a Search Atlas site audit automatically when an external form is submitted — for example, using a GoHighLevel form connected to a Make scenario that calls the Search Atlas API. This article clarifies what is and is not supported so you can design your automation correctly from the start. 🚫 Unsupported Workflow: End-User-Triggered Audits via External Forms Triggering a site audit on behalf of an end user through an external form submission is not a supported workflow. Specifically, the following scenario is not available: - A prospect or client fills out a form (for example, in GoHighLevel). - The form submission triggers a Make scenario. - The Make scenario calls the Search Atlas API to initiate a site audit for that user's domain. - The completed report is retrieved and sent to a third-party AI tool (such as Claude) for editing. - The edited report is emailed to the end user automatically. Even though this flow may appear technically plausible based on API documentation, it is outside the intended use of the audit system and will not function as expected. Attempting to build this workflow will result in errors, incomplete data, or unsupported behavior that our support team cannot troubleshoot. ✅ Supported Workflow: Account Owner Initiates Audits from the Dashboard Site audits in Search Atlas must be initiated by the account owner from inside the platform. This is the only supported method for starting a new audit. Log in to your Search Atlas account and navigate to the site audit area of the dashboard to configure and run an audit for a project under your account. This ensures audits are run with the correct account permissions, accurate project configuration, and full access to all reporting features. ⚙️ What the API Does and Does Not Support The Search Atlas API is designed to support account owners and their internal tools — not end-user-facing automation flows. Here is a general breakdown based on the intended design of the system: - Supported: Retrieving audit data for projects already created and run under your own account. - Supported: Reading report results programmatically to feed into your own dashboards or internal tools. - Supported: Managing projects and accessing data on behalf of your own account. - Not supported: Initiating new audits on arbitrary domains submitted by third-party users via external forms or automation triggers. - Not supported: Acting as a middleman API layer that processes external user requests and triggers audits dynamically on demand. If you are building an automation and need to confirm which specific API endpoints are available for reading audit data or managing projects, refer to the Search Atlas API documentation available within your account, or contact our team for guidance on what is achievable within the supported scope. If you need further assistance, open the chat widget in the bottom-right corner of the platform and type human teammate to be connected with a member of our team.

🔗 Site Audit API Integration via Make.com with Dynamic Report Retrieval

Overview This article explains how to integrate the Search Atlas Site Audit API with Make.com (formerly Integromat) so you can automate site audit workflows and retrieve reports dynamically without logging into the platform manually each time. What You Will Need - An active Search Atlas account with Site Audit access - Your Search Atlas API key (found in Account Menu → Settings → API Keys) - A Make.com account - The project ID or project name for the site audit you want to retrieve Step 1: Locate Your API Key and Project ID 1. Log in to Search Atlas and navigate to Account Menu → Settings → API Keys. 2. Copy your API key from the API Keys page. 3. Open the Site Audit tool and open the project you want to automate. Note the project ID — you will need this when configuring your Make.com scenario. Step 2: Set Up an HTTP Request Module in Make.com 1. Log in to Make.com and create a new scenario. 2. Add an HTTP request module as your action step. 3. Set the appropriate request method for the endpoint you are calling — refer to the Search Atlas API documentation for the correct method and endpoint URL. 4. Enter the Site Audit API endpoint URL, including your project ID as a parameter. 5. In the Headers section, add your API key in the format specified by the Search Atlas API documentation. Step 3: Parse and Use the Report Data 1. After the HTTP module runs, add a module to parse the JSON response and extract the audit report fields you need. 2. Map the parsed data to any downstream modules in your scenario — for example, to log results or notify your team when an audit completes. 3. Optionally, configure a schedule trigger in Make.com to run the scenario automatically at your preferred interval. Need Help with Specific Details? Because API endpoint names, required parameters, and authentication formats may change, always refer to the official Search Atlas API documentation for the most accurate and up-to-date instructions. If you encounter an error, note the exact error message, your project ID, and the endpoint you are calling — this information will help our team assist you quickly. If you need further assistance, open the chat widget in the bottom-right corner of the platform and type human teammate to be connected with a member of our team.

⚡ Signal Genesys External API Press Release Automation

Overview The Signal Genesys External API allows you to automate press release creation and publishing directly within Search Atlas. This article explains what to prepare, what to expect, and how to escalate effectively if you encounter issues. Because this is a backend-assisted integration, some steps — such as credential provisioning, entity linking, and endpoint configuration — require the support team to complete setup on your account before you can proceed. What to Prepare Before You Start Before contacting the support team to enable the Signal Genesys External API integration, gather the following information. Having this ready will allow the team to configure your account in a single interaction: - Your Search Atlas account email address — used to locate your account and assign API credentials. - The name of the project or integration you are building — helps the team provision the correct access scope. - The entity name you plan to associate with press releases — entities must exist and be linked to your account before API submissions will succeed. - Any error messages already encountered, including the exact error text and the timestamp of the failed request. Authentication Setup Signal Genesys API requests require authentication credentials tied to your Search Atlas account. These credentials are not self-provisioned — they are assigned by the support team based on your plan and integration requirements. To initiate this process: 1. Log in to your Search Atlas account and navigate to Avatar → Settings → API Keys to confirm whether an API key or token is already present. 2. If no credential is visible, open the chat widget and request API access. Provide your account email, project name, and intended use case so the team can assign the correct credential type. 3. Once credentials are issued, store them securely. The team will confirm the exact authentication header or parameter format required for your account configuration. Entity Management Every press release submitted via the API must be associated with a valid entity in your Search Atlas workspace. Entity linking is managed on the backend. If you receive a validation error related to an entity, this typically means one of the following: - The entity does not yet exist in your account and needs to be created by the support team. - The entity exists but is not linked to the correct workspace or project. - The entity name or identifier in your API request does not match the value stored on your account. When escalating an entity error, have ready: your account email, your organisation name, the exact error message returned by the API, and the timestamp of the failed request. The support team will identify which of the above applies and resolve it on the backend. Publishing a Press Release Once your credentials and entity are confirmed, press release submission via the External API follows this general flow: 1. Review the API documentation or developer resources available inside your Search Atlas account dashboard. These resources contain the endpoint path, required parameters, and accepted field values specific to your account configuration. 2. Construct your API request using the credentials issued to you. Include the entity identifier, press release content fields, and any distribution or variant parameters documented for your account. 3. Submit a test request before going live. Capture the full API response, including the status code, any error codes, and the response body. 4. If the test response indicates a configuration issue — such as an unrecognised entity, an invalid parameter, or an authentication failure — escalate to support with your account email, a description of the workflow you are automating, and the full error response including timestamps. Endpoint paths and required field names are account-specific and provided directly by the support team during onboarding. Do not share your API credentials in any support conversation. Credit Usage Credits may be deducted when a press release is submitted via the API. To avoid unexpected deductions: - Confirm with the support team how many credits a single API submission consumes on your plan before running bulk submissions. - Use test mode or a staging environment if one is available for your account, so that exploratory submissions do not consume production credits. - If you notice an unexpected credit deduction after a submission, note the press release ID or submission timestamp from the API response before escalating. When reporting a credit discrepancy, provide your account email, the press release ID or submission timestamp, and the credit balance before and after the deduction if visible in your dashboard. Status Tracking After a press release is submitted, its publishing status is returned in the API response and may also be visible in your Search Atlas dashboard. Common status values include submitted, processing, published, and failed. If a submission enters a failed or stuck state, escalate with the press release ID, the status value returned, and the timestamp of the original submission so the support team can investigate the backend workflow. If you need further assistance, open the chat widget in the bottom-right corner of the platform and type human teammate to be connected with a member of our team.

📘 OAuth vs API Key — Authentication Explained

The Search Atlas MCP uses credentials issued by the main Search Atlas platform. It does not issue its own authentication system. There are two supported authentication methods: OAuth (recommended) and API Key (advanced use only). This article explains how each method works, when to use them, and which one you should choose. 🔑 OAuth — Recommended for All Users OAuth is the recommended and supported authentication method for all customer-facing scenarios. 1. Add the MCP endpoint in your MCP-compatible client: https://mcp.searchatlas.com/mcp/ 2. Start the connection process in your client. 3. A browser window opens automatically. 4. Sign in to your Search Atlas account. 5. Complete the login and approval. 6. Return to your client. The connection is now saved, and the client will automatically handle credential storage and refresh going forward. 🔐 What Happens After OAuth Login Once connected, your client holds the credential and refreshes it automatically — you do not need to log in again for future sessions. All MCP actions will use your Search Atlas account, follow your plan entitlements, and respect your quota limits. ⚙️ API Key — Advanced / Programmatic Use The MCP also supports authentication using a Search Atlas API key via the X-API-Key header. This method is intended for scripts, server-to-server integrations, and non-interactive environments. Important limitations: there is no browser login flow, no automatic credential refresh, and it requires manual handling of the API key. ⚠️ Which One Should You Use? If you are a regular user, use OAuth. If you are building automation or backend integrations, use API Key. OAuth is the recommended path for all customer-facing scenarios. ⚠️ Common Issues - Authentication fails after login — this may happen if your session is expired. Disconnect and reconnect the MCP to refresh credentials. - Using API Key for normal usage — API keys are not recommended for standard usage. Switch to OAuth for a supported and smoother experience. OAuth is the standard way to connect MCP because it provides a secure, automatic, and fully supported authentication flow. API keys are available for advanced use cases, but most users should rely on OAuth to ensure a reliable connection and seamless experience. If you need further assistance, open the chat widget in the bottom-right corner of the platform and type human teammate to be connected with a member of our team.

🚀 Create Cloud Stacks via API with OTTO

Overview Cloud Stacks can be created within OTTO projects using knowledge bases via the Search Atlas API. This article explains what you will need and how to get started. Because the exact endpoint details, required payload fields, and navigation paths vary based on your account configuration, our team can walk you through the precise steps for your setup. What You Need Before You Start - A Search Atlas account with an active OTTO project - Your OTTO Project ID (found within your Search Atlas account) - Your Knowledge Graph ID (linked to the OTTO project, found within your Search Atlas account) - Your Search Atlas API key (found in Account Menu → Settings → API Keys) - An API client capable of sending HTTP requests How to Find Your OTTO Project ID and Knowledge Graph ID Your OTTO Project ID and Knowledge Graph ID are available within your Search Atlas account when you open the relevant OTTO project. In many cases, these IDs appear in the page URL when you are viewing that project. If you are unsure where to locate them, our support team can help you identify the correct values for your account. Authentication Every API request to Search Atlas must be authenticated using your Search Atlas API key. Include your API key as a Bearer token in the Authorization header of each request. Never share your API key publicly. You can locate your API key in Account Menu → Settings → API Keys. Sending Your API Request To create a Cloud Stack via the API, you will need to send an authenticated request that references your OTTO Project ID and Knowledge Graph ID. The specific endpoint URL, required JSON payload fields, and exact parameter names for Cloud Stack creation are confirmed in the Search Atlas API documentation available in your account portal. We recommend consulting that documentation for the most accurate and up-to-date details. Need Help Getting Started? If you are unsure of your OTTO Project ID, Knowledge Graph ID, or the correct API endpoint and payload structure for your account, our team is here to help. When reaching out, please have the following ready: - Your OTTO project name - The knowledge base you intend to use - Any error messages or response codes you have received - The API client you are using If you need further assistance, open the chat widget in the bottom-right corner of the platform and type human teammate to be connected with a member of our team.

🔌 Access Brand Voice Analysis via API

🧭 Overview Brand Vault stores your agency's brand identity details, including the Brand Voice Analysis — a structured breakdown of your brand's tone, style, and messaging guidelines. If you need to retrieve this data programmatically (for example, to integrate it into your own workflows or tools), the Search Atlas API gives you direct access. This article explains how to authenticate, find your Brand ID, and call the correct endpoint to retrieve Brand Voice Analysis data for any brand in your workspace, such as creativeblue.agency. 🔑 Step 1: Get Your API Key Before making any API calls, you need a valid Search Atlas API key. 1. Log in to your Search Atlas account. 2. Navigate to Settings → API Keys. 3. Copy your API key and store it securely. Treat it like a password — do not share it publicly. 🏷️ Step 2: Find Your Brand ID Every brand in Brand Vault has a unique Brand ID. You need this ID to query the correct brand's Voice Analysis. 1. Open Brand Vault from the header apps-grid icon → More Features → Brand Vault. 2. Select the brand you want to access (for example, creativeblue.agency). 3. Check the URL in your browser — the Brand ID appears as a unique identifier in the URL path (for example, /brand-vault/brands/abc123xyz). 4. Copy and save this ID for use in your API request. Alternatively, you can list all brands in your workspace by calling the brands list endpoint and matching by brand name. 📡 Step 3: Call the Brand Voice Analysis Endpoint Once you have your API key and Brand ID, use the following request structure to retrieve the Brand Voice Analysis: - Method: GET - Endpoint:/api/v1/brand-vault/brands/{brand_id}/voice-analysis - Header:Authorization: Bearer YOUR_API_KEY - Content-Type:application/json Replace {brand_id} with the ID you copied in Step 2, and YOUR_API_KEY with your actual API key. 📦 Step 4: Understand the Response A successful response returns a JSON object containing the brand's voice analysis fields. Common fields include: - tone — the overall tone of the brand (e.g., professional, conversational, authoritative) - style_guidelines — specific writing style rules for the brand - vocabulary — preferred and avoided words or phrases - audience — the target audience description - messaging_pillars — core themes and value propositions You can use individual fields from this response to dynamically apply the brand voice in your own content pipelines or AI workflows. ⚙️ Using Dynamic Field-Based Preview The API supports field-based filtering, so you can request only the specific voice attributes you need rather than retrieving the entire analysis object. Append a fields query parameter to your request to specify which fields to return. - Example: ?fields=tone,vocabulary,audience - This reduces payload size and speeds up integration, especially when embedding brand voice into real-time content generation tools. ⚠️ Common Issues and Fixes - 401 Unauthorized: Your API key is missing or incorrect. Double-check it in Settings → API Keys. - 404 Not Found: The Brand ID is wrong or the brand has been deleted. Re-confirm the ID from Brand Vault. - 403 Forbidden: Your account role may not have API access enabled. Contact your workspace admin to verify permissions. - Empty voice analysis fields: Brand Voice Analysis is generated after a brand profile is fully set up. Make sure the brand in Brand Vault has completed its onboarding and analysis steps. 💡 Best Practices - Store your API key as an environment variable — never hardcode it in your source code. - Cache Brand Voice Analysis responses if you query the same brand frequently to avoid unnecessary API calls. - Use the fields parameter to retrieve only what you need, keeping responses lightweight. - If you manage multiple brands (like an agency), loop through your brands list endpoint to batch-retrieve voice data for all clients. 🙋 Need More Help? If you need further assistance, open the chat widget in the bottom-right corner of the platform and type human teammate to be connected with a member of our team.

🔌 Fix WordPress MetaSync API Key Authentication Timeout

🔍 Overview When connecting the Search Atlas MetaSync plugin to your WordPress site, you may encounter an authentication timeout — typically after 60 seconds — regardless of whether you use the One-Click connection or manual API key entry method. In some cases, you may also see a 500 error or the message "The API key could not be verified." This article walks you through the most effective troubleshooting steps to restore the connection. ⚠️ What Causes This Issue? Authentication timeouts and API key errors during MetaSync setup are usually caused by one or more of the following: - A corrupted or invalidated API key stored in your WordPress database - A server-side timeout on your WordPress host that cuts the connection before authentication completes - A plugin conflict or caching layer interfering with the authentication request - An outdated version of the MetaSync plugin that does not send authentication headers correctly - A firewall or security plugin blocking outbound requests from your WordPress site to Search Atlas servers 🛠️ Step-by-Step Troubleshooting Work through the steps below in order. Most customers resolve the issue by completing steps 1 through 4. 1. Update the MetaSync plugin to the latest version. In your WordPress dashboard, go to Plugins → Installed Plugins, find Search Atlas MetaSync, and click Update if an update is available. Older plugin versions may not send the correct authentication headers required by the Search Atlas API. 2. Regenerate your API key in Search Atlas. Log in to your Search Atlas dashboard, navigate to Settings → API Keys, and generate a new API key. Do not reuse the old key — copy the new one immediately and keep it ready for the next step. 3. Disconnect and reconnect the plugin manually. In your WordPress admin panel, go to the MetaSync plugin settings and disconnect any existing connection. Select the manual entry method and paste your newly generated API key. Save the settings and wait up to 90 seconds for the handshake to complete. 4. Clear all caches before retrying. Clear your WordPress object cache, page cache, and any CDN cache (e.g., Cloudflare, WP Rocket, W3 Total Cache). A stale cache can cause the authentication request to fail silently. 5. Temporarily disable security and firewall plugins. Plugins such as Wordfence, iThemes Security, or All In One WP Security may block outbound API requests. Disable them one at a time, then retry the connection after each deactivation to identify the culprit. Re-enable them once the connection is established. 6. Check your hosting provider's outbound request limits. Some managed WordPress hosts (e.g., WP Engine, Kinsta, Flywheel) restrict or throttle outbound HTTP requests. Contact your host and ask them to whitelist outbound connections to api.searchatlas.com. Also ask them to confirm that your PHP execution timeout is set to at least 120 seconds. 7. Switch to the One-Click connection method if manual entry failed, or vice versa. If manual entry timed out, try the One-Click SSO flow from your Search Atlas dashboard under Account Menu → Settings → CMS Connectors. If One-Click failed first, switch to manual entry with your regenerated key. ✅ How to Confirm the Connection Is Working After completing the steps above, verify that MetaSync is connected successfully: - In your WordPress admin panel, the MetaSync plugin status should show Connected with your Search Atlas account name displayed. - In your Search Atlas dashboard under Account Menu → Settings → CMS Connectors, your WordPress site should appear as an active, linked property. - Run a test sync from the MetaSync plugin settings page and confirm that data flows to your Search Atlas account without errors. 🚫 Common Mistakes to Avoid - Do not reuse a previously generated API key after a failed authentication attempt. Once an error occurs, always regenerate a fresh key. - Do not attempt multiple connection methods simultaneously. Complete one method fully — including clearing caches — before trying the other. - Do not skip the cache-clearing step. This is one of the most overlooked causes of repeated authentication failures. 💬 Still Need Help? If you have followed all the steps above and the MetaSync plugin still cannot authenticate, our team can investigate your specific account and server configuration. If you need further assistance, open the chat widget in the bottom-right corner of the platform and type human teammate to be connected with a member of our team. When you reach out, please have the following ready to speed up the investigation: - Your WordPress site URL - The exact error message displayed (screenshot if possible) - Your WordPress version and MetaSync plugin version - Your hosting provider name - A list of active security or caching plugins Additional Notes API key type mismatch: The MetaSync plugin currently requires a v1 API key. Using a v2 API key may cause verification to fail. Log in to Search Atlas, go to Settings > API Keys, and generate or copy a v1 key instead.

🔑 Fix Wix CMS API Key Authentication Errors

🔍 Overview When connecting Wix CMS to Search Atlas, you may encounter an authentication error that reads: "Invalid or expired API Key. Please ensure your Wix API Key has the 'Manage Blog' permission enabled." This article walks you through the most common causes and how to fix them. ⚠️ Common Causes of This Error - The API key is missing the required Manage Blog permission - The API key was regenerated or expired after the initial connection was made - The Account ID was not included during setup - The wrong Wix site is associated with the API key - The API key belongs to a different Wix account than the one managing the site 🛠️ Step-by-Step Troubleshooting 1. Log in to your Wix account and go to Settings > API Keys in the Wix dashboard. 2. Verify the Manage Blog permission is enabled on your API key. If it is not checked, edit the key, enable the permission, and save. 3. Locate your Account ID. In Wix, your Account ID appears in the API Keys section, typically labeled Account ID at the top of the page. This is different from your Site ID. 4. Re-enter your credentials in Search Atlas. Go to the Wix CMS connector settings via Account Menu → Settings → CMS Connectors in Search Atlas, remove the existing connection, and reconnect using both your API Key and your Account ID. 5. Confirm the correct site is selected. During reconnection, make sure the site you are linking matches the site associated with your API key. 6. Generate a new API key if needed. If the key may have been regenerated or revoked, create a fresh API key in Wix, ensure Manage Blog is enabled, and use the new key in Search Atlas. ✅ Required Wix API Key Permissions Your Wix API key must have at least the following permission enabled for the Search Atlas integration to work correctly: - Manage Blog — required to read categories, posts, and other blog data Without this permission, Search Atlas cannot authenticate against the Wix API, even if the key itself is valid. 🔄 Reconnecting After Fixing Your Credentials Once you have corrected your API key permissions or generated a new key, follow these steps to restore the connection: 1. Open Search Atlas and navigate to your CMS Connector settings. 2. Select your Wix connection and click Disconnect or Reconnect. 3. Enter your updated API Key and Account ID in the fields provided. 4. Click Connect and wait for the status indicator to confirm a successful connection. 5. If the connection succeeds, trigger a manual sync to confirm data is flowing correctly. ❓ Frequently Asked Questions Do I need to include my Account ID? Yes. The Account ID is a required field. Submitting only the API key without the Account ID will cause the connection to fail, even if all permissions are correctly set. My permissions look correct but I still get the error. What should I do? Try generating a brand-new API key in Wix and reconnecting. Existing keys can become invalid if your Wix account credentials or plan change. What does "meta-site not found" mean? This error typically means the API key is associated with a different Wix account or site than the one you are trying to connect. Double-check that the Account ID and API key both belong to the same Wix account that owns the target site. 💬 Still Need Help? If you need further assistance, open the chat widget in the bottom-right corner of the platform and type human teammate to be connected with a member of our team.

Brand Voice Analysis API Reference for Developers

Overview Search Atlas supports programmatic access to Brand Voice Analysis data stored in your Brand Vault via the Search Atlas API. This is useful for integrating voice guidelines into your own tools, automating content workflows, or pulling analysis results into external platforms. This article covers what you need to get started, including authentication, what to have ready, and how to reach our team for confirmed endpoint details specific to your account configuration. Authentication All Search Atlas API requests require authentication via a Bearer token. To locate or manage your API credentials, log in to Search Atlas, click your Avatar (top-right), then go to Settings → API Keys / Integrations to find your API key. If you are unable to locate your API key, our team can walk you through generating one. What to Prepare Before Making API Requests To successfully integrate Brand Voice Analysis data into your workflows, gather the following before you begin or before reaching out for support: - Your API key — retrieved from your Search Atlas account Settings as described above - Your Search Atlas account email or workspace name - The name or ID of the Brand Vault you want to access programmatically — you can find this by opening the Brand Vault inside the platform and noting the name you assigned it - Your intended use case — for example, pulling data into an external tool, automating a content workflow, or building a direct integration - Any error messages or HTTP status codes you have already encountered, if applicable - The programming language or HTTP client you are using (for example: Python, Node.js, cURL) How API Requests Are Structured When making requests to the Search Atlas API for Brand Voice Analysis data, follow these general steps: 1. Include your API key as a Bearer token in the Authorization header of every request. 2. Target the Brand Voice Analysis endpoint associated with your specific Brand Vault. Because exact endpoint paths depend on your account configuration and may be updated, confirm the current endpoint path with our team before building your integration. 3. Submit a GET request (or the request method confirmed for your endpoint) and parse the JSON response, which will contain the Brand Voice Analysis fields associated with your Brand Vault. 4. If you receive an HTTP error (such as 401 Unauthorized or 404 Not Found), verify that your API key is valid and that the Brand Vault name or ID in your request matches what is configured in your account. Common Issues and How to Resolve Them - 401 Unauthorized: Your Bearer token is missing, expired, or incorrect. Regenerate your API key in Settings and update your request headers. - 404 Not Found: The Brand Vault identifier in your request does not match any vault in your account. Double-check the name or ID against what is shown in the platform. - Empty or unexpected response: Confirm that Brand Voice Analysis has been run for the Brand Vault you are querying. If no analysis exists yet, run it from within the platform first, then retry your API request. Next Steps If you need the confirmed endpoint path, full request format, or complete response schema for your specific account, our team can provide verified technical documentation. Have your account email, Brand Vault name, use case, and any error messages ready to speed up the process. If you need further assistance, open the chat widget in the bottom-right corner of the platform and type human teammate to be connected with a member of our team.

🔗 Publishing AI Content to a Custom PHP Backend

🧭 Overview Search Atlas does not support direct webhook creation for custom PHP websites. This is expected behaviour — the webhook option in the publishing settings is reserved for supported third-party platforms. If you are running a custom PHP backend, you can still publish AI-generated content automatically using one of two integration methods described in this article. ⚙️ Choose Your Integration Method Before you begin, determine how your PHP site stores content: - Database storage — your site uses MySQL, MariaDB, or another database to store posts and pages. - File storage — your site writes content to flat files such as HTML, Markdown, or JSON files on the server. Both methods use the Search Atlas REST API to retrieve published content. The difference lies in how your PHP script handles and stores the data once it is received. 🔑 Step 1 — Generate Your API Key 1. Log in to Search Atlas, click your Avatar, and open Settings. 2. Navigate to API Keys. 3. Click Generate New Key and copy the key to a safe location. 4. Note your Organisation ID displayed on the same page — you will need it in later steps. 📡 Step 2 — Set Up the PHP Integration Script Create a new PHP file on your server, for example fetch-content.php. This script will request your published content from the Search Atlas API and store it on your site. Base API request structure: - Endpoint: https://api.searchatlas.com/v1/content/published - Method: GET - Required headers: Authorization: Bearer YOUR_API_KEY and X-Organisation-ID: YOUR_ORG_ID - Optional query parameter: ?since=TIMESTAMP to retrieve only content published after a specific date and time. Your PHP script should perform an HTTP request to this endpoint using cURL or a library such as Guzzle, then decode the JSON response and process each content item. 🗄️ Step 3A — Store Content in a Database If your PHP site uses a database, follow these steps after retrieving the API response: 1. Connect to your database using PDO or MySQLi. 2. For each content item in the response, check whether a record with the same content_id already exists in your posts table. 3. If the record exists, run an UPDATE statement to refresh the title, body, slug, and updated timestamp. 4. If the record does not exist, run an INSERT statement to create a new row. 5. Map the following API response fields to your table columns: title, body_html, slug, meta_description, published_at, and content_id. 📁 Step 3B — Store Content as Flat Files If your PHP site uses file-based storage, follow these steps after retrieving the API response: 1. Define a target directory on your server where content files will be saved, for example /var/www/html/content/. 2. For each content item in the response, construct a file name using the slug field and your preferred extension, such as my-article-slug.html. 3. Write the body_html value to the file using file_put_contents(). This will create the file if it does not exist or overwrite it if it does. 4. Optionally, write a companion JSON file for each piece of content containing the title, meta description, and published date for use by your templating layer. ⏱️ Step 4 — Automate With a Cron Job Because webhooks are not available for custom PHP backends, you will use a scheduled cron job to poll the API at regular intervals and keep your site up to date. 1. Open your server's crontab by running crontab -e in the terminal. 2. Add a new line to run your script on your preferred schedule. For example, to run every 15 minutes use: */15 * * * * php /var/www/html/fetch-content.php 3. Save the crontab. Your server will now automatically check for new or updated content and publish it to your site. 4. To retrieve only new content on each run, store the timestamp of the last successful fetch and pass it as the since query parameter in each API request. ✅ Step 5 — Test the Integration 1. Publish a test article from the Search Atlas content editor. 2. Manually run your PHP script from the terminal to confirm it fetches the article without errors. 3. Verify the article appears in your database table or file directory as expected. 4. Check that the cron job runs on schedule by reviewing your server logs after the next scheduled interval. 🚫 Common Issues and Fixes - 401 Unauthorised error — Confirm your API key is correct and has not expired. Regenerate it in Settings if needed. - Empty response from API — Ensure at least one article has been published in Search Atlas and that your Organisation ID is correct. - Cron job not running — Verify the PHP binary path in your cron command by running which php in the terminal and updating the crontab accordingly. - Duplicate content in database — Confirm your upsert logic is checking against the content_id field, not the title or slug, which may change. 💬 Need More Help? If you need further assistance, open the chat widget in the bottom-right corner of the platform and type human teammate to be connected with a member of our team.

🔌 API Access, Quotas, and Plan Eligibility

🗺️ Overview API access at Search Atlas is not limited to Enterprise or higher-tier plans. Every plan — including Starter — includes API access. This article explains exactly which APIs are available on each plan and what monthly quota limits apply. ✅ Which Plans Include API Access? All Search Atlas pricing plans include API access: - Starter — API access included - Growth — API access included - Pro — API access included - Agency — API access included You do not need to upgrade to an Enterprise plan to use the Search Atlas API. Quota limits and available endpoints vary by plan tier, as detailed below. 📊 Monthly API Quota Limits by Plan Each plan comes with a set monthly quota. The following limits apply across core API types: - Starter — Base-level quotas suitable for individual use and testing - Growth — Increased quotas to support growing teams and campaigns - Pro — Higher limits for advanced users managing multiple projects - Agency — Maximum quotas designed for agencies with high-volume needs The table below outlines specific monthly quota limits for key API types: - Competitor Gap API - Growth: 200,000 requests/month - Pro: 500,000 requests/month - Agency: 1,000,000 requests/month - Content Gap API - Growth: 200,000 requests/month - Pro: 500,000 requests/month - Agency: 1,000,000 requests/month Starter plan quotas for these specific APIs may differ. If you are on the Starter plan and need confirmation of your exact limits, open the chat widget in the bottom-right corner of the platform and type human teammate to be connected with a member of our team. 🔍 Content Gap and Competitor Gap API Availability Both the Content Gap API and Competitor Gap API are available on the following plans: - Growth — Both APIs available - Pro — Both APIs available - Agency — Both APIs available If you are on the Starter plan and want to confirm whether Content Gap or Competitor Gap API endpoints are enabled for your account, open the chat widget in the bottom-right corner of the platform and type human teammate to be connected with a member of our team. 📋 Quick Reference: Plan Comparison - Starter — API access: Yes | Content Gap API: Confirm with support | Competitor Gap API: Confirm with support | Quota: Base level - Growth — API access: Yes | Content Gap API: Yes | Competitor Gap API: Yes | Quota: 200,000/month per API - Pro — API access: Yes | Content Gap API: Yes | Competitor Gap API: Yes | Quota: 500,000/month per API - Agency — API access: Yes | Content Gap API: Yes | Competitor Gap API: Yes | Quota: 1,000,000/month per API ⚡ How to Access Your API Credentials 1. Log in to your Search Atlas account. 2. Click your avatar in the top-right corner and select Settings. 3. Select API Keys or Integrations from the settings menu. 4. Copy your API key and review your current usage and remaining quota for the month. 🔄 What Happens When You Reach Your Quota? Once your monthly API quota is reached, requests to the affected endpoints will return an error until your quota resets at the start of the next billing cycle. To avoid interruptions: - Monitor your usage regularly in the API settings dashboard. - Consider upgrading to a higher plan if you consistently approach your limit. - Contact our team to discuss custom quota options if your needs exceed Agency-level limits. 🆙 Upgrading Your Plan If your current plan quota is not sufficient, you can upgrade directly from your account dashboard. Click your avatar in the top-right corner, select Billing, and open the Plans & Top-ups tab (Billing) to view available options and upgrade instantly. 💬 Need Help? If you need further assistance, open the chat widget in the bottom-right corner of the platform and type human teammate to be connected with a member of our team.

🔍 Holistic SEO Pillars API Endpoint Reference

Overview If you are looking to retrieve Holistic SEO Pillars audit data programmatically via the Search Atlas API, this article explains what you need to know about finding the correct endpoint and parameters for your request. Why This Article Exists Customers have contacted support specifically to ask for the API endpoint and parameter details needed to pull Holistic SEO Pillars audit data. The exact endpoint path and parameter names are not documented in a single publicly indexed location, which is why this gap exists. Because the specific endpoint details are not confirmed in available source material, the steps below explain how to get this information directly and what to have ready when you reach out to the team. Step 1: Locate Your API Key All Search Atlas API requests require authentication with your API key. To find your API key: 1. Log in to your Search Atlas account. 2. Navigate to your account settings area within the platform. 3. Look for the section related to API access or developer credentials. 4. Copy your API key — you will need to pass this as an authentication credential in every request. Step 2: Find the Holistic SEO Pillars Endpoint The Holistic SEO Pillars audit data is available through the Search Atlas REST API. However, because the exact endpoint path and required parameter names have not been publicly confirmed in available documentation, we recommend the following: 1. Check the Search Atlas API Documentation accessible from within your account dashboard for any reference to Holistic SEO Pillars or Site Audit endpoints. 2. If the endpoint is not listed there, contact the support team directly — a support agent can provide you with the confirmed endpoint URL, required parameters, and an example request. 3. When you reach out, have your project name, the domain you are auditing, and your intended use case ready so the team can give you the most accurate endpoint details. Step 3: What to Have Ready To get a working API call as quickly as possible, prepare the following before reaching out: - Your project name as it appears in your Search Atlas account - The domain associated with the Holistic SEO Pillars audit you want to query - The type of data you need (e.g., full audit results, specific pillar scores, historical data) - Any error message or response code you have already received if you attempted a request - The request you already tried, including the endpoint path and any parameters you used If you need further assistance, open the chat widget in the bottom-right corner of the platform and type human teammate to be connected with a member of our team.

🛠️ Signal Genesys External API Technical Reference

📋 Overview The Signal Genesys External API allows you to programmatically manage press releases, entities, media assets, and distribution channels from within your own workflow. This article covers the key technical areas customers most commonly ask about, including entity configuration, release publishing, credit management, image handling, request validation, and response schema details. Because the full technical specification for the Signal Genesys External API — including verified endpoint paths, required and optional field names, parameter flags, credit deduction logic, and behavioral rules — is not publicly documented in a single reference, the details for your specific implementation may vary. Our team can confirm the exact specifications that apply to your account and integration. 🏷️ Configuring Entities Entities represent the brand, person, or organisation associated with a press release. If you have questions about which fields are required for entity configuration, how entity updates affect previously published releases, or how to reference entities across multiple releases, please reach out to our team with the following information ready: - Your Signal Genesys account name or project identifier - The specific entity type you are working with (e.g. brand, person, or organisation) - A description of the behaviour or error you are experiencing, including any exact error messages and timestamps 📤 Publishing Releases Publishing a press release through the API involves submitting a validated payload. Common questions in this area include draft versus published states, how distribution channel variants are handled on re-submission, batch submission behaviour, and indexation tracking. To get accurate guidance for your integration, please have the following ready when you contact us: - Your Signal Genesys account name or project identifier - The endpoint and request method you are using - The exact error message or unexpected behaviour you observed, including timestamps - A sanitised version of your request payload (remove any sensitive credentials before sharing) 💳 Understanding and Managing Credits Credits govern how many releases you can publish. If you have questions about when credits are deducted, how draft versus published states affect your credit balance, or how to track remaining credits, our team can confirm the exact rules that apply to your account plan. Please have the following ready: - Your Signal Genesys account name - The specific action you took (e.g. publishing, re-submitting to additional channels) and the credit change you observed - Any relevant timestamps 🖼️ Image Management, Request Validation, and Response Schemas For questions about uploading and referencing images in release payloads, understanding validation error responses, or interpreting API response schemas, the specifics depend on your API version and account configuration. When escalating these questions, please include: - Your Signal Genesys account name or project identifier - The API version or integration type you are using, if known - The exact validation error message or response body you received, including timestamps If you need further assistance, open the chat widget in the bottom-right corner of the platform and type human teammate to be connected with a member of our team.

🔑 Where to Find Your UUID and API Key in Search Atlas

If you're setting up OTTO, connecting an integration, or working with a developer, you may be asked for either your UUID or your API Key. While they may sound similar, they serve very different purposes and are located in different areas of the dashboard. This guide shows you exactly where to find each one. 🆔 How to Find Your UUID (OTTO Pixel UUID) Your UUID is part of your OTTO Pixel installation script. It identifies your specific project installation. Navigate to Left Sidebar → OTTO SEO → All Sites, select your project, then open Installation Guide → Custom Installation. Custom Installation page with the OTTO Pixel script Under Step 1: Copy Your Pixel Script, you'll see a script block containing a data-uuid attribute formatted like XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. That value is your UUID. 🧠 What the UUID Is Used For It identifies your OTTO installation, connects your website to your specific project, is unique per project, and is automatically generated. You'll typically need it when verifying pixel installation, troubleshooting OTTO setup, or working with technical support. 🔐 How to Find Your API Key Your API Key is different from your UUID. It's used for integrations and external connections to Search Atlas. Navigate to Top Right → Click Your Profile Name → Settings → API Keys. API Keys panel in account settings You'll see a section titled Search Atlas API Key, with a long alphanumeric key. That string is your API Key. 🧠 What the API Key Is Used For It's used for connecting third-party tools, API-based integrations, automation workflows, and external platform connections. Your API Key is sensitive — do not share it publicly. ⚖️ UUID vs API Key — What's the Difference? The UUID is found in the OTTO Installation Guide, is project-specific, is used for pixel installation, and lives inside a script tag. The API Key is found in Account Settings, is account-level, is used for integrations, and is displayed in the API Keys panel. Quick summary: Need to install or verify OTTO? Get your UUID. Connecting an integration or using API access? Get your API Key. If you need further assistance, open the chat widget in the bottom-right corner of the platform and type human teammate to be connected with a member of our team.

🔧 Fix Signal Genesys External API 403 Scope Errors

Overview If every request you send to the Signal Genesys External API returns an HTTP 403 – Invalid scope provided error, your API token may be missing one or more required permission scopes. This article explains what causes the error and what to have ready when contacting our team to resolve it. What Causes the 403 'Invalid Scope' Error? A 403 scope error means your bearer token was authenticated successfully, but it does not have permission to perform the action you requested. Common reasons include: - The token was generated without the necessary permission scopes for the External API feature you are trying to use. - Your token was created with a limited scope configuration that excludes certain External API features. - Your plan tier may not include External API access, so the platform blocks those scopes entirely. - The token has expired or been rotated and the updated token was not saved in your integration. What to Do Because resolving a 403 scope error on the Signal Genesys External API requires backend verification of your token permissions and plan entitlements, our support team will need to investigate on your behalf. To help us resolve this as quickly as possible, please have the following ready before reaching out: - Your Search Atlas account email address - The exact 403 error message you are receiving - The specific API endpoint or action you are attempting to call - The date and time (with timezone) when the error first occurred - Your current plan or subscription tier, if known Do not share your full bearer token when contacting support — our team can look up your token configuration securely on the backend. If you need further assistance, open the chat widget in the bottom-right corner of the platform and type human teammate to be connected with a member of our team.

🔌 Search Atlas API authentication and endpoint configuration for Google Apps Script

Overview You can connect Google Apps Script to Search Atlas by making authenticated HTTP requests to the Search Atlas API. This requires your API key and the correct endpoint URL. Step 1: Locate your Search Atlas API key 1. Log in to your Search Atlas account. 2. Navigate to your account settings or profile area to find your API key. 3. Copy the API key — you will use this to authenticate all requests. Step 2: Configure authentication in Google Apps Script Search Atlas uses API key-based authentication. In your Google Apps Script project, pass your API key as a header in each request: - Header name: X-API-KEY - Header value: YOUR_API_KEY (the key itself, with no "Bearer" prefix) Example setup in Google Apps Script: 1. Open your Google Apps Script project at script.google.com. 2. Use the UrlFetchApp.fetch() method to make HTTP requests. 3. Set the headers option to include your X-API-KEY header with your API key. 4. Set the method option to match the required HTTP method for your endpoint (e.g., GET or POST). Step 3: Use the correct API endpoint Use the base API URL provided in your Search Atlas account documentation or onboarding materials. Append the specific endpoint path for the data or action you need (for example, keyword data, project data, or backlink data). Troubleshooting common issues - 401 Unauthorized: Double-check that your API key is correct and that it is sent in the X-API-KEY header with no "Bearer" prefix and no extra spaces. - 403 Forbidden: Most often the API key was missing, invalid, or revoked. Check that the key is sent in the X-API-KEY header (not as a Bearer token), that you copied the full key, and that it has not been regenerated or revoked in Settings → API Keys. If the response is a Cloudflare error page (for example Error 1010), the request was blocked by our security layer before reaching Search Atlas — contact support with the Cloudflare Ray ID, the time of the request, and the endpoint you called. Your plan does not cause this error. - Endpoint not found: Verify the endpoint path matches what is documented in your Search Atlas account — check for typos or version mismatches in the URL. When to contact support If you are unable to resolve your authentication or endpoint issue, please have the following ready before reaching out: your project name, the exact error message returned by the API, the endpoint URL you are calling, and a timestamp of when the error occurred. If you need further assistance, open the chat widget in the bottom-right corner of the platform and type human teammate to be connected with a member of our team.

🔗 Search Atlas API Documentation

Search Atlas provides a set of APIs that allow you to interact with different parts of the platform programmatically. These APIs are designed to help you: - Automate workflows - Integrate Search Atlas into your internal systems - Interact with AI agents - Access and manage SEO-related processes You can explore the full technical reference in the official API documentation. 📍 Access the full API documentation 👉 Explore the full API reference here: ​ https://docs.searchatlas.com/#description/introduction The documentation includes: - Available endpoints by service - Authentication requirements - Request and response formats - Example payloads 🔐 Authentication All API requests require an API key. To get your key: Account Menu (avatar) → Settings → API Keys Then include it in your request headers: X-API-Key: your_api_key ⚙️ Available API Services & Modules The Search Atlas API includes endpoints across the following core systems: 🤖 AI Agents & Automation Interact directly with Search Atlas AI systems: - Atlas Brain (Orchestrator) → multi-agent coordination - OTTO SEO Agent → SEO optimization workflows - OTTO PPC (Ad Brain) → paid ads optimization - Content Genius → AI content generation - Website Studio → landing page and site generation - Local SEO (GBP, Heatmaps, Citations) → local visibility automation - Authority Building → link and authority workflows - Site Explorer → site analysis - Keywords Agent → keyword research workflows - LLM Visibility → AI search visibility tracking 👉 These endpoints typically use streaming responses via WebSockets, enabling real-time agent interaction. 🧩 Playbooks & Workflow Automation Manage reusable automation workflows: - List and search playbooks - Create and update playbooks - Clone or archive playbooks - Run quick-execution playbooks 👉 Designed to automate repeatable SEO and AI-driven processes. 📁 Agent Projects - Create and manage projects tied to domains - Configure location, country, and setup parameters 👉 Used as the base layer for agent-driven workflows. 💬 Sessions & Conversations - Retrieve chat sessions - Access message history - Regenerate AI responses - Share conversations 👉 Enables building custom interfaces on top of AI interactions. 📦 Artifacts & Outputs - Access outputs generated by agents - Track artifacts across sessions - Retrieve activity types and scorecards 👉 Useful for reporting, dashboards, and automation pipelines. ☁️ Signal Genesys (Content & Distribution APIs) Advanced content and distribution workflows: - Cloud Stack content generation and deployment - Press Release creation and distribution - HTML templates and publishing systems - Export and deployment tracking 👉 These APIs support large-scale content automation and syndication. 🔗 Backlink Projects - Create backlink comparison projects - Analyze competitors - Retrieve backlink datasets 👉 Designed for SEO analysis and link intelligence workflows. 🌐 Base URLs Different services use different base endpoints, such as: - https://api.searchatlas.com - https://agent.searchatlas.com - https://sa.searchatlas.com - https://backlink.searchatlas.com 👉 Each corresponds to a specific system or service. 💡 What you can do with the API Depending on the service, you can: - Automate SEO workflows - Integrate AI agents into your systems - Build custom dashboards and reporting tools - Manage projects and configurations programmatically - Trigger and monitor content or SEO processes 💡 What makes this API different Unlike traditional SEO APIs, Search Atlas APIs are designed around: - Agent-based execution (not just data retrieval) - Streaming interactions - Automation-first workflows - Multi-system orchestration This allows developers to build systems that execute SEO tasks, not just analyze them. 🧾 Summary - The API includes multiple services: AI agents, workflows, content systems, and SEO tools - Each module has dedicated endpoints and base URLs - Supports real-time agent interaction and automation - Full documentation is available online 🚀 Getting started 1. Open the API documentation 2. Generate your API key 3. Explore endpoints by module 4. Start testing with your preferred tool The Search Atlas API opens the door to a new way of working—one where SEO, content, and marketing execution are no longer manual, but programmable, scalable, and agent-driven. Whether you're integrating AI agents like OTTO and Content Genius, automating playbooks, or building custom dashboards on top of Search Atlas data, the API gives you the flexibility to turn strategy into execution. Everything you need to get started—endpoints, authentication, and examples—is available in the official documentation: 👉 https://docs.searchatlas.com/#description/introduction If you're looking to go further—automating workflows, connecting systems, or building your own tools—we’re here to support you. Start exploring, start building, and let the system do the work.

🤖⚙️ OTTO SEO Project Creation

Authentication All requests must include an API key in the header: x-api-key: YOUR_API_KEY 1. Create Site Audit Endpoint: POST https://sa.searchatlas.com/api/v2/site-audit/ Payload: { "siteproperty": "https://example.com/", "selected_user_agent": "googlebot_desktop", "crawl_budget": 100, "crawl_concurrency": 10 } Parameters: - siteproperty (string) – Website URL - selected_user_agent (string) – User agent for crawling (e.g., googlebot_desktop, bingbot_mobile) - crawl_budget (integer) – Number of pages to crawl (min: 1, max: 10,000, default: 100) - crawl_concurrency (integer) – Crawl speed (min: 1, max: 50, default: 10) Response Example: { "id": "123456" } Note: Use the returned id to create an Otto Project. 2. Create Otto Project Endpoint: POST https://sa.searchatlas.com/api/v2/otto-projects/ Payload: { "siteaudit": "123456" } Parameters: - siteaudit (string) – ID from the Create Site Audit response Response Example: { "otto_uuid": "abcdef-12345" } 3. Get Otto Project List Endpoint: GET https://sa.searchatlas.com/api/v2/otto-projects/ Query Parameters: - page (integer) – Page number for pagination - page_size (integer) – Number of results per page (max: 100) - search (string) – Search by Otto Project URL Response Example: { "results": [ { "otto_uuid": "abcdef-12345", "site_url": "https://example.com/" } ] } 4. Get Otto Project Details Endpoint: GET https://sa.searchatlas.com/api/v2/otto-projects/#{{otto_uuid}}/ Path Parameter: - otto_uuid (string) – Unique identifier for the Otto Project Response Example: { "otto_uuid": "abcdef-12345", "site_url": "https://example.com/", "status": "completed" } Usage Flow 1. Create a Site Audit – Get the id from the response. 2. Create an Otto Project – Use the id from Step 1. 3. Retrieve Project List or Details – Use otto_uuid to get details. Postman Collection { "info": { "_postman_id": "5255f9d4-d180-472a-94a9-7203592ff142", "name": "Otto Project Collection", "description": "**For creating the Otto Project: \n1\\. First use POST Create Site Audit; \n2\\. From the returned response, extract** **`id`****; \n**3\\. Use that **`id`** **in the POST Create Otto Project;**", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", "_exporter_id": "14722608" }, "item": [ { "name": "Create Site Audit", "request": { "auth": { "type": "noauth" }, "method": "POST", "header": [ { "key": "x-api-key", "value": "", "type": "text" } ], "body": { "mode": "raw", "raw": "{\n \"siteproperty\":,\n \"selected_user_agent\":,\n \"crawl_budget\":,\n \"crawl_concurrency\":,\n}", "options": { "raw": { "language": "json" } } }, "url": { "raw": "https://sa.searchatlas.com/api/v2/site-audit/", "protocol": "https", "host": [ "sa", "searchatlas", "com" ], "path": [ "api", "v2", "site-audit", "" ] }, "description": "Creating a Site Audit, params:\n\n- siteproperty - string of the website, e.g.: \"[https://searchatlas.com/\"](https://searchatlas.com/)\n- selected_user_agent - string of the UserAgent for the crawling, can be one of:\n \n\n```\n 'google_chrome_desktop',\n 'google_chrome_mobile',\n 'googlebot_desktop',\n 'googlebot_mobile',\n 'bingbot_desktop',\n 'bingbot_mobile',\n 'slurp',\n 'yandexbot',\n 'baiduspider',\n 'screaming_frog',\n 'duckduckgo',\n 'searchatlas',\n\n ```\n\n- crawl_budget - integer, how many pages to crawl, min 1, max 10000, default is 100, **consumes quota**\n \n- crawl_concurrency - integer, how fast to crawl, min 1, max 50, default is 10" }, "response": [] }, { "name": "Create Otto Project from Site Audit", "request": { "auth": { "type": "noauth" }, "method": "POST", "header": [ { "key": "x-api-key", "value": "", "type": "text" } ], "body": { "mode": "raw", "raw": "{\n \"siteaudit\":,\n}", "options": { "raw": { "language": "json" } } }, "url": { "raw": "https://sa.searchatlas.com/api/v2/otto-projects/", "protocol": "https", "host": [ "sa", "searchatlas", "com" ], "path": [ "api", "v2", "otto-projects", "" ] }, "description": "Creating Otto Project from a Site Audit, params:\n\n- siteaudit - ID of the site audit, comes from the previous `Create Site Audit` request" }, "response": [] }, { "name": "Otto Project Detail", "request": { "auth": { "type": "noauth" }, "method": "GET", "header": [ { "key": "x-api-key", "value": "", "type": "text" } ], "url": { "raw": "https://sa.searchatlas.com/api/v2/otto-projects/#{{otto_uuid}}/", "protocol": "https", "host": [ "sa", "searchatlas", "com" ], "path": [ "api", "v2", "otto-projects", "#{{otto_uuid}}", "" ] }, "description": "Get the Otto Project detail" }, "response": [] }, { "name": "Otto Project List", "request": { "auth": { "type": "noauth" }, "method": "GET", "header": [ { "key": "x-api-key", "value": "", "type": "text" } ], "url": { "raw": "https://sa.searchatlas.com/api/v2/otto-projects/", "protocol": "https", "host": [ "sa", "searchatlas", "com" ], "path": [ "api", "v2", "otto-projects", "" ] }, "description": "Get the Otto Project List, query params:\n\n- page - integer of the page number in pagination;\n- page_size - integer of the page size in pagination, max 100;\n- search - string for lookup based on the Otto Project url;" }, "response": [] } ], "variable": [ { "key": "otto_uuid", "value": "x" } ] }

📍Local SEO GBP Project Creation

Authentication All API requests require an API key passed as a query parameter: searchatlas_api_key=<your_api_key> Endpoints 1. Add a Business Endpoint: POST https://keyword.searchatlas.com/api/v3/google-business/ Payload: { "business_name": "string", "data_cid": "string", "google_url": "string", "address": "string", "location": { "type": "Point", "coordinates": [latitude, longitude] }, "center": { "type": "Point", "coordinates": [latitude, longitude] } } 2. Add a Business with URL Endpoint: POST https://keyword.searchatlas.com/api/v3/google-business/ Payload: { "business_url": "string" } 3. Search for Businesses by Text Endpoint: GET https://keyword.searchatlas.com/api/v3/google-business/text-search/ Query Parameters: - query: Business name (e.g., "KFC") - lat: Latitude - long: Longitude - searchatlas_api_key: API key 4. Retrieve Place Details Endpoint: GET https://keyword.searchatlas.com/api/v3/google-business/place-detail/ Query Parameters: - place_id: Unique place identifier - searchatlas_api_key: API key 5. Set Up Grid Tracking Endpoint: POST https://keyword.searchatlas.com/api/v3/google-business/#{{business_id}}/setup-grids/ Payload: { "keyword": "string", "update_frequency_days": int, "grid_size": int, "grid_shape": "string", "spacing": int, "grid_coordinates": [ {"lat": latitude, "lon": longitude} ], "recrawl_time": "HH:MM:SS" } Notes - API requests should be properly authenticated using the provided API key. - Ensure valid coordinates are passed when adding businesses or setting up grids. For more details, refer to the official API documentation at SearchAtlas. Postman Collection { "info": { "_postman_id": "13acd65c-9ebc-4305-9e62-4d408c0889b6", "name": "GMB-V2", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", "_exporter_id": "18279724" }, "item": [ { "name": "add-business", "request": { "auth": { "type": "noauth" }, "method": "POST", "header": [], "body": { "mode": "raw", "raw": "{\n \"business_name\": \"KFC\",\n \"data_cid\": \"7998182588890038297\",\n \"google_url\": null,\n \"address\": \"208 McGuinness Blvd, Brooklyn, NY 11222, USA\",\n \"location\": {\n \"type\": \"Point\",\n \"coordinates\": [\n 40.7298715,\n -73.95059549999999\n ]\n },\n \"center\": {\n \"type\": \"Point\",\n \"coordinates\": [\n 40.7298715,\n -73.95059549999999\n ]\n }\n}", "options": { "raw": { "language": "json" } } }, "url": { "raw": "https://keyword.searchatlas.com/api/v3/google-business/?searchatlas_api_key=<your_api_key>", "protocol": "https", "host": [ "keyword", "searchatlas", "com" ], "path": [ "api", "v3", "google-business", "" ], "query": [ { "key": "searchatlas_api_key", "value": "<your_api_key>" } ] } }, "response": [] }, { "name": "add-business-with-url", "request": { "auth": { "type": "noauth" }, "method": "POST", "header": [ { "key": "authority", "value": "keyword.searchatlas.com" }, { "key": "accept", "value": "application/json, text/plain, */*" }, { "key": "accept-language", "value": "en-US,en;q=0.9,ur;q=0.8" }, { "key": "authorization", "value": "Bearer REDACTED-EXPIRED-EXAMPLE-TOKEN" }, { "key": "cache-control", "value": "no-cache" }, { "key": "content-type", "value": "application/json" }, { "key": "origin", "value": "http://localhost:3000" }, { "key": "pragma", "value": "no-cache" }, { "key": "referer", "value": "http://localhost:3000/" }, { "key": "sec-ch-ua", "value": "\"Not_A Brand\";v=\"8\", \"Chromium\";v=\"120\", \"Google Chrome\";v=\"120\"" }, { "key": "sec-ch-ua-mobile", "value": "?0" }, { "key": "sec-ch-ua-platform", "value": "\"Linux\"" }, { "key": "sec-fetch-dest", "value": "empty" }, { "key": "sec-fetch-mode", "value": "cors" }, { "key": "sec-fetch-site", "value": "cross-site" }, { "key": "user-agent", "value": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } ], "body": { "mode": "raw", "raw": "{\"business_url\":\"https://www.google.com/maps/place/Quetta+Darbar+Cafe/@31.5529046,74.3151824,17z/data=!3m1!4b1!4m6!3m5!1s0x3919055fdb2a8675:0x46a0a86e06d88fb9!8m2!3d31.5529046!4d74.3151824!16s%2Fg%2F11rn79bcmd?authuser=0&hl=en&entry=ttu\"}" }, "url": { "raw": "https://keyword.searchatlas.com/api/v3/google-business/?searchatlas_api_key=<your_api_key>", "protocol": "https", "host": [ "keyword", "searchatlas", "com" ], "path": [ "api", "v3", "google-business", "" ], "query": [ { "key": "searchatlas_api_key", "value": "<your_api_key>" } ] } }, "response": [] }, { "name": "text-search", "request": { "auth": { "type": "noauth" }, "method": "GET", "header": [], "url": { "raw": "https://keyword.searchatlas.com/api/v3/google-business/text-search/?query=kfc&lat=40.73061&long=-73.935242&searchatlas_api_key=<your_api_key>", "protocol": "https", "host": [ "keyword", "searchatlas", "com" ], "path": [ "api", "v3", "google-business", "text-search", "" ], "query": [ { "key": "query", "value": "kfc" }, { "key": "lat", "value": "40.73061" }, { "key": "long", "value": "-73.935242" }, { "key": "searchatlas_api_key", "value": "<your_api_key>" } ] } }, "response": [] }, { "name": "place-detail", "request": { "auth": { "type": "noauth" }, "method": "GET", "header": [], "url": { "raw": "https://keyword.searchatlas.com/api/v3/google-business/place-detail/?place_id=ChIJ8-TBCkdZwokRGUCBO7BA_24&searchatlas_api_key=<your_api_key>", "protocol": "https", "host": [ "keyword", "searchatlas", "com" ], "path": [ "api", "v3", "google-business", "place-detail", "" ], "query": [ { "key": "place_id", "value": "ChIJ8-TBCkdZwokRGUCBO7BA_24" }, { "key": "searchatlas_api_key", "value": "<your_api_key>" } ] } }, "response": [] }, { "name": "setup-grids", "request": { "auth": { "type": "noauth" }, "method": "POST", "header": [], "body": { "mode": "raw", "raw": "{\n \"keyword\": \"kfc burger\",\n \"update_frequency_days\": 7,\n \"grid_size\": 3,\n \"grid_shape\": \"square\",\n \"spacing\": 1,\n \"grid_coordinates\": [\n {\n \"lat\": 40.715414489067456,\n \"lon\": -73.96967325202148\n },\n {\n \"lat\": 40.715414489067456,\n \"lon\": -73.9505955\n },\n {\n \"lat\": 40.715414489067456,\n \"lon\": -73.93151774797853\n },\n {\n \"lat\": 40.7298715,\n \"lon\": -73.96967325202148\n },\n {\n \"lat\": 40.7298715,\n \"lon\": -73.9505955\n },\n {\n \"lat\": 40.7298715,\n \"lon\": -73.93151774797853\n },\n {\n \"lat\": 40.74432851093255,\n \"lon\": -73.96967325202148\n },\n {\n \"lat\": 40.74432851093255,\n \"lon\": -73.9505955\n },\n {\n \"lat\": 40.74432851093255,\n \"lon\": -73.93151774797853\n },\n {\n \"lat\": 40.7298715,\n \"lon\": -73.9505955\n }\n ],\n \"recrawl_time\": \"00:00:00\"\n}", "options": { "raw": { "language": "json" } } }, "url": { "raw": "https://keyword.searchatlas.com/api/v3/google-business/#{{business_id}}/setup-grids/?searchatlas_api_key=<your_api_key>", "protocol": "https", "host": [ "keyword", "searchatlas", "com" ], "path": [ "api", "v3", "google-business", "#{{business_id}}", "setup-grids", "" ], "query": [ { "key": "searchatlas_api_key", "value": "<your_api_key>" } ] } }, "response": [] } ] }

📡📣 Press Release API — Search Atlas

This article is split into 2 parts. Part 1, Part 2 The Press Release API allows you to programmatically create, generate, and publish AI-driven press releases within the Search Atlas ecosystem. Designed for content, SEO, and PR teams, it helps automate the entire press release lifecycle — from prompt-based generation to publication and indexation tracking — while maintaining full control through secure API access. With this API, you can build scalable workflows to handle multiple campaigns, track publication metrics, and integrate content generation into your existing systems. ⚙️ Authentication All requests require authentication via JWT Bearer token or API Key. 🗂️ Headers Required: Authorization: Bearer <your_jwt_token> Content-Type: application/json 🧩 Press Release Endpoints (cont'd 1/11) 🧩 Press Release Endpoints (cont'd 2/11) ✍️ 1. List Press Releases Retrieve a paginated list of press releases for the authenticated customer. Endpoint: GET /api/cg/v1/press-release/ Query Parameters: page (integer, optional): Page number for pagination (default: 1) page\_size (integer, optional): Number of results per page (default: 10, max: 100) otto\_project (integer, optional): Filter by Otto Project ID knowledge\_graph (integer, optional): Filter by Knowledge Graph ID status (string, optional): Filter by status (Pending, Generating, Generated, Publishing, Published, etc.) is\_deleted (boolean, optional): Include soft-deleted press releases (default: false) cURL Example: curl -X GET "https://ca.searchatlas.com/api/cg/v1/press-release/?page=1&page_size=10" \ -H "Authorization: Bearer YOUR_JWT_TOKEN" \ -H "Content-Type: application/json" Success Response (200 OK): { "count": 45, "next": "https://ca.searchatlas.com/api/cg/v1/press-release/?page=2", "previous": null, "results": [ { "id": "550e8400-e29b-41d4-a716-446655440000", "otto_project": 123, "knowledge_graph": 456, "target_url": "https://example.com/new-product-launch", "target_keywords": ["new product", "innovation", "technology"], "input_prompt": "Write a press release about our new AI-powered product launch targeting tech enthusiasts.", "title": "Company XYZ Unveils Revolutionary AI-Powered Product", "status": "Generated", "viewable_url": "https://ca.searchatlas.com/cg/press-release/550e8400-e29b-41d4-a716-446655440000/view", "editable_url": "https://ca.searchatlas.com/cg/press-release/550e8400-e29b-41d4-a716-446655440000/edit", "published_at": "2025-01-15T10:30:00Z", "created_at": "2025-01-10T14:22:00Z", "updated_at": "2025-01-15T10:30:00Z", "signal_genesys": { "genesys_id": "12345", "genesys_status": "published", "genesys_status_message": "Successfully published", "genesys_status_description": "Your press release has been distributed", "genesys_client_id": "client_abc123" }, "channels_count": 5, "channels_count_by_status": { "Pending": 0, "Generating": 0, "Generated": 2, "Publishing": 0, "Published": 3 }, "indexation_metrics": { "total_urls": 15, "indexed_urls": 12, "indexation_rate": 0.8 }, "signal_boost": true } ] } 🧩 Press Release Endpoints (cont'd 3/11) 🧩 2. Create Press Release Create a new press release for content generation. Endpoint: POST /api/cg/v1/press-release/ Required Fields: target\_url (string): The URL this press release is targeting (must be accessible) target\_keywords (array of strings): SEO keywords for the press release (min: 1) input\_prompt (string, max 1500 chars): Instructions for AI content generation One of the following (not both): otto\_project (integer): Otto Project ID knowledge\_graph (integer): Knowledge Graph ID Optional Fields: images (array): Array of image objects with url property bypass\_target\_url\_status\_code\_validation (boolean): Skip URL validation (default: false) cURL Example: curl -X POST "https://ca.searchatlas.com/api/cg/v1/press-release/" \ -H "Authorization: Bearer YOUR_JWT_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "otto_project": 123, "target_url": "https://example.com/new-product", "target_keywords": ["AI technology", "product launch", "innovation"], "input_prompt": "Write a press release announcing our new AI-powered analytics platform. Highlight the key features: real-time insights, predictive analytics, and easy integration. Target audience: B2B SaaS companies.", "images": [ {"url": "https://example.com/images/product-hero.jpg"} ] }' Success Response (201 Created): { "id": "6ba7b810-9dad-11d1-80b4-00c04fd430c8", "otto_project": 123, "knowledge_graph": 456, "target_url": "https://example.com/new-product", "target_keywords": ["AI technology", "product launch", "innovation"], "input_prompt": "Write a press release announcing our new AI-powered analytics platform...", "title": null, "status": "Pending", "viewable_url": null, "editable_url": null, "published_at": null, "created_at": "2025-01-28T14:30:00Z", "updated_at": "2025-01-28T14:30:00Z", "signal_genesys": null, "channels_count": 0, "channels_count_by_status": { "Pending": 0, "Generating": 0, "Generated": 0, "Publishing": 0, "Published": 0 }, "indexation_metrics": { "total_urls": 0, "indexed_urls": 0, "indexation_rate": 0 }, "signal_boost": false } Validation Notes: target\_url must return 2xx status code (or 403) when validated target\_keywords must have at least 1 keyword If otto\_project is provided, target\_url domain must match Otto Project hostname Cannot provide both otto\_project and knowledge\_graph 🧩 Press Release Endpoints (cont'd 4/11) 📰 3. Retrieve Press Release Get details of a specific press release by ID. Endpoint: GET /api/cg/v1/press-release/{id}/ Path Parameters: id (UUID): Press release ID cURL Example: curl -X GET "https://ca.searchatlas.com/api/cg/v1/press-release/550e8400-e29b-41d4-a716-446655440000/" \ -H "Authorization: Bearer YOUR_JWT_TOKEN" \ -H "Content-Type: application/json" Success Response (200 OK): { "id": "550e8400-e29b-41d4-a716-446655440000", "otto_project": 123, "knowledge_graph": 456, "target_url": "https://example.com/new-product-launch", "target_keywords": ["new product", "innovation", "technology"], "input_prompt": "Write a press release about our new AI-powered product launch...", "title": "Company XYZ Unveils Revolutionary AI-Powered Product", "status": "Generated", "viewable_url": "https://ca.searchatlas.com/cg/press-release/550e8400-e29b-41d4-a716-446655440000/view", "editable_url": "https://ca.searchatlas.com/cg/press-release/550e8400-e29b-41d4-a716-446655440000/edit", "published_at": null, "created_at": "2025-01-10T14:22:00Z", "updated_at": "2025-01-15T10:30:00Z", "signal_genesys": null, "channels_count": 0, "channels_count_by_status": { "Pending": 0, "Generating": 0, "Generated": 0, "Publishing": 0, "Published": 0 }, "indexation_metrics": { "total_urls": 0, "indexed_urls": 0, "indexation_rate": 0 }, "signal_boost": false } 🧩 Press Release Endpoints (cont'd 5/11) 📄 4. Update Press Release Modify editable fields such as target_keywords or input_prompt. Update an existing press release (limited fields can be modified). Endpoint: PATCH /api/cg/v1/press-release/{id}/ Path Parameters: id (UUID): Press release ID Updatable Fields: target\_url (string): Target URL (must match Otto Project domain if set) target\_keywords (array): Keywords input\_prompt (string): Prompt text images (array): Image URLs Cannot Modify: otto\_project knowledge\_graph status (changed via actions like /build/) title (generated by AI) cURL Example: curl -X PATCH "https://ca.searchatlas.com/api/cg/v1/press-release/550e8400-e29b-41d4-a716-446655440000/" \ -H "Authorization: Bearer YOUR_JWT_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "target_keywords": ["AI", "machine learning", "automation", "enterprise"], "input_prompt": "Revised: Focus more on enterprise use cases and ROI benefits." }' Success Response (200 OK): { "id": "550e8400-e29b-41d4-a716-446655440000", "otto_project": 123, "knowledge_graph": 456, "target_url": "https://example.com/new-product-launch", "target_keywords": ["AI", "machine learning", "automation", "enterprise"], "input_prompt": "Revised: Focus more on enterprise use cases and ROI benefits.", "title": "Company XYZ Unveils Revolutionary AI-Powered Product", "status": "Generated", "viewable_url": "https://ca.searchatlas.com/cg/press-release/550e8400-e29b-41d4-a716-446655440000/view", "editable_url": "https://ca.searchatlas.com/cg/press-release/550e8400-e29b-41d4-a716-446655440000/edit", "published_at": null, "created_at": "2025-01-10T14:22:00Z", "updated_at": "2025-01-28T15:45:00Z", "signal_genesys": null, "channels_count": 0, "channels_count_by_status": { "Pending": 0, "Generating": 0, "Generated": 0, "Publishing": 0, "Published": 0 }, "indexation_metrics": { "total_urls": 0, "indexed_urls": 0, "indexation_rate": 0 }, "signal_boost": false } 🧩 Press Release Endpoints (cont'd 6/11) 🔗 5. Delete Press Release Soft delete a press release (sets is\_deleted=True). Endpoint: DELETE /api/cg/v1/press-release/{id}/ Path Parameters: id (UUID): Press release ID cURL Example: curl -X DELETE "https://ca.searchatlas.com/api/cg/v1/press-release/550e8400-e29b-41d4-a716-446655440000/" \ -H "Authorization: Bearer YOUR_JWT_TOKEN" Success Response (204 No Content) 🧩 Press Release Endpoints (cont'd 7/11) 📤 6. Build Press Release (Generate Content) Trigger AI content generation for a press release. This creates the actual press release content based on the input prompt. Endpoint: POST /api/cg/v1/press-release/{id}/build/ Path Parameters: id (UUID): Press release ID Process: 1. Validates press release has required information 2. Checks quota limits 3. Queues background task for AI generation 4. Updates status to "Generating" 5. Returns task ID for polling cURL Example: curl -X POST "https://ca.searchatlas.com/api/cg/v1/press-release/550e8400-e29b-41d4-a716-446655440000/build/" \ -H "Authorization: Bearer YOUR_JWT_TOKEN" \ -H "Content-Type: application/json" Success Response (202 Accepted): [ "a1b2c3d4-e5f6-7890-abcd-ef1234567890" ] What Happens: Press release status changes to "Generating" Background task generates content using AI (GPT-4, Claude, or Gemini) Task creates title, summary, and full content Once complete, status changes to "Generated" viewable\_url and editable\_url become available Polling for Completion: Use the task ID to check status (see Task Polling section). 🧩 Press Release Endpoints (cont'd 8/11) 🔍 7. Deploy to Signal Genesys Deploy a generated press release to Signal Genesys distribution channels. Endpoint: POST /api/cg/v1/press-release/{id}/deploy/signal-genesys/ Path Parameters: id (UUID): Press release ID Request Body: genesys\_category\_id (string, required): Signal Genesys category ID distribution\_ids (array of integers, required): List of distribution channel IDs (min: 1) variations (boolean, optional): Generate content variations (default: false) override\_profanity\_check (boolean, optional): Skip profanity check (default: false) signal\_boost\_enabled (boolean, optional): Enable signal boost feature (default: false) Prerequisites: Press release must have status "Generated" Must have generated content (title, summary, body) cURL Example: curl -X POST "https://ca.searchatlas.com/api/cg/v1/press-release/550e8400-e29b-41d4-a716-446655440000/deploy/signal-genesys/" \ -H "Authorization: Bearer YOUR_JWT_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "genesys_category_id": "technology", "distribution_ids": [1, 3, 5, 7], "variations": true, "signal_boost_enabled": true }' Success Response (202 Accepted): { "task_id": "b2c3d4e5-f6a7-8901-bcde-f12345678901" } What Happens: Press release is sent to Signal Genesys for distribution Creates variations if requested Distributes to selected channels Updates status to "Publishing" → "Published" Media URLs are populated in channels Validate if content is worthy of being a press release using AI assessment. Endpoint: POST /api/cg/v1/press-release/check-worthiness/ Request Body: headline (string, max 80 chars): Main headline blog\_headline (string): Alternative blog-style headline summary (string): Brief summary (15-35 words) blog\_summary (string): Alternative blog-style summary content (string): Full press release content (1500-2000 words recommended) cURL Example: curl -X POST "https://ca.searchatlas.com/api/cg/v1/press-release/check-worthiness/" \ -H "Authorization: Bearer YOUR_JWT_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "headline": "Company XYZ Launches Revolutionary AI Platform", "blog_headline": "How Company XYZ is Transforming AI Analytics", "summary": "Company XYZ today announced the launch of its groundbreaking AI-powered analytics platform, designed to help businesses make data-driven decisions in real-time.", "blog_summary": "Discover how Company XYZ new AI platform is changing the game for businesses seeking real-time analytics and insights.", "content": "FOR IMMEDIATE RELEASE\n\nCompany XYZ Unveils Revolutionary AI-Powered Analytics Platform\n\n[CITY, STATE] – January 28, 2025 – Company XYZ, a leader in business intelligence solutions, today announced the launch of..." }' Success Response (202 Accepted): { "task_id": "c3d4e5f6-a7b8-9012-cdef-123456789012" } Task Result (After Polling): { "is_valid": true, "score": 0.85, "confidence": 0.92, "reasoning": "This press release announces a significant product launch with clear business value. It includes specific features, target audience, and demonstrates innovation in the AI analytics space. The content is well-structured and newsworthy.", "suggestions": [ "Include specific metrics or statistics to strengthen credibility", "Add a quote from a customer or industry analyst", "Mention partnerships or integrations with known platforms" ] } Continued in Part 2 →

🛠️ WordPress Plugin: API Key Verification Fails When Your Home URL Uses www

If the Search Atlas WordPress plugin reports connected: false even though your API key is valid, and your WordPress Home URL starts with www. (or your server redirects non-www traffic to www), a now-fixed bug triggered a false verification failure. Update the plugin to resolve this immediately. ⚠️ Confirm This Is Your Issue This article applies when all of the following are true: - The Search Atlas plugin displays connected: false or an API key verification error. - Your API key is valid — it appears correctly in your Search Atlas dashboard. - Either your WordPress Home URL (Settings → General → Site Address) starts with www. — for example, www.yoursite.com — or your server automatically redirects non-www URLs to the www version. Before you continue — confirm you are using the correct credential: Ensure you are using the Search Atlas API Key found under Settings → API Keys (a 32-character code) — not the OTTO UUID (the data-uuid attribute shown in the Installation Guide). These are different values, and using the OTTO UUID in place of the API Key will also cause verification to fail. 🔍 Why the www Prefix Causes Verification to Fail There are two related scenarios that trigger this failure, both resolved by the latest plugin version: - Scenario 1 — Home URL mismatch: The plugin's connection check reads your WordPress Home URL and extracts the hostname to send to the Search Atlas verification endpoint. When the Home URL includes www. but the domain associated with your Search Atlas workspace (visible in Settings → General or your OTTO project settings) is registered without it, the hostnames do not match and the endpoint returns a failed status — even though your API key is correct. - Scenario 2 — Server-level non-www → www redirect: If your server automatically redirects non-www URLs to www (for example, via .htaccess, nginx config, or a CDN rule), the redirect can intercept the SSO connect callback and heartbeat POST requests, causing them to fail before the plugin completes verification. Both scenarios are resolved in the latest version of the Search Atlas WordPress plugin. 🛠️ Fix: Update the Search Atlas WordPress Plugin Updating to the latest plugin version applies the fix automatically. No changes to your API key or WordPress URL settings are required. 1. In your WordPress admin, go to Plugins → Installed Plugins. 2. Locate Search Atlas in the plugin list and note the installed version number. 3. If an update is available, click Update Now. The fix is included in the most recent release. If you are unsure which version contains the fix, contact Search Atlas support to confirm. 4. After the update completes, open the Search Atlas plugin settings, re-enter your API key if prompted, and confirm the plugin now shows connected: true. The plugin will now correctly verify your API key whether or not your Home URL includes www., and regardless of server-level non-www → www redirects. ⚙️ Temporary Workaround (If You Cannot Update Immediately) If you need to connect the plugin before updating, temporarily remove the www. prefix from your WordPress Site Address: 1. In WordPress admin, go to Settings → General. 2. In both the WordPress Address (URL) and Site Address (URL) fields, remove www. so the value reads yoursite.com. 3. Click Save Changes. 4. Open Search Atlas plugin settings, enter your API key, and click Connect. Verification should succeed. 5. Update the plugin as soon as possible, then restore your www. prefix in Settings → General if needed. Important: Changing your Site Address can affect site redirects and internal links. Apply this workaround only if you are comfortable managing WordPress URL settings. ✅ Verify the Connection Is Active After updating (or applying the workaround), confirm the plugin is connected: - In WordPress admin, go to Search Atlas → Settings. - The status should display connected: true or show a green confirmation indicator. - If the error persists after updating, confirm the API key matches exactly what appears in your Search Atlas dashboard under Settings → API Keys. 🧰 If the Error Persists After Updating In some cases, updating alone may not immediately resolve the problem. If you still see connected: false after updating, work through these steps in order: 1. Deactivate and reactivate the Search Atlas plugin from Plugins → Installed Plugins. 2. Clear your browser cache (or try an incognito/private window) and reload the plugin settings page. 3. Re-copy the API key directly from Settings → API Keys in your Search Atlas dashboard and re-enter it in the plugin — making sure you are not pasting the OTTO UUID by mistake. 4. Contact Search Atlas support with your site URL, the installed plugin version, and a screenshot of the error. 🌀 Updating the Search Atlas WordPress plugin resolves the false API key verification error triggered by a www Home URL or a server-level non-www → www redirect. If connection errors continue after updating, contact Search Atlas support for further assistance.

🔍 Cloud Stacks API: Why cs_list Shows 0 Providers When cs_get Shows Active Stacks

🤔 What is happening When using the Search Atlas MCP or API, cs_list returns all cloud stacks for the currently selected OTTO project. If you have cloud stacks in Project A but your dashboard is set to Project B, cs_list returns Project B's stacks — which may show 0 deployed providers. Meanwhile, cs_get fetches a specific stack by ID regardless of the active project — so it correctly shows your active providers. ✅ This is not a bug The discrepancy between cs_list and cs_get is a project selection mismatch, not a data error. Your stacks and providers are intact. 🛠️ How to fix it 1. In your Search Atlas dashboard, check which OTTO project is currently active in the project selector 2. Switch to the correct OTTO project that contains your cloud stacks 3. Re-run cs_list — it should now return the correct stacks 🔌 If you are using the MCP or API When calling cs_list via the MCP server or REST API, pass the project_id parameter explicitly if available, or verify your session is authenticated to the correct project context. 🚨 If switching projects doesn't fix it If you have confirmed the correct OTTO project is active and a provider still shows as not deployed, the deployment itself may have failed rather than the data being missing. Cloud Stack provider calls do not currently retry automatically, so a single network interruption during deployment can cause that provider to fail permanently (Linear AB-547, status: Canceled — an automatic retry with exponential backoff was proposed but not implemented). In that case, re-deploy the affected provider. Separately, if the Cloud Stack AI agent suggested fewer providers than you expected, this was a known issue where the agent's prompt wording anchored on a fixed count (~14–15) instead of the live provider list (Linear AIAGENT-2101, status: Done — now resolved). Cloud Stacking supports 40+ publishing destinations, including REST API providers such as Netlify, Neocities, Firebase, and Tiiny Host.

🧠 Content Genius API: Article Generation and Management Guide

The Search Atlas Content Genius API allows developers and SEO professionals to programmatically generate AI-optimized outlines, full SEO articles, and manage content data — all directly from their applications or automation pipelines. 🧭 Step-by-Step Instructions 1. Authentication All API requests require an authorization token passed in the request header. Header Format: Authorization: Bearer <API_TOKEN> ⚙️ Ensure that your API token is valid and kept secure. Tokens must not be exposed publicly. 2. Creating an Article Use this endpoint to create a new article within the Search Atlas environment. Endpoint: POST https://ca.searchatlas.com/api/pages/ Payload Example: { "title": "string", "keywords_list": ["string"], "location_id": int, "location": "string" } Example cURL Request: curl 'https://ca.searchatlas.com/api/pages/' \ -H 'authorization: <API_TOKEN>' \ -H 'content-type: application/json' \ --data-raw '{"title":"Test Title","keywords_list":["test keyword"],"location_id":2840,"location":"United States"}' 💡 Use descriptive titles and precise keyword lists to guide the AI generation process. 3. Retrieving Articles List All Articles Retrieve a list of all generated articles in your account. GET https://ca.searchatlas.com/api/pages/ Retrieve a Single Article Access details for one article using its unique identifier (UUID). GET https://ca.searchatlas.com/api/pages/<uuid>

🛠️ WP Plugin: Troubleshooting the "API Key Could Not Be Verified" Error

If the Search Atlas WordPress plugin displays "The API key could not be verified," follow the fixes below to identify the cause and restore your connection — most cases are resolved in under five minutes. ⚠️ Common Causes of This Error Verification fails when the plugin cannot authenticate your API key with Search Atlas. The most frequent causes are: - Incorrect or incomplete API key — a typo, extra space, or truncated string. - Expired or rotated key — the key was regenerated in the dashboard but the plugin still holds the old one. - Server blocking outbound HTTPS requests — a firewall, security plugin, or hosting restriction prevents your site from reaching api.searchatlas.com. - Invalid SSL certificate — the plugin communicates over HTTPS; a broken certificate blocks the verification request. - Outdated plugin or stale cache — an older plugin build or cached response interferes with authentication. 🔑 Fix 1 — Confirm and Re-enter Your API Key A typo or extra whitespace is the most common cause. Copy the key directly from your dashboard to eliminate manual-entry errors. 1. Log in to your Search Atlas dashboard. 2. Go to Settings → API Keys and click the copy icon next to your key — paste the value rather than typing it. 3. In WordPress admin, go to Search Atlas → Settings and clear the current value from the API Key field. 4. Paste the copied key and click Save Settings. You'll see a green "API key verified" confirmation when the key is accepted. If the error persists, continue to Fix 2. 🔄 Fix 2 — Regenerate Your API Key If the key looks correct but still fails, it may have been invalidated — for example, after a recent rotation or an account plan change. 1. In your Search Atlas dashboard, go to Settings → API Keys. 2. Click Regenerate Key to issue a new API key. 3. Copy the new key immediately — it is displayed only once. 4. In WordPress admin, go to Search Atlas → Settings, replace the old key with the new one, and click Save Settings. The plugin confirms a successful connection once the regenerated key is accepted. 🛡️ Fix 3 — Check Server Connectivity and Outbound Access Your WordPress server must be able to make outbound HTTPS requests to api.searchatlas.com. Firewalls, security plugins, or restrictive hosting environments can silently block these requests. Disable security plugins temporarily 1. Deactivate security plugins such as Wordfence or iThemes Security. 2. Retry the API key verification in Search Atlas → Settings. 3. If the key verifies, add api.searchatlas.com to that plugin's allowlist, then re-enable it. Confirm outbound HTTPS with your hosting provider - Contact your host and ask whether outbound connections to external APIs on port 443 (HTTPS) are permitted from your server. - Request that they whitelist api.searchatlas.com if outbound traffic is restricted at the server level. Verify that PHP cURL is enabled cURL is the PHP extension the plugin uses to make API requests. Confirm it is active before retrying verification. 1. In WordPress admin, go to Tools → Site Health → Info → Server. 2. Confirm cURL appears in the extensions list with a status of enabled. 3. If cURL is missing or disabled, contact your hosting provider to enable it. Once connectivity is restored, retry saving your API key in Search Atlas → Settings. The plugin will connect as soon as your server can reach Search Atlas. 🔁 Fix 4 — Clear Caches and Update the Plugin Stale cached responses or an outdated plugin build can prevent the verification request from completing correctly. 1. In WordPress admin, go to Plugins → Installed Plugins and check for a pending update to the Search Atlas plugin. Install any available update. 2. Deactivate your caching plugin (e.g., WP Rocket, W3 Total Cache, LiteSpeed Cache) and purge all cached files. 3. Go to Search Atlas → Settings, re-enter your API key, and click Save Settings. 4. Re-enable your caching plugin only after the key is successfully verified. Running the latest plugin version with a clean cache ensures the verification request reaches Search Atlas without interference. ⚙️ Fix 5 — Resolve SSL Certificate Issues The Search Atlas plugin sends all API requests over HTTPS. If your site's SSL certificate is invalid, expired, or missing, the verification handshake will fail before it reaches Search Atlas. - Open your site in a browser and confirm the padlock icon appears in the address bar. A warning triangle means the certificate is broken or untrusted. - If your certificate is expired or misconfigured, contact your hosting provider to renew or reinstall it. - If your WordPress site still runs on HTTP, update both URL fields to HTTPS at Settings → General → WordPress Address (URL) and Site Address (URL). Once your site has a valid SSL certificate, the plugin can establish a secure connection to Search Atlas and complete verification. 📞 Contact Search Atlas Support If you have worked through all five fixes and the error still appears, contact the Search Atlas support team. We can inspect your account status and API key configuration directly. Include the following details in your message to speed up resolution: - Your Search Atlas account email address. - Your WordPress site URL. - The exact error message shown in the plugin. - Which fixes from this article you have already tried. - Your hosting provider's name. 🎯 You now have a clear path to resolve the "API key could not be verified" error in the Search Atlas WordPress plugin. Once connected, see the Search Atlas Plugin Setup Guide to configure your first project and start tracking your SEO performance.