Для разработчиков

Сделайте свой ICQ-клиент

Тот же API, на котором работают наши веб-клиенты, открыт для всех. Обычный HTTP и JSON, без ключей и регистрации приложения. Нужен только UIN. Подойдёт для бота, клиента под любимую платформу или виджета на сайте.

Базовый адрес https://jimm.online/webapi

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

Три запроса до первого сообщения

Вся работа с API — это вход, выход в онлайн и бесконечный цикл получения событий.

  1. 1

    Войдите

    Отправьте UIN и пароль формой на /auth/clientLogin. В ответ придёт токен token.a.

  2. 2

    Выйдите в онлайн

    Вызовите /aim/startSession с этим токеном. Получите aimsid — ключ ко всем остальным методам — и сразу контакт-лист.

  3. 3

    Слушайте события

    Опрашивайте /aim/fetchEvents по кругу. Запрос ждёт до минуты и возвращается, как только что-то произошло: сообщение, статус, «печатает…».

Нет UIN? Зарегистрируйтесь на Jimm.online за минуту. Для бота заведите отдельный аккаунт.

🤖 Эхо-бот на 20 строк

Рабочий пример: бот выходит в онлайн и отвечает на каждое сообщение его же текстом. Подставьте свой UIN и пароль и запускайте.

import re, time, requests

API = "https://jimm.online/webapi"
UIN, PASSWORD = "123456789", "secret"

def call(path, **params):
    r = requests.get(API + path, params={"f": "json", **params}, timeout=75)
    resp = r.json()["response"]
    if resp["statusCode"] != 200:
        raise RuntimeError(f'{resp["statusCode"]} {resp["statusText"]}')
    return resp["data"]

login = requests.post(API + "/auth/clientLogin", data={
    "s": UIN, "pwd": PASSWORD, "devId": "echo-bot", "f": "json"}).json()
token = login["response"]["data"]["token"]["a"]

aimsid = call("/aim/startSession", a=token, events="im", clientName="EchoBot")["aimsid"]
seq = 0
while True:
    batch = call("/aim/fetchEvents", aimsid=aimsid, seqNum=seq, timeout=60000)
    for ev in batch["events"]:
        if ev["type"] == "im":
            text = re.sub(r"<[^>]+>", "", ev["eventData"]["message"])
            call("/im/sendIM", aimsid=aimsid, t=ev["eventData"]["source"]["aimId"],
                 message="Эхо: " + text, offlineIM="true")
    seq = batch["lastSeqNum"]
    time.sleep(batch["timeToNextFetch"] / 1000)

Как это устроено

Что нужно знать до первой строчки кода

Конверт ответа

Каждый ответ завёрнут в {"response": {"statusCode", "statusText", "data"}}. Успех определяйте по statusCode, а не по HTTP-коду: например, недоставленное сообщение (602) и превышение лимита (430) приходят с HTTP 200. Полезные данные лежат в data.

Токен и aimsid

token.a из clientLogin подтверждает, кто вы. По умолчанию он живёт 24 часа, с tokenType=longterm — год, и пароль можно не хранить. aimsid из startSession — это конкретная сессия «в сети». Он живёт, пока вы опрашиваете события, и умирает через 150 секунд тишины. С одного UIN можно держать несколько сессий одновременно.

Long-polling

Вебсокетов нет: fetchEvents просто держит запрос открытым, пока не появится событие (до 60 с). После ответа подождите timeToNextFetch мс и запросите снова с seqNum = lastSeqNum. Так вы не потеряете ни одного события. Ставьте HTTP-таймаут клиента больше 60 с, иначе запрос оборвётся раньше ответа.

GET, POST и параметры

Почти все методы — GET с параметрами в строке запроса. Те же параметры можно передать формой в POST, кроме /auth/clientLogin (только POST-форма) и загрузки аватарки (сырые байты). Формат ответа выбирают параметром f: json (по умолчанию), xml или amf3. С c=имяФункции ответ придёт как JSONP.

Из браузера

API отвечает с CORS-заголовками, поэтому fetch со страницы работает. Используйте GET-методы: это «простые» запросы, CORS-preflight для них не нужен. Пароль отправляйте только напрямую на сервер API, никогда через третьи руки.

Лимиты

Лимиты те же, что у обычных ICQ-клиентов, и считаются на аккаунт, а не на соединение. При превышении вы получите statusCode 430 с заголовком Retry-After (сколько секунд ждать) и событие rateLimit. Повторяйте не раньше указанного времени, иначе ограничение затянется.

Правила хорошего тона

  • Передавайте понятные devId и clientName: так нам проще помочь, если что-то пойдёт не так.
  • Боты не рассылают сообщения тем, кто им не писал. Спам-аккаунты блокируются.
  • Не храните чужие пароли. Храните токен, а пароль спрашивайте заново, когда токен истечёт.
  • Вызывайте endSession, когда клиент закрывается: контакты сразу увидят, что вы вышли.

Живая консоль

Попробуйте прямо здесь

Войдите своим UIN, и у каждого метода ниже появится кнопка «Выполнить». Запросы уходят из вашего браузера прямо на сервер API, как у любого клиента. Сайт пароль не видит и не сохраняет.

Консоль работает от вашего имени: отправленные сообщения и изменения контакт-листа настоящие.

Справочник · 33

Все методы

Нажмите на метод, чтобы увидеть параметры, ответ и примеры кода.

Вход

Обмен UIN и пароля на токен. Пароль передаётся один раз, дальше работаете с токеном.

POST /auth/clientLogin Войти по UIN и паролю Без авторизации

