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

# product.availability_changed

> Disparado quando um produto é ativado ou desativado em uma ou mais lojas.

`product.availability_changed` é emitido quando a disponibilidade de um ou mais produtos muda — por exemplo, quando um restaurante marca um produto como esgotado ou o reativa. Controla se o produto aparece no menu e está disponível para compra.

Suporta múltiplos produtos em um único evento. Quando a mudança afeta várias lojas, o Fire emite um **único evento** com todas as lojas afetadas listadas em `targets`.

## Payload

```json theme={null}
{
  "event": {
    "id": "evt_mno345",
    "type": "product.availability_changed",
    "executionId": "exec_mno123",
    "createdAt": "2025-01-15T14:40:00.000Z",
    "timezone": "America/Sao_Paulo"
  },
  "data": {
    "account": "1",
    "country": "BR",
    "groupId": "a3f7c2d1-84be-4e10-9b3a-2c5d6e7f8091",
    "targets": [
      {
        "storeId": "b3d2a1f0-6e21-4c3a-9f5d-7a8b9c0d1e2f",
        "storeName": "Laboratorio Brasil",
        "vendorId": "100.6.1350",
        "timezone": "America/Sao_Paulo",
        "channels": [
          {
            "channelId": "d5f4c3b2-8043-4e5c-9b7f-9c0d1e2f3a4b",
            "channelReferenceName": "iFood"
          }
        ]
      },
      {
        "storeId": "c4e3b2a1-7f32-4d4b-8a6e-8b9c0d1e2f3a",
        "storeName": "Vila Olimpia",
        "vendorId": "100.6.1351",
        "timezone": "America/Sao_Paulo",
        "channels": [
          {
            "channelId": "d5f4c3b2-8043-4e5c-9b7f-9c0d1e2f3a4b",
            "channelReferenceName": "iFood"
          }
        ]
      }
    ],
    "products": [
      {
        "productId": "e925f6b0-15bf-dc39-2e3f-1a2b284310c6",
        "active": false
      },
      {
        "productId": "prod_size_small",
        "active": true
      }
    ]
  }
}
```

## Campos

### `data`

| Campo      | Tipo      | Descrição                                                                                     |
| ---------- | --------- | --------------------------------------------------------------------------------------------- |
| `account`  | string    | Identificador da conta — necessário para sistemas externos                                    |
| `country`  | string    | Código do país ISO 3166-1 alpha-2 (ex.: `EC`, `BR`, `CO`) — necessário para sistemas externos |
| `groupId`  | string    | UUID que correlaciona eventos do mesmo batch de publicação ou sincronização                   |
| `targets`  | object\[] | Lojas onde a mudança de disponibilidade deve ser aplicada                                     |
| `products` | object\[] | Produtos cuja disponibilidade mudou                                                           |

### `data.targets[n]`

Mesma estrutura que em [`product.updated`](/pt/webhook-reference/product-updated#datatargetsn), sem o campo `listName` em `channels[n]`.

| Campo       | Tipo      | Descrição                                                      |
| ----------- | --------- | -------------------------------------------------------------- |
| `storeId`   | string    | UUID interno da loja (PK `stores.id`) — não é o `store_number` |
| `storeName` | string    | Nome operacional da loja                                       |
| `vendorId`  | string    | Identificador da marca da loja                                 |
| `timezone`  | string    | Fuso horário IANA da loja (ex.: `America/Sao_Paulo`)           |
| `channels`  | object\[] | Canais de vendas onde a alteração deve ser aplicada            |

### `data.targets[n].channels[n]`

| Campo                  | Tipo   | Descrição                                                                                      |
| ---------------------- | ------ | ---------------------------------------------------------------------------------------------- |
| `channelId`            | string | UUID interno do canal de vendas (PK `channels.id`) — não é o `channel_id` externo do agregador |
| `channelReferenceName` | string | Nome legível do canal de vendas (ex.: `iFood`, `Rappi`)                                        |

### `data.products[n]`

| Campo       | Tipo    | Descrição                                  |
| ----------- | ------- | ------------------------------------------ |
| `productId` | string  | Identificador do produto (UUID)            |
| `active`    | boolean | `true` para ativar, `false` para desativar |

## Comportamento

Definir `active: false` oculta o produto do menu e o marca como indisponível para compra. Definir `active: true` o restaura.

Este evento não modifica nenhum outro dado do produto — nome, preço, imagens e modificadores permanecem inalterados.

Desativar um produto **não** é removê-lo do menu: ele continua sendo membro, apenas deixa de estar disponível. Por isso sua data de atribuição ao menu (`additionalInfo.assignedAt`) não muda com `active: false` nem é reiniciada ao voltar para `active: true`, e este evento não a transmite. Ela chega em [`product.updated`](/pt/webhook-reference/product-updated#data-de-atribuição-ao-menu) e em [`menu.updated`](/pt/webhook-reference/menu-updated-v2).

### `active` é a disponibilidade EFETIVA, não um único interruptor

`products[n].active` não reflete um único campo: é o resultado de combinar a visibilidade do
produto com a de **cada categoria** em que ele aparece. Um produto pode viver em várias categorias
do menu, e o evento é plano por produto, então se aplica o **OR** entre elas:

> `active = true` se existir AO MENOS UMA categoria onde (a categoria está visível E o produto está
> visível nela).

Duas consequências importantes ao processar o evento:

* **Ocultar uma categoria inteira chega como N entradas de produto**, uma para cada produto cuja
  disponibilidade efetiva mudou — não como uma alteração de categoria. Este evento não tem como
  expressar categorias; a estrutura do menu viaja em
  [`menu.updated`](/pt/webhook-reference/menu-updated-v2) (`categories[n].displayInList`).
* **Um produto que também vive em outra categoria visível NÃO aparece no evento**, porque sua
  disponibilidade efetiva não mudou. Está correto, mas significa que a ausência de um produto em
  `products[]` não implica que sua categoria não tenha sido tocada.

Somente os produtos cuja disponibilidade efetiva **mudou** em relação ao estado anterior são
emitidos. Um produto novo no menu não aparece aqui: ele chega com `menu.updated` / `product.updated`.

## Uso

Consulte o guia [Publicação de produto](/pt/guides/product-publication) para o fluxo completo de processamento.
