---
slug: "getcourse"
name: "GetCourse API"
vendor: "GetCourse"
industry: "other"
docsUrl: "https://getcourse.ru/help/api"
version: 2
updatedAt: "2026-10-24"
---

# GetCourse API

Отрасль: Другое. Актуально на 2026-10-24.

API онлайн-школ на платформе GetCourse: импорт пользователей и заказов (создание, обновление, смена статуса заказа, добавление в группы) и экспорт пользователей, групп, заказов и платежей. Импорт доступен только на платных тарифах. Работает в аккаунте школы по секретному ключу.

## Сценарии

### Добавить ученика в группу после оплаты

Оплата прошла на внешнем лендинге или в другой системе — ученик автоматически появляется в GetCourse и получает доступ к курсу через группу.

1. Создай ключ API в аккаунте школы («Профиль» → «Настройки аккаунта» → «АПИ»). Для импорта нужен ключ с правом записи и платный тариф.
2. Собери params: user.email (или phone), first_name, group_name — список групп, дающих доступ к курсу. Чтобы не получить ошибку на существующем пользователе, передай system.refresh_if_exists = 1.
3. Закодируй JSON params в base64 и отправь POST /users как form-data с полями action = add, key и params. Без form-data придёт ошибка «Пустой параметр action».
4. Проверь ответ: success верхнего уровня говорит только о том, что запрос принят. Итог по пользователю — в result: user_id, user_status и error_message.
5. UTM-метки передавай в params.session — они попадут в аналитику школы.

```python
import base64, json, requests

ACCOUNT, KEY = "myschool", "<секретный ключ>"
params = {
    "user": {"email": "student@example.ru", "first_name": "Анна", "group_name": ["Курс «Python с нуля» — поток 5"]},
    "system": {"refresh_if_exists": 1},
    "session": {"utm_source": "vk", "utm_campaign": "autumn"},
}
r = requests.post(f"https://{ACCOUNT}.getcourse.ru/pl/api/users", data={
    "action": "add",
    "key": KEY,
    "params": base64.b64encode(json.dumps(params, ensure_ascii=False).encode()).decode(),
}).json()
print(r["success"], r.get("result"))
```

### Создать заказ и получить ссылку на оплату

Заказ из CRM или чат-бота: менеджер оформляет покупку, клиент получает ссылку на оплату GetCourse.

1. Отправь POST /deals как form-data с action = add, key и params (JSON в base64). Минимум для заказа — user.email, deal.offer_code (или product_title) и deal.deal_cost; либо email и deal.offer_id.
2. Чтобы сразу получить ссылку на оплату и номер заказа, добавь system.return_payment_link = 1 и system.return_deal_number = 1. В ответе result: deal_id, deal_number, payment_link.
3. Сохрани deal_number у себя: по нему заказ обновляется.
4. Если оплата прошла вне GetCourse, смени статус тем же методом: action = add, user.email, deal.deal_number и deal.deal_status = payed.
5. Импорт ограничен числом создаваемых объектов в месяц по тарифу; изменения существующих заказов в лимит не входят.

```python
import base64, json, requests

def gc_import(entity, params):
    payload = base64.b64encode(json.dumps(params, ensure_ascii=False).encode()).decode()
    return requests.post(f"https://myschool.getcourse.ru/pl/api/{entity}",
                         data={"action": "add", "key": "<секретный ключ>", "params": payload}).json()

r = gc_import("deals", {
    "user": {"email": "client@example.ru", "first_name": "Олег"},
    "deal": {"offer_code": "python-start", "deal_cost": 14900, "deal_status": "new",
             "manager_email": "sales@myschool.ru"},
    "system": {"return_payment_link": 1, "return_deal_number": 1},
})
print(r["result"].get("payment_link"), r["result"].get("deal_number"))

# Позже, когда оплата подтверждена:
gc_import("deals", {"user": {"email": "client@example.ru"},
                    "deal": {"deal_number": r["result"]["deal_number"], "deal_status": "payed"}})
```

### Выгрузить заказы за период в аналитику

Продажи школы — в BI, Google-таблицу или сквозную аналитику.

1. Запусти экспорт: GET /account/deals с key и фильтрами — created_at[from] и created_at[to] (YYYY-MM-DD) или payed_at[from] / payed_at[to] для оплаченных. В ответе — export_id.
2. Через минуту-другую забери данные: GET /account/exports/{export_id} с key. Пока файл готовится, придёт ошибка — повтори запрос позже.
3. Данные приходят таблицей: список полей и строки значений. Сопоставь их по позиции.
4. Лимит Export API — 100 запросов за 2 часа на аккаунт, включая проверки статуса, и экспорты идут строго по одному. Ошибка 903 — лимит исчерпан, жди сброса. Не проверяй статус чаще раза в минуту.
5. Платежи выгружаются так же: GET /account/payments с created_at[from] и created_at[to].

```python
import time, requests

BASE, KEY = "https://myschool.getcourse.ru/pl/api", "<секретный ключ>"

start = requests.get(f"{BASE}/account/deals", params={
    "key": KEY, "created_at[from]": "2026-10-01", "created_at[to]": "2026-10-23"}).json()
export_id = start["info"]["export_id"]

for _ in range(10):
    time.sleep(60)
    res = requests.get(f"{BASE}/account/exports/{export_id}", params={"key": KEY}).json()
    if res.get("success"):
        fields, items = res["info"]["fields"], res["info"]["items"]
        deals = [dict(zip(fields, row)) for row in items]
        break
```

### Выгрузить учеников группы

Список учеников потока — для рассылки, проверки доступа или переноса в другую систему.

1. Найди ID группы: GET /account/groups с key.
2. Запусти экспорт: GET /account/groups/{id}/users с key, при необходимости added_at[from] и added_at[to] — дата добавления в группу.
3. Забери результат: GET /account/exports/{export_id} — как и для заказов, с паузой и с учётом общего лимита Export API.
4. Для частых событий (новый ученик, оплата) экспорт не подходит: настрой в GetCourse процесс с операцией «Вызвать URL», и школа сама будет отправлять события в твою систему.

```bash
KEY='<секретный ключ>'
curl -s -G "https://myschool.getcourse.ru/pl/api/account/groups" -d key=$KEY

EXPORT=$(curl -s -G "https://myschool.getcourse.ru/pl/api/account/groups/123456/users" \
  -d key=$KEY -d 'added_at[from]=2026-09-01' | jq -r .info.export_id)
sleep 60
curl -s -G "https://myschool.getcourse.ru/pl/api/account/exports/$EXPORT" -d key=$KEY
```

## Базовые URL

- Боевой: `https://{account}.getcourse.ru/pl/api`

## Авторизация

Тип: API-ключ

Отдельной авторизации нет: секретный ключ аккаунта передаётся в каждом запросе — в импорте POST-параметром `key`, в экспорте параметром `key` в строке запроса. Ключ создаётся в аккаунте («Профиль» → «Настройки аккаунта» → «АПИ»); для импорта нужен ключ с правом записи.

## Методы

### POST /users — Импорт пользователя

Тело — `form-data`: `action`, `key` и `params` (JSON, закодированный в base64).

| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
| `action` | body | string | да | add — создать (или обновить при refresh_if_exists=1); update — задать полный список групп по user.id |
| `key` | body | string | да | Секретный ключ |
| `params` | body | string | да | JSON в base64 |
| `params.user.email` | body | string | нет | Email (нужен email или телефон) |
| `params.user.phone` | body | string | нет | Телефон |
| `params.user.first_name` | body | string | нет | Имя |
| `params.user.last_name` | body | string | нет | Фамилия |
| `params.user.city` | body | string | нет | Город |
| `params.user.country` | body | string | нет | Страна |
| `params.user.group_name` | body | array | нет | Группы (можно с датой добавления) |
| `params.user.addfields` | body | object | нет | Дополнительные поля |
| `params.system.refresh_if_exists` | body | integer | нет | 1 — обновить существующего пользователя |
| `params.system.partner_email` | body | string | нет | Email партнёра |
| `params.session` | body | object | нет | UTM-метки: utm_source, utm_medium, utm_content, utm_campaign, utm_group |

### POST /deals — Импорт заказа

Создаёт заказ или обновляет существующий по `deal_number`; смена статуса — `action=add` с `user.email`, `deal.deal_number` и `deal.deal_status`. Минимум для создания: код или название предложения, сумма и email (либо `offer_id` и email).

В ответе: `success`, `action`, `result` (`deal_id`, `deal_number`, `user_id`, `user_status`, `payment_link`, `error_message`, `error`).

| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
| `action` | body | string | да | add |
| `key` | body | string | да | Секретный ключ |
| `params` | body | string | да | JSON в base64 |
| `params.user.email` | body | string | да | Email покупателя |
| `params.deal.deal_number` | body | string | нет | Номер заказа (для обновления) |
| `params.deal.offer_code` | body | string | нет | Код предложения |
| `params.deal.offer_id` | body | string | нет | ID предложения |
| `params.deal.product_title` | body | string | нет | Название предложения |
| `params.deal.deal_cost` | body | string | нет | Сумма заказа |
| `params.deal.deal_status` | body | string | нет | Статус: new, payed, cancelled и др. |
| `params.deal.deal_is_paid` | body | integer | нет | Признак оплаты |
| `params.deal.payment_type` | body | string | нет | Способ оплаты |
| `params.deal.payment_status` | body | string | нет | Статус платежа |
| `params.deal.manager_email` | body | string | нет | Email менеджера |
| `params.deal.deal_comment` | body | string | нет | Комментарий |
| `params.system.multiple_offers` | body | integer | нет | 1 — несколько предложений в одном заказе (добавляются по одному) |
| `params.system.return_payment_link` | body | integer | нет | Вернуть ссылку на оплату |
| `params.system.return_deal_number` | body | integer | нет | Вернуть номер заказа |

### GET /account/users — Экспорт пользователей

Запускает экспорт и возвращает ключ экспорта; данные получают методом `/account/exports/{export_id}`.

| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
| `key` | query | string | да | Секретный ключ |
| `created_at[from]` | query | string | нет | Дата создания с, YYYY-MM-DD |
| `created_at[to]` | query | string | нет | Дата создания по |
| `status` | query | string | нет | active или in_base |
| `email` | query | string | нет | Email через запятую |
| `idgrouplist` | query | string | нет | Выгрузить ID групп (id или id_date — с датой добавления) |

### GET /account/groups — Список групп

| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
| `key` | query | string | да | Секретный ключ |

### GET /account/groups/{id}/users — Экспорт пользователей группы

| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
| `id` | path | integer | да | ID группы |
| `key` | query | string | да | Секретный ключ |
| `added_at[from]` | query | string | нет | Дата добавления в группу с |
| `added_at[to]` | query | string | нет | Дата добавления в группу по |
| `status` | query | string | нет | Статус пользователя |

### GET /account/deals — Экспорт заказов

| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
| `key` | query | string | да | Секретный ключ |
| `created_at[from]` | query | string | нет | Дата создания с |
| `created_at[to]` | query | string | нет | Дата создания по |
| `payed_at[from]` | query | string | нет | Дата оплаты с |
| `payed_at[to]` | query | string | нет | Дата оплаты по |
| `finished_at[from]` | query | string | нет | Дата завершения с |
| `status_changed_at[from]` | query | string | нет | Дата смены статуса с |
| `status` | query | string | нет | Статус заказа |
| `user_in_group` | query | integer | нет | ID группы пользователя |
| `user_id` | query | string | нет | ID пользователей через запятую |

### GET /account/payments — Экспорт платежей

| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
| `key` | query | string | да | Секретный ключ |
| `created_at[from]` | query | string | нет | Дата создания с |
| `created_at[to]` | query | string | нет | Дата создания по |
| `status` | query | string | нет | Статус платежа |

### GET /account/exports/{export_id} — Результат экспорта

| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
| `export_id` | path | integer | да | ID экспорта из ответа метода экспорта |
| `key` | query | string | да | Секретный ключ |

## Нюансы

- Импорт: POST с полями `action`, `key`, `params`; в base64 кодируется только `params`. Без POST/form-data будет ошибка «Пустой параметр action».
- Экспорт двухшаговый: запрос с фильтром → `export_id` → получение данных; экспорты выполняются последовательно, не параллельте их.
- Справочники доп. полей пользователей и заказов — `/account/fields` с `action=get`.
- Даты в импорте — `yyyy-mm-dd HH:MM:II`.
- Для оперативной передачи событий документация рекомендует процессы с операцией «Вызвать URL» вместо частого экспорта.

## Ошибки

| Код | Описание |
|---|---|
| `903` | Превышен лимит export API — дождитесь сброса |
| `Неавторизованное API-обращение` | Неверный аккаунт или ключ |
| `Действие запрещено` | Ключ только на чтение |
| `Пустой параметр action` | Данные переданы не в теле POST form-data |
| `Не указан ни эл. адрес, ни телефон` | Нет email или телефона в params |

## Ограничения

- Import API: лимит создаваемых объектов в месяц по тарифу; изменение существующих объектов не ограничено. Статистика — «Профиль» → «Настройки аккаунта» → «АПИ».
- Export API: 100 запросов за 2 часа на аккаунт, включая проверки статуса.

## Источники

- [API GetCourse](https://getcourse.ru/help/api)

---

Если этого недостаточно — официальная документация: https://getcourse.ru/help/api
JSON: https://mcp-everything.ru/api/integrations/getcourse. MCP: https://mcp-everything.ru/mcp
