Audiência

Contatos

As pessoas da sua audiência: dados, propriedades, segmentos e inscrição em tópicos.

Contatos são as pessoas da sua audiência de marketing: e-mail, nome, propriedades personalizadas, segmentos e a inscrição em tópicos. Cada e-mail aparece uma vez por time. O número de contatos depende do plano de marketing (Free: 1.000, Pro: 5.000, Scale: 50.000, Enterprise: sem limite). Nos endpoints com {id}, você pode usar o ID ou o próprio e-mail do contato. Para trazer muitos contatos de uma vez, use a importação de CSV.

#Listar contatos

GET/contacts

Chave de acesso total

Do mais recente para o mais antigo. A lista não traz os segmentos de cada contato.

Parâmetros de consulta

  • limitinteger
    De 1 a 100. Padrão: 20.
  • afterstring
    Cursor da próxima página.
  • beforestring
    Cursor da página anterior.
  • searchstring
    Busca no e-mail e no nome.
  • segment_idstring
    Só contatos de um segmento.
  • topic_idstring
    Só contatos inscritos no tópico: os que escolheram receber e, se o tópico for opt_in por padrão, os que não escolheram nada.
  • unsubscribedboolean
    true para os descadastrados; false para os demais.

Erros

  • 422validation_error
    Algum campo é inválido. A mensagem diz qual.
GET /contacts

cURL

curl 'https://api.postal.so/contacts?segment_id=019a1d90-3b4c-7d5e-9f6a-7b8c9d0e1f2a&unsubscribed=false' \
  -H "Authorization: Bearer $POSTAL_API_KEY"

Node.js

const response = await fetch('https://api.postal.so/contacts?segment_id=019a1d90-3b4c-7d5e-9f6a-7b8c9d0e1f2a&unsubscribed=false', {
  headers: {
    Authorization: `Bearer ${process.env.POSTAL_API_KEY}`,
  },
});

const data = await response.json();

Python

import os
import requests

response = requests.get(
    "https://api.postal.so/contacts",
    headers={"Authorization": f"Bearer {os.environ['POSTAL_API_KEY']}"},
    params={
        "segment_id": "019a1d90-3b4c-7d5e-9f6a-7b8c9d0e1f2a",
        "unsubscribed": "false",
    },
    timeout=10,
)

data = response.json()

PHP

$client = new \GuzzleHttp\Client(['base_uri' => 'https://api.postal.so']);

$response = $client->get('contacts', [
    'headers' => ['Authorization' => 'Bearer '.getenv('POSTAL_API_KEY')],
    'query' => [
        'segment_id' => '019a1d90-3b4c-7d5e-9f6a-7b8c9d0e1f2a',
        'unsubscribed' => 'false',
    ],
]);

$data = json_decode($response->getBody(), true);
200Resposta
{
  "object": "list",
  "has_more": true,
  "data": [
    {
      "object": "contact",
      "id": "019a1e00-1a2b-7c3d-8e4f-5a6b7c8d9e0f",
      "email": "[email protected]",
      "first_name": "Ana",
      "last_name": "Souza",
      "unsubscribed": false,
      "properties": {
        "plan": "pro",
        "city": "Recife",
        "customer_since": "2024-03-18"
      },
      "created_at": "2026-10-24T14:00:00.000000Z",
      "updated_at": "2026-10-24T14:00:00.000000Z"
    }
  ]
}

#Criar um contato

POST/contacts

Chave de acesso total

Cria o contato e, se quiser, já o coloca em segmentos e registra a escolha dele nos tópicos. Dispara o webhook contact.created.

Corpo da requisição

  • emailstringobrigatório
    E-mail, até 320 caracteres. Guardado em minúsculas.
  • first_namestring | null
    Nome, até 255 caracteres.
  • last_namestring | null
    Sobrenome, até 255 caracteres.
  • unsubscribedboolean
    Descadastrado de todos os envios de marketing. Padrão: false.
  • propertiesobject
    Valores das propriedades, como {"plan": "pro"}. Cada chave precisa existir antes; os valores são convertidos para o tipo da propriedade.
  • segmentsstring[]
    IDs de até 100 segmentos (ou objetos {"id": "…"}).
  • topicsobject[]
    Até 100 escolhas de tópicos.
    • idstringobrigatório
      ID do tópico.
    • subscriptionstringobrigatório
      opt_in (quer receber) ou opt_out (não quer).

