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
βοΈ 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
π§© Press Release Endpoints
βοΈ 1. List Press Releases
βοΈ 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
}
]
}
---
π§© 2. Create Press Release
π§© 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`
---
π° 3. Retrieve Press Release
π° 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
}
---
π 4. Update Press Release
π 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
}
---
π 5. Delete Press Release
π 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)
---
π€ 6. Build Press Release (Generate Content)
π€ 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](#task-polling) section).
---
π 7. Deploy to Signal Genesys
π 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"
]
}
---
π¦ 8. Check Press Release Worthiness
π¦ 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"
]
}
---
π§ 9. Export Press Release Links
π§ 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"
}
ποΈ 10. Get Press Release Channels
ποΈ 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
π 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
π οΈ 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
π§± 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
π 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
π§±βοΈ Press Release Statuses
`Pending`: 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
π 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
π‘ 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
β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.
