Примеры кода

Готовые примеры для 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'],
    })