Erros

  • 422validation_error
    E-mail inválido ou já cadastrado, propriedade desconhecida ou valor com o tipo errado.
  • 403plan_limit_reached
    O plano não permite mais contatos.
  • 404not_found
    Algum segmento ou tópico não existe.
POST /contacts

cURL

curl -X POST https://api.postal.so/contacts \
  -H "Authorization: Bearer $POSTAL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "[email protected]",
    "first_name": "Ana",
    "last_name": "Souza",
    "properties": {
      "plan": "pro",
      "city": "Recife"
    },
    "segments": ["019a1d90-3b4c-7d5e-9f6a-7b8c9d0e1f2a"],
    "topics": [
      {
        "id": "019a1d95-4c5d-7e6f-8a7b-8c9d0e1f2a3b",
        "subscription": "opt_in"
      }
    ]
  }'

Node.js

const response = await fetch('https://api.postal.so/contacts', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.POSTAL_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    email: '[email protected]',
    first_name: 'Ana',
    last_name: 'Souza',
    properties: {
      plan: 'pro',
      city: 'Recife',
    },
    segments: ['019a1d90-3b4c-7d5e-9f6a-7b8c9d0e1f2a'],
    topics: [
      {
        id: '019a1d95-4c5d-7e6f-8a7b-8c9d0e1f2a3b',
        subscription: 'opt_in',
      },
    ],
  }),
});

const data = await response.json();

Python

import os
import requests

response = requests.post(
    "https://api.postal.so/contacts",
    headers={"Authorization": f"Bearer {os.environ['POSTAL_API_KEY']}"},
    json={
        "email": "[email protected]",
        "first_name": "Ana",
        "last_name": "Souza",
        "properties": {
            "plan": "pro",
            "city": "Recife",
        },
        "segments": ["019a1d90-3b4c-7d5e-9f6a-7b8c9d0e1f2a"],
        "topics": [
            {
                "id": "019a1d95-4c5d-7e6f-8a7b-8c9d0e1f2a3b",
                "subscription": "opt_in",
            },
        ],
    },
    timeout=10,
)

data = response.json()

PHP

$client = new \GuzzleHttp\Client(['base_uri' => 'https://api.postal.so']);

$response = $client->post('contacts', [
    'headers' => ['Authorization' => 'Bearer '.getenv('POSTAL_API_KEY')],
    'json' => [
        'email' => '[email protected]',
        'first_name' => 'Ana',
        'last_name' => 'Souza',
        'properties' => [
            'plan' => 'pro',
            'city' => 'Recife',
        ],
        'segments' => ['019a1d90-3b4c-7d5e-9f6a-7b8c9d0e1f2a'],
        'topics' => [
            [
                'id' => '019a1d95-4c5d-7e6f-8a7b-8c9d0e1f2a3b',
                'subscription' => 'opt_in',
            ],
        ],
    ],
]);

$data = json_decode($response->getBody(), true);
201Resposta
{
  "object": "contact",
  "id": "019a1e00-1a2b-7c3d-8e4f-5a6b7c8d9e0f"
}

#Obter um contato

GET/contacts/{id}

Chave de acesso total

Devolve o contato com os segmentos de que ele faz parte.

Parâmetros de caminho

  • idstringobrigatório
    ID ou e-mail do contato.

Erros

  • 404not_found
    O recurso não existe ou é de outro time.
GET /contacts/{id}

cURL

curl https://api.postal.so/contacts/[email protected] \
  -H "Authorization: Bearer $POSTAL_API_KEY"

Node.js

const response = await fetch('https://api.postal.so/contacts/[email protected]', {
  headers: {
    Authorization: `Bearer ${process.env.POSTAL_API_KEY}`,
  },
});

const data = await response.json();

Python

import os
import requests

response = requests.get(
    "https://api.postal.so/contacts/[email protected]",
    headers={"Authorization": f"Bearer {os.environ['POSTAL_API_KEY']}"},
    timeout=10,
)

data = response.json()

PHP

$client = new \GuzzleHttp\Client(['base_uri' => 'https://api.postal.so']);

