GrowthAtlas Connector API v1
This document describes the GrowthAtlas Connector API v1 specification — the contract that all GrowthAtlas connectors (WordPress plugin, Laravel package, custom implementations) must implement.
GrowthAtlas uses this API to push content drafts to your website and to pull page/entity data for SEO analysis. As long as your site exposes these endpoints, GrowthAtlas can publish to it, regardless of platform.
Base URL
Connectors expose endpoints under a sub-path of your domain. The path prefix depends on the connector:
| Connector | Base path |
|---|---|
| WordPress plugin | /wp-json/growthatlas/v1/ |
| Laravel package | /api/growthatlas/v1/ |
| Custom connector | Configured by you in the dashboard |
Authentication
All requests from GrowthAtlas include a Bearer token:
Authorization: Bearer <your-api-key>
Optionally, connectors can verify an HMAC-SHA256 signature for additional security:
X-GrowthAtlas-Signature: sha256=<hmac>
The HMAC is computed as HMAC-SHA256(secret, request_body). The signing secret is configured in the connector settings and in the GrowthAtlas dashboard.
Request Headers
GrowthAtlas always sends the following headers:
| Header | Value |
|---|---|
Authorization |
Bearer <api-key> |
Content-Type |
application/json |
Accept |
application/json |
User-Agent |
GrowthAtlas/1.0 (+https://growthatlas.io) |
X-GrowthAtlas-Version |
v1 |
Idempotency-Key |
ga_draft_{draft_id}_{attempt} (on POST) |
Response Envelope
All responses must be JSON. Successful responses return HTTP 200 or 201. Error responses return 4xx or 5xx.
Success
{
"success": true,
"data": { ... }
}
Error
{
"success": false,
"message": "Human readable error message",
"errors": { "field": ["validation error"] }
}
Endpoints
GET /health
Health check. Returns connector version and platform info.
Response:
{
"success": true,
"data": {
"status": "ok",
"connector": "wordpress",
"connector_version": "1.0.0",
"platform": "wordpress",
"platform_version": "6.5.3",
"php_version": "8.2.10",
"growthatlas_api_version": "v1"
}
}
GET /site-profile
Returns basic information about the website for context in content generation.
Response:
{
"success": true,
"data": {
"name": "My Website",
"url": "https://example.com",
"description": "A brief description of the site",
"language": "en",
"platform": "wordpress",
"timezone": "UTC",
"post_types": ["post", "page", "product"],
"taxonomies": ["category", "tag"]
}
}
GET /pages
Returns a paginated list of published pages/posts for SEO analysis.
Query parameters:
| Parameter | Type | Default | Description |
|---|---|---|---|
page |
int | 1 | Page number |
per_page |
int | 100 | Items per page (max 100) |
Response:
{
"success": true,
"data": [
{
"url": "https://example.com/my-post",
"title": "My Post Title",
"meta_description": "Brief description",
"h1": "My Post Title",
"word_count": 1500,
"published_at": "2024-01-15T10:00:00Z"
}
],
"pagination": {
"current_page": 1,
"per_page": 100,
"total": 350,
"last_page": 4
}
}
GET /entities
Returns a paginated list of entities (products, categories, locations, etc.) for topical authority building.
Query parameters:
| Parameter | Type | Default | Description |
|---|---|---|---|
page |
int | 1 | Page number |
per_page |
int | 100 | Items per page (max 100) |
type |
string | null | Filter by type (product, etc.) |
Response:
{
"success": true,
"data": [
{
"id": "product-123",
"type": "product",
"name": "My Product",
"slug": "my-product",
"description": "Product description",
"url": "https://example.com/products/my-product",
"priority": 80,
"metadata": {}
}
],
"pagination": {
"current_page": 1,
"per_page": 100,
"total": 45,
"last_page": 1
}
}
POST /content-drafts
Receives a content draft from GrowthAtlas and publishes or saves it as a draft on your site.
Idempotency: The Idempotency-Key header is sent on every request. Connectors must check whether a post with the same growthatlas_draft_id already exists (via meta/custom field) and skip re-creating it. Instead, return the existing post's URL.
Request body:
{
"growthatlas_draft_id": 123,
"growthatlas_brief_id": 456,
"title": "10 Best CRM Tools for Startups in 2025",
"slug": "best-crm-tools-startups-2025",
"excerpt": "A concise excerpt for the post.",
"body": "## Introduction\n\nMarkdown body content...",
"body_html": "<h2>Introduction</h2><p>HTML body content...</p>",
"body_format": "markdown",
"meta_title": "10 Best CRM Tools for Startups | My Site",
"meta_description": "Discover the top CRM tools for startups in 2025.",
"faq": [
{
"question": "What is a CRM?",
"answer": "A CRM is..."
}
],
"schema_json": {
"@context": "https://schema.org",
"@type": "Article",
"headline": "10 Best CRM Tools"
},
"featured_image_url": "https://images.unsplash.com/photo-123",
"featured_image_alt": "CRM dashboard illustration",
"internal_links": [
{
"anchor": "email marketing tools",
"url": "/email-marketing-guide"
}
],
"tags": ["crm", "startups", "productivity"],
"categories": ["Software Reviews"],
"language": "en",
"publish_status": "draft",
"target_keyword": "best crm for startups",
"seo_score": 87,
"source": "growthatlas"
}
Fields:
| Field | Type | Required | Description |
|---|---|---|---|
growthatlas_draft_id |
int | yes | Used for idempotency. Store in post meta. |
growthatlas_brief_id |
int | no | Linked brief ID. Optional, store in meta. |
title |
string | yes | Post title |
slug |
string | no | URL slug. Auto-generate from title if empty. |
excerpt |
string | no | Short description / excerpt |
body |
string | no | Body content (markdown if body_format=markdown) |
body_html |
string | no | Pre-rendered HTML body |
body_format |
string | no | markdown or html. Default markdown. |
meta_title |
string | no | SEO title. Set in Yoast/RankMath/AIOSEO if available. |
meta_description |
string | no | SEO meta description. |
faq |
array | no | FAQ items [{question, answer}] |
schema_json |
object | no | Schema.org JSON-LD object |
featured_image_url |
string | no | URL of the featured image to download and attach |
featured_image_alt |
string | no | Alt text for the featured image |
internal_links |
array | no | Suggested internal links [{anchor, url}] |
tags |
array | no | Post tags |
categories |
array | no | Post categories |
language |
string | no | ISO language code. Default en. |
publish_status |
string | no | draft or published. Default draft. |
target_keyword |
string | no | Primary SEO keyword |
seo_score |
int | no | GrowthAtlas SEO score (0-100) |
source |
string | no | Always growthatlas |
Response (success):
{
"success": true,
"data": {
"external_id": "wp-post-4521",
"url": "https://example.com/best-crm-tools-startups-2025",
"status": "draft",
"created": true
}
}
Response (idempotent — already exists):
{
"success": true,
"data": {
"external_id": "wp-post-4521",
"url": "https://example.com/best-crm-tools-startups-2025",
"status": "draft",
"created": false
}
}
Rate Limiting
GrowthAtlas respects Retry-After headers if returned. Connectors may limit requests per minute at their discretion. Recommended defaults:
POST /content-drafts: 10 requests/minute- Import endpoints: 60 requests/minute
Versioning
The current version is v1. Breaking changes will result in a new version (v2). Non-breaking additions (new optional fields) are made in-place without version bumps.
The version is included in all request paths and in the X-GrowthAtlas-Version header.
Security Checklist for Connector Implementors
- Validate
Authorization: Bearertoken using constant-time comparison - Optionally verify
X-GrowthAtlas-SignatureHMAC-SHA256 - Implement idempotency for
POST /content-draftsusinggrowthatlas_draft_id - Return proper HTTP status codes (200/201 for success, 4xx for errors)
- Never expose sensitive data in error messages
- Store API keys securely (encrypted, not in plain text)
- Implement slug conflict resolution (suffix or idempotent update)
Official Connectors
| Connector | Install | Docs |
|---|---|---|
| WordPress Plugin | WordPress.org Plugin Directory or GitHub | /connector-api#wordpress |
| Laravel Package | composer require growthatlas/laravel-connector |
/connector-api#laravel |
| Custom (any stack) | Build your own using this spec | This document |