> ## Documentation Index
> Fetch the complete documentation index at: https://docs.lazyapp.in/llms.txt
> Use this file to discover all available pages before exploring further.

# Capabilities

> Ask what a number supports instead of assuming.

Meta does not open every WhatsApp feature to every account. Calling, block lists and India payments are granted per business, sometimes per number, and sometimes only in certain countries.

So LazyApp does not let you hard-code that knowledge. Ask:

```bash theme={null}
curl https://lazyapp.in/v1/capabilities \
  -H "Authorization: Bearer $LAZYAPP_API_KEY"
```

```json theme={null}
{
  "data": [
    {
      "connection_uuid": "9f8b1c2d-4e5f-4a6b-8c7d-0e1f2a3b4c5d",
      "phone_number_id": "123456789012345",
      "display_phone_number": "+919812345670",
      "is_default": true,
      "quality_rating": "GREEN",
      "messaging_limit_tier": "TIER_1K",
      "capabilities": {
        "messages.text": true,
        "messages.template": true,
        "flows": true,
        "calling": false,
        "block_users": true,
        "groups": false,
        "messages.group": false,
        "commerce.catalog_sync": true
      }
    }
  ]
}
```

## Why a capability is false

Two different reasons, and the distinction matters:

* **Meta has not granted it to you.** Calling starts `false` for everyone. When Meta approves your account, LazyApp turns it on per connection — no deploy on your side, no code change. Your integration should start working the moment the flag flips.
* **Your number does not qualify yet.** `groups` and `messages.group` need an Official Business Account. [`POST /v1/groups/eligibility`](https://docs.lazyapp.in/guides/groups#before-you-start) checks Meta and flips both flags to match.
* **Switched off for one connection.** Block lists (`block_users`) and catalog sync default on; a connection can turn either off.

Either way the correct client behaviour is the same: read the flag, and degrade gracefully when it is `false`.

## Using it well

```js Node theme={null}
const { data } = await lazyapp('/v1/capabilities');
const number = data.find((c) => c.is_default);

if (number.capabilities.calling) {
  showCallButton();
}
```

> [!TIP]
>
> Cache the response for a few minutes rather than calling it per send. It changes rarely,
> but do not cache it for the life of your process — the point is that it can change
> without you deploying.

## Quality rating

`quality_rating` is Meta's own signal — `GREEN`, `YELLOW` or `RED` — reflecting how recipients are reacting to your messages. A number sliding to `RED` risks having its messaging limit cut, so it is worth alerting on. You also receive `phone_number.quality_changed` [webhooks](https://docs.lazyapp.in/webhooks/events.md).

## Messaging limit tier

`messaging_limit_tier` is Meta's send ceiling for that number (for example `TIER_1K`). It moves as quality and usage change. Pair it with `quality_rating` when you decide how aggressively to run broadcasts.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.