Проверяет UIN и пароль и выдаёт токен token.a. С ним вызывают startSession. Тело запроса — обычная форма application/x-www-form-urlencoded: JSON сервер не читает и ответит 400. Токен можно хранить вместо пароля, по умолчанию он живёт 24 часа.

Параметры

ИмяОписание
s string · в теле обязательный UIN (или username).
pwd string · в теле обязательный Пароль (или password).
devId string · в теле Имя вашего клиента. Попадает в логи сервера, по умолчанию WebAIM.
tokenType string · в теле Срок жизни токена: shortterm (24 ч, по умолчанию), longterm (365 дней) или число секунд.
f string · в теле Формат ответа. У POST он передаётся в теле. jsonxmlamf3

Ошибки

  • 330 Неверный UIN или пароль (statusDetailCode: 3011, HTTP 401).
  • 460 Не передан UIN или пароль (HTTP 400).
  • 462 Недопустимый tokenType (HTTP 400).

Пример запроса

curl -X POST "https://jimm.online/webapi/auth/clientLogin" \
  --data-urlencode "s=123456789" \
  --data-urlencode "pwd=$PASSWORD" \
  --data-urlencode "devId=my-client" \
  --data-urlencode "f=json"

Ответ Содержимое response.data

{
    "token": {
        "a": "AAAAAGdQ…base64url…",
        "expiresIn": "86400"
    },
    "loginId": "123456789",
    "screenName": "123456789",
    "sessionSecret": "q1w2e3…",
    "hostTime": 1761130000,
    "tokenExpiresIn": 86400
}
#clientLogin · Ссылка на метод
GET /auth/getInfo Проверить токен Токен

Говорит, жив ли сохранённый токен и чей он. Удобно при старте клиента: если ответ не 200, попросите пароль заново.

Параметры

ИмяОписание
a string обязательный Токен из clientLogin.
reqAuthFreshness integer Максимальный возраст входа в секундах (по умолчанию 86400). Старше — ответ 330.
f string Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP. jsonxmlamf3

Ошибки

  • 401 Токен не принят: просрочен, повреждён или не из clientLogin.
  • 330 Вход слишком старый для reqAuthFreshness.

Пример запроса

curl -G "https://jimm.online/webapi/auth/getInfo" \
  --data-urlencode "a=$TOKEN" \
  --data-urlencode "f=json"

Ответ Содержимое response.data

{
    "userData": {
        "loginId": "123456789",
        "displayName": "123456789"
    }
}
#getInfo · Ссылка на метод

Сессия и события

Выход в онлайн, long-polling ленты событий и выход из сети.

GET /aim/startSession Выйти в онлайн Токен

Открывает сессию и выводит вас в онлайн: контакты видят, что вы зашли. Возвращает aimsid, его передают во все остальные методы. В events перечисляете, какие события хотите получать. Начальное состояние (контакт-лист, ваш профиль) приходит сразу в ответе и дублируется первыми событиями ленты. Офлайн-сообщения приходят событиями offlineIM и при этом удаляются с сервера, сохраните их сами. Если не опрашивать ленту, сессия закроется через 150 секунд.

Параметры

ИмяОписание
a string обязательный Токен из clientLogin.
events string Через запятую: на какие события подписаться. По умолчанию buddylist,presence,im,sentIM.
clientName string Название клиента.
clientVersion string Версия клиента.
timeout integer Таймаут long-polling по умолчанию, в секундах (60).
f string Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP. jsonxmlamf3

Ошибки

  • 401 Нет токена, или он просрочен.
  • 503 Не удалось открыть сессию на сервере.

Пример запроса

curl -G "https://jimm.online/webapi/aim/startSession" \
  --data-urlencode "a=$TOKEN" \
  --data-urlencode "f=json"

Ответ Содержимое response.data

{
    "aimsid": "0123456789abcdef.123456789",
    "ts": 1761130000,
    "fetchTimeout": 60000,
    "timeToNextFetch": 500,
    "fetchBaseURL": "https://jimm.online/webapi/aim/fetchEvents?aimsid=0123456789abcdef.123456789&seqNum=0",
    "myInfo": {
        "aimId": "123456789",
        "displayId": "123456789",
        "friendly": "123456789",
        "state": "online",
        "userType": "icq",
        "bot": false,
        "service": "icq",
        "capabilities": [],
        "buddyIcon": "https://jimm.online/webapi/expressions/get?t=123456789&type=buddyIcon"
    },
    "events": {
        "buddylist": {
            "groups": [
                {
                    "name": "Друзья",
                    "id": 1,
                    "buddies": [
                        {
                            "aimId": "987654321",
                            "displayId": "987654321",
                            "friendly": "Вася",
                            "state": "online",
                            "statusMsg": "на связи",
                            "onlineTime": 1761120000,
                            "userType": "icq",
                            "service": "icq",
                            "buddyIcon": "https://jimm.online/webapi/expressions/get?t=987654321&type=buddyIcon",
                            "bot": false
                        }
                    ]
                }
            ]
        }
    },
    "wellKnownUrls": {
        "webApiBase": "https://jimm.online/webapi/",
        "fetchBaseURL": "https://jimm.online/webapi/aim/fetchEvents"
    }
}
#startSession · Ссылка на метод
GET /aim/fetchEvents Получить события (long-polling) aimsid

Главный цикл клиента. Запрос висит, пока не появятся события новее seqNum или не выйдет timeout, после чего возвращает их пачкой (возможно, пустой). Следующий запрос делайте с seqNum = lastSeqNum через timeToNextFetch мс. Каждый вызов продлевает жизнь сессии. Сервер держит до 1000 последних событий.

