API v1 · интеграция сервисного центра

Install-IOS Partner API

Готовый маршрут от выбора приложения до установки, получения кода и автоматического учёта задолженности.

С чего начать

Для подключения достаточно основного API-ключа, адреса API и готового комплекта выше. Резервный ключ хранится отдельно и используется только если основной потребуется заменить.

Основной адрес

https://api.installios.ru/v1

Используйте его во всех новых интеграциях.

Резервный маршрут

https://installios.ru/api/partner/v1

Оставлен для совместимости и аварийной проверки.

Заголовки каждого запроса

Authorization: Bearer iosp_ВАШ_ОСНОВНОЙ_КЛЮЧ
Accept: application/json
Content-Type: application/json
X-Request-ID: ваш-идентификатор-запроса

Не размещайте ключ в браузере или мобильном приложении. Все запросы выполняются только с вашего сервера. API-ключ, webhook-секрет, логины, пароли и коды нельзя писать в журналы.

Навигация

Как проходит одна установка

Покажите свой каталогПолучите доступные каталоги и названия приложений через API.
Создайте заявкуПередайте ваш уникальный номер заказа и выбранные приложения. Один номер заказа всегда создаёт только одну заявку.
Передайте клиенту страницуВ ответе будет fallback_url — готовая нейтральная инструкция с QR, реквизитами и кнопками установки.
Включите ожидание кодаСделайте это до того, как клиент нажмёт запрос кода на iPhone.
Получите свежий кодПроверяйте состояние ожидания раз в секунду либо принимайте подписанный webhook code.ready.
Завершите установкуПосле первого успешного кода заявка один раз начисляется в долг. Заявка завершена, когда код успешно получен по каждой задействованной учётке.

Первый тест за 15 минут

Тестовый партнёр работает в sandbox: сумма рассчитывается, но реальный долг не создаётся.

  1. Скачайте комплект и укажите ключ в .env или в окружении Postman.
  2. Запустите START_TEST_WINDOWS.cmd либо коллекцию Postman «01 — безопасная проверка».
  3. Убедитесь, что API отвечает, каталоги получены, заявка создана, повтор не создал дубль, страница и QR открываются.
  4. Для реального теста кода сначала вызовите POST /orders/{id}/code-waits, затем запросите код на iPhone и проверяйте GET /code-waits/{wait_id}.

Успешный результат: ответы 2xx, повторный заказ вернул тот же id, код не старше 60 секунд, а balance.debt_kopecks в sandbox остался равен нулю.

1. Каталоги и приложения

GET/catalogs

curl -sS "$API_BASE/catalogs" \
  -H "Authorization: Bearer $API_KEY"
{
  "ok": true,
  "data": {
    "catalogs": [
      {"id": "cat_...", "name": "maxim", "applications_count": 18}
    ]
  }
}

GET/catalogs/{catalog_id}/applications

{
  "ok": true,
  "data": {
    "catalog": {"id": "cat_...", "name": "maxim"},
    "applications": [{"id": "app_...", "name": "ВКонтакте"}]
  }
}

API намеренно не передаёт внутренние UID, IPA-адреса, версии и технические данные учёток.

2. Создание заявки

POST/orders

Автоматический выбор учёток — рекомендуемый режим

{
  "external_order_id": "SC-10482",
  "source_mode": "auto",
  "applications": [
    {"id": "app_..."},
    {"id": "app_..."}
  ]
}

Ручной выбор каталога

{
  "external_order_id": "SC-10483",
  "source_mode": "manual",
  "applications": [
    {"id": "app_...", "catalog_id": "cat_..."}
  ]
}

В одной заявке можно передать до 50 приложений. API сам объединит их в группы по Apple-учёткам.

Защита от дублей: при сетевом повторе отправляйте тот же external_order_id. Первый ответ будет HTTP 201, повторный — HTTP 200 с тем же id. Новый внешний номер при повторе создавать нельзя.

Что приходит в ответе