$response = $client->get('contacts/[email protected]', [
    'headers' => ['Authorization' => 'Bearer '.getenv('POSTAL_API_KEY')],
]);

$data = json_decode($response->getBody(), true);
200Resposta
{
  "object": "contact",
  "id": "019a1e00-1a2b-7c3d-8e4f-5a6b7c8d9e0f",
  "email": "[email protected]",
  "first_name": "Ana",
  "last_name": "Souza",
  "unsubscribed": false,
  "properties": {
    "plan": "pro",
    "city": "Recife",
    "customer_since": "2024-03-18"
  },
  "created_at": "2026-10-24T14:00:00.000000Z",
  "updated_at": "2026-10-24T14:00:00.000000Z",
  "segments": [
    {
      "id": "019a1d90-3b4c-7d5e-9f6a-7b8c9d0e1f2a",
      "name": "Clientes ativos"
    }
  ]
}

#Atualizar um contato

PATCH/contacts/{id}

Chave de acesso total

Só os campos enviados mudam. Em properties, as chaves enviadas são atualizadas e as outras ficam como estão; mande null ou "" para apagar um valor. Segmentos e tópicos têm endpoints próprios (abaixo). Se algo mudou, dispara contact.updated.

Parâmetros de caminho

  • idstringobrigatório
    ID ou e-mail do contato.

Corpo da requisição (todos opcionais)

  • emailstring
    Novo e-mail.
  • first_namestring | null
    Nome.
  • last_namestring | null
    Sobrenome.
  • unsubscribedboolean
    Descadastra (true) ou reinscreve (false).
  • propertiesobject
    Valores a mudar.

Erros

  • 422validation_error
    E-mail já usado por outro contato, propriedade desconhecida, valor inválido, ou segments/topics no corpo.
  • 404not_found
    O recurso não existe ou é de outro time.
PATCH /contacts/{id}

cURL

curl -X PATCH https://api.postal.so/contacts/019a1e00-1a2b-7c3d-8e4f-5a6b7c8d9e0f \
  -H "Authorization: Bearer $POSTAL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "properties": {
      "plan": "scale",
      "city": null
    }
  }'

Node.js

const response = await fetch('https://api.postal.so/contacts/019a1e00-1a2b-7c3d-8e4f-5a6b7c8d9e0f', {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${process.env.POSTAL_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    properties: {
      plan: 'scale',
      city: null,
    },
  }),
});

const data = await response.json();

Python

import os
import requests

response = requests.patch(
    "https://api.postal.so/contacts/019a1e00-1a2b-7c3d-8e4f-5a6b7c8d9e0f",
    headers={"Authorization": f"Bearer {os.environ['POSTAL_API_KEY']}"},
    json={
        "properties": {
            "plan": "scale",
            "city": None,
        },
    },
    timeout=10,
)

data = response.json()

PHP

$client = new \GuzzleHttp\Client(['base_uri' => 'https://api.postal.so']);

$response = $client->patch('contacts/019a1e00-1a2b-7c3d-8e4f-5a6b7c8d9e0f', [
    'headers' => ['Authorization' => 'Bearer '.getenv('POSTAL_API_KEY')],
    'json' => [
        'properties' => [
            'plan' => 'scale',
            'city' => null,
        ],
    ],
]);

$data = json_decode($response->getBody(), true);
200Resposta
{
  "object": "contact",
  "id": "019a1e00-1a2b-7c3d-8e4f-5a6b7c8d9e0f"
}

#Excluir um contato

DELETE/contacts/{id}

Chave de acesso total

Remove o contato da audiência, com os segmentos e as escolhas de tópicos. Dispara contact.deleted. Para só parar de enviar, prefira unsubscribed: true.

Parâmetros de caminho

  • idstringobrigatório
    ID ou e-mail do contato.

Erros

  • 404not_found
    O recurso não existe ou é de outro time.
DELETE /contacts/{id}

cURL

curl -X DELETE https://api.postal.so/contacts/019a1e00-1a2b-7c3d-8e4f-5a6b7c8d9e0f \
  -H "Authorization: Bearer $POSTAL_API_KEY"

Node.js

