Быстрый старт
Три запроса до первого сообщения
Вся работа с API — это вход, выход в онлайн и бесконечный цикл получения событий.
1
Войдите
Отправьте UIN и пароль формой на /auth/clientLogin. В ответ придёт токен token.a.
2
Выйдите в онлайн
Вызовите /aim/startSession с этим токеном. Получите aimsid — ключ ко всем остальным методам — и сразу контакт-лист.
3
Слушайте события
Опрашивайте /aim/fetchEvents по кругу. Запрос ждёт до минуты и возвращается, как только что-то произошло: сообщение, статус, «печатает…».
Нет UIN? Зарегистрируйтесь на Jimm.online за минуту. Для бота заведите отдельный аккаунт.
🤖 Эхо-бот на 20 строк
Рабочий пример: бот выходит в онлайн и отвечает на каждое сообщение его же текстом. Подставьте свой UIN и пароль и запускайте.
Python
Node.js
Копировать
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)
Копировать
// Node.js 18+ (fetch is built in). Run as an .mjs file.
const API = 'https://jimm.online/webapi';
const UIN = '123456789', PASSWORD = 'secret';
async function call(path, params) {
const res = await fetch(`${API}${path}?${new URLSearchParams({ f: 'json', ...params })}`);
const { response } = await res.json();
if (response.statusCode !== 200) throw new Error(`${response.statusCode} ${response.statusText}`);
return response.data;
}
const login = await fetch(`${API}/auth/clientLogin`, {
method: 'POST',
body: new URLSearchParams({ s: UIN, pwd: PASSWORD, devId: 'echo-bot', f: 'json' }),
}).then((r) => r.json());
const token = login.response.data.token.a;
const { aimsid } = await call('/aim/startSession', { a: token, events: 'im', clientName: 'EchoBot' });
let seqNum = 0;
for (;;) {
const { events, lastSeqNum, timeToNextFetch } = await call('/aim/fetchEvents', { aimsid, seqNum, timeout: 60000 });
for (const { type, eventData } of events) {
if (type !== 'im') continue;
const text = eventData.message.replace(/<[^>]+>/g, '');
await call('/im/sendIM', { aimsid, t: eventData.source.aimId, message: `Эхо: ${text}`, offlineIM: 'true' });
}
seqNum = lastSeqNum;
await new Promise((resolve) => setTimeout(resolve, timeToNextFetch));
}
Как это устроено
Что нужно знать до первой строчки кода
clientLogin
token
startSession
aimsid
fetchEvents ⟳
endSession
Конверт ответа
Каждый ответ завёрнут в {"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, как у любого клиента. Сайт пароль не видит и не сохраняет.
В сети как
Выйти
Лента событий
0
Пауза
Очистить
Пока тихо. Напишите себе с другого клиента, и событие появится здесь.
Консоль работает от вашего имени: отправленные сообщения и изменения контакт-листа настоящие.
Справочник · 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
JavaScript
Python
Копировать
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"
Копировать
const res = await fetch('https://jimm.online/webapi/auth/clientLogin', {
method: 'POST',
body: new URLSearchParams({ s: "123456789", pwd: password, devId: "my-client", f: "json" }),
});
const { response } = await res.json();
if (response.statusCode !== 200) throw new Error(response.statusText);
Копировать
import requests
r = requests.post("https://jimm.online/webapi/auth/clientLogin", data={"s": "123456789", "pwd": password, "devId": "my-client", "f": "json"})
resp = r.json()["response"]
assert resp["statusCode"] == 200, resp["statusText"]
print(resp["data"])
Ответ Содержимое 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
JavaScript
Python
Копировать
curl -G "https://jimm.online/webapi/auth/getInfo" \
--data-urlencode "a=$TOKEN" \
--data-urlencode "f=json"
Копировать
const params = new URLSearchParams({ a: token, f: "json" });
const res = await fetch(`https://jimm.online/webapi/auth/getInfo?${params}`);
const { response } = await res.json();
if (response.statusCode !== 200) throw new Error(response.statusText);
Копировать
import requests
r = requests.get("https://jimm.online/webapi/auth/getInfo", params={"a": token, "f": "json"})
resp = r.json()["response"]
assert resp["statusCode"] == 200, resp["statusText"]
print(resp["data"])
Ответ Содержимое 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
JavaScript
Python
Копировать
curl -G "https://jimm.online/webapi/aim/startSession" \
--data-urlencode "a=$TOKEN" \
--data-urlencode "f=json"
Копировать
const params = new URLSearchParams({ a: token, f: "json" });
const res = await fetch(`https://jimm.online/webapi/aim/startSession?${params}`);
const { response } = await res.json();
if (response.statusCode !== 200) throw new Error(response.statusText);
Копировать
import requests
r = requests.get("https://jimm.online/webapi/aim/startSession", params={"a": token, "f": "json"})
resp = r.json()["response"]
assert resp["statusCode"] == 200, resp["statusText"]
print(resp["data"])
Ответ Содержимое 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
JavaScript
Python
Копировать
curl -G "https://jimm.online/webapi/aim/fetchEvents" \
--data-urlencode "aimsid=$AIMSID" \
--data-urlencode "f=json"
Копировать
const params = new URLSearchParams({ aimsid, f: "json" });
const res = await fetch(`https://jimm.online/webapi/aim/fetchEvents?${params}`);
const { response } = await res.json();
if (response.statusCode !== 200) throw new Error(response.statusText);
Копировать
import requests
r = requests.get("https://jimm.online/webapi/aim/fetchEvents", params={"aimsid": aimsid, "f": "json"})
resp = r.json()["response"]
assert resp["statusCode"] == 200, resp["statusText"]
print(resp["data"])
Ответ Содержимое 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
JavaScript
Python
Копировать
curl -G "https://jimm.online/webapi/aim/endSession" \
--data-urlencode "aimsid=$AIMSID" \
--data-urlencode "f=json"
Копировать
const params = new URLSearchParams({ aimsid, f: "json" });
const res = await fetch(`https://jimm.online/webapi/aim/endSession?${params}`);
const { response } = await res.json();
if (response.statusCode !== 200) throw new Error(response.statusText);
Копировать
import requests
r = requests.get("https://jimm.online/webapi/aim/endSession", params={"aimsid": aimsid, "f": "json"})
resp = r.json()["response"]
assert resp["statusCode"] == 200, resp["statusText"]
print(resp["data"])
Ответ Содержимое 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
JavaScript
Python
Копировать
curl -G "https://jimm.online/webapi/aim/startOSCARSession" \
--data-urlencode "a=$TOKEN" \
--data-urlencode "f=json"
Копировать
const params = new URLSearchParams({ a: token, f: "json" });
const res = await fetch(`https://jimm.online/webapi/aim/startOSCARSession?${params}`);
const { response } = await res.json();
if (response.statusCode !== 200) throw new Error(response.statusText);
Копировать
import requests
r = requests.get("https://jimm.online/webapi/aim/startOSCARSession", params={"a": token, "f": "json"})
resp = r.json()["response"]
assert resp["statusCode"] == 200, resp["statusText"]
print(resp["data"])
Ответ Содержимое 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
JavaScript
Python
Копировать
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"
Копировать
const params = new URLSearchParams({ aimsid, t: "987654321", message: "Привет! 👋", offlineIM: "true", f: "json" });
const res = await fetch(`https://jimm.online/webapi/im/sendIM?${params}`);
const { response } = await res.json();
if (response.statusCode !== 200) throw new Error(response.statusText);
Копировать
import requests
r = requests.get("https://jimm.online/webapi/im/sendIM", params={"aimsid": aimsid, "t": "987654321", "message": "Привет! 👋", "offlineIM": "true", "f": "json"})
resp = r.json()["response"]
assert resp["statusCode"] == 200, resp["statusText"]
print(resp["data"])
Ответ Содержимое 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
JavaScript
Python
Копировать
curl -G "https://jimm.online/webapi/im/setTyping" \
--data-urlencode "aimsid=$AIMSID" \
--data-urlencode "t=987654321" \
--data-urlencode "f=json"
Копировать
const params = new URLSearchParams({ aimsid, t: "987654321", f: "json" });
const res = await fetch(`https://jimm.online/webapi/im/setTyping?${params}`);
const { response } = await res.json();
if (response.statusCode !== 200) throw new Error(response.statusText);
Копировать
import requests
r = requests.get("https://jimm.online/webapi/im/setTyping", params={"aimsid": aimsid, "t": "987654321", "f": "json"})
resp = r.json()["response"]
assert resp["statusCode"] == 200, resp["statusText"]
print(resp["data"])
Ответ Содержимое 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
Ошибки
Пример запроса
cURL
JavaScript
Python
Копировать
curl -G "https://jimm.online/webapi/imlog/fetchStoredIMs" \
--data-urlencode "aimsid=$AIMSID" \
--data-urlencode "to=987654321" \
--data-urlencode "f=json"
Копировать
const params = new URLSearchParams({ aimsid, to: "987654321", f: "json" });
const res = await fetch(`https://jimm.online/webapi/imlog/fetchStoredIMs?${params}`);
const { response } = await res.json();
if (response.statusCode !== 200) throw new Error(response.statusText);
Копировать
import requests
r = requests.get("https://jimm.online/webapi/imlog/fetchStoredIMs", params={"aimsid": aimsid, "to": "987654321", "f": "json"})
resp = r.json()["response"]
assert resp["statusCode"] == 200, resp["statusText"]
print(resp["data"])
Ответ Содержимое 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
JavaScript
Python
Копировать
curl -G "https://jimm.online/webapi/presence/get" \
--data-urlencode "aimsid=$AIMSID" \
--data-urlencode "f=json"
Копировать
const params = new URLSearchParams({ aimsid, f: "json" });
const res = await fetch(`https://jimm.online/webapi/presence/get?${params}`);
const { response } = await res.json();
if (response.statusCode !== 200) throw new Error(response.statusText);
Копировать
import requests
r = requests.get("https://jimm.online/webapi/presence/get", params={"aimsid": aimsid, "f": "json"})
resp = r.json()["response"]
assert resp["statusCode"] == 200, resp["statusText"]
print(resp["data"])
Ответ Содержимое 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
Ошибки
Пример запроса
cURL
JavaScript
Python
Копировать
curl -G "https://jimm.online/webapi/presence/setState" \
--data-urlencode "aimsid=$AIMSID" \
--data-urlencode "view=away" \
--data-urlencode "f=json"
Копировать
const params = new URLSearchParams({ aimsid, view: "away", f: "json" });
const res = await fetch(`https://jimm.online/webapi/presence/setState?${params}`);
const { response } = await res.json();
if (response.statusCode !== 200) throw new Error(response.statusText);
Копировать
import requests
r = requests.get("https://jimm.online/webapi/presence/setState", params={"aimsid": aimsid, "view": "away", "f": "json"})
resp = r.json()["response"]
assert resp["statusCode"] == 200, resp["statusText"]
print(resp["data"])
Ответ Содержимое 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
JavaScript
Python
Копировать
curl -G "https://jimm.online/webapi/presence/setStatus" \
--data-urlencode "aimsid=$AIMSID" \
--data-urlencode "f=json"
Копировать
const params = new URLSearchParams({ aimsid, f: "json" });
const res = await fetch(`https://jimm.online/webapi/presence/setStatus?${params}`);
const { response } = await res.json();
if (response.statusCode !== 200) throw new Error(response.statusText);
Копировать
import requests
r = requests.get("https://jimm.online/webapi/presence/setStatus", params={"aimsid": aimsid, "f": "json"})
resp = r.json()["response"]
assert resp["statusCode"] == 200, resp["statusText"]
print(resp["data"])
Ответ Содержимое response.data
#setStatus · Ссылка на метод
GET
/presence/getProfile
Профиль пользователя
aimsid
Текст профиля («о себе»). Без sn — ваш собственный.
Параметры
Имя Описание
aimsid
string
обязательный
Идентификатор сессии из startSession.
sn
string
Чей профиль.
f
string
Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP.
jsonxmlamf3
Пример запроса
cURL
JavaScript
Python
Копировать
curl -G "https://jimm.online/webapi/presence/getProfile" \
--data-urlencode "aimsid=$AIMSID" \
--data-urlencode "f=json"
Копировать
const params = new URLSearchParams({ aimsid, f: "json" });
const res = await fetch(`https://jimm.online/webapi/presence/getProfile?${params}`);
const { response } = await res.json();
if (response.statusCode !== 200) throw new Error(response.statusText);
Копировать
import requests
r = requests.get("https://jimm.online/webapi/presence/getProfile", params={"aimsid": aimsid, "f": "json"})
resp = r.json()["response"]
assert resp["statusCode"] == 200, resp["statusText"]
print(resp["data"])
Ответ Содержимое 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
Ошибки
Пример запроса
cURL
JavaScript
Python
Копировать
curl -G "https://jimm.online/webapi/presence/setProfile" \
--data-urlencode "aimsid=$AIMSID" \
--data-urlencode "profile=Сижу в аське с 2003 года" \
--data-urlencode "f=json"
Копировать
const params = new URLSearchParams({ aimsid, profile: "Сижу в аське с 2003 года", f: "json" });
const res = await fetch(`https://jimm.online/webapi/presence/setProfile?${params}`);
const { response } = await res.json();
if (response.statusCode !== 200) throw new Error(response.statusText);
Копировать
import requests
r = requests.get("https://jimm.online/webapi/presence/setProfile", params={"aimsid": aimsid, "profile": "Сижу в аське с 2003 года", "f": "json"})
resp = r.json()["response"]
assert resp["statusCode"] == 200, resp["statusText"]
print(resp["data"])
Ответ Содержимое 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
Ошибки
Пример запроса
cURL
JavaScript
Python
Копировать
curl -G "https://jimm.online/webapi/buddylist/addBuddy" \
--data-urlencode "aimsid=$AIMSID" \
--data-urlencode "buddy=987654321" \
--data-urlencode "f=json"
Копировать
const params = new URLSearchParams({ aimsid, buddy: "987654321", f: "json" });
const res = await fetch(`https://jimm.online/webapi/buddylist/addBuddy?${params}`);
const { response } = await res.json();
if (response.statusCode !== 200) throw new Error(response.statusText);
Копировать
import requests
r = requests.get("https://jimm.online/webapi/buddylist/addBuddy", params={"aimsid": aimsid, "buddy": "987654321", "f": "json"})
resp = r.json()["response"]
assert resp["statusCode"] == 200, resp["statusText"]
print(resp["data"])
Ответ Содержимое 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
JavaScript
Python
Копировать
curl -G "https://jimm.online/webapi/buddylist/removeBuddy" \
--data-urlencode "aimsid=$AIMSID" \
--data-urlencode "buddy=987654321" \
--data-urlencode "f=json"
Копировать
const params = new URLSearchParams({ aimsid, buddy: "987654321", f: "json" });
const res = await fetch(`https://jimm.online/webapi/buddylist/removeBuddy?${params}`);
const { response } = await res.json();
if (response.statusCode !== 200) throw new Error(response.statusText);
Копировать
import requests
r = requests.get("https://jimm.online/webapi/buddylist/removeBuddy", params={"aimsid": aimsid, "buddy": "987654321", "f": "json"})
resp = r.json()["response"]
assert resp["statusCode"] == 200, resp["statusText"]
print(resp["data"])
Ответ Содержимое 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
JavaScript
Python
Копировать
curl -G "https://jimm.online/webapi/buddylist/moveBuddy" \
--data-urlencode "aimsid=$AIMSID" \
--data-urlencode "buddy=987654321" \
--data-urlencode "group=Друзья" \
--data-urlencode "f=json"
Копировать
const params = new URLSearchParams({ aimsid, buddy: "987654321", group: "Друзья", f: "json" });
const res = await fetch(`https://jimm.online/webapi/buddylist/moveBuddy?${params}`);
const { response } = await res.json();
if (response.statusCode !== 200) throw new Error(response.statusText);
Копировать
import requests
r = requests.get("https://jimm.online/webapi/buddylist/moveBuddy", params={"aimsid": aimsid, "buddy": "987654321", "group": "Друзья", "f": "json"})
resp = r.json()["response"]
assert resp["statusCode"] == 200, resp["statusText"]
print(resp["data"])
Ответ Содержимое 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
JavaScript
Python
Копировать
curl -G "https://jimm.online/webapi/buddylist/setBuddyAttribute" \
--data-urlencode "aimsid=$AIMSID" \
--data-urlencode "t=987654321" \
--data-urlencode "f=json"
Копировать
const params = new URLSearchParams({ aimsid, t: "987654321", f: "json" });
const res = await fetch(`https://jimm.online/webapi/buddylist/setBuddyAttribute?${params}`);
const { response } = await res.json();
if (response.statusCode !== 200) throw new Error(response.statusText);
Копировать
import requests
r = requests.get("https://jimm.online/webapi/buddylist/setBuddyAttribute", params={"aimsid": aimsid, "t": "987654321", "f": "json"})
resp = r.json()["response"]
assert resp["statusCode"] == 200, resp["statusText"]
print(resp["data"])
Ответ Содержимое response.data
#setBuddyAttribute · Ссылка на метод
GET
/buddylist/addGroup
Создать группу
aimsid
Создаёт группу. Повторный вызов ничего не ломает.
Параметры
Имя Описание
aimsid
string
обязательный
Идентификатор сессии из startSession.
group
string
обязательный
Название.
f
string
Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP.
jsonxmlamf3
Пример запроса
cURL
JavaScript
Python
Копировать
curl -G "https://jimm.online/webapi/buddylist/addGroup" \
--data-urlencode "aimsid=$AIMSID" \
--data-urlencode "group=Работа" \
--data-urlencode "f=json"
Копировать
const params = new URLSearchParams({ aimsid, group: "Работа", f: "json" });
const res = await fetch(`https://jimm.online/webapi/buddylist/addGroup?${params}`);
const { response } = await res.json();
if (response.statusCode !== 200) throw new Error(response.statusText);
Копировать
import requests
r = requests.get("https://jimm.online/webapi/buddylist/addGroup", params={"aimsid": aimsid, "group": "Работа", "f": "json"})
resp = r.json()["response"]
assert resp["statusCode"] == 200, resp["statusText"]
print(resp["data"])
Ответ Содержимое response.data
#addGroup · Ссылка на метод
GET
/buddylist/renameGroup
Переименовать группу
aimsid
Меняет название группы.
Параметры
Имя Описание
aimsid
string
обязательный
Идентификатор сессии из startSession.
oldGroup
string
обязательный
Текущее название.
newGroup
string
обязательный
Новое название.
f
string
Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP.
jsonxmlamf3
Пример запроса
cURL
JavaScript
Python
Копировать
curl -G "https://jimm.online/webapi/buddylist/renameGroup" \
--data-urlencode "aimsid=$AIMSID" \
--data-urlencode "oldGroup=Работа" \
--data-urlencode "newGroup=Коллеги" \
--data-urlencode "f=json"
Копировать
const params = new URLSearchParams({ aimsid, oldGroup: "Работа", newGroup: "Коллеги", f: "json" });
const res = await fetch(`https://jimm.online/webapi/buddylist/renameGroup?${params}`);
const { response } = await res.json();
if (response.statusCode !== 200) throw new Error(response.statusText);
Копировать
import requests
r = requests.get("https://jimm.online/webapi/buddylist/renameGroup", params={"aimsid": aimsid, "oldGroup": "Работа", "newGroup": "Коллеги", "f": "json"})
resp = r.json()["response"]
assert resp["statusCode"] == 200, resp["statusText"]
print(resp["data"])
Ответ Содержимое response.data
#renameGroup · Ссылка на метод
GET
/buddylist/removeGroup
Удалить группу
aimsid
Удаляет группу.
Параметры
Имя Описание
aimsid
string
обязательный
Идентификатор сессии из startSession.
group
string
обязательный
Название.
f
string
Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP.
jsonxmlamf3
Пример запроса
cURL
JavaScript
Python
Копировать
curl -G "https://jimm.online/webapi/buddylist/removeGroup" \
--data-urlencode "aimsid=$AIMSID" \
--data-urlencode "group=Коллеги" \
--data-urlencode "f=json"
Копировать
const params = new URLSearchParams({ aimsid, group: "Коллеги", f: "json" });
const res = await fetch(`https://jimm.online/webapi/buddylist/removeGroup?${params}`);
const { response } = await res.json();
if (response.statusCode !== 200) throw new Error(response.statusText);
Копировать
import requests
r = requests.get("https://jimm.online/webapi/buddylist/removeGroup", params={"aimsid": aimsid, "group": "Коллеги", "f": "json"})
resp = r.json()["response"]
assert resp["statusCode"] == 200, resp["statusText"]
print(resp["data"])
Ответ Содержимое response.data
#removeGroup · Ссылка на метод
GET
/buddylist/setGroupAttribute
Свернуть или развернуть группу
aimsid
Запоминает на сервере, свёрнута ли группа, чтобы все ваши клиенты показывали её одинаково.
Параметры
Имя Описание
aimsid
string
обязательный
Идентификатор сессии из startSession.
group
string
обязательный
Название.
collapsed
boolean
обязательный
Свёрнута ли.
f
string
Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP.
jsonxmlamf3
Пример запроса
cURL
JavaScript
Python
Копировать
curl -G "https://jimm.online/webapi/buddylist/setGroupAttribute" \
--data-urlencode "aimsid=$AIMSID" \
--data-urlencode "group=Друзья" \
--data-urlencode "collapsed=true" \
--data-urlencode "f=json"
Копировать
const params = new URLSearchParams({ aimsid, group: "Друзья", collapsed: "true", f: "json" });
const res = await fetch(`https://jimm.online/webapi/buddylist/setGroupAttribute?${params}`);
const { response } = await res.json();
if (response.statusCode !== 200) throw new Error(response.statusText);
Копировать
import requests
r = requests.get("https://jimm.online/webapi/buddylist/setGroupAttribute", params={"aimsid": aimsid, "group": "Друзья", "collapsed": "true", "f": "json"})
resp = r.json()["response"]
assert resp["statusCode"] == 200, resp["statusText"]
print(resp["data"])
Ответ Содержимое 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
JavaScript
Python
Копировать
curl -G "https://jimm.online/webapi/aim/addTempBuddy" \
--data-urlencode "aimsid=$AIMSID" \
--data-urlencode "t=987654321" \
--data-urlencode "f=json"
Копировать
const params = new URLSearchParams({ aimsid, t: "987654321", f: "json" });
const res = await fetch(`https://jimm.online/webapi/aim/addTempBuddy?${params}`);
const { response } = await res.json();
if (response.statusCode !== 200) throw new Error(response.statusText);
Копировать
import requests
r = requests.get("https://jimm.online/webapi/aim/addTempBuddy", params={"aimsid": aimsid, "t": "987654321", "f": "json"})
resp = r.json()["response"]
assert resp["statusCode"] == 200, resp["statusText"]
print(resp["data"])
Ответ Содержимое response.data
#addTempBuddy · Ссылка на метод
GET
/aim/removeTempBuddy
Перестать следить
aimsid
Отменяет addTempBuddy.
Параметры
Имя Описание
aimsid
string
обязательный
Идентификатор сессии из startSession.
t
string
обязательный
UIN через запятую.
f
string
Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP.
jsonxmlamf3
Пример запроса
cURL
JavaScript
Python
Копировать
curl -G "https://jimm.online/webapi/aim/removeTempBuddy" \
--data-urlencode "aimsid=$AIMSID" \
--data-urlencode "t=987654321" \
--data-urlencode "f=json"
Копировать
const params = new URLSearchParams({ aimsid, t: "987654321", f: "json" });
const res = await fetch(`https://jimm.online/webapi/aim/removeTempBuddy?${params}`);
const { response } = await res.json();
if (response.statusCode !== 200) throw new Error(response.statusText);
Копировать
import requests
r = requests.get("https://jimm.online/webapi/aim/removeTempBuddy", params={"aimsid": aimsid, "t": "987654321", "f": "json"})
resp = r.json()["response"]
assert resp["statusCode"] == 200, resp["statusText"]
print(resp["data"])
Ответ Содержимое response.data
#removeTempBuddy · Ссылка на метод
Настройки и приватность
Серверные настройки аккаунта и списки видимости и игнора.
GET
/preference/get
Настройки аккаунта
aimsid
Серверные настройки: 1 — включено, 0 — выключено. Те же значения приходят событием preference.
Параметры
Имя Описание
aimsid
string
обязательный
Идентификатор сессии из startSession.
f
string
Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP.
jsonxmlamf3
Пример запроса
cURL
JavaScript
Python
Копировать
curl -G "https://jimm.online/webapi/preference/get" \
--data-urlencode "aimsid=$AIMSID" \
--data-urlencode "f=json"
Копировать
const params = new URLSearchParams({ aimsid, f: "json" });
const res = await fetch(`https://jimm.online/webapi/preference/get?${params}`);
const { response } = await res.json();
if (response.statusCode !== 200) throw new Error(response.statusText);
Копировать
import requests
r = requests.get("https://jimm.online/webapi/preference/get", params={"aimsid": aimsid, "f": "json"})
resp = r.json()["response"]
assert resp["statusCode"] == 200, resp["statusText"]
print(resp["data"])
Ответ Содержимое 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
JavaScript
Python
Копировать
curl -G "https://jimm.online/webapi/preference/set" \
--data-urlencode "aimsid=$AIMSID" \
--data-urlencode "f=json"
Копировать
const params = new URLSearchParams({ aimsid, f: "json" });
const res = await fetch(`https://jimm.online/webapi/preference/set?${params}`);
const { response } = await res.json();
if (response.statusCode !== 200) throw new Error(response.statusText);
Копировать
import requests
r = requests.get("https://jimm.online/webapi/preference/set", params={"aimsid": aimsid, "f": "json"})
resp = r.json()["response"]
assert resp["statusCode"] == 200, resp["statusText"]
print(resp["data"])
Ответ Содержимое response.data
#setPreferences · Ссылка на метод
GET
/preference/getPermitDeny
Кто может вам писать
aimsid
Режим приватности и списки «разрешённые» и «заблокированные».
Параметры
Имя Описание
aimsid
string
обязательный
Идентификатор сессии из startSession.
f
string
Формат ответа: json (по умолчанию), xml или amf3. С c=имя ответ придёт как JSONP.
jsonxmlamf3
Пример запроса
cURL
JavaScript
Python
Копировать
curl -G "https://jimm.online/webapi/preference/getPermitDeny" \
--data-urlencode "aimsid=$AIMSID" \
--data-urlencode "f=json"
Копировать
const params = new URLSearchParams({ aimsid, f: "json" });
const res = await fetch(`https://jimm.online/webapi/preference/getPermitDeny?${params}`);
const { response } = await res.json();
if (response.statusCode !== 200) throw new Error(response.statusText);
Копировать
import requests
r = requests.get("https://jimm.online/webapi/preference/getPermitDeny", params={"aimsid": aimsid, "f": "json"})
resp = r.json()["response"]
assert resp["statusCode"] == 200, resp["statusText"]
print(resp["data"])
Ответ Содержимое 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
Ошибки
Пример запроса
cURL
JavaScript
Python
Копировать
curl -G "https://jimm.online/webapi/preference/setPermitDeny" \
--data-urlencode "aimsid=$AIMSID" \
--data-urlencode "f=json"
Копировать
const params = new URLSearchParams({ aimsid, f: "json" });
const res = await fetch(`https://jimm.online/webapi/preference/setPermitDeny?${params}`);
const { response } = await res.json();
if (response.statusCode !== 200) throw new Error(response.statusText);
Копировать
import requests
r = requests.get("https://jimm.online/webapi/preference/setPermitDeny", params={"aimsid": aimsid, "f": "json"})
resp = r.json()["response"]
assert resp["statusCode"] == 200, resp["statusText"]
print(resp["data"])
Ответ Содержимое 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
JavaScript
Python
Копировать
curl -G "https://jimm.online/webapi/memberDir/search" \
--data-urlencode "aimsid=$AIMSID" \
--data-urlencode "match=keyword=987654321" \
--data-urlencode "f=json"
Копировать
const params = new URLSearchParams({ aimsid, match: "keyword=987654321", f: "json" });
const res = await fetch(`https://jimm.online/webapi/memberDir/search?${params}`);
const { response } = await res.json();
if (response.statusCode !== 200) throw new Error(response.statusText);
Копировать
import requests
r = requests.get("https://jimm.online/webapi/memberDir/search", params={"aimsid": aimsid, "match": "keyword=987654321", "f": "json"})
resp = r.json()["response"]
assert resp["statusCode"] == 200, resp["statusText"]
print(resp["data"])
Ответ Содержимое 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
JavaScript
Python
Копировать
curl -G "https://jimm.online/webapi/memberDir/get" \
--data-urlencode "aimsid=$AIMSID" \
--data-urlencode "f=json"
Копировать
const params = new URLSearchParams({ aimsid, f: "json" });
const res = await fetch(`https://jimm.online/webapi/memberDir/get?${params}`);
const { response } = await res.json();
if (response.statusCode !== 200) throw new Error(response.statusText);
Копировать
import requests
r = requests.get("https://jimm.online/webapi/memberDir/get", params={"aimsid": aimsid, "f": "json"})
resp = r.json()["response"]
assert resp["statusCode"] == 200, resp["statusText"]
print(resp["data"])
Ответ Содержимое 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
JavaScript
Python
Копировать
curl -G "https://jimm.online/webapi/memberDir/update" \
--data-urlencode "aimsid=$AIMSID" \
--data-urlencode "set=firstName=Иван" \
--data-urlencode "f=json"
Копировать
const params = new URLSearchParams({ aimsid, set: "firstName=Иван", f: "json" });
const res = await fetch(`https://jimm.online/webapi/memberDir/update?${params}`);
const { response } = await res.json();
if (response.statusCode !== 200) throw new Error(response.statusText);
Копировать
import requests
r = requests.get("https://jimm.online/webapi/memberDir/update", params={"aimsid": aimsid, "set": "firstName=Иван", "f": "json"})
resp = r.json()["response"]
assert resp["statusCode"] == 200, resp["statusText"]
print(resp["data"])
Ответ Содержимое 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
Ошибки
Пример запроса
cURL
JavaScript
Python
Копировать
curl -G "https://jimm.online/webapi/expressions/get" \
--data-urlencode "t=987654321" \
--data-urlencode "f=json"
Копировать
const params = new URLSearchParams({ t: "987654321", f: "json" });
const res = await fetch(`https://jimm.online/webapi/expressions/get?${params}`);
const { response } = await res.json();
if (response.statusCode !== 200) throw new Error(response.statusText);
Копировать
import requests
r = requests.get("https://jimm.online/webapi/expressions/get", params={"t": "987654321", "f": "json"})
resp = r.json()["response"]
assert resp["statusCode"] == 200, resp["statusText"]
print(resp["data"])
Ответ Содержимое 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
JavaScript
Python
Копировать
curl -X POST "https://jimm.online/webapi/expressions/upload?aimsid=$AIMSID&type=buddyIcon&f=json" \
-H "Content-Type: image/png" \
--data-binary @avatar.png
Копировать
const params = new URLSearchParams({ aimsid, type: "buddyIcon", f: "json" });
const res = await fetch(`https://jimm.online/webapi/expressions/upload?${params}`, {
method: 'POST',
body: file, // a File or Blob, up to 64 KB
});
const { response } = await res.json();
Копировать
import requests
with open("avatar.png", "rb") as f:
r = requests.post("https://jimm.online/webapi/expressions/upload", params={"aimsid": aimsid, "type": "buddyIcon", "f": "json"}, data=f.read())
print(r.json()["response"])
Ответ Содержимое 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=….
0icqmood0
Шопинг
0icqmood1
Ванна
0icqmood2
Устал
0icqmood3
Вечеринка
0icqmood4
Пиво
0icqmood5
Думаю
0icqmood6
Ем
0icqmood7
Телевизор
0icqmood8
С друзьями
0icqmood9
Кофе
0icqmood10
Музыка
0icqmood11
Дела
0icqmood12
Кино
0icqmood13
Весело
0icqmood14
Телефон
0icqmood15
PSP
0icqmood16
Учусь
0icqmood17
Болею
0icqmood18
Засыпаю
0icqmood19
Сёрфинг
0icqmood20
Интернет
0icqmood21
Работаю
0icqmood22
Печатаю
0icqmood23
Злой
0icqmood61
Любовь
0icqmood66
Выходные
0icqmood68
WC
0icqmood70
Сплю
0icqmood71
С телефона
0icqmood76
Влюблён
0icqmood77
Не понял
0icqmood81
Играю
0icqmood83
В пути
0icqmood84
Дневник
0icqmood85
Ищу
OpenAPI-спецификация
Весь API одним файлом: импортируйте в Postman или Insomnia, откройте в Swagger Editor или сгенерируйте SDK для своего языка.
Сервер — open-oscar-server от mk6i, открытый проект под MIT. API совместим с Web AIM API, так что старая документация AOL тоже местами пригодится.
Нашли неточность или не хватает метода? Пишите в Telegram-сообщество . А если сделали свой клиент — покажите, расскажем о нём в блоге.