Параметры

ИмяОписание
aimsid string обязательный Идентификатор сессии из startSession.
seqNum integer Последний полученный номер события; 0 — с начала.
timeout integer Сколько ждать, в миллисекундах, максимум 60000.
f string Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP. jsonxmlamf3

Ошибки

  • 401 Сессия закрыта или истекла. Начните заново с startSession.

Пример запроса

curl -G "https://jimm.online/webapi/aim/fetchEvents" \
  --data-urlencode "aimsid=$AIMSID" \
  --data-urlencode "f=json"

Ответ Содержимое response.data

{
    "events": [
        {
            "type": "im",
            "seqNum": 7,
            "timestamp": 1761130042,
            "eventData": {
                "source": {
                    "aimId": "987654321",
                    "displayId": "987654321",
                    "friendly": "Вася",
                    "userType": "icq",
                    "state": "online"
                },
                "message": "Привет! Как дела?",
                "msgId": "9c2e41d07a3b55f1",
                "timestamp": 1761130042,
                "imf": "plain",
                "autoresponse": false
            }
        }
    ],
    "lastSeqNum": 7,
    "timeToNextFetch": 500,
    "fetchBaseURL": "https://jimm.online/webapi/aim/fetchEvents?aimsid=0123456789abcdef.123456789&seqNum=7"
}
#fetchEvents · Ссылка на метод
GET /aim/endSession Выйти из сети aimsid

Закрывает сессию: контакты увидят, что вы вышли. В браузере удобно вызывать через navigator.sendBeacon в pagehide.

Параметры

ИмяОписание
aimsid string обязательный Идентификатор сессии из startSession.
f string Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP. jsonxmlamf3

Пример запроса

curl -G "https://jimm.online/webapi/aim/endSession" \
  --data-urlencode "aimsid=$AIMSID" \
  --data-urlencode "f=json"

Ответ Содержимое response.data

{}
#endSession · Ссылка на метод
GET /aim/startOSCARSession Адрес и cookie для нативного OSCAR Токен

Для тех, кто пишет полноценный OSCAR-клиент поверх TCP: вход через HTTP, а дальше прямое подключение к BOS по выданным host, port и cookie, без шага с паролем по протоколу.

Параметры

ИмяОписание
a string обязательный Токен из clientLogin.
useTLS boolean Нужен TLS-порт. Если сервер его не держит, вернётся обычный.
f string Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP. jsonxmlamf3

Ошибки

  • 401 Нет токена, или он просрочен.

Пример запроса

curl -G "https://jimm.online/webapi/aim/startOSCARSession" \
  --data-urlencode "a=$TOKEN" \
  --data-urlencode "f=json"

Ответ Содержимое response.data

{
    "host": "icq.jimm.online",
    "port": 5190,
    "cookie": "AAAAAGdQ…base64…"
}
#startOSCARSession · Ссылка на метод

Сообщения

Отправка сообщений, индикатор «печатает…» и история текущей сессии.

GET /im/sendIM Отправить сообщение aimsid

Работает и как GET, и как POST с формой. Из браузера лучше GET: это «простой» запрос, CORS-preflight для него не нужен. Чтобы сообщение дошло до собеседника не в сети, передайте offlineIM=true — оно сохранится и придёт ему при входе. Для собеседника в сети флаг ничего не меняет, его можно передавать всегда. Ваши же сессии получат копию событием sentIM.

Параметры

ИмяОписание
aimsid string обязательный Идентификатор сессии из startSession.
t string обязательный Кому: UIN получателя.
message string обязательный Текст. До ~4000 байт.
offlineIM boolean Сохранить, если получатель не в сети.
autoResponse string 1 — это автоответ (например, «я отошёл»).
f string Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP. jsonxmlamf3

Ошибки

  • 602 Не доставлено: получатель не в сети без offlineIM, его ящик офлайн-сообщений полон или вы его заблокировали. HTTP при этом 200, смотрите statusCode.
  • 430 Слишком часто. Подождите Retry-After секунд.
  • 400 Нет t или message.

Пример запроса

curl -G "https://jimm.online/webapi/im/sendIM" \
  --data-urlencode "aimsid=$AIMSID" \
  --data-urlencode "t=987654321" \
  --data-urlencode "message=Привет! 👋" \
  --data-urlencode "offlineIM=true" \
  --data-urlencode "f=json"

Ответ Содержимое response.data

{
    "msgId": "5f1c0e2a-9b3d-4c11-8000-0a1b2c3d4e5f",
    "state": "delivered",
    "timestamp": 1761130050
}
#sendIM · Ссылка на метод
GET /im/setTyping «Печатает…» aimsid

Сообщает собеседнику, что вы набираете текст. Отправляется, только если его клиент просил такие уведомления. Иначе сервер молча отвечает пустым телом с HTTP 200, это не ошибка. Не шлите чаще раза в пару секунд.

Параметры

ИмяОписание
aimsid string обязательный Идентификатор сессии из startSession.
t string обязательный UIN собеседника.
typingStatus string typing — печатает, typed — остановился, none — стёр. typingtypednone
f string Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP. jsonxmlamf3

Пример запроса

curl -G "https://jimm.online/webapi/im/setTyping" \
  --data-urlencode "aimsid=$AIMSID" \
  --data-urlencode "t=987654321" \
  --data-urlencode "f=json"

Ответ Содержимое response.data

