API Documentation

Use the SaveMySEO REST API to fetch AI-generated content and publish it to your platform. Articles are written and scheduled automatically — the API is how you retrieve them and sync publish status.

Authentication

All API requests require a Bearer token. Create an API key from your API Keys page.

Authorization: Bearer sk_live_your_key_here

All responses return JSON. Successful responses use { "data": ... } and errors use { "error": "..." }.

Getting Started

Use the SaveMySEO API to manage your sites, retrieve content, and set up webhooks for notifications.

  1. List your sites — Call GET /api/v1/sites to see your sites and grab the id for the site you want.
  2. Fetch content — Call GET /api/v1/content?siteId=... to list content items for a site.
  3. Set up a webhook — Register a webhook for the scheduled_article_ready event so you get notified when new content is ready, instead of polling.

Example — list sites and fetch content:

# 1. List your sites to get the site ID
curl -H "Authorization: Bearer sk_live_your_key" \
  https://savemyseo.com/api/v1/sites

# 2. Get content for that site
curl -H "Authorization: Bearer sk_live_your_key" \
  "https://savemyseo.com/api/v1/content?siteId=abc123"

# Tip: Register a webhook so you don't need to poll for new content:
#   POST /api/v1/webhooks  {"events": ["scheduled_article_ready"]}

Sites

GET/api/v1/sites

List all your sites.

curl -H "Authorization: Bearer sk_live_your_key" \
  https://savemyseo.com/api/v1/sites

Response:

{
  "data": [
    {
      "id": "abc123",
      "url": "https://example.com",
      "name": "My Site",
      "createdAt": "2026-01-15T00:00:00Z",
      "updatedAt": "2026-01-15T00:00:00Z"
    }
  ]
}
GET/api/v1/sites/:siteId

Get a single site by ID, including all settings.

curl -H "Authorization: Bearer sk_live_your_key" \
  https://savemyseo.com/api/v1/sites/abc123
PATCH/api/v1/sites/:siteId

Update site settings. All fields are optional — only provided fields are updated.

ParameterTypeDescription
autoPublishbooleanEnable auto-publishing to connected WordPress/Shopify
publishStatusstring"draft" or "publish" — default post status for auto-publish
languagestringContent language code (e.g. "en", "es", "fr")
blogPathPrefixstringBlog URL prefix (e.g. "/blog")
curl -X PATCH \
  -H "Authorization: Bearer sk_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{"autoPublish": true, "publishStatus": "publish"}' \
  https://savemyseo.com/api/v1/sites/abc123
DELETE/api/v1/sites/:siteId

Delete a site and all its associated data (articles, audits, keywords, etc.).

curl -X DELETE \
  -H "Authorization: Bearer sk_live_your_key" \
  https://savemyseo.com/api/v1/sites/abc123

Webhooks

Register webhooks to get notified when articles are ready. Instead of polling the API, your server receives a push notification.

Available events

scheduled_article_readyFires daily when generated articles are scheduled for today. Includes the date and count so you can fetch articles for that day.

Example webhook payload:

{
  "event": "scheduled_article_ready",
  "timestamp": "2026-03-11T06:00:00Z",
  "data": {
    "siteId": "abc123",
    "date": "2026-03-11",
    "count": 2
  }
}

Webhook payloads are signed with HMAC-SHA256. Verify the X-SaveMySEO-Signature header against the payload using your webhook secret.

GET/api/v1/webhooks

List all registered webhooks.

curl -H "Authorization: Bearer sk_live_your_key" \
  https://savemyseo.com/api/v1/webhooks
POST/api/v1/webhooks

Register a new webhook. The response includes a secret for verifying webhook signatures — save it, as it won't be shown again.

ParameterTypeDescription
urlstringRequired. The HTTPS URL to receive webhook events.
eventsstring[]Required. Array of event names to subscribe to.
curl -X POST \
  -H "Authorization: Bearer sk_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://yoursite.com/webhook", "events": ["scheduled_article_ready"]}' \
  https://savemyseo.com/api/v1/webhooks

Response:

{
  "data": {
    "id": "wh_123",
    "url": "https://yoursite.com/webhook",
    "events": ["scheduled_article_ready"],
    "secret": "a1b2c3d4e5f6...",
    "active": true,
    "createdAt": "2026-03-11T00:00:00Z"
  }
}
PATCH/api/v1/webhooks/:webhookId

Update a webhook's URL, events, or active status.

ParameterTypeDescription
urlstringNew webhook URL (must be HTTPS)
eventsstring[]Updated list of events
activebooleanEnable or disable the webhook
curl -X PATCH \
  -H "Authorization: Bearer sk_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{"active": false}' \
  https://savemyseo.com/api/v1/webhooks/wh_123
DELETE/api/v1/webhooks/:webhookId

Delete a webhook.

curl -X DELETE \
  -H "Authorization: Bearer sk_live_your_key" \
  https://savemyseo.com/api/v1/webhooks/wh_123

Content

Retrieve AI-generated content items for your sites.

GET/api/v1/content

List content items. Returns paginated results without the full body.

ParameterTypeDescription
siteIdstringSite ID (required)
contentTypestringFilter by content type (e.g. comparison, listicle, how-to)
statusstringFilter by status: planned, generating, generated, needs-review, scheduled, publishing, published, failed (default: generated)
datestringExact date filter (YYYY-MM-DD). Overrides dateFrom/dateTo.
dateFromstringStart of date range (YYYY-MM-DD)
dateTostringEnd of date range (YYYY-MM-DD)
pagenumberPage number (default: 1)
limitnumberResults per page (default: 20, max: 100)
curl -H "Authorization: Bearer sk_live_your_key" \
  "https://savemyseo.com/api/v1/content?siteId=abc123"
GET/api/v1/content/:id

Get a single content item by ID. Returns the full body, schema markup, and quality data.

curl -H "Authorization: Bearer sk_live_your_key" \
  https://savemyseo.com/api/v1/content/abc123-def456
PATCH/api/v1/content/:id

Update a content item's status. Use this to mark content as published after posting it to your CMS.

ParameterTypeDescription
statusstringNew status: published, scheduled, or needs-review (required)
platformPostIdstringExternal URL or ID where the content was published (optional)
curl -X PATCH -H "Authorization: Bearer sk_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{"status": "published", "platformPostId": "https://example.com/blog/my-post"}' \
  https://savemyseo.com/api/v1/content/abc123-def456

Error Codes

StatusDescription
400Bad request — invalid or missing parameters, or invalid status transition
401Unauthorized — invalid or missing API key
403Forbidden — no organization associated with this key, or subscription required
404Not found — resource does not exist or does not belong to your organization
409Conflict — resource already exists (e.g. duplicate rolling plan) or is already being processed
500Internal server error — something went wrong on our end