> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://api-docs.nilo.services/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://api-docs.nilo.services/_mcp/server.

# Mensagem enviada

> Consultar as mensagens trocadas com o paciente na conversa da plataforma, no padrão FHIR Communication.

Uma **mensagem enviada** é o que a equipe e o paciente trocaram na conversa: o texto, o anexo,
quando saiu e quando chegou.

No FHIR o recurso é a
[`Communication`](https://hl7.org/fhir/R4/communication.html).

> **Warning**
>
> **Este recurso é somente leitura.** Não existe `POST /fhir/resources/Communication` — não há
> como enviar mensagem a um paciente por esta API.

## Campos

Todos os campos são de resposta — nenhum deles é enviado por você.

| Campo          | Sempre presente | O que significa                                                                                                                               |
| -------------- | --------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| `resourceType` | sim             | Constante `Communication`                                                                                                                     |
| `identifier`   | sim             | Identificador Nilo da mensagem                                                                                                                |
| `status`       | sim             | Situação de entrega — veja abaixo                                                                                                             |
| `medium[0]`    | sim             | Constante `REMOTE`, com `display` e `text` iguais a `remote presence`                                                                         |
| `sent`         | quase sempre    | Quando a mensagem foi enviada                                                                                                                 |
| `received`     | não             | Quando foi entregue                                                                                                                           |
| `sender`       | quase sempre    | Quem enviou: um `Practitioner` nas mensagens da equipe, um `Patient` nas do paciente. Ausente quando a mensagem da equipe não registrou autor |
| `recipient[]`  | não             | Os pacientes da conversa — **só nas mensagens da equipe**                                                                                     |
| `payload[]`    | não             | O texto e o anexo                                                                                                                             |
| `id` · `meta`  | sim             | Identificador Nilo FHIR do recurso e metadados da gravação                                                                                    |

### `status` é entrega, não leitura

| Valor         | O que aconteceu                   |
| ------------- | --------------------------------- |
| `preparation` | A mensagem está na fila           |
| `in-progress` | Está saindo                       |
| `completed`   | Foi enviada, entregue **ou lida** |
| `not-done`    | Falhou                            |

> **Warning**
>
> **`completed` junta três coisas diferentes.** Enviada, entregue e lida colapsam no mesmo valor:
> não há como saber, por este campo, se o paciente leu a mensagem.
>
> O que dá alguma pista é o `received`, que só aparece quando a entrega foi confirmada — mas
> leitura não tem campo nenhum.

### Quem enviou e quem recebeu

> **Warning**
>
> **Mensagem do paciente vem sem destinatário.** Só as mensagens enviadas pela equipe trazem
> `recipient[]`. Numa mensagem recebida, o campo simplesmente não vem — a plataforma não registra
> para quem, dentro da equipe, ela foi.
>
> E uma mensagem **da equipe** também pode vir sem `recipient`: quando a conversa não resolve
> nenhum paciente, a lista sai vazia e some da resposta. Ausência de `recipient` não distingue,
> sozinha, quem enviou — para isso, olhe o `type` do `sender`.

> **Warning**
>
> **Numa mensagem do paciente, o `sender` é o *primeiro* paciente da conversa**, não
> necessariamente quem escreveu. Numa conversa com mais de um paciente — o que acontece em
> conversas familiares —, isso pode apontar para a pessoa errada.
>
> Não use o `sender` de uma mensagem recebida para atribuir autoria.

> **Warning**
>
> **Uma conversa resolve no máximo 50 pacientes.** Acima disso, os destinatários excedentes são
> **omitidos em silêncio** do `recipient[]`. Numa conversa grande, a lista que você recebe é
> incompleta e não há sinal disso na resposta.

### O conteúdo

`payload[]` traz até dois itens: um com `contentString`, para o texto, e outro com
`contentAttachment`, para o anexo.

> **Note**
>
> Uma mensagem só com anexo vem com um item só; uma mensagem sem texto e sem anexo vem **sem**
> `payload`. E o anexo é uma referência ao arquivo, não o conteúdo dele.

### Campos que a Nilo não usa

A `Communication` canônica traz muito mais: `basedOn`, `partOf`, `inResponseTo`, `category`,
`priority`, `subject`, `topic`, `about`, `encounter`, `reasonCode`, `reasonReference` e `note`.
Nenhum deles é lido.

> **Warning**
>
> Repare em **`inResponseTo`** e em **`partOf`**: não há como reconstruir a **thread** da
> conversa por esta API. As mensagens vêm soltas, e a única forma de agrupá-las é pelo par de
> participantes e pela ordem de `sent`.
>
> E repare em **`subject`**: numa mensagem da equipe, o paciente está em `recipient`; numa do
> paciente, em `sender`. Não há um campo único que diga "de quem é esta conversa".

## Buscar

### Request

GET [https://landing-zone-api.nilo.services/fhir/resources/Communication](https://landing-zone-api.nilo.services/fhir/resources/Communication)

**`Busca com resultados`**

```curl Busca com resultados
curl -G https://landing-zone-api.nilo.services/fhir/resources/Communication \
     -H "x-api-key: <apiKey>" \
     -d _count=50 \
     -d _lastUpdated=eq2013-01-14 \
     --data-urlencode identifier=https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/parrot-api--whats-app-message|9911204 \
     -d received=ge2026-07-01 \
     --data-urlencode recipient=Patient/ba200cfa-dae0-46cf-81a0-008e3f7414b4 \
     --data-urlencode recipient:identifier=https://www.acmesaude.com.br/integracao/paciente/|507823709 \
     --data-urlencode sender=Practitioner/1f30c8b7-45ad-4e62-9c81-73b0e5f24a19 \
     --data-urlencode sender:identifier=https://www.acmesaude.com.br/integracao/profissional/|5032932 \
     -d sent=ge2026-07-01 \
     -d status=completed
```

**`Busca com resultados`**

```python Busca com resultados
import requests

url = "https://landing-zone-api.nilo.services/fhir/resources/Communication"

querystring = {"_count":"50","_lastUpdated":"[\"eq2013-01-14\"]","identifier":"https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/parrot-api--whats-app-message|9911204","received":"ge2026-07-01","recipient":"Patient/ba200cfa-dae0-46cf-81a0-008e3f7414b4","recipient:identifier":"https://www.acmesaude.com.br/integracao/paciente/|507823709","sender":"Practitioner/1f30c8b7-45ad-4e62-9c81-73b0e5f24a19","sender:identifier":"https://www.acmesaude.com.br/integracao/profissional/|5032932","sent":"ge2026-07-01","status":"completed"}

headers = {"x-api-key": "<apiKey>"}

response = requests.get(url, headers=headers, params=querystring)

print(response.json())
```

**`Busca com resultados`**

```javascript Busca com resultados
const url = 'https://landing-zone-api.nilo.services/fhir/resources/Communication?_count=50&_lastUpdated=%5B%22eq2013-01-14%22%5D&identifier=https%3A%2F%2Flanding-zone-api.nilo.services%2Ffhir%2Fresources%2FNamingSystem%2Fparrot-api--whats-app-message%7C9911204&received=ge2026-07-01&recipient=Patient%2Fba200cfa-dae0-46cf-81a0-008e3f7414b4&recipient%3Aidentifier=https%3A%2F%2Fwww.acmesaude.com.br%2Fintegracao%2Fpaciente%2F%7C507823709&sender=Practitioner%2F1f30c8b7-45ad-4e62-9c81-73b0e5f24a19&sender%3Aidentifier=https%3A%2F%2Fwww.acmesaude.com.br%2Fintegracao%2Fprofissional%2F%7C5032932&sent=ge2026-07-01&status=completed';
const options = {method: 'GET', headers: {'x-api-key': '<apiKey>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

**`Busca com resultados`**

```go Busca com resultados
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://landing-zone-api.nilo.services/fhir/resources/Communication?_count=50&_lastUpdated=%5B%22eq2013-01-14%22%5D&identifier=https%3A%2F%2Flanding-zone-api.nilo.services%2Ffhir%2Fresources%2FNamingSystem%2Fparrot-api--whats-app-message%7C9911204&received=ge2026-07-01&recipient=Patient%2Fba200cfa-dae0-46cf-81a0-008e3f7414b4&recipient%3Aidentifier=https%3A%2F%2Fwww.acmesaude.com.br%2Fintegracao%2Fpaciente%2F%7C507823709&sender=Practitioner%2F1f30c8b7-45ad-4e62-9c81-73b0e5f24a19&sender%3Aidentifier=https%3A%2F%2Fwww.acmesaude.com.br%2Fintegracao%2Fprofissional%2F%7C5032932&sent=ge2026-07-01&status=completed"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("x-api-key", "<apiKey>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

**`Busca com resultados`**

```ruby Busca com resultados
require 'uri'
require 'net/http'

url = URI("https://landing-zone-api.nilo.services/fhir/resources/Communication?_count=50&_lastUpdated=%5B%22eq2013-01-14%22%5D&identifier=https%3A%2F%2Flanding-zone-api.nilo.services%2Ffhir%2Fresources%2FNamingSystem%2Fparrot-api--whats-app-message%7C9911204&received=ge2026-07-01&recipient=Patient%2Fba200cfa-dae0-46cf-81a0-008e3f7414b4&recipient%3Aidentifier=https%3A%2F%2Fwww.acmesaude.com.br%2Fintegracao%2Fpaciente%2F%7C507823709&sender=Practitioner%2F1f30c8b7-45ad-4e62-9c81-73b0e5f24a19&sender%3Aidentifier=https%3A%2F%2Fwww.acmesaude.com.br%2Fintegracao%2Fprofissional%2F%7C5032932&sent=ge2026-07-01&status=completed")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<apiKey>'

response = http.request(request)
puts response.read_body
```

**`Busca com resultados`**

```java Busca com resultados
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://landing-zone-api.nilo.services/fhir/resources/Communication?_count=50&_lastUpdated=%5B%22eq2013-01-14%22%5D&identifier=https%3A%2F%2Flanding-zone-api.nilo.services%2Ffhir%2Fresources%2FNamingSystem%2Fparrot-api--whats-app-message%7C9911204&received=ge2026-07-01&recipient=Patient%2Fba200cfa-dae0-46cf-81a0-008e3f7414b4&recipient%3Aidentifier=https%3A%2F%2Fwww.acmesaude.com.br%2Fintegracao%2Fpaciente%2F%7C507823709&sender=Practitioner%2F1f30c8b7-45ad-4e62-9c81-73b0e5f24a19&sender%3Aidentifier=https%3A%2F%2Fwww.acmesaude.com.br%2Fintegracao%2Fprofissional%2F%7C5032932&sent=ge2026-07-01&status=completed")
  .header("x-api-key", "<apiKey>")
  .asString();
```

**`Busca com resultados`**

```php Busca com resultados
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://landing-zone-api.nilo.services/fhir/resources/Communication?_count=50&_lastUpdated=%5B%22eq2013-01-14%22%5D&identifier=https%3A%2F%2Flanding-zone-api.nilo.services%2Ffhir%2Fresources%2FNamingSystem%2Fparrot-api--whats-app-message%7C9911204&received=ge2026-07-01&recipient=Patient%2Fba200cfa-dae0-46cf-81a0-008e3f7414b4&recipient%3Aidentifier=https%3A%2F%2Fwww.acmesaude.com.br%2Fintegracao%2Fpaciente%2F%7C507823709&sender=Practitioner%2F1f30c8b7-45ad-4e62-9c81-73b0e5f24a19&sender%3Aidentifier=https%3A%2F%2Fwww.acmesaude.com.br%2Fintegracao%2Fprofissional%2F%7C5032932&sent=ge2026-07-01&status=completed', [
  'headers' => [
    'x-api-key' => '<apiKey>',
  ],
]);

echo $response->getBody();
```

**`Busca com resultados`**

```csharp Busca com resultados
using RestSharp;

var client = new RestClient("https://landing-zone-api.nilo.services/fhir/resources/Communication?_count=50&_lastUpdated=%5B%22eq2013-01-14%22%5D&identifier=https%3A%2F%2Flanding-zone-api.nilo.services%2Ffhir%2Fresources%2FNamingSystem%2Fparrot-api--whats-app-message%7C9911204&received=ge2026-07-01&recipient=Patient%2Fba200cfa-dae0-46cf-81a0-008e3f7414b4&recipient%3Aidentifier=https%3A%2F%2Fwww.acmesaude.com.br%2Fintegracao%2Fpaciente%2F%7C507823709&sender=Practitioner%2F1f30c8b7-45ad-4e62-9c81-73b0e5f24a19&sender%3Aidentifier=https%3A%2F%2Fwww.acmesaude.com.br%2Fintegracao%2Fprofissional%2F%7C5032932&sent=ge2026-07-01&status=completed");
var request = new RestRequest(Method.GET);
request.AddHeader("x-api-key", "<apiKey>");
IRestResponse response = client.Execute(request);
```

**`Busca com resultados`**

```swift Busca com resultados
import Foundation

let headers = ["x-api-key": "<apiKey>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://landing-zone-api.nilo.services/fhir/resources/Communication?_count=50&_lastUpdated=%5B%22eq2013-01-14%22%5D&identifier=https%3A%2F%2Flanding-zone-api.nilo.services%2Ffhir%2Fresources%2FNamingSystem%2Fparrot-api--whats-app-message%7C9911204&received=ge2026-07-01&recipient=Patient%2Fba200cfa-dae0-46cf-81a0-008e3f7414b4&recipient%3Aidentifier=https%3A%2F%2Fwww.acmesaude.com.br%2Fintegracao%2Fpaciente%2F%7C507823709&sender=Practitioner%2F1f30c8b7-45ad-4e62-9c81-73b0e5f24a19&sender%3Aidentifier=https%3A%2F%2Fwww.acmesaude.com.br%2Fintegracao%2Fprofissional%2F%7C5032932&sent=ge2026-07-01&status=completed")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

A resposta é sempre um `Bundle` do tipo `searchset`:

### Response (200)

```json
{
  "resourceType": "Bundle",
  "type": "searchset",
  "entry": [
    {
      "fullUrl": "https://landing-zone-api.nilo.services/fhir/resources/Communication/a3f802d6-71b4-4e59-9c07-52d148ba3e91",
      "resource": {
        "resourceType": "Communication",
        "identifier": [
          {
            "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/parrot-api--whats-app-message",
            "value": "9911204",
            "use": "usual"
          }
        ],
        "status": "completed",
        "id": "a3f802d6-71b4-4e59-9c07-52d148ba3e91",
        "meta": {
          "lastUpdated": "2026-07-02T14:31:13.004000Z",
          "versionId": "MTc4NjAyMTQ1MjkwNTAwMDM2Nw"
        },
        "medium": [
          {
            "coding": [
              {
                "code": "REMOTE",
                "display": "remote presence",
                "system": "http://terminology.hl7.org/CodeSystem/v3-ParticipationMode"
              }
            ],
            "text": "remote presence"
          }
        ],
        "sent": "2026-07-02T14:31:08+00:00",
        "received": "2026-07-02T14:31:12+00:00",
        "sender": {
          "identifier": {
            "system": "https://www.acmesaude.com.br/integracao/profissional/",
            "value": "5032932",
            "use": "usual"
          },
          "type": "Practitioner",
          "reference": "Practitioner/1f30c8b7-45ad-4e62-9c81-73b0e5f24a19"
        },
        "recipient": [
          {
            "identifier": {
              "system": "https://www.acmesaude.com.br/integracao/paciente/",
              "value": "507823709",
              "use": "usual"
            },
            "type": "Patient",
            "reference": "Patient/ba200cfa-dae0-46cf-81a0-008e3f7414b4"
          }
        ],
        "payload": [
          {
            "contentString": "Bom dia! Sua consulta é amanhã às 14h."
          }
        ]
      },
      "search": {
        "mode": "match"
      }
    },
    {
      "fullUrl": "https://landing-zone-api.nilo.services/fhir/resources/Communication/7e40b915-c2d8-4a63-81f7-06e93a2c5478",
      "resource": {
        "resourceType": "Communication",
        "identifier": [
          {
            "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/parrot-api--whats-app-message",
            "value": "9911207",
            "use": "usual"
          }
        ],
        "status": "completed",
        "id": "7e40b915-c2d8-4a63-81f7-06e93a2c5478",
        "meta": {
          "lastUpdated": "2026-07-02T14:40:55.318000Z",
          "versionId": "MTc4NjAyMTQ1MjkwNTAwMDQwMg"
        },
        "medium": [
          {
            "coding": [
              {
                "code": "REMOTE",
                "display": "remote presence",
                "system": "http://terminology.hl7.org/CodeSystem/v3-ParticipationMode"
              }
            ],
            "text": "remote presence"
          }
        ],
        "sent": "2026-07-02T14:40:51+00:00",
        "sender": {
          "identifier": {
            "system": "https://www.acmesaude.com.br/integracao/paciente/",
            "value": "507823709",
            "use": "usual"
          },
          "type": "Patient",
          "reference": "Patient/ba200cfa-dae0-46cf-81a0-008e3f7414b4"
        },
        "payload": [
          {
            "contentString": "Confirmado, obrigada!"
          }
        ]
      },
      "search": {
        "mode": "match"
      }
    }
  ],
  "link": []
}
```

Busca sem resultados não é erro: volta `200` com um `Bundle` cujo `entry` é uma lista vazia.

### Response (200)

```json
{
  "resourceType": "Bundle",
  "type": "searchset",
  "entry": [],
  "link": []
}
```

### Parâmetros de busca suportados

| Nome                                 | Tipo                                                       | Descrição                                                | Expressão                  |
| ------------------------------------ | ---------------------------------------------------------- | -------------------------------------------------------- | -------------------------- |
| `identifier`                         | [token](https://hl7.org/fhir/R4/search.html#token)         | Identificador da mensagem, em `system\|value`            | `Communication.identifier` |
| `sender` · `sender:identifier`       | [reference](https://hl7.org/fhir/R4/search.html#reference) | Quem enviou                                              | `Communication.sender`     |
| `recipient` · `recipient:identifier` | [reference](https://hl7.org/fhir/R4/search.html#reference) | Quem recebeu                                             | `Communication.recipient`  |
| `status`                             | [token](https://hl7.org/fhir/R4/search.html#token)         | Situação de entrega                                      | `Communication.status`     |
| `sent`                               | [date](https://hl7.org/fhir/R4/search.html#date)           | Data de envio, com os prefixos `eq`, `ge`, `le`          | `Communication.sent`       |
| `received`                           | [date](https://hl7.org/fhir/R4/search.html#date)           | Data de entrega, com os mesmos prefixos                  | `Communication.received`   |
| `medium`                             | [token](https://hl7.org/fhir/R4/search.html#token)         | Aceito, e inútil: toda mensagem é `REMOTE`               | `Communication.medium`     |
| `_lastUpdated`                       | [date](https://hl7.org/fhir/R4/search.html#date)           | Data da última gravação no store, com os mesmos prefixos | —                          |

> **Warning**
>
> **Para listar as mensagens de um paciente, você precisa das duas buscas.** As que ele recebeu
> estão em `recipient`; as que ele enviou, em `sender`. Não há um parâmetro que cubra os dois.

> **Note**
>
> Os demais parâmetros canônicos da `Communication` existem e **não encontram nada**, porque a
> plataforma não preenche o campo correspondente: `based-on`, `category`, `encounter`,
> `instantiates-canonical`, `instantiates-uri`, `part-of`, `patient` e `subject`.
>
> Repare em **`patient`**: o parâmetro canônico procura em `Communication.subject`, que a Nilo
> não preenche — use `recipient` e `sender`.

> **Warning**
>
> Qual identificador as referências de `sender` e `recipient` carregam **depende da sua
> implantação**. Na configuração que usa identificadores externos, cada referência sai com o
> identificador do seu sistema; sem ela, vem o identificador Nilo. Confira numa resposta de
> leitura antes de montar a busca em volume.

A paginação é por `_count` e `_page_token`; havendo página seguinte, o `Bundle` traz a URL
pronta em `link`.

## Ler por ID

### Request

GET [https://landing-zone-api.nilo.services/fhir/resources/Communication/\{id}](https://landing-zone-api.nilo.services/fhir/resources/Communication/\{id})

**`Mensagem encontrada`**

```curl Mensagem encontrada
curl https://landing-zone-api.nilo.services/fhir/resources/Communication/id \
     -H "x-api-key: <apiKey>"
```

**`Mensagem encontrada`**

```python Mensagem encontrada
import requests

url = "https://landing-zone-api.nilo.services/fhir/resources/Communication/id"

headers = {"x-api-key": "<apiKey>"}

response = requests.get(url, headers=headers)

print(response.json())
```

**`Mensagem encontrada`**

```javascript Mensagem encontrada
const url = 'https://landing-zone-api.nilo.services/fhir/resources/Communication/id';
const options = {method: 'GET', headers: {'x-api-key': '<apiKey>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

**`Mensagem encontrada`**

```go Mensagem encontrada
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://landing-zone-api.nilo.services/fhir/resources/Communication/id"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("x-api-key", "<apiKey>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

**`Mensagem encontrada`**

```ruby Mensagem encontrada
require 'uri'
require 'net/http'

url = URI("https://landing-zone-api.nilo.services/fhir/resources/Communication/id")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<apiKey>'

response = http.request(request)
puts response.read_body
```

**`Mensagem encontrada`**

```java Mensagem encontrada
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://landing-zone-api.nilo.services/fhir/resources/Communication/id")
  .header("x-api-key", "<apiKey>")
  .asString();
```

**`Mensagem encontrada`**

```php Mensagem encontrada
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://landing-zone-api.nilo.services/fhir/resources/Communication/id', [
  'headers' => [
    'x-api-key' => '<apiKey>',
  ],
]);

echo $response->getBody();
```

**`Mensagem encontrada`**

```csharp Mensagem encontrada
using RestSharp;

var client = new RestClient("https://landing-zone-api.nilo.services/fhir/resources/Communication/id");
var request = new RestRequest(Method.GET);
request.AddHeader("x-api-key", "<apiKey>");
IRestResponse response = client.Execute(request);
```

**`Mensagem encontrada`**

```swift Mensagem encontrada
import Foundation

let headers = ["x-api-key": "<apiKey>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://landing-zone-api.nilo.services/fhir/resources/Communication/id")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

> **Warning**
>
> Diferente da busca, esta leitura não devolve um `Bundle` — mas também **não devolve o recurso
> nu**. A resposta é um envelope com `fullUrl`, `search` e `resource`, e a mensagem está em
> `resource`.

### Response (200)

```json
{
  "fullUrl": "https://landing-zone-api.nilo.services/fhir/resources/Communication/a3f802d6-71b4-4e59-9c07-52d148ba3e91",
  "resource": {
    "resourceType": "Communication",
    "identifier": [
      {
        "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/parrot-api--whats-app-message",
        "value": "9911204",
        "use": "usual"
      }
    ],
    "status": "completed",
    "id": "a3f802d6-71b4-4e59-9c07-52d148ba3e91",
    "meta": {
      "lastUpdated": "2026-07-02T14:31:13.004000Z",
      "versionId": "MTc4NjAyMTQ1MjkwNTAwMDM2Nw"
    },
    "medium": [
      {
        "coding": [
          {
            "code": "REMOTE",
            "display": "remote presence",
            "system": "http://terminology.hl7.org/CodeSystem/v3-ParticipationMode"
          }
        ],
        "text": "remote presence"
      }
    ],
    "sent": "2026-07-02T14:31:08+00:00",
    "received": "2026-07-02T14:31:12+00:00",
    "sender": {
      "identifier": {
        "system": "https://www.acmesaude.com.br/integracao/profissional/",
        "value": "5032932",
        "use": "usual"
      },
      "type": "Practitioner",
      "reference": "Practitioner/1f30c8b7-45ad-4e62-9c81-73b0e5f24a19"
    },
    "payload": [
      {
        "contentString": "Bom dia! Sua consulta é amanhã às 14h."
      }
    ]
  },
  "search": {
    "mode": "match"
  }
}
```

## Cadastrar ou atualizar

**Não existe.** Este recurso não tem caminho de escrita nesta API.

> **Warning**
>
> Um `POST /fhir/resources/Communication` **não é uma operação suportada** e não devolve um erro
> de validação tratável: a chamada falha com erro inesperado do servidor (`500`). Não escreva
> tratamento em cima desse comportamento — ele não é contrato, e nada é gravado.

## O que a integração não cobre

* **enviar mensagem** a um paciente;
* a **thread** da conversa — não há `inResponseTo` nem `partOf`;
* se o paciente **leu** a mensagem;
* o **destinatário** de uma mensagem recebida;
* os pacientes além do **quinquagésimo** numa conversa grande;
* o **conteúdo** do anexo — só a referência a ele.

Para as mensagens que a plataforma **vai** enviar, veja
[Mensagem programada](/guia/recursos/communicationrequest).