Отлично, я нашёл решение.
Пример пригласительной ссылки:
https://t.me/joinchat/some_chat. Для удобства TL-типы буду описывать как TL{TypeName}. "TypeName" взят из
данной схемы.
1. Сперва нужно послать messages.checkChatInvite с параметром hash равным последней части ссылки (some_chat в данном случае).
2. Приходит ответ с типом TLChatInvite. В нём будет первичная информация о группе: её вид (чат или канал?), кол-во участников и, возможно, они сами в виде вектора TLUser.
[Вот здесь я был в тупике]
3. Вызываем метод messages.importChatInvite с тем же параметром hash. В ответ приходит объект типа TLUpdates или TLUpdatesCombined. Оба будут содержать вектор чатов. Взять можно первый элемент вектора (проверив на пустоту, естественно). Собственно, это и есть результат: в объекте будет и ID, и прочее.
Зачем делать три шага вместо лишь последнего? Нужно тип чата определить для каста результата к корректному типу.
Признаться, разочарован, что так долго заняло времени на выяснение этой ерунды.
UPD: messages.importChatInvite добавит пользователя в группу при вызове. Ну ёлки-палки.