> ## Documentation Index
> Fetch the complete documentation index at: https://whatsapp-rust.jlucaso.com/llms.txt
> Use this file to discover all available pages before exploring further.

# June 4, 2026

> New Labels API, a generic send_app_state_action escape hatch for syncd actions, query_info now returns Arc<GroupInfo>, and a wire-shape fix for message edits.

## New features

**Chat labels API**
Manage WhatsApp chat labels (etiquetas) from Rust. `client.labels()` exposes `create_label`, `delete_label`, `add_chat_label`, and `remove_chat_label`, all synced across linked devices through the `regular` app state collection. Inbound label changes made on a linked device are delivered as the new `Event::LabelEditUpdate` and `Event::LabelAssociationUpdate` events, each carrying the underlying action and a `from_full_sync` flag. See [Labels](/api/labels) and the new event types in [Events](/concepts/events#labeleditupdate).

```rust theme={null}
client.labels().create_label("vip", "VIP", 3).await?;
client.labels().add_chat_label("vip", &chat_jid).await?;
```

**Generic `send_app_state_action` API**
Send any syncd action — including ones without a dedicated helper like `clear_chat`, `favorites`, or `quick_reply` — directly from a schema in the new `whatsapp_rust::schemas` registry. The schema picks the collection, action version, and index shape; you only fill in the typed `SyncActionValue` and the non-literal index args. The existing typed methods on `ChatActions` and `Labels` are now thin wrappers over this same call. See [`send_app_state_action`](/api/chat-actions#send_app_state_action).

```rust theme={null}
use whatsapp_rust::schemas;
use whatsapp_rust::waproto::whatsapp as wa;

let value = wa::SyncActionValue {
    clear_chat_action: Some(Default::default()),
    timestamp: Some(1_700_000_000_000),
    ..Default::default()
};
client
    .send_app_state_action(
        &schemas::CLEAR_CHAT,
        &["15551234567@s.whatsapp.net", "0", "0"],
        &value,
    )
    .await?;
```

## Updates

**`query_info` returns `Arc<GroupInfo>`**
`client.groups().query_info()` now returns `Result<Arc<GroupInfo>, anyhow::Error>` instead of `Result<GroupInfo, anyhow::Error>`. Repeated lookups for the same group share the same cached snapshot, so warm sends to groups no longer deep-clone the participants list or LID-to-phone map. This is a breaking change for direct callers — bind the result as `Arc<GroupInfo>` and reach through `info.participants` / `info.lid_to_pn_map()` as before. See [`query_info`](/api/groups#query_info) and the [Group management guide](/guides/group-management).

## Fixes

**Message edits now use WhatsApp Web's wire shape**
[`client.edit_message`](/api/send#edit_message) previously wrapped the new content in a nested `Message.edited_message` (`FutureProofMessage`) envelope — the history/storage form — which other clients did not always render. Edits are now sent as a top-level `protocolMessage` with `type = MESSAGE_EDIT`, matching WhatsApp Web, and use a fresh stanza ID so the server does not deduplicate the edit against the original message. The public signature is unchanged; rebuild against the latest release to pick up the fix. If you were hand-rolling the legacy envelope and passing it to `send_message`, switch to `client.edit_message` — see the [Sending messages guide](/guides/sending-messages#editing-messages).
