npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

getcourse-api

v1.2.0

Published

TypeScript SDK для GetCourse API

Readme

⚙️ GetCourse API

All-in-one пакет для нового и старого API

npm version license

Официальная документация:


Основная идея

GetCourse предоставляет два API: новое и старое. Оба этих API независимы друг от друга, не имеют типизацию и неудобны в использовании

Мне, как разработчику, захотелось создать пакет, который объединяет оба API в одном SDK с полной TypeScript-типизацией и с понятным неймингом методов, который был в Chatium SDK

Теперь не нужно вручную разбираться в документации, формировать HTTP-запросы и описывать типы. Просто добавь воды (вызывай методы) и работай

Пакет покрывает все актуальные эндпоинты: работу с пользователями, заказами, предложениями, уроками, вебинарами, диалогами и экспорт данных

Приятной работы, коллеги 😉


Установка

npm install getcourse-api

Быстрый старт

import GetCourse from "getcourse-api";

const gc = new GetCourse({
  devKey: "XXXXXXXX", // Ключ разработчика
  apiKey: "YYYYYYYYYYYYYYY", // Ключ API школы
  domain: "test.getcourse.ru", // Подойдет технический или любой подключенный домен к аккаунту
});

// Получить данные пользователя
const user = await gc.getUserFields({ userId: 123 });
console.log(user.data.first_name);

// Получить заказы пользователя
const deals = await gc.getUserDeals({ email: "[email protected]" });

// Получить данные заказа
const deal = await gc.getDealFields(12345);

Получение токена

  • Ключ разработчика — после заполнения анкеты
  • Ключ API школы — выдаётся в каждой школе отдельно. Должны быть права на чтение и запись

Конфигурация

| Параметр | Тип | Обязательный | По умолчанию | Описание | | ---------- | -------------------------------- | ------------ | ------------ | ----------------------------------------- | | devKey | string | да | — | Ключ разработчика | | apiKey | string | да | — | Ключ API школы | | domain | string | да | — | Домен школы, например test.getcourse.ru | | timeout | number | нет | 15000 | Таймаут запросов в мс | | logLevel | 'silent' \| 'error' \| 'debug' | нет | 'silent' | Уровень встроенного логгера | | logger | Logger | нет | — | Кастомный логгер (winston, pino и др.) |

const gc = new GetCourse({
  devKey: "XXXXXXXX",
  apiKey: "YYYYYYYYYYYYYYY",
  domain: "test.getcourse.ru",
  timeout: 10_000,
  logLevel: "debug",
});

Кастомный логгер (winston, pino)

import winston from "winston";
import GetCourse from "getcourse-api";

const logger = winston.createLogger({
  /* ... */
});

const gc = new GetCourse({
  devKey: "XXXXXXXX",
  apiKey: "YYYYYYYYYYYYYYY",
  domain: "test.getcourse.ru",
  logger, // Совместим с интерфейсом Logger
});

Обработка ошибок

Все методы бросают исключения — используй try/catch:

try {
  const deal = await gc.getDealFields(99999);
} catch (err) {
  console.error(err.message); // Текст ошибки
  console.error(err.statusCode); // HTTP статус: 400, 403, 404...
  console.error(err.apiCode); // Код ошибки из тела ответа
  console.error(err.errors); // string[] — список ошибок валидации
}

Справочник методов

Вебхуки

| Метод | Описание | | -------------- | ------------------------------------ | | setUri(body) | Установить URI для получения событий |

await gc.setUri({
  uri: "https://myapp.ru/webhook",
  event_object_id: 2, // Deal
  event_id: 3, // DealPaid
});

Общее

| Метод | Описание | | -------------------------- | ------------------------------------- | | getAllGroups() | Получить все группы пользователей | | getAllPersonalManagers() | Получить всех персональных менеджеров | | getTrainings() | Получить все тренинги |


Заказы

| Метод | Описание | | ------------------------------ | ------------------------------ | | getDealFields(dealId) | Получить поля заказа | | getDealCustomFields(dealId) | Получить кастомные поля заказа | | getDealComments(dealId) | Получить комментарии заказа | | getDealCalls(dealId) | Получить звонки по заказу | | getDealCancelReasons() | Получить причины отмены | | getDealsTags(params?) | Получить заказы с тегами | | addCommentToDeal(body) | Добавить комментарий заказу | | addDealPositions(body) | Добавить позиции в заказ | | removeDealPositions(body) | Удалить позиции из заказа | | updateDealFields(body) | Обновить поля заказа | | updateDealCustomFields(body) | Обновить кастомные поля заказа |

// Получить заказ
const deal = await gc.getDealFields(12345);

// Обновить статус заказа
await gc.updateDealFields({
  dealId: 12345,
  status: "cancelled",
  cancel_reason_comment: "Клиент передумал",
});

// Добавить позиции
await gc.addDealPositions({
  dealId: 12345,
  positions: [{ offerId: 1, price: 1000, quantity: 2 }, { offerId: 3 }],
});

Диалоги

| Метод | Описание | | -------------------------- | ----------------------------- | | getDialogHistory(body) | Получить историю диалога | | addCommentToDialog(body) | Добавить комментарий в диалог | | changeDepartment(body) | Изменить отдел диалога | | closeDialog(body) | Закрыть диалог |


Уроки

| Метод | Описание | | -------------------------------- | ----------------------------- | | getLessonAnswers(lessonId?) | Получить ответы на урок | | addCommentToLessonAnswer(body) | Добавить комментарий к ответу | | changeStatusAnswers(body) | Изменить статус ответа |