{}
#setTyping · Ссылка на метод
GET /imlog/fetchStoredIMs История текущей сессии aimsid

Сообщения с собеседником, прошедшие через эту сессию. Сервер не хранит переписку между сессиями: после повторного входа список начнётся с нуля. Постоянную историю храните на стороне клиента.

Параметры

ИмяОписание
aimsid string обязательный Идентификатор сессии из startSession.
to string обязательный UIN собеседника.
nToGet integer Сколько вернуть.
sortOrder string asc или desc. ascdesc
startTime integer Не раньше (unix-время).
endTime integer Не позже (unix-время).
f string Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP. jsonxmlamf3

Ошибки

  • 400 Нет to.

Пример запроса

curl -G "https://jimm.online/webapi/imlog/fetchStoredIMs" \
  --data-urlencode "aimsid=$AIMSID" \
  --data-urlencode "to=987654321" \
  --data-urlencode "f=json"

Ответ Содержимое response.data

{
    "msgs": [
        {
            "sender": "987654321",
            "message": "Привет!",
            "msgId": "9c2e41d07a3b55f1",
            "date": 1761130042
        }
    ]
}
#fetchStoredIMs · Ссылка на метод

Статусы и профиль

Свой статус, x-статус, профиль, а также статусы других людей.

GET /presence/get Статусы людей или весь контакт-лист aimsid

С bl=1 возвращает весь контакт-лист с текущими статусами. С t — статусы конкретных людей (до 32), даже если их нет в вашем списке. Так удобно показать карточку перед добавлением в контакты.

Параметры

ИмяОписание
aimsid string обязательный Идентификатор сессии из startSession.
t string UIN через запятую (или повторить t). До 32.
bl string 1 — вернуть весь контакт-лист по группам.
profileMsg string 1 — добавить текст профиля.
mdir boolean Добавить данные анкеты (имя, город).
f string Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP. jsonxmlamf3

Пример запроса

curl -G "https://jimm.online/webapi/presence/get" \
  --data-urlencode "aimsid=$AIMSID" \
  --data-urlencode "f=json"

Ответ Содержимое response.data

{
    "users": [
        {
            "aimId": "987654321",
            "displayId": "987654321",
            "friendly": "Вася",
            "state": "online",
            "statusMsg": "на связи",
            "onlineTime": 1761120000,
            "userType": "icq",
            "service": "icq",
            "buddyIcon": "https://jimm.online/webapi/expressions/get?t=987654321&type=buddyIcon"
        }
    ]
}
#getPresence · Ссылка на метод
GET /presence/setState Сменить статус aimsid

Основной статус: в сети, отошёл, не беспокоить, занят, невидимый. Для «отошёл» можно передать текст автоответа.

Параметры

ИмяОписание
aimsid string обязательный Идентификатор сессии из startSession.
view string обязательный Новый статус (или state). onlineawaydndoccupiedinvisible
awayMsg string Текст «отошёл» (для away).
f string Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP. jsonxmlamf3

Ошибки

  • 400 Неизвестный статус.

Пример запроса

curl -G "https://jimm.online/webapi/presence/setState" \
  --data-urlencode "aimsid=$AIMSID" \
  --data-urlencode "view=away" \
  --data-urlencode "f=json"

Ответ Содержимое response.data

{
    "aimId": "123456789",
    "displayId": "123456789",
    "state": "away",
    "awayMsg": "Скоро вернусь",
    "statusMsg": "",
    "userType": "icq",
    "onlineTime": 1761130000
}
#setState · Ссылка на метод
GET /presence/setStatus Текст статуса и x-статус aimsid

Задаёт подпись под ником и иконку настроения (x-статус). Параметр меняется только если он есть в запросе. mood= с пустым значением снимает x-статус, а без mood x-статус остаётся как был. Коды настроений — в справочнике.

Параметры

ИмяОписание
aimsid string обязательный Идентификатор сессии из startSession.
statusMsg string Текст статуса. Пустой — убрать.
mood string Код x-статуса. Пустой — убрать.
f string Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP. jsonxmlamf3

Ошибки

  • 400 Неизвестный mood или слишком длинный текст.

Пример запроса

curl -G "https://jimm.online/webapi/presence/setStatus" \
  --data-urlencode "aimsid=$AIMSID" \
  --data-urlencode "f=json"

Ответ Содержимое response.data

{}
#setStatus · Ссылка на метод
GET /presence/getProfile Профиль пользователя aimsid

Текст профиля («о себе»). Без sn — ваш собственный.

Параметры

ИмяОписание
aimsid string обязательный Идентификатор сессии из startSession.
sn string Чей профиль.
f string Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP. jsonxmlamf3

Пример запроса

curl -G "https://jimm.online/webapi/presence/getProfile" \
  --data-urlencode "aimsid=$AIMSID" \
  --data-urlencode "f=json"

Ответ Содержимое response.data

{
    "screenName": "987654321",
    "profile": "Сижу в аське с 2003 года",
    "lastUpdated": 0
}
#getProfile · Ссылка на метод
GET /presence/setProfile Изменить свой профиль aimsid

Заменяет текст профиля. До 4 КБ.

Параметры

ИмяОписание
aimsid string обязательный Идентификатор сессии из startSession.
profile string обязательный Новый текст.
f string Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP. jsonxmlamf3

Ошибки

  • 400 Больше 4 КБ.

Пример запроса

curl -G "https://jimm.online/webapi/presence/setProfile" \
  --data-urlencode "aimsid=$AIMSID" \
  --data-urlencode "profile=Сижу в аське с 2003 года" \
  --data-urlencode "f=json"

