---
title: Login Finished
description: "Login 0x02, server → client."
---

`login` · `0x02` · **clientbound** (server → client)

Login success. Sent by the server once authentication (if any) is done and compression is set, carrying the player's UUID, username, and profile properties such as skin textures. The client must answer with `LoginAcknowledged`, which moves the connection into the configuration state.

Sent by the server, read by the client. Listen for it with `client.on("LoginFinished", (data) => …)` on the receiving side.

## Fields

| Field | Type | Notes |
|---|---|---|
| `gameProfile` | Struct | Shape: `{ uuid: string; username: string; properties?: Array<{ name: string; value: string; signature?: string \| null }>; }`. |
| `sessionId` | UUID |  |

## Send it

```ts
// Server side with autoInit: false, after receiving Hello.
await client.sendPacket("LoginFinished", {
  gameProfile: {
    uuid: packet.data.playerUUID,
    username: packet.data.username,
    properties: [], // skin/cape textures in online mode
  },
  sessionId: "00000000000000000000000000000000",
});
```

The client replies with `LoginAcknowledged` and both sides switch to `config`. With `autoInit: true` the server sends this for you. `properties` is the signed texture list from Mojang's session server; leave it empty in offline mode.

Field aliases listed under Notes are accepted as alternative keys when writing.

Source: [`src/Core/Versions/776/Packets/login/clientbound/LoginFinished.ts`](https://github.com/GDLev/mc-protocol/blob/master/src/Core/Versions/776/Packets/login/clientbound/LoginFinished.ts)