const response = await fetch('https://api.postal.so/contacts/019a1e00-1a2b-7c3d-8e4f-5a6b7c8d9e0f', {
  method: 'DELETE',
  headers: {
    Authorization: `Bearer ${process.env.POSTAL_API_KEY}`,
  },
});

const data = await response.json();

Python

import os
import requests

response = requests.delete(
    "https://api.postal.so/contacts/019a1e00-1a2b-7c3d-8e4f-5a6b7c8d9e0f",
    headers={"Authorization": f"Bearer {os.environ['POSTAL_API_KEY']}"},
    timeout=10,
)

data = response.json()

PHP

$client = new \GuzzleHttp\Client(['base_uri' => 'https://api.postal.so']);

$response = $client->delete('contacts/019a1e00-1a2b-7c3d-8e4f-5a6b7c8d9e0f', [
    'headers' => ['Authorization' => 'Bearer '.getenv('POSTAL_API_KEY')],
]);

$data = json_decode($response->getBody(), true);
200Resposta
{
  "object": "contact",
  "id": "019a1e00-1a2b-7c3d-8e4f-5a6b7c8d9e0f",
  "deleted": true
}

#Segmentos de um contato

GET/contacts/{id}/segments

Chave de acesso total

Os segmentos de que o contato faz parte. Aceita limit, after e before.

Parâmetros de caminho

  • idstringobrigatório
    ID ou e-mail do contato.

Erros

  • 404not_found
    O recurso não existe ou é de outro time.
GET /contacts/{id}/segments

cURL

curl https://api.postal.so/contacts/019a1e00-1a2b-7c3d-8e4f-5a6b7c8d9e0f/segments \
  -H "Authorization: Bearer $POSTAL_API_KEY"

Node.js

const response = await fetch('https://api.postal.so/contacts/019a1e00-1a2b-7c3d-8e4f-5a6b7c8d9e0f/segments', {
  headers: {
    Authorization: `Bearer ${process.env.POSTAL_API_KEY}`,
  },
});

const data = await response.json();

Python

import os
import requests

response = requests.get(
    "https://api.postal.so/contacts/019a1e00-1a2b-7c3d-8e4f-5a6b7c8d9e0f/segments",
    headers={"Authorization": f"Bearer {os.environ['POSTAL_API_KEY']}"},
    timeout=10,
)

data = response.json()

PHP

$client = new \GuzzleHttp\Client(['base_uri' => 'https://api.postal.so']);

$response = $client->get('contacts/019a1e00-1a2b-7c3d-8e4f-5a6b7c8d9e0f/segments', [
    'headers' => ['Authorization' => 'Bearer '.getenv('POSTAL_API_KEY')],
]);

$data = json_decode($response->getBody(), true);
200Resposta
{
  "object": "list",
  "has_more": false,
  "data": [
    {
      "object": "segment",
      "id": "019a1d90-3b4c-7d5e-9f6a-7b8c9d0e1f2a",
      "name": "Clientes ativos",
      "description": "Compraram nos últimos 90 dias.",
      "created_at": "2026-10-20T10:00:00.000000Z",
      "updated_at": "2026-10-20T10:00:00.000000Z"
    }
  ]
}

#Adicionar a um segmento

POST/contacts/{id}/segments/{segment_id}

Chave de acesso total

Coloca o contato no segmento. Se ele já estiver lá, nada muda.

Parâmetros de caminho

  • idstringobrigatório
    ID ou e-mail do contato.
  • segment_idstringobrigatório
    ID do segmento.

Erros

  • 404not_found
    O contato ou o segmento não existe.
POST /contacts/{id}/segments/{segment_id}

cURL

curl -X POST https://api.postal.so/contacts/019a1e00-1a2b-7c3d-8e4f-5a6b7c8d9e0f/segments/019a1d90-3b4c-7d5e-9f6a-7b8c9d0e1f2a \
  -H "Authorization: Bearer $POSTAL_API_KEY"

Node.js