Ответ Содержимое response.data

{}
#setProfile · Ссылка на метод

Контакт-лист

Контакт-лист хранится на сервере: группы, контакты, клички. Любое изменение прилетает событием buddylist во все ваши сессии.

GET /buddylist/addBuddy Добавить контакт aimsid

Добавляет человека в группу (по умолчанию Buddies). Если группы нет, она будет создана. Пустой data значит успех; иначе в data.resultCode будет причина, например alreadyExists.

Параметры

ИмяОписание
aimsid string обязательный Идентификатор сессии из startSession.
buddy string обязательный UIN.
group string Группа.
preAuthorized boolean Заранее разрешить этому человеку добавить вас.
authorizationMsg string Текст запроса авторизации.
f string Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP. jsonxmlamf3

Ошибки

  • 400 Нет buddy.

Пример запроса

curl -G "https://jimm.online/webapi/buddylist/addBuddy" \
  --data-urlencode "aimsid=$AIMSID" \
  --data-urlencode "buddy=987654321" \
  --data-urlencode "f=json"

Ответ Содержимое response.data

{}
#addBuddy · Ссылка на метод
GET /buddylist/removeBuddy Удалить контакт aimsid

Удаляет контакт из группы или, с allGroups=1, отовсюду.

Параметры

ИмяОписание
aimsid string обязательный Идентификатор сессии из startSession.
buddy string обязательный UIN.
group string Из какой группы.
allGroups boolean Удалить из всех групп.
f string Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP. jsonxmlamf3

Пример запроса

curl -G "https://jimm.online/webapi/buddylist/removeBuddy" \
  --data-urlencode "aimsid=$AIMSID" \
  --data-urlencode "buddy=987654321" \
  --data-urlencode "f=json"

Ответ Содержимое response.data

{}
#removeBuddy · Ссылка на метод
GET /buddylist/moveBuddy Переместить контакт aimsid

Переносит контакт в другую группу и/или ставит его перед другим контактом.

Параметры

ИмяОписание
aimsid string обязательный Идентификатор сессии из startSession.
buddy string обязательный UIN.
group string обязательный Текущая группа.
newGroup string Новая группа.
beforeBuddy string Поставить перед этим UIN.
f string Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP. jsonxmlamf3

Пример запроса

curl -G "https://jimm.online/webapi/buddylist/moveBuddy" \
  --data-urlencode "aimsid=$AIMSID" \
  --data-urlencode "buddy=987654321" \
  --data-urlencode "group=Друзья" \
  --data-urlencode "f=json"

Ответ Содержимое response.data

{}
#moveBuddy · Ссылка на метод
GET /buddylist/setBuddyAttribute Кличка контакта aimsid

Ваше личное имя для контакта (видите только вы). Приходит в поле friendly.

Параметры

ИмяОписание
aimsid string обязательный Идентификатор сессии из startSession.
t string обязательный UIN.
friendly string Кличка. Пустая — убрать.
f string Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP. jsonxmlamf3

Пример запроса

curl -G "https://jimm.online/webapi/buddylist/setBuddyAttribute" \
  --data-urlencode "aimsid=$AIMSID" \
  --data-urlencode "t=987654321" \
  --data-urlencode "f=json"

Ответ Содержимое response.data

{}
#setBuddyAttribute · Ссылка на метод
GET /buddylist/addGroup Создать группу aimsid

Создаёт группу. Повторный вызов ничего не ломает.

Параметры

ИмяОписание
aimsid string обязательный Идентификатор сессии из startSession.
group string обязательный Название.
f string Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP. jsonxmlamf3

Пример запроса

curl -G "https://jimm.online/webapi/buddylist/addGroup" \
  --data-urlencode "aimsid=$AIMSID" \
  --data-urlencode "group=Работа" \
  --data-urlencode "f=json"

Ответ Содержимое response.data

{}
#addGroup · Ссылка на метод
GET /buddylist/renameGroup Переименовать группу aimsid

Меняет название группы.

Параметры

ИмяОписание
aimsid string обязательный Идентификатор сессии из startSession.
oldGroup string обязательный Текущее название.
newGroup string обязательный Новое название.
f string Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP. jsonxmlamf3

Пример запроса

curl -G "https://jimm.online/webapi/buddylist/renameGroup" \
  --data-urlencode "aimsid=$AIMSID" \
  --data-urlencode "oldGroup=Работа" \
  --data-urlencode "newGroup=Коллеги" \
  --data-urlencode "f=json"

Ответ Содержимое response.data

{}
#renameGroup · Ссылка на метод
GET /buddylist/removeGroup Удалить группу aimsid

Удаляет группу.

Параметры

ИмяОписание
aimsid string обязательный Идентификатор сессии из startSession.
group string обязательный Название.
f string Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP. jsonxmlamf3

Пример запроса

curl -G "https://jimm.online/webapi/buddylist/removeGroup" \
  --data-urlencode "aimsid=$AIMSID" \
  --data-urlencode "group=Коллеги" \
  --data-urlencode "f=json"

Ответ Содержимое response.data

{}
#removeGroup · Ссылка на метод
GET /buddylist/setGroupAttribute Свернуть или развернуть группу aimsid

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

Параметры

ИмяОписание
aimsid string обязательный Идентификатор сессии из startSession.
group string обязательный Название.
collapsed boolean обязательный Свёрнута ли.
f string Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP. jsonxmlamf3

Пример запроса

curl -G "https://jimm.online/webapi/buddylist/setGroupAttribute" \
  --data-urlencode "aimsid=$AIMSID" \
  --data-urlencode "group=Друзья" \
  --data-urlencode "collapsed=true" \
  --data-urlencode "f=json"

