SEO Vendor APIDeveloper Referencev1
All systems operational
Unlimited Free Usage while in BETA.

The SEO Vendor
API

Programmatic access to the AI SEO & GEO engine behind tens of thousands of agency campaigns. Generate content, audit visibility, research keywords, and map strategy — all from a single authenticated endpoint.

13
Endpoints
POST
Every request
JSON
In & out
v1
Stable

Your first call

Send a POST request with your API key and a keyword. The example on the right generates SEO content with SEO GPT. Swap the endpoint and parameters to use any of the 13 tools — the request shape is the same everywhere.

Base URL  https://ai.seovendor.co/api/
POST /api/seogpt/
curl -X POST "https://ai.seovendor.co/api/seogpt/" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
  "k": "[API KEY]",
  "action": "generate",
  "kw": "white label seo",
  "web": "https://seovendor.co",
  "brand": "SEO Vendor"
}'
<?php
$ch = curl_init("https://ai.seovendor.co/api/seogpt/");

$payload = [
    "k" => "[API KEY]",
    "action" => "generate",
    "kw" => "white label seo",
    "web" => "https://seovendor.co",
    "brand" => "SEO Vendor",
];

curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_HTTPHEADER => [
        "Content-Type: application/json",
        "Accept: application/json",
    ],
    CURLOPT_POSTFIELDS => json_encode($payload),
]);

$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
print_r($data);
const response = await fetch("https://ai.seovendor.co/api/seogpt/", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Accept": "application/json"
  },
  body: JSON.stringify({
    k: "[API KEY]",
    action: "generate",
    kw: "white label seo",
    web: "https://seovendor.co",
    brand: "SEO Vendor",
  })
});

const data = await response.json();
console.log(data);
import requests

url = "https://ai.seovendor.co/api/seogpt/"

payload = {
    "k": "[API KEY]",
    "action": "generate",
    "kw": "white label seo",
    "web": "https://seovendor.co",
    "brand": "SEO Vendor",
}

headers = {
    "Content-Type": "application/json",
    "Accept": "application/json"
}

response = requests.post(url, json=payload, headers=headers)
data = response.json()
print(data)

01Authentication

Every endpoint is authenticated with a secret API key passed as the k field in the JSON request body. There are no other headers required beyond the content type.

Treat your key like a password. Send requests from your server, never from client-side code, and never commit k to source control.
{  "k": "[API KEY]"  }

02Making a request

All endpoints accept a POST with a JSON body. Most tools take an action that selects the operation, plus tool-specific fields. The base URL is https://ai.seovendor.co/api/ followed by the endpoint slug.

POST /api/<endpoint>/
curl -X POST "https://ai.seovendor.co/api/seogpt/" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
  "k": "[API KEY]",
  "action": "generate",
  "kw": "white label seo",
  "web": "https://seovendor.co",
  "brand": "SEO Vendor"
}'
<?php
$ch = curl_init("https://ai.seovendor.co/api/seogpt/");

$payload = [
    "k" => "[API KEY]",
    "action" => "generate",
    "kw" => "white label seo",
    "web" => "https://seovendor.co",
    "brand" => "SEO Vendor",
];

curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_HTTPHEADER => [
        "Content-Type: application/json",
        "Accept: application/json",
    ],
    CURLOPT_POSTFIELDS => json_encode($payload),
]);

$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
print_r($data);
const response = await fetch("https://ai.seovendor.co/api/seogpt/", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Accept": "application/json"
  },
  body: JSON.stringify({
    k: "[API KEY]",
    action: "generate",
    kw: "white label seo",
    web: "https://seovendor.co",
    brand: "SEO Vendor",
  })
});

const data = await response.json();
console.log(data);
import requests

url = "https://ai.seovendor.co/api/seogpt/"

payload = {
    "k": "[API KEY]",
    "action": "generate",
    "kw": "white label seo",
    "web": "https://seovendor.co",
    "brand": "SEO Vendor",
}

headers = {
    "Content-Type": "application/json",
    "Accept": "application/json"
}

response = requests.post(url, json=payload, headers=headers)
data = response.json()
print(data)

03The response envelope

Every endpoint returns the same top-level structure. The endpoint-specific payload always lives in data; metadata lives in meta; and error is null unless something went wrong.

Standard response body
successbooleantrue when the request succeeded; false on error.
applicationstringThe endpoint slug that produced the response.
actionstringThe action that was executed (echoes your request).
dataobjectEndpoint-specific payload. May be an object, array, or null on error. See each endpoint.
metaobject
└─request_idstringUnique request identifier, useful for support.
└─duration_msintegerServer processing time in milliseconds.
└─upstream_http_codeintegerHTTP status from the upstream engine.
errorobjectnull on success. On failure, an object with the fields below.
└─codestringMachine-readable error code.
└─messagestringHuman-readable error message.
└─fieldstringInput field associated with the error, when applicable.
└─detailsarrayOptional array of additional error details.
└─apidefinitionsstringURL of the public API definitions for the endpoint.
200 success envelope
{
  "success": true,
  "application": "seogpt",
  "action": "generate",
  "data": { "...": "endpoint-specific payload" },
  "meta": {
    "request_id": "req_3f9a7c2e8b41",
    "duration_ms": 1284,
    "upstream_http_code": 200
  },
  "error": null
}

04Errors

On failure, success is false and error contains a code, message, and the offending field when applicable. These HTTP statuses are returned:

StatusMeaningDescription
400Bad requestA required field is missing or a value failed validation. Check error.field.
401UnauthorizedThe k API key is missing, malformed, or invalid.
502Bad gatewayThe upstream generation engine returned an unexpected response.
503Service unavailableThe engine is temporarily overloaded. Retry with backoff.
504Gateway timeoutThe request exceeded the processing window. Retry, or use an async endpoint.
error response
{
  "success": false,
  "application": "seogpt",
  "action": null,
  "data": null,
  "meta": { "request_id": "req_3f9a7c2e8b41" },
  "error": {
    "code": "invalid_request",
    "message": "The kw field is required.",
    "field": "kw",
    "details": [],
    "apidefinitions": "https://ai.seovendor.co/api/seogpt/definitions"
  }
}

05Asynchronous tasks

Long-running endpoints — SEO GPT 2, GEO Audit, SEO Strategist, and SEO Mapping — run as background tasks. The flow is three steps:

ActionDescription
createTaskSubmit inputs. Returns a task_id.
getTaskStatusPoll with task_id until the task reports complete.
getResultFetch the finished result with task_id.

06Endpoints

Thirteen tools, grouped by what they do. Each links to its full reference with parameters, response schema, and code in cURL, PHP, Node.js, and Python.

SEO Vendor API
Base URL https://ai.seovendor.co/api  ·  All requests are POST · JSON in, JSON out · © 2026 SEO Vendor. Built for agencies since 2004.