Integrate Echloe's GEO audit, content generation, and keyword discovery into your own applications.
All API requests require a valid API key passed in the Authorization header as a Bearer token.
API keys start with ek_live_ and can be generated in your Dashboard Settings.
bashcurl https://echloe.io/api/v1/audit \
-H "Authorization: Bearer ek_live_abc123def456..." \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com"}'https://echloe.io/api/v1| Endpoint | Limit |
|---|---|
POST /api/v1/audit | 10 requests per day per API key |
POST /api/v1/content | No hard limit (fair use) |
POST /api/v1/keywords | No hard limit (fair use) |
When rate limited, the API returns 429 Too Many Requests.
Runs a comprehensive GEO (Generative Engine Optimization) audit on the given URL. Returns a detailed score with per-category breakdowns, findings, and recommendations.
| Parameter | Type | Required | Description |
|---|---|---|---|
url | string | Yes | The URL to audit (with or without https://) |
bashcurl -X POST https://echloe.io/api/v1/audit \
-H "Authorization: Bearer ek_live_..." \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com"}'json{
"url": "https://example.com/",
"score": 42,
"categories": [
{
"name": "AI Citability",
"score": 12,
"maxScore": 25,
"weight": 25,
"details": "Average passage citability: 48/100..."
}
],
"findings": [
{
"severity": "critical",
"category": "Schema & Structured Data",
"message": "No JSON-LD structured data found."
}
],
"recommendations": [
{
"priority": 1,
"title": "Fix: No JSON-LD structured data found",
"description": "...",
"impact": "high"
}
],
"crawledAt": "2026-04-02T12:00:00.000Z",
"citability": { "averageScore": 48, "blockCount": 12, ... },
"brandPresence": { "platforms": { ... }, "overallScore": 35 },
"crawlerAccess": { "tier1Allowed": 5, "tier2Allowed": 7, ... },
"llmsTxt": { "exists": false, ... },
"schemaReport": { "typesFound": ["Organization"], ... }
}Generates AI content (currently blog posts) for a product. The content is stored in your account and returned in the response.
| Parameter | Type | Required | Description |
|---|---|---|---|
productId | string | Yes | ID of the product to generate content for |
topic | string | Yes | The topic or keyword to write about |
type | string | Yes | Content type. Currently only "blog_post" is supported. |
bashcurl -X POST https://echloe.io/api/v1/content \
-H "Authorization: Bearer ek_live_..." \
-H "Content-Type: application/json" \
-d '{"productId": "abc123", "topic": "AI SEO best practices", "type": "blog_post"}'json{
"id": "ctn_xyz789",
"title": "AI SEO Best Practices for 2026",
"content": "# AI SEO Best Practices for 2026\n\n..."
}Returns a paginated list of your generated content pieces.
| Parameter | Type | Required | Description |
|---|---|---|---|
limit | integer | No | Max items to return (default 20, max 100) |
offset | integer | No | Number of items to skip (default 0) |
bashcurl "https://echloe.io/api/v1/content?limit=10" \
-H "Authorization: Bearer ek_live_..."json{
"items": [
{
"id": "...",
"title": "AI SEO Best Practices",
"type": "blog_post",
"status": "draft",
"tokenCount": 2048,
"createdAt": "2026-04-01T10:00:00.000Z"
}
],
"limit": 10,
"offset": 0
}Uses AI to discover up to 20 new keywords for a product. Discovered keywords are automatically stored and won't be repeated on subsequent calls.
| Parameter | Type | Required | Description |
|---|---|---|---|
productId | string | Yes | ID of the product to discover keywords for |
bashcurl -X POST https://echloe.io/api/v1/keywords \
-H "Authorization: Bearer ek_live_..." \
-H "Content-Type: application/json" \
-d '{"productId": "abc123"}'json{
"keywords": [
{
"id": "kw_001",
"keyword": "ai content optimization",
"intent": "informational",
"difficulty": "medium",
"source": "ai_discovered",
"status": "active"
}
],
"count": 18
}Returns all keywords for a given product.
| Parameter | Type | Required | Description |
|---|---|---|---|
productId | string | Yes | Product ID to list keywords for |
bashcurl "https://echloe.io/api/v1/keywords?productId=abc123" \
-H "Authorization: Bearer ek_live_..."Echloe can send real-time notifications to your server when events occur. Configure webhook endpoints in your Dashboard Settings.
| Event | Description |
|---|---|
audit.completed | A GEO audit has finished processing |
content.published | Content has been generated |
keyword.discovered | New keywords have been discovered |
json{
"event": "audit.completed",
"timestamp": "2026-04-02T12:00:00.000Z",
"data": {
"url": "https://example.com",
"score": 72,
"auditId": "https://example.com/"
}
}| Header | Description |
|---|---|
X-Echloe-Signature | HMAC-SHA256 hex digest of the raw request body |
X-Echloe-Event | The event name (e.g. audit.completed) |
Each webhook request includes an X-Echloe-Signature header containing an HMAC-SHA256 signature of the raw request body, signed with your webhook secret.
javascriptconst crypto = require('crypto');
function verifyWebhook(body, signature, secret) {
const expected = crypto
.createHmac('sha256', secret)
.update(body)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
);
}
// In your webhook handler:
app.post('/webhook', (req, res) => {
const signature = req.headers['x-echloe-signature'];
const event = req.headers['x-echloe-event'];
if (!verifyWebhook(req.rawBody, signature, WEBHOOK_SECRET)) {
return res.status(401).send('Invalid signature');
}
const payload = JSON.parse(req.rawBody);
console.log('Received ' + event + ':', payload.data);
res.status(200).send('OK');
});| Status | Meaning |
|---|---|
400 | Bad request — missing or invalid parameters |
401 | Unauthorized — invalid or missing API key |
404 | Resource not found |
429 | Rate limit exceeded |
500 | Internal server error |
All errors return JSON:
json{
"error": "Human-readable error message"
}Need help? [email protected]