Ответ Содержимое response.data

{}
#setGroupAttribute · Ссылка на метод
GET /aim/addTempBuddy Следить за статусом без добавления aimsid

Подписывает сессию на статусы людей, которых нет в контакт-листе. Подписка живёт до конца сессии, максимум 160 человек.

Параметры

ИмяОписание
aimsid string обязательный Идентификатор сессии из startSession.
t string обязательный UIN через запятую.
f string Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP. jsonxmlamf3

Ошибки

  • 400 Пустой список или больше 160.

Пример запроса

curl -G "https://jimm.online/webapi/aim/addTempBuddy" \
  --data-urlencode "aimsid=$AIMSID" \
  --data-urlencode "t=987654321" \
  --data-urlencode "f=json"

Ответ Содержимое response.data

{}
#addTempBuddy · Ссылка на метод
GET /aim/removeTempBuddy Перестать следить aimsid

Отменяет addTempBuddy.

Параметры

ИмяОписание
aimsid string обязательный Идентификатор сессии из startSession.
t string обязательный UIN через запятую.
f string Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP. jsonxmlamf3

Пример запроса

curl -G "https://jimm.online/webapi/aim/removeTempBuddy" \
  --data-urlencode "aimsid=$AIMSID" \
  --data-urlencode "t=987654321" \
  --data-urlencode "f=json"

Ответ Содержимое response.data

{}
#removeTempBuddy · Ссылка на метод

Настройки и приватность

Серверные настройки аккаунта и списки видимости и игнора.

GET /preference/get Настройки аккаунта aimsid

Серверные настройки: 1 — включено, 0 — выключено. Те же значения приходят событием preference.

Параметры

ИмяОписание
aimsid string обязательный Идентификатор сессии из startSession.
f string Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP. jsonxmlamf3

Пример запроса

curl -G "https://jimm.online/webapi/preference/get" \
  --data-urlencode "aimsid=$AIMSID" \
  --data-urlencode "f=json"

Ответ Содержимое response.data

{
    "showGroups": 1,
    "showOffLineBuddies": 1,
    "acceptOffLineIM": 1,
    "discloseTyping": 1,
    "viewIMTimestamps": 1
}
#getPreferences · Ссылка на метод
GET /preference/set Изменить настройки aimsid

Каждая настройка — отдельный параметр со значением 1 или 0. Возвращает только то, что изменилось.

Параметры

ИмяОписание
aimsid string обязательный Идентификатор сессии из startSession.
acceptOffLineIM string Принимать офлайн-сообщения.
discloseTyping string Показывать собеседникам, что вы печатаете.
showOffLineBuddies string Показывать контакты не в сети.
f string Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP. jsonxmlamf3

Пример запроса

curl -G "https://jimm.online/webapi/preference/set" \
  --data-urlencode "aimsid=$AIMSID" \
  --data-urlencode "f=json"

Ответ Содержимое response.data

{
    "discloseTyping": 1
}
#setPreferences · Ссылка на метод
GET /preference/getPermitDeny Кто может вам писать aimsid

Режим приватности и списки «разрешённые» и «заблокированные».

Параметры

ИмяОписание
aimsid string обязательный Идентификатор сессии из startSession.
f string Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP. jsonxmlamf3

Пример запроса

curl -G "https://jimm.online/webapi/preference/getPermitDeny" \
  --data-urlencode "aimsid=$AIMSID" \
  --data-urlencode "f=json"

Ответ Содержимое response.data

{
    "pdMode": "denySome",
    "blocks": [
        "555555"
    ]
}
#getPermitDeny · Ссылка на метод
GET /preference/setPermitDeny Блокировки и режим приватности aimsid

Меняет режим и/или добавляет и убирает людей из списков. Списки — UIN через запятую.

Параметры

ИмяОписание
aimsid string обязательный Идентификатор сессии из startSession.
pdMode string permitAll — все, denySome — все, кроме заблокированных, permitSome — только разрешённые, permitOnList — только контакты, denyAll — никто. permitAlldenySomepermitSomepermitOnListdenyAll
pdBlock string Заблокировать.
pdBlockRemove string Разблокировать.
pdAllow string Разрешить.
pdAllowRemove string Убрать из разрешённых.
f string Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP. jsonxmlamf3

Ошибки

  • 400 Неизвестный pdMode.

Пример запроса

curl -G "https://jimm.online/webapi/preference/setPermitDeny" \
  --data-urlencode "aimsid=$AIMSID" \
  --data-urlencode "f=json"

Ответ Содержимое response.data

{
    "pdMode": "denySome",
    "blocks": [
        "555555"
    ]
}
#setPermitDeny · Ссылка на метод

Поиск людей

Каталог пользователей: поиск по UIN, имени и фамилии, анкета.

GET /memberDir/search Найти людей aimsid

match — пары ключ=значение через запятую. keyword ищет точное совпадение UIN и по ключевым словам, firstName и lastName — по имени и фамилии. Вы сами в результаты не попадаете.

Параметры

ИмяОписание
aimsid string обязательный Идентификатор сессии из startSession.
match string обязательный Что искать.
nToGet integer Сколько вернуть (по умолчанию 100).
nToSkip integer Сколько пропустить.
f string Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP. jsonxmlamf3

Пример запроса

curl -G "https://jimm.online/webapi/memberDir/search" \
  --data-urlencode "aimsid=$AIMSID" \
  --data-urlencode "match=keyword=987654321" \
  --data-urlencode "f=json"

