Примеры кода
Готовые примеры для curl, Python, JavaScript и инструкция для AI-агента.
Примеры кода
Инструкция для AI-агента
Если вы хотите дать внешнему AI-агенту (Claude, GPT и т.д.) доступ к Framix, передайте ему следующий системный промпт:
Ты работаешь с Framix API. Базовый URL: https://framix.app.
Аутентификация: добавляй заголовок Authorization: Bearer fmxk_ВАШ_ТОКЕН к каждому запросу.
Формат ответов: JSON { "data": { "status": true/false, "message": "...", ...поля } }.
Успех — data.status === true. Ошибка — data.status === false, причина в data.message.
Workspace-контекст устанавливается автоматически по токену — не нужно передавать workspaceId.
Доступные операции (зависят от выданных скоупов):
- GET /api/projects/list — список сайтов
- GET /api/pages/list?projectId=ID — страницы сайта
- POST /api/pages/save-html — обновить HTML страницы: { id, html }
- GET /api/products/list — товары
- POST /api/products/create — создать товар: { name, price (копейки), description }
- GET /api/forms/collection-list — лиды из CRM
- POST /api/forms/collection-status — обновить статус лида: { id, status }
- GET /api/services/list — услуги
- GET /api/bookings/list — записи клиентов
- GET /api/agents/list — AI-агенты
- POST /api/admin/blog/create — создать статью блога (требует blog:write)
- PUT /api/admin/blog/ID — обновить статью
curl
Получить список сайтов
curl https://framix.app/api/projects/list \
-H "Authorization: Bearer fmxk_ваш_токен"
Создать статью в блоге
curl -X POST https://framix.app/api/admin/blog/create \
-H "Authorization: Bearer fmxk_ваш_токен" \
-H "Content-Type: application/json" \
-d '{
"title": "Как автоматизировать публикации",
"content": "# Введение\n\nТекст статьи в Markdown...",
"tags": ["автоматизация", "api"],
"category": "Гайды",
"status": "draft"
}'
Обновить HTML страницы
curl -X POST https://framix.app/api/pages/save-html \
-H "Authorization: Bearer fmxk_ваш_токен" \
-H "Content-Type: application/json" \
-d '{
"id": "page-id",
"html": "<main><h1>Новый заголовок</h1></main>"
}'
Получить лиды из CRM
curl "https://framix.app/api/forms/collection-list?size=20&status=new" \
-H "Authorization: Bearer fmxk_ваш_токен"
JavaScript / TypeScript
const BASE = 'https://framix.app'
const TOKEN = 'fmxk_ваш_токен'
async function apiCall(path: string, options: RequestInit = {}) {
const res = await fetch(`${BASE}${path}`, {
...options,
headers: {
'Authorization': `Bearer ${TOKEN}`,
'Content-Type': 'application/json',
...options.headers,
},
})
const json = await res.json()
if (!json.data?.status) {
throw new Error(json.data?.message ?? 'Unknown error')
}
return json.data
}
// Список товаров
const { products } = await apiCall('/api/products/list?size=50')
// Создать статью блога
const { post } = await apiCall('/api/admin/blog/create', {
method: 'POST',
body: JSON.stringify({
title: 'Заголовок из скрипта',
content: '# Привет\n\nТекст статьи.',
status: 'draft',
tags: ['api', 'автоматизация'],
}),
})
console.log('Создана статья:', post.slug)
// Поменять статус лида
await apiCall('/api/forms/collection-status', {
method: 'POST',
body: JSON.stringify({ id: 'lead-id', status: 'completed' }),
})
Python
import requests
BASE = 'https://framix.app'
TOKEN = 'fmxk_ваш_токен'
session = requests.Session()
session.headers.update({
'Authorization': f'Bearer {TOKEN}',
'Content-Type': 'application/json',
})
def api_call(path, method='GET', body=None):
url = f'{BASE}{path}'
r = session.request(method, url, json=body)
r.raise_for_status()
data = r.json()['data']
if not data.get('status'):
raise RuntimeError(data.get('message', 'Unknown error'))
return data
# Список агентов
data = api_call('/api/agents/list')
for agent in data['agents']:
print(agent['name'], agent['id'])
# Создать статью блога
result = api_call('/api/admin/blog/create', method='POST', body={
'title': 'Новая статья из Python',
'content': '# Заголовок\n\nТекст в **Markdown**.',
'tags': ['python', 'api'],
'status': 'draft',
})
print('Статья создана:', result['post']['slug'])
# Обновить HTML страницы
api_call('/api/pages/save-html', method='POST', body={
'id': 'page-id-here',
'html': '<main><h1>Привет из Python</h1></main>',
})
print('Страница обновлена')
n8n / Make / Zapier
Для no-code интеграций используйте HTTP Request ноду со следующими настройками:
- Method: выберите нужный (
GET,POST) - URL:
https://framix.app/api/... - Authentication: None (авторизация через заголовок)
- Headers: добавьте
Authorization=Bearer fmxk_ваш_токен - Body (для POST): JSON с нужными полями
Разберите ответ по пути data → нужное поле.
Типичные сценарии
Автоматическая публикация блога
Скрипт на Python собирает статью из внешнего источника и публикует её:
post = api_call('/api/admin/blog/create', method='POST', body={
'title': article['title'],
'content': article['body_markdown'],
'description': article['excerpt'],
'tags': article['tags'],
'coverImage': article['image_url'],
'status': 'published',
})
print(f"Опубликовано: https://framix.app/blog/{post['post']['slug']}")
AI-агент обновляет контент
Дайте Claude доступ к странице, чтобы он мог её переписать:
# 1. Получаем текущий HTML
page = api_call(f'/api/pages/{PAGE_ID}')
current_html = page['page']['html']
# 2. Просим Claude улучшить
new_html = ask_claude(f"Улучши этот HTML:\n{current_html}")
# 3. Сохраняем обратно
api_call('/api/pages/save-html', method='POST', body={
'id': PAGE_ID,
'html': new_html,
})
Синхронизация товаров из внешней системы
# Получаем товары из внешней БД
external_products = fetch_from_erp()
for product in external_products:
api_call('/api/products/create', method='POST', body={
'name': product['name'],
'price': product['price_kopecks'],
'description': product['description'],
'sku': product['sku'],
'stock': product['stock'],
})