API Documentation
Build powerful integrations with the EscalateFlow REST API. Manage websites, pages, forms, e-commerce, analytics, and more programmatically.
Get your API keyAPI Modules
Websites
Pages, sections, settings, domains, navigation, layout
Forms
Forms, fields, submissions, exports
Shop
Products, variants, categories, settings, hero slides
Blog
Posts, categories, settings, post versions
Marketing
A/B testing, analytics, funnels, ad platforms
Appointments
Calendars, team members, availability, bookings
Webhooks
Event notifications, delivery history
Redirects
301/302 URL redirect management
Jobs
Async task status and polling
Agent & MCP
MCP server, agent orchestration, batch operations, skills
Authentication & Quick Start
Base URL
https://escalateflow.com/api/v1
API Key Authentication
Send your API key in the Authorization header:
Authorization: Api-Key ef_xxxxxxxxxxxxxxxxxxxx
Rate Limits
| Limit | Rate | Scope |
|---|---|---|
| Burst | 5 requests/second | Per user |
| Sustained | 60 requests/minute | Per user |
| Daily | 100 - 100,000/day | Based on plan |
| AI Generation | 10/hour | Per user |
Rate limit headers included in every response:
X-RateLimit-Limit: 60 X-RateLimit-Remaining: 58 X-RateLimit-Reset: 1704067200
Response Format
Success
{
"success": true,
"data": { ... },
"count": 10,
"pagination": {
"page": 1,
"page_size": 25,
"total": 100,
"total_pages": 4
}
}
Error
{
"success": false,
"error": {
"code": 400,
"message": "Validation error",
"details": {
"name": ["This field is required."]
}
}
}
Error Codes
| Status | Description | Common Cause |
|---|---|---|
400 | Validation error | Invalid input - check error.details |
401 | Not authenticated | Missing or invalid API key |
403 | Permission denied | Resource belongs to another user |
404 | Not found | Resource doesn't exist |
429 | Rate limited | Too many requests |
500 | Server error | Contact support |
API Keys
/api/v1/keys/
List all your API keys.
Response
{
"success": true,
"data": [
{
"id": "uuid",
"name": "My Integration Key",
"key_prefix": "ef_abc12",
"is_active": true,
"rate_limit": 100,
"last_used_at": "2026-04-01T10:00:00Z",
"total_requests": 1520,
"created_at": "2026-01-01T00:00:00Z",
"expires_at": null
}
]
}
/api/v1/keys/
Create a new API key. Save the key immediately - it won't be shown again.
Request Body
{
"name": "My Integration Key"
}
Response
{
"success": true,
"data": {
"id": "uuid",
"name": "My Integration Key",
"key": "ef_xxxxxxxxxxxxxxxxxxxx",
"key_prefix": "ef_xxxxx"
},
"message": "Store this key securely - it won't be shown again."
}
/api/v1/keys/{key_id}/
Delete an API key. This action is irreversible.
HTML Content Guidelines
When submitting HTML content via the API (page content, navbar, footer):
Do
- Use plain HTML, CSS, and JavaScript
- Use relative URLs for internal links (
/about) - Use
[FORM]or[FORM:uuid]shortcodes - Reference Style Kit CSS variables
Don't
- Use server-side template syntax
- Hardcode absolute domain URLs
- Include tracking scripts in page HTML (use settings)
Example
<section class="hero"> <h1 style="color: var(--ef-color-primary)">Welcome</h1> <a href="/contact" class="btn">Contact Us</a> [FORM:550e8400-e29b-41d4-a716-446655440000] </section>
Known Limitations
Current platform limitations to be aware of when building integrations. These are actively being addressed.
SEO settings endpoint is read-only
GET /settings/seo/ only supports GET.
To update SEO fields, use PUT /settings/ (the general settings endpoint) instead.
robots.txt may be overridden by CDN
The robots_txt setting may be overridden
by CDN-level rules (e.g. Cloudflare managed content signals), which can block AI crawlers
(ClaudeBot, GPTBot, Google-Extended) by default regardless of your custom configuration.
Automatic SEO injection on published pages
The platform automatically injects SEO meta tags, Open Graph tags, Twitter Card tags,
canonical URLs, and favicon into every published page's <head>.
Values are pulled from page-level SEO fields and website settings defaults.
SEO features not yet available
The following SEO features are not currently available via the API:
- Structured data / JSON-LD generation (Person, Organization, WebSite schemas)
- Redirect management (301/302 redirects)
- Per-page meta robots (noindex, nofollow)
- Hreflang support for multilingual sites
- Breadcrumb schema generation
Code Examples
Complete examples showing authentication, website creation, and page listing in popular languages.
# List your websites
curl -X GET "https://escalateflow.com/api/v1/projects/list/" \
-H "Authorization: Api-Key ef_xxxxxxxxxxxxxxxxxxxx"
# Create a website with AI-generated pages
curl -X POST "https://escalateflow.com/api/v1/projects/" \
-H "Authorization: Api-Key ef_xxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"name": "My Website",
"pages": [
{
"slug": "",
"prompt": "Create a professional homepage for a marketing agency",
"is_homepage": true
},
{
"slug": "about",
"prompt": "Create an about page with team bios"
}
]
}'
# List pages for a website
curl -X GET "https://escalateflow.com/api/v1/projects/{project_id}/pages/" \
-H "Authorization: Api-Key ef_xxxxxxxxxxxxxxxxxxxx"
# Edit a page section with AI
curl -X POST "https://escalateflow.com/api/v1/projects/{project_id}/ai-pages/home/sections/edit/" \
-H "Authorization: Api-Key ef_xxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"section_id": "hero", "prompt": "Make the headline bigger and add a video background"}'
import requests
API_KEY = "ef_xxxxxxxxxxxxxxxxxxxx"
BASE_URL = "https://escalateflow.com/api/v1"
headers = {"Authorization": f"Api-Key {API_KEY}"}
# List your websites
response = requests.get(f"{BASE_URL}/projects/list/", headers=headers)
websites = response.json()
print(f"You have {websites['count']} websites")
# Create a website with AI-generated pages
response = requests.post(f"{BASE_URL}/projects/", headers=headers, json={
"name": "My Website",
"pages": [
{
"slug": "",
"prompt": "Create a professional homepage for a marketing agency",
"is_homepage": True
},
{
"slug": "about",
"prompt": "Create an about page with team bios"
}
]
})
website = response.json()
project_id = website["data"]["project_id"]
# List pages
response = requests.get(f"{BASE_URL}/projects/{project_id}/pages/", headers=headers)
pages = response.json()
# Edit a section with AI
response = requests.post(
f"{BASE_URL}/projects/{project_id}/ai-pages/home/sections/edit/",
headers=headers,
json={
"section_id": "hero",
"prompt": "Make the headline bigger and add a video background"
}
)
const API_KEY = "ef_xxxxxxxxxxxxxxxxxxxx";
const BASE_URL = "https://escalateflow.com/api/v1";
const headers = {
"Authorization": `Api-Key ${API_KEY}`,
"Content-Type": "application/json"
};
// List your websites
const listRes = await fetch(`${BASE_URL}/projects/list/`, { headers });
const websites = await listRes.json();
console.log(`You have ${websites.count} websites`);
// Create a website with AI-generated pages
const createRes = await fetch(`${BASE_URL}/projects/`, {
method: "POST",
headers,
body: JSON.stringify({
name: "My Website",
pages: [
{
slug: "",
prompt: "Create a professional homepage for a marketing agency",
is_homepage: true
},
{
slug: "about",
prompt: "Create an about page with team bios"
}
]
})
});
const website = await createRes.json();
const projectId = website.data.project_id;
// List pages
const pagesRes = await fetch(`${BASE_URL}/projects/${projectId}/pages/`, { headers });
const pages = await pagesRes.json();
// Edit a section with AI
const editRes = await fetch(
`${BASE_URL}/projects/${projectId}/ai-pages/home/sections/edit/`,
{
method: "POST",
headers,
body: JSON.stringify({
section_id: "hero",
prompt: "Make the headline bigger and add a video background"
})
}
);
<?php
$apiKey = "ef_xxxxxxxxxxxxxxxxxxxx";
$baseUrl = "https://escalateflow.com/api/v1";
function apiRequest($method, $url, $data = null) {
global $apiKey;
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Api-Key $apiKey",
"Content-Type: application/json"
]);
if ($method === "POST") {
curl_setopt($ch, CURLOPT_POST, true);
if ($data) curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
}
$response = curl_exec($ch);
curl_close($ch);
return json_decode($response, true);
}
// List your websites
$websites = apiRequest("GET", "$baseUrl/projects/list/");
echo "You have " . $websites["count"] . " websites\n";
// Create a website with AI-generated pages
$website = apiRequest("POST", "$baseUrl/projects/", [
"name" => "My Website",
"pages" => [
[
"slug" => "",
"prompt" => "Create a professional homepage for a marketing agency",
"is_homepage" => true
],
[
"slug" => "about",
"prompt" => "Create an about page with team bios"
]
]
]);
$projectId = $website["data"]["project_id"];
// List pages
$pages = apiRequest("GET", "$baseUrl/projects/$projectId/pages/");
// Edit a section with AI
$result = apiRequest("POST",
"$baseUrl/projects/$projectId/ai-pages/home/sections/edit/",
["section_id" => "hero", "prompt" => "Make the headline bigger"]
);
Public Page URLs
| URL Pattern | Description |
|---|---|
https://{subdomain}.escalateflow.com/ | Website homepage |
https://{subdomain}.escalateflow.com/{slug} | Website page |
https://escalateflow.com/lp/{slug}/ | Standalone landing page |