Ответ Содержимое response.data

{
    "results": {
        "nTotal": 1,
        "nSkipped": 0,
        "nProfiles": 1,
        "infoArray": [
            {
                "profile": {
                    "aimId": "987654321",
                    "displayId": "987654321",
                    "firstName": "Василий",
                    "lastName": "Пупкин",
                    "city": "Киев",
                    "country": "UA"
                }
            }
        ]
    }
}
#memberDirSearch · Ссылка на метод
GET /memberDir/get Анкета aimsid

Анкеты (имя, фамилия, город, страна) до 20 человек. Без t — ваша.

Параметры

ИмяОписание
aimsid string обязательный Идентификатор сессии из startSession.
t string UIN через запятую.
f string Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP. jsonxmlamf3

Пример запроса

curl -G "https://jimm.online/webapi/memberDir/get" \
  --data-urlencode "aimsid=$AIMSID" \
  --data-urlencode "f=json"

Ответ Содержимое response.data

{
    "infoArray": [
        {
            "profile": {
                "aimId": "987654321",
                "displayId": "987654321",
                "firstName": "Василий",
                "lastName": "Пупкин",
                "city": "Киев",
                "country": "UA"
            }
        }
    ]
}
#memberDirGet · Ссылка на метод
GET /memberDir/update Изменить свою анкету aimsid

Каждое поле — отдельный set=ключ=значение. Поля, которых нет в запросе, не меняются.

Параметры

ИмяОписание
aimsid string обязательный Идентификатор сессии из startSession.
set string обязательный Поле: firstName, lastName. Можно повторять.
f string Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP. jsonxmlamf3

Пример запроса

curl -G "https://jimm.online/webapi/memberDir/update" \
  --data-urlencode "aimsid=$AIMSID" \
  --data-urlencode "set=firstName=Иван" \
  --data-urlencode "f=json"

Ответ Содержимое response.data

{}
#memberDirUpdate · Ссылка на метод

Аватарки

Получение и загрузка аватарок.

GET /expressions/get Аватарка пользователя Без авторизации

Без авторизации. type=buddyIcon отдаёт саму картинку, и её можно сразу ставить в <img src>. Без type возвращается JSON со ссылкой.

Параметры

ИмяОписание
t string обязательный UIN.
type string buddyIcon — вернуть картинку. buddyIconbigBuddyIcon
f string Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP. jsonxmlamf3

Ошибки

  • 400 Нет t.

Пример запроса

curl -G "https://jimm.online/webapi/expressions/get" \
  --data-urlencode "t=987654321" \
  --data-urlencode "f=json"

Ответ Содержимое response.data

{
    "expressions": [
        {
            "type": "bigBuddyIcon",
            "url": "https://jimm.online/webapi/expressions/get?t=987654321&type=buddyIcon&bartId=…"
        }
    ]
}
#expressionsGet · Ссылка на метод
POST /expressions/upload Загрузить свою аватарку aimsid

Тело запроса — сами байты картинки (GIF, JPEG или PNG), не форма. До 64 КБ. Контакты получат новую аватарку событием presence.

Параметры

ИмяОписание
aimsid string обязательный Идентификатор сессии из startSession.
type string обязательный Всегда buddyIcon. buddyIcon
f string Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP. jsonxmlamf3

Тело запроса: байты картинки (image/png, image/jpeg, image/gif).

Ошибки

  • 460 Нет type.
  • 462 Пустая картинка, больше 64 КБ или неизвестный type.

Пример запроса

curl -X POST "https://jimm.online/webapi/expressions/upload?aimsid=$AIMSID&type=buddyIcon&f=json" \
  -H "Content-Type: image/png" \
  --data-binary @avatar.png

Ответ Содержимое response.data

{
    "id": "0001a1b2c3d4e5f6…"
}
#expressionsUpload · Ссылка на метод

События

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

Каждое событие выглядит как {type, seqNum, timestamp, eventData}. Подписка задаётся параметром events в startSession.

