Acelate

Ссылки beam://

Весь профиль в одной ссылке.

По ссылке BEAM покажет «Добавить профиль?» и после подтверждения добавит профиль.

beam://import/<payload>
payload = base64url( gzip( JSON профиля ) )
СсылкаЧто делает
beam://import/<payload>профиль из ссылки
beam://import?data=<payload>то же самое
beam://import?url=https://...добавить подписку по адресу
  • JSON — UTF-8 без пробелов, так ссылка короче.
  • base64url (- и _), паддинг = можно не ставить. Обычный base64 в ссылках ломается.
  • Обрезанная ссылка даст ошибку, а не битый профиль.

Закодировать

Node.js / TypeScript

import { gzipSync } from "node:zlib"

export function beamLink(profile: object): string {
  return "beam://import/" + gzipSync(JSON.stringify(profile), { level: 9 }).toString("base64url")
}

Python

import base64, gzip, json

def beam_link(profile: dict) -> str:
    raw = json.dumps(profile, ensure_ascii=False, separators=(",", ":")).encode()
    return "beam://import/" + base64.urlsafe_b64encode(gzip.compress(raw, 9)).decode().rstrip("=")

Go

func BeamLink(profile any) (string, error) {
	raw, err := json.Marshal(profile)
	if err != nil {
		return "", err
	}
	var buf bytes.Buffer
	w, _ := gzip.NewWriterLevel(&buf, gzip.BestCompression)
	w.Write(raw)
	w.Close()
	return "beam://import/" + base64.RawURLEncoding.EncodeToString(buf.Bytes()), nil
}

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

Длина

КаналСколько влезает
QR-код~2 КБ, уверенно читается до ~1,5 КБ
Сообщение Telegram4096 символов
Запуск из браузера~32 000 символов
BEAM256 КБ payload

Профиль из трёх серверов с брендингом — около 600 символов, каждый следующий сервер +100–150. Не влезает — отдавайте beam://import?url=....

Ссылка не шифруется: у кого ссылка — у того серверы, как с vless://. Без подтверждения пользователя BEAM ничего не импортирует.

На этой странице