API Documentation

Build powerful integrations with the EscalateFlow REST API. Manage websites, pages, forms, e-commerce, analytics, and more programmatically.

Get your API key

API Modules

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

LimitRateScope
Burst5 requests/secondPer user
Sustained60 requests/minutePer user
Daily100 - 100,000/dayBased on plan
AI Generation10/hourPer 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

StatusDescriptionCommon Cause
400Validation errorInvalid input - check error.details
401Not authenticatedMissing or invalid API key
403Permission deniedResource belongs to another user
404Not foundResource doesn't exist
429Rate limitedToo many requests
500Server errorContact support

API Keys

GET /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
    }
  ]
}
POST /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."
}
DELETE /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 PatternDescription
https://{subdomain}.escalateflow.com/Website homepage
https://{subdomain}.escalateflow.com/{slug}Website page
https://escalateflow.com/lp/{slug}/Standalone landing page