im Входящее сообщение. В message может прийти HTML от десктопных клиентов (<HTML><BODY>…): если показываете как текст, вырежьте теги.
{
    "type": "im",
    "seqNum": 12,
    "timestamp": 1761130042,
    "eventData": {
        "source": {
            "aimId": "987654321",
            "displayId": "987654321",
            "friendly": "Вася",
            "userType": "icq",
            "state": "online"
        },
        "message": "Привет! Как дела?",
        "msgId": "9c2e41d07a3b55f1",
        "timestamp": 1761130042,
        "imf": "plain",
        "autoresponse": false
    }
}
offlineIM Сообщение, присланное, пока вас не было в сети. timestamp — время отправки. Сервер удаляет его после доставки, повторно оно не придёт.
{
    "type": "offlineIM",
    "seqNum": 12,
    "timestamp": 1761130042,
    "eventData": {
        "aimId": "987654321",
        "friendly": "Вася",
        "message": "Ты где?",
        "msgId": "3e1f…",
        "timestamp": 1761100000,
        "imf": "plain",
        "autoresponse": false
    }
}
sentIM Копия вашего отправленного сообщения для остальных ваших сессий. Это синхронизация между устройствами. Если iSent: true, сообщение отправлено из этой же сессии, повторно его показывать не нужно.
{
    "type": "sentIM",
    "seqNum": 12,
    "timestamp": 1761130042,
    "eventData": {
        "sender": {
            "aimId": "123456789"
        },
        "dest": {
            "aimId": "987654321",
            "displayId": "987654321"
        },
        "message": "Привет!",
        "msgId": "5f1c0e2a-…",
        "timestamp": 1761130050,
        "iSent": true
    }
}
typing Собеседник печатает (typing), остановился (typed) или стёр текст (none).
{
    "type": "typing",
    "seqNum": 12,
    "timestamp": 1761130042,
    "eventData": {
        "aimId": "987654321",
        "typingStatus": "typing"
    }
}
presence Контакт сменил статус, x-статус или аватарку. Приходят только изменившиеся поля. Пустой state значит, что статус прежний: не переводите контакт в офлайн.
{
    "type": "presence",
    "seqNum": 12,
    "timestamp": 1761130042,
    "eventData": {
        "aimId": "987654321",
        "friendly": "Вася",
        "state": "away",
        "statusMsg": "обедаю",
        "userType": "icq",
        "moodIcon": "https://jimm.online/webapi/…",
        "onlineTime": 1761120000
    }
}
buddylist Весь контакт-лист целиком. Приходит при входе и после любого изменения. Заменяйте им список, а не дополняйте.
{
    "type": "buddylist",
    "seqNum": 12,
    "timestamp": 1761130042,
    "eventData": {
        "groups": [
            {
                "name": "Друзья",
                "id": 1,
                "buddies": [
                    {
                        "aimId": "987654321",
                        "displayId": "987654321",
                        "friendly": "Вася",
                        "state": "online",
                        "statusMsg": "на связи",
                        "onlineTime": 1761120000,
                        "userType": "icq",
                        "service": "icq",
                        "buddyIcon": "https://jimm.online/webapi/expressions/get?t=987654321&type=buddyIcon",
                        "bot": false
                    }
                ]
            }
        ]
    }
}
myInfo Ваш собственный статус и данные. Приходит при входе и при изменениях.
{
    "type": "myInfo",
    "seqNum": 12,
    "timestamp": 1761130042,
    "eventData": {
        "aimId": "123456789",
        "displayId": "123456789",
        "state": "online",
        "userType": "icq",
        "statusMsg": "",
        "capabilities": []
    }
}
preference Серверные настройки: при входе и после preference/set.
{
    "type": "preference",
    "seqNum": 12,
    "timestamp": 1761130042,
    "eventData": {
        "showGroups": 1,
        "acceptOffLineIM": 1
    }
}
permitDeny Режим приватности и списки блокировок: при входе и при изменениях.
{
    "type": "permitDeny",
    "seqNum": 12,
    "timestamp": 1761130042,
    "eventData": {
        "pdMode": "permitAll"
    }
}
rateLimit Вы шлёте слишком часто: warn — предупреждение, limit — сообщения отклоняются, clear — можно снова.
{
    "type": "rateLimit",
    "seqNum": 12,
    "timestamp": 1761130042,
    "eventData": {
        "classes": [
            {
                "id": 3,
                "status": "limit"
            }
        ]
    }
}
clientError Клиент получателя не смог обработать ваше сообщение. В cookie — msgId из sendIM.
{
    "type": "clientError",
    "seqNum": 12,
    "timestamp": 1761130042,
    "eventData": {
        "source": {
            "aimId": "987654321"
        },
        "cookie": "5f1c0e2a-…",
        "channel": "im"
    }
}
sessionEnded Сервер закрыл сессию (например, из-за лимитов или перезапуска). Опрос нужно остановить и войти заново.
{
    "type": "sessionEnded",
    "seqNum": 12,
    "timestamp": 1761130042,
    "eventData": {}
}

Коды statusCode

КодHTTPЧто значит
200 200 Успех.
330 401 Нужен повторный вход. С statusDetailCode: 3011 — неверный пароль.
400 400 Не хватает параметра или он неверный. Текст — в statusText.
401 401 / 200 Токен или aimsid недействительны: сессия закрыта или истекла.
430 200 Превышен лимит частоты. Подождите столько секунд, сколько в заголовке Retry-After.
460 400 Не передан обязательный параметр.
462 400 Параметр есть, но с недопустимым значением.
602 200 Сообщение не доставлено: получатель не в сети, ящик полон или он заблокирован.

Статусы (state)

  • online В сети
  • away Отошёл
  • idle Неактивен (давно не трогал клиент). Ставит сервер, не вы.
  • dnd Не беспокоить
  • occupied Занят
  • invisible Невидимый. Так вы видите себя сами, остальные видят `offline`.
  • offline Не в сети

X-статусы (mood)

Коды для presence/setStatus?mood=….

  • Шопинг
  • Ванна
  • Устал
  • Вечеринка
  • Пиво
  • Думаю
  • Ем
  • Телевизор
  • С друзьями
  • Кофе
  • Музыка
  • Дела
  • Кино
  • Весело
  • Телефон
  • PSP
  • Учусь
  • Болею
  • Засыпаю
  • Сёрфинг
  • Интернет
  • Работаю
  • Печатаю
  • Злой
  • Любовь
  • Выходные
  • WC
  • Сплю
  • С телефона
  • Влюблён
  • Не понял
  • Играю
  • В пути
  • Дневник
  • Ищу

OpenAPI-спецификация

Весь API одним файлом: импортируйте в Postman или Insomnia, откройте в Swagger Editor или сгенерируйте SDK для своего языка.

Сервер — open-oscar-server от mk6i, открытый проект под MIT. API совместим с Web AIM API, так что старая документация AOL тоже местами пригодится.

Нашли неточность или не хватает метода? Пишите в Telegram-сообщество. А если сделали свой клиент — покажите, расскажем о нём в блоге.