Таймер пилота «Сервис»: новая заявка действует 24 часа. Первый успешный вызов ожидания кода сокращает срок всей заявки, клиентской страницы и всех установочных ссылок до 1 часа от этого момента. Повторные вызовы час не добавляют. Всегда сохраняйте новое order_expires_at из ответа API.

3. Реквизиты, клиентская страница и продление

GET/orders/{id}/credentials

Возвращает логин и пароль отдельно для каждой группы. Чтение доступно только пока заявка активна и всегда фиксируется в аудите.

POST/orders/{id}/extend

Один раз создаёт новые реквизиты и ссылки на настроенный первоначальный срок. Все прежние ссылки заявки сразу отключаются.

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

Если не хотите собирать собственный интерфейс установки, просто откройте клиенту fallback_url. На странице уже есть QR, инструкция, логин, пароль, получение кода и обе ссылки каждого приложения.

4. Получение кода

Правильный порядок: сначала API включает ожидание, затем клиент запрашивает код на iPhone. Код, появившийся раньше ожидания, не выдаётся.

POST/orders/{id}/code-waits

Idempotency-Key: code-SC-10482-group-1

{"group_id": "grp_..."}

В ответе приходит order_expires_at. При первом успешном запуске это новый срок всей заявки; обновите таймер в своей системе и больше не используйте прежнее значение expires_at.

Сохраните полученный wait_id и проверяйте его раз в секунду:

GET/code-waits/{wait_id}

СтатусЧто делать
activeПродолжать polling раз в секунду. Клиент уже может запросить код.
succeededСразу показать поле code клиенту. Учитывайте valid_for_seconds.
code_expiredКод старше минуты. Создать новое ожидание и попросить клиента запросить новый код.
timed_outЗа время ожидания код не появился. Повторить процесс по действию клиента.

Активное ожидание работает до 5 минут. На одной учётке одновременно может ждать любое количество клиентов; один свежий код получат все ожидания, включённые до его появления. Для одной группы разрешено не более трёх успешных получений.

5. Webhook — необязательное ускорение

Polling полностью поддерживается. Webhook позволяет получать события быстрее и использовать polling только как страховку.

События: order.created, order.extended, order.expired, code.ready, billing.charged, billing.reversed, payment.recorded, order.completed.

ЗаголовокНазначение
X-InstallIOS-EventУникальный ID события. Используйте для защиты от повторной обработки.
X-InstallIOS-TimestampUnix-время создания подписи.
X-InstallIOS-Signaturesha256=HMAC-SHA256(secret, timestamp + "." + raw_body)

Проверяйте подпись по точному сырому телу до JSON-разбора, отклоняйте слишком старый timestamp и отвечайте HTTP 2xx только после безопасного сохранения события. Повторы одного X-InstallIOS-Event не должны менять результат.

6. Финансы

GET/balance · GET/ledger · GET/ledger.csv

Тариф фиксируется для каждого приложения при создании заявки. В рабочем режиме вся сумма заявки начисляется один раз после первого успешного кода. Частичные платежи уменьшают долг, а переплата автоматически становится авансом.

Денежные поля передаются целым числом в копейках: 10000 = 100 ₽.

Ошибки и безопасные повторы

HTTPЧто означаетЧто делать
400Неверные поляИсправить запрос, не повторять без изменений.
401Ключ отключён, ошибочен или IP не разрешёнПроверить основной ключ; по согласованию перейти на резервный.
404ID не найден или недоступен партнёруОбновить каталог и проверить ID.
409 / 410Заявка истекла, уже продлена или действие конфликтуетПрочитать текущую заявку и показать понятное состояние оператору.
429Лимит запросов или успешных кодовДля общего лимита ждать Retry-After; лимит кодов не обходить.
500 / 503Временная серверная ошибкаПовторить через 2, 5, 15 и 30 секунд с прежними идентификаторами.

Каждый ответ содержит request_id. Передавайте его владельцу при разборе ошибки, но не прикладывайте ключи, реквизиты и коды.

Чек-лист перед рабочим запуском