const response = await fetch('https://api.postal.so/contacts/019a1e00-1a2b-7c3d-8e4f-5a6b7c8d9e0f/segments/019a1d90-3b4c-7d5e-9f6a-7b8c9d0e1f2a', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.POSTAL_API_KEY}`,
  },
});

const data = await response.json();

Python

import os
import requests

response = requests.post(
    "https://api.postal.so/contacts/019a1e00-1a2b-7c3d-8e4f-5a6b7c8d9e0f/segments/019a1d90-3b4c-7d5e-9f6a-7b8c9d0e1f2a",
    headers={"Authorization": f"Bearer {os.environ['POSTAL_API_KEY']}"},
    timeout=10,
)

data = response.json()

PHP

$client = new \GuzzleHttp\Client(['base_uri' => 'https://api.postal.so']);

$response = $client->post('contacts/019a1e00-1a2b-7c3d-8e4f-5a6b7c8d9e0f/segments/019a1d90-3b4c-7d5e-9f6a-7b8c9d0e1f2a', [
    'headers' => ['Authorization' => 'Bearer '.getenv('POSTAL_API_KEY')],
]);

$data = json_decode($response->getBody(), true);
201Resposta
{
  "object": "contact_segment",
  "contact_id": "019a1e00-1a2b-7c3d-8e4f-5a6b7c8d9e0f",
  "segment_id": "019a1d90-3b4c-7d5e-9f6a-7b8c9d0e1f2a"
}

#Remover de um segmento

DELETE/contacts/{id}/segments/{segment_id}

Chave de acesso total

Parâmetros de caminho

  • idstringobrigatório
    ID ou e-mail do contato.
  • segment_idstringobrigatório
    ID do segmento.

Erros

  • 404not_found
    O contato ou o segmento não existe.
DELETE /contacts/{id}/segments/{segment_id}

cURL

curl -X DELETE https://api.postal.so/contacts/019a1e00-1a2b-7c3d-8e4f-5a6b7c8d9e0f/segments/019a1d90-3b4c-7d5e-9f6a-7b8c9d0e1f2a \
  -H "Authorization: Bearer $POSTAL_API_KEY"

Node.js

const response = await fetch('https://api.postal.so/contacts/019a1e00-1a2b-7c3d-8e4f-5a6b7c8d9e0f/segments/019a1d90-3b4c-7d5e-9f6a-7b8c9d0e1f2a', {
  method: 'DELETE',
  headers: {
    Authorization: `Bearer ${process.env.POSTAL_API_KEY}`,
  },
});

const data = await response.json();

Python

import os
import requests

response = requests.delete(
    "https://api.postal.so/contacts/019a1e00-1a2b-7c3d-8e4f-5a6b7c8d9e0f/segments/019a1d90-3b4c-7d5e-9f6a-7b8c9d0e1f2a",
    headers={"Authorization": f"Bearer {os.environ['POSTAL_API_KEY']}"},
    timeout=10,
)

data = response.json()

PHP

$client = new \GuzzleHttp\Client(['base_uri' => 'https://api.postal.so']);

$response = $client->delete('contacts/019a1e00-1a2b-7c3d-8e4f-5a6b7c8d9e0f/segments/019a1d90-3b4c-7d5e-9f6a-7b8c9d0e1f2a', [
    'headers' => ['Authorization' => 'Bearer '.getenv('POSTAL_API_KEY')],
]);

$data = json_decode($response->getBody(), true);
200Resposta
{
  "object": "contact_segment",
  "contact_id": "019a1e00-1a2b-7c3d-8e4f-5a6b7c8d9e0f",
  "segment_id": "019a1d90-3b4c-7d5e-9f6a-7b8c9d0e1f2a",
  "deleted": true
}

#Tópicos de um contato

GET/contacts/{id}/topics

Chave de acesso total

Todos os tópicos do time, em ordem alfabética, com a inscrição do contato: a escolha dele ou, se ele não escolheu, o padrão do tópico.

Parâmetros de caminho

  • idstringobrigatório
    ID ou e-mail do contato.

Erros

  • 404not_found
    O recurso não existe ou é de outro time.
GET /contacts/{id}/topics

cURL

curl https://api.postal.so/contacts/019a1e00-1a2b-7c3d-8e4f-5a6b7c8d9e0f/topics \
  -H "Authorization: Bearer $POSTAL_API_KEY"

Node.js

const response = await fetch('https://api.postal.so/contacts/019a1e00-1a2b-7c3d-8e4f-5a6b7c8d9e0f/topics', {
  headers: {
    Authorization: `Bearer ${process.env.POSTAL_API_KEY}`,
  },
});

const data = await response.json();

Python

import os
import requests

response = requests.get(
    "https://api.postal.so/contacts/019a1e00-1a2b-7c3d-8e4f-5a6b7c8d9e0f/topics",
    headers={"Authorization": f"Bearer {os.environ['POSTAL_API_KEY']}"},
    timeout=10,
)

data = response.json()

PHP

$client = new \GuzzleHttp\Client(['base_uri' => 'https://api.postal.so']);

$response = $client->get('contacts/019a1e00-1a2b-7c3d-8e4f-5a6b7c8d9e0f/topics', [
    'headers' => ['Authorization' => 'Bearer '.getenv('POSTAL_API_KEY')],
]);

$data = json_decode($response->getBody(), true);
200Resposta
{
  "object": "list",
  "has_more": false,
  "data": [
    {
      "id": "019a1d95-4c5d-7e6f-8a7b-8c9d0e1f2a3b",
      "name": "Novidades",
      "description": "Lançamentos e promoções, uma vez por semana.",
      "visibility": "public",
      "default_subscription": "opt_in",
      "subscription": "opt_in"
    },
    {
      "id": "019a1d95-4c5e-7f70-9b8c-9d0e1f2a3b4c",
      "name": "Pesquisas",
      "description": null,
      "visibility": "private",
      "default_subscription": "opt_out",
      "subscription": "opt_out"
    }
  ]
}

#Mudar a inscrição em tópicos

PATCH/contacts/{id}/topics

Chave de acesso total

Registra a escolha do contato em um ou mais tópicos. Os tópicos não enviados ficam como estão.

Parâmetros de caminho

  • idstringobrigatório
    ID ou e-mail do contato.

Corpo da requisição

  • topicsobject[]obrigatório
    De 1 a 100 escolhas.
    • idstringobrigatório
      ID do tópico.
    • subscriptionstringobrigatório
      opt_in ou opt_out.

Erros

  • 422validation_error
    Algum campo é inválido. A mensagem diz qual.
  • 404not_found
    O contato ou algum tópico não existe.
PATCH /contacts/{id}/topics

cURL

curl -X PATCH https://api.postal.so/contacts/019a1e00-1a2b-7c3d-8e4f-5a6b7c8d9e0f/topics \
  -H "Authorization: Bearer $POSTAL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "topics": [
      {
        "id": "019a1d95-4c5d-7e6f-8a7b-8c9d0e1f2a3b",
        "subscription": "opt_out"
      }
    ]
  }'

Node.js

const response = await fetch('https://api.postal.so/contacts/019a1e00-1a2b-7c3d-8e4f-5a6b7c8d9e0f/topics', {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${process.env.POSTAL_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    topics: [
      {
        id: '019a1d95-4c5d-7e6f-8a7b-8c9d0e1f2a3b',
        subscription: 'opt_out',
      },
    ],
  }),
});

const data = await response.json();

Python

import os
import requests

response = requests.patch(
    "https://api.postal.so/contacts/019a1e00-1a2b-7c3d-8e4f-5a6b7c8d9e0f/topics",
    headers={"Authorization": f"Bearer {os.environ['POSTAL_API_KEY']}"},
    json={
        "topics": [
            {
                "id": "019a1d95-4c5d-7e6f-8a7b-8c9d0e1f2a3b",
                "subscription": "opt_out",
            },
        ],
    },
    timeout=10,
)

data = response.json()

PHP

$client = new \GuzzleHttp\Client(['base_uri' => 'https://api.postal.so']);

$response = $client->patch('contacts/019a1e00-1a2b-7c3d-8e4f-5a6b7c8d9e0f/topics', [
    'headers' => ['Authorization' => 'Bearer '.getenv('POSTAL_API_KEY')],
    'json' => [
        'topics' => [
            [
                'id' => '019a1d95-4c5d-7e6f-8a7b-8c9d0e1f2a3b',
                'subscription' => 'opt_out',
            ],
        ],
    ],
]);

$data = json_decode($response->getBody(), true);
200Resposta
{
  "object": "contact",
  "id": "019a1e00-1a2b-7c3d-8e4f-5a6b7c8d9e0f"
}