Заметки

| Метод | Описание | | --------------- | -------------------------- | | addNote(body) | Добавить заметку к диалогу |


Предложения

| Метод | Описание | | ------------------------ | ----------------------------- | | getOffers() | Получить все предложения | | getOfferById(offerId) | Получить предложение по ID | | getOffersTags(params?) | Получить предложения с тегами |


Пользователи

| Метод | Описание | | --------------------------------- | --------------------------------- | | getUserFields(params) | Получить поля пользователя | | getUserCustomFields(params) | Получить кастомные поля | | getUserDeals(params) | Получить заказы пользователя | | getUserDiplomas(params) | Получить дипломы | | getUserGroups(params) | Получить группы | | getUserBalance(params) | Получить баланс | | getUserPurchases(params) | Получить покупки | | getUserTrainings(params) | Получить тренинги | | getUserSchedule(params) | Получить расписание | | getUserGoalRecords(params) | Получить записи целей | | getUserAnswers(params) | Получить ответы | | getUserLessonAnswers(params) | Получить ответы на уроки | | getUserByTelegramChatId(chatId) | Найти по Telegram Chat ID | | addUserBalance(body) | Добавить баланс | | addCommentToUser(body) | Добавить комментарий пользователю | | addUserGroups(body) | Добавить в группы | | removeUserGroups(body) | Удалить из групп | | setUserGroups(body) | Установить группы | | setPersonalManager(body) | Установить менеджера | | updateUserFields(body) | Обновить поля пользователя | | updateUserCustomFields(body) | Обновить кастомные поля | | createDiploma(body) | Создать диплом |

// Поиск по userId или email
const user = await gc.getUserFields({ userId: 123 });
const user2 = await gc.getUserFields({ email: "[email protected]" });

// Получить баланс
const balance = await gc.getUserBalance({ userId: 123, type: "virtual" });

// Добавить баланс
await gc.addUserBalance({
  userId: 123,
  value: 500,
  type: "virtual",
  comment: "Бонус за активность",
});

// Добавить комментарий пользователю (userId — адресат, authorId — автор)
await gc.addCommentToUser({
  userId: 123,
  authorId: 456,
  text: "Тестовый комментарий в ленту пользователя",
});

// Обновить поля
await gc.updateUserFields({
  userId: 123,
  first_name: "Иван",
  last_name: "Иванов",
  phone: "+79991234567",
});

Вебинары

| Метод | Описание | | ------------------------------ | ----------------------------------- | | getAllWebinars() | Получить все вебинары | | getWebinarsByIds(body) | Получить вебинары по ID | | addCommentToWebinar(body) | Добавить комментарий в чат вебинара | | moderateWebinarComment(body) | Модерация сообщения в чате вебинара | | moderateWebinarUser(body) | Модерация пользователя вебинара |


Старое API (Legacy API)

Используй эти методы для задач, которых нет в новом API: создание пользователей/сделок и массовый экспорт данных

Лимит Export API: 100 запросов за 2 часа

Импорт

| Метод | Описание | | -------------------- | --------------------------------- | | addUser(params) | Создать или обновить пользователя | | createDeal(params) | Создать сделку |

// Создать пользователя
await gc.addUser({
  user: { email: "[email protected]", first_name: "Иван" },
  system: { refresh_if_exists: 1 },
});

// Создать сделку (вариант 1: по offer_code)
await gc.createDeal({
  user: { email: "[email protected]" },
  deal: { offer_code: "offer123", deal_cost: "1990" },
});

// Создать сделку (вариант 2: по offer_id)
await gc.createDeal({
  user: { email: "[email protected]" },
  deal: { offer_id: "42" },
});

Экспорт

Методы экспорта запускают асинхронный процесс на сервере и автоматически ждут результата

| Метод | Описание | | ----------------------------------------------- | --------------------------------------- | | exportUsers(filters?, polling?) | Экспорт пользователей | | exportGroupUsers(groupId, filters?, polling?) | Экспорт пользователей группы | | exportDeals(filters?, polling?) | Экспорт сделок | | exportPayments(filters?, polling?) | Экспорт платежей | | getCustomFields() | Дополнительные поля аккаунта | | getExportResult(exportId) | Результат экспорта по ID (ручной режим) |

// Экспорт всех пользователей
const users = await gc.exportUsers();

// Экспорт с фильтрами
const activeUsers = await gc.exportUsers({ status: "active" });

// Экспорт пользователей группы
const groupUsers = await gc.exportGroupUsers(12345);

// Экспорт сделок за период
const deals = await gc.exportDeals({
  created_at: { from: "2026-01-01", to: "2026-03-31" },
});

// Настройка поллинга (интервал 5с, таймаут 5 мин)
const payments = await gc.exportPayments(
  { status: "accepted" },
  { pollInterval: 5_000, timeout: 300_000 },
);

// Ручное получение результата по ID
const result = await gc.getExportResult(456789);

Тестирование

Все тесты интеграционные — работают с реальным проектом на GetCourse. Для запуска нужен файл .env с ключами API и тестовыми ID (пример в .env.example)

Тесты охватывают все методы, кроме установки вебхука

# Все тесты
npm run test

# Только экспорт (медленно — тратит лимит API: 100 запросов за 2 часа)
npm run test:export

# Запуск тестов отдельного файла
npm run test -- tests/user.test.ts

# Запуск конкретного теста в файле по имени
npm run test -- tests/user.test.ts -t "getUserFields"

🤓 Автор

NiktarioN


Если проект полезен — поставь ⭐️ на GitHub


Лицензия

MIT