# Odbieranie wiadomości WhatsApp

Wiadomości przychodzące trafiają na ten sam zasób co wychodzące, bez osobnego endpointu skrzynki odbiorczej do odpytywania. Odczytuj je za pomocą [listy wiadomości](/docs/guides/whatsapp/message-log) w dashboardzie albo przez API za pomocą `GET /v1/whatsapp/messages/{id}` po przefiltrowaniu listy do przychodzących.

Każda wiadomość przychodząca wydłuża [okno obsługi klienta](/docs/knowledge-base/whatsapp/customer-service-window) do 24 godzin od znacznika czasu tej wiadomości, co pozwala dostarczyć Twoją odpowiedź w dowolnej formie. Wiadomość, która dotrze do Bird z opóźnieniem, niesie ze sobą okno faktycznie przyznane przez kontakt, a późniejszy termin już zapisany nigdy nie jest skracany.

## Co zawiera wiadomość przychodząca

Każda wiadomość przychodząca ma wspólną kopertę: `id`, `direction: "inbound"`, kontakt w `from`, Twój numer w `to`, `status` o wartości `received` oraz `created_at`. Obok koperty znajduje się dokładnie jedno pole treści wskazujące, co kontakt wysłał:

```json
{
  "id": "wam_01kya19eknftrs2s6p82asmvnh",
  "direction": "inbound",
  "from": { "phone_number": "+14155550100" },
  "to": { "phone_number": "+13124495569" },
  "status": "received",
  "text": { "body": "Is my order out for delivery yet?" },
  "created_at": "2026-08-25T09:04:11Z"
}
```

`from` identyfikuje kontakt na podstawie tożsamości zgłaszanej przez WhatsApp: numer E.164 `phone_number`, `bsuid` lub oba, a także publikowane `username` i `display_name`. Kontakt, który przyjął nazwę użytkownika WhatsApp, może się z Tobą skontaktować bez numeru telefonu; zobacz [identyfikatory użytkowników w zakresie firmy](/docs/guides/whatsapp/business-scoped-user-ids), żeby dowiedzieć się, co przechowywać i jak poprosić o numer.

Jedno z tych pól treści, tzw. **arm**, zawiera to, co kontakt wysłał, i dokładnie jeden arm jest ustawiony w każdej wiadomości. Każdy ma własną stronę z kształtem odczytu, payloadem `whatsapp.received` i tym, na co uważać:

| Pole                                                                                | Co zawiera przychodzące                                                        |
| ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ |
| [`text`](/docs/guides/whatsapp/receiving-whatsapp/plain-text)                       | `body`, wiadomość wpisana przez kontakt                                        |
| [`image`](/docs/guides/whatsapp/receiving-whatsapp/images)                          | `id`, `url`, `mime_type` i ewentualny `caption`                                |
| [`video`](/docs/guides/whatsapp/receiving-whatsapp/video)                           | Te same pola multimediów, plus ewentualny `caption`                            |
| [`audio`](/docs/guides/whatsapp/receiving-whatsapp/audio)                           | Te same pola multimediów, plus `voice` w notatce głosowej; podpis nie istnieje |
| [`sticker`](/docs/guides/whatsapp/receiving-whatsapp/stickers)                      | Te same pola multimediów, plus `animated`                                      |
| [`document`](/docs/guides/whatsapp/receiving-whatsapp/documents)                    | Te same pola multimediów, plus ewentualny `filename` i `caption`               |
| [`location`](/docs/guides/whatsapp/receiving-whatsapp/location)                     | `latitude` i `longitude`, a czasem `name`, `address` lub `url`                 |
| [`contact_cards`](/docs/guides/whatsapp/receiving-whatsapp/contact-cards)           | Jedna lub więcej wizytówek udostępnionych przez kontakt                        |
| [`interactive_reply`](/docs/guides/whatsapp/receiving-whatsapp/interactive-replies) | `slug` i `text` przycisku lub wiersza, który kontakt nacisnął                  |
| [`unsupported`](/docs/guides/whatsapp/receiving-whatsapp/unsupported)               | Typ treści WhatsApp, którego API nie modeluje, np. zamówienie                  |

Dwa stuknięcia trafiają na arm, którego możesz się nie spodziewać. [Żądanie lokalizacji](/docs/guides/whatsapp/message-types/interactive/location-requests) odpowiada jako zwykły przychodzący `location`, a [żądanie danych kontaktu](/docs/guides/whatsapp/message-types/interactive/contact-info-requests) odpowiada jako `contact_cards`, więc integracja obserwująca tylko `interactive_reply` w oczekiwaniu na stuknięcie przeoczy oba.

## Pobieranie multimediów przychodzących

Przychodzący `image`, `video`, `audio`, `sticker` lub `document` dociera jako referencja do pliku przechowywanego przez Bird, a nie jako sam plik:

```json
{
  "image": {
    "id": "waf_01kyb2m4xq7whs0d8n3prv6tez",
    "url": "https://platform.bird.com/v1/whatsapp/messages/wam_01kya19eknftrs2s6p82asmvnh/media/waf_01kyb2m4xq7whs0d8n3prv6tez",
    "mime_type": "image/jpeg",
    "caption": "Is this the right part?"
  }
}
```

Pobierz bajty za pomocą metody media kanału, przekazując id wiadomości i `id` medium:

**TypeScript**

```typescript
const media = await bird.whatsapp.messages.media(
  "wam_01kya19eknftrs2s6p82asmvnh",
  "waf_01kyb2m4xq7whs0d8n3prv6tez",
);
console.log(media.contentType, media.contentLength);
```

Examples: [TypeScript](/pl-pl/dokumentacja/guides/whatsapp/receiving-whatsapp.ts.md) · [Python](/pl-pl/dokumentacja/guides/whatsapp/receiving-whatsapp.py.md) · [Go](/pl-pl/dokumentacja/guides/whatsapp/receiving-whatsapp.go.md) · [PHP](/pl-pl/dokumentacja/guides/whatsapp/receiving-whatsapp.php.md) · [CLI](/pl-pl/dokumentacja/guides/whatsapp/receiving-whatsapp.cli.md) · [MCP](/pl-pl/dokumentacja/guides/whatsapp/receiving-whatsapp.mcp.md) · [cURL](/pl-pl/dokumentacja/guides/whatsapp/receiving-whatsapp.curl.md)

Otrzymujesz bajty z `mime_type` zadeklarowanym dla nich. Identyfikator, którego Bird nie rozpoznaje, zwraca `404`, a wiadomość wychodząca nie ma zapisanych multimediów do serwowania.

**Wiadomość jest dostępna do odczytu przez 30 dni od momentu odebrania, a jej multimedia nigdy nie przeżyją samej wiadomości.** Ten endpoint odczytuje wiadomość, zanim zaserwuje plik, więc po upływie tego okna oba zwracają `404`. Zapisz każdy potrzebny plik na dłużej, dopóki wiadomość jest jeszcze dostępna. Jedyny przypadek, w którym dane znikają wcześniej, to usunięcie przechowywanych bajtów przed upływem okna: pobranie zwraca `410` [`E15021`](/docs/api/errors/E15021), a wiadomość wciąż daje się odczytać z `mime_type` i `caption` medium.

Pod spodem ten endpoint odpowiada `302` z presigned URL ważnym przez 15 minut. SDK i CLI obsługują to przekierowanie za Ciebie. Przy bezpośrednim wywołaniu presigned URL niesie własne poświadczenie, więc przekierowane żądanie nie może jednocześnie wysyłać nagłówka `Authorization`. Wysłanie obu kończy się błędem. `curl -L` sam usuwa nagłówek przy przekierowaniu na inny host; klient przekazujący nagłówki dosłownie musi pobrać `Location` jako osobne, nieuwierzytelnione żądanie.

## Cytowane odpowiedzi

`in_reply_to_message_id` wskazuje wiadomość, na którą odpowiada wiadomość przychodząca, gdy WhatsApp oznacza ją jako odpowiedź:

```json
{
  "id": "wam_01kyb2m4xq7whs0d8n3prv6tez",
  "direction": "inbound",
  "in_reply_to_message_id": "wam_01kya19eknftrs2s6p82asmvnh",
  "text": { "body": "Yes, that one" }
}
```

WhatsApp nie oznacza każdej odpowiedzi, a nieoznaczona nie niesie żadnego ID. Pole jest również pomijane, gdy cytowanej wiadomości nie da się dopasować do wiadomości przechowywanej przez Bird: wysłanej zanim ten obszar roboczy zaczął je rejestrować albo starszej niż 15 dni, przez które Bird przechowuje identyfikatory wiadomości WhatsApp. Brak dopasowania skutkuje pominięciem pola zamiast zgłoszenia, co wygląda tak samo jak odpowiedź na nic.

Traktuj to pole jako wskazówkę, nie klucz. `metadata` ustawiony na Twojej własnej wiadomości nie pomaga, ponieważ pozostaje na Twojej wiadomości i nigdy nie trafia do odpowiedzi kontaktu, więc integracja, która musi wiedzieć, do którego pytania należy odpowiedź, sama śledzi ostatnie pytanie zadane danemu kontaktowi. Zobacz [Cytowanie wiadomości](/docs/guides/whatsapp/sending-whatsapp#quoting-a-message), aby poznać stronę wychodzącą.

## Webhook

Zasubskrybuj `whatsapp.received`, aby reagować na wiadomość przychodzącą w momencie jej nadejścia, zamiast odpytywać listę. Payload zawiera treść na wierzchu koperty zdarzenia, więc endpoint nie potrzebuje dodatkowego odczytu:

```json
{
  "type": "whatsapp.received",
  "timestamp": "2026-08-25T09:04:11.118Z",
  "data": {
    "whatsapp_id": "wam_01kyb2m4xq7whs0d8n3prv6tez",
    "workspace_id": "ws_01ky7m235keycbnwyajabe1a6b",
    "direction": "inbound",
    "from": { "phone_number": "+14155550100", "display_name": "Alex Rivera" },
    "to": { "phone_number": "+13124495569" },
    "in_reply_to_message_id": "wam_01kya19eknftrs2s6p82asmvnh",
    "interactive_reply": {
      "type": "button",
      "button": { "slug": "cancel-booking", "text": "Cancel" }
    },
    "tags": null,
    "metadata": null
  }
}
```

Zobacz [zdarzenia WhatsApp](/docs/guides/whatsapp/events#webhooks), aby poznać pełną kopertę i resztę listy zdarzeń.

## Następne kroki

- [Wiadomości serwisowe](/docs/guides/whatsapp/message-types): strona wysyłania tych samych armów treści
- [Wysyłanie wiadomości WhatsApp](/docs/guides/whatsapp/sending-whatsapp): odpowiadanie w oknie serwisowym i cytowanie wiadomości
- [Zdarzenia WhatsApp](/docs/guides/whatsapp/events): pełna lista zdarzeń, przez API lub webhooki
- [Log WhatsApp](/docs/guides/whatsapp/message-log): przeglądanie konwersacji w dashboardzie

## Related resources

- [Connecting WhatsApp to Bird: from buying a number to a live channel](/learn/whatsapp/connecting-whatsapp-to-bird) (video)
- [What is the 24-hour customer service window on WhatsApp?](/explained/whatsapp/what-is-the-24-hour-customer-service-window) (answer)
- [WhatsApp message builder](/tools/whatsapp-message-builder) (tool)
- [WhatsApp](/whatsapp) (product)

[Get an implementation brief](/learn/workspace?topic=whatsapp)
