These are promises to the people writing clients and bots. Not about values — about what you can lean on once your code is in production.
The TL-schema is complete, not excerpted: every constructor, every method, every type, each with its own page and with a machine-readable dump. If a method exists on the server, it is in the schema. There are no hidden methods only our own clients know about.
A layer number is a contract. Within a layer signatures do not change: if a constructor changes, it gets a new identifier and arrives in a new layer while the old one keeps working. The client declares its layer when it connects and gets answers in it.
One layer is live today — 223, the first public one. The next will appear in the layer log together with what changed; we do not remove old layers retroactively.
api_id and api_hash are issued automatically at
my.ansible.su — no application, no waiting,
no explaining what your client is for. A key belongs to an account, not to a
company.
The other side of that: a key can be blocked if it is used for spam or for
brute-force attempts. The block hits the api_id rather than your
users, and we will say what it was for.
Where there is a limit, the server returns FLOOD_WAIT_X with a
number of seconds rather than dropping the connection silently. Errors are codes
and text you can branch on, not human phrases that change between releases.
We have no availability guarantee (SLA) — the project is young, and promising four nines would be a lie. Group calls are not implemented: the methods are in the schema, the media side needs an SFU, and it is not ready. Some client builds are debug builds. The full list is on the technical work page.
We do not promise compatibility with other servers of the same protocol family and do not treat it as a goal: compatibility is there for client libraries, and the server side here is our own.