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.
→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.
https://ai.seovendor.co/api/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.
k to source control.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.
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.
{
"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:
| Status | Meaning | Description |
|---|---|---|
| 400 | Bad request | A required field is missing or a value failed validation. Check error.field. |
| 401 | Unauthorized | The k API key is missing, malformed, or invalid. |
| 502 | Bad gateway | The upstream generation engine returned an unexpected response. |
| 503 | Service unavailable | The engine is temporarily overloaded. Retry with backoff. |
| 504 | Gateway timeout | The request exceeded the processing window. Retry, or use an async endpoint. |
{
"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:
| Action | Description |
|---|---|
| createTask | Submit inputs. Returns a task_id. |
| getTaskStatus | Poll with task_id until the task reports complete. |
| getResult | Fetch 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.
https://ai.seovendor.co/api · All requests are POST · JSON in, JSON out · © 2026 SEO Vendor. Built for agencies since 2004.