# Introdução a API

A The Members disponibiliza a integração de aplicações externas para importações e atualizações gerais de usuário.

## Conectando a API&#x20;

Bem-vindo(a) a documentação do micro serviço de importação e gerenciamento de usuários.&#x20;

Antes de conectarmos a API de importação será necessário ter um usuário desenvolvedor criado.

{% content-ref url="/pages/MjS6aHDZfTx5TrEjsznH" %}
[Criando usuário desenvolvedor](/api-gerenciamento-de-usuarios/referencia-da-api/criando-usuario-desenvolvedor)
{% endcontent-ref %}

Agora que você já tem um usuário desenvolvedor vamos iniciar:&#x20;

O endereço base de comunicação é <mark style="color:blue;">`https://registration.themembers.dev.br/api`</mark> , acompanhado sempre do protocolo seguro <mark style="color:blue;">`https://`</mark> como prefixo. As versões da API são agrupadas por diretório e parâmetros, sufixadas ao endereço base.&#x20;

Exemplo: <mark style="color:blue;"><https://registration.themembers.dev.br/api/diretorio/{parametro}/{parametro}></mark>

Sempre envie dados em modelo <mark style="background-color:green;">`JSON`</mark> no corpo das requisições.

Em referência da API poderá acessar todos os métodos:

{% content-ref url="/pages/HjwsOdc14L9umiZy7aId" %}
[Referência da API](/api-gerenciamento-de-usuarios/referencia-da-api)
{% endcontent-ref %}


# Referência da API

Aqui ficaram listados os métodos para facilitar o acesso direto.

{% hint style="warning" %}
**IMPORTANTE:**  como mencionado na seção [introdução a API](/) as requisições sempre devem seguir o padrão:

&#x20;<mark style="color:blue;background-color:orange;">`URL_BASE`</mark>/diretorio/diretorio/{token\_do\_desenvolvedor}/{token\_do\_cliente}
{% endhint %}

## Usuários

Todos os métodos relacionados á usuários:

{% content-ref url="/pages/8H3n4TbrsFIvz9dFdJbm" %}
[Usuários](/api-gerenciamento-de-usuarios/referencia-da-api/usuarios)
{% endcontent-ref %}


# Criando usuário desenvolvedor

Vamos começar gerando um usuário desenvolvedor e um token corporativo.

## Criando uma conta de desenvolvedor

{% hint style="warning" %}
Assim que o usuário for criado salve o ID, pois vamos precisar para criar o token da aplicação.
{% endhint %}

Para criar uma conta desenvolvedor, enviar uma solicitação para o endpoint <mark style="color:blue;">`https://api.themembers.com.br/api/register`</mark>.    &#x20;

Vamos la! Bora começar! :tada:

## Exemplo de criação de usuário desenvolvedor:

<mark style="color:green;">`POST`</mark> `https://api.themembers.com.br/api/register`

Abaixo os parâmetros para criação de usuário desenvolvedor.

#### Request Body

| Name                                                   | Type   | Description                |
| ------------------------------------------------------ | ------ | -------------------------- |
| name<mark style="color:red;">\*</mark>                 | string | Nome do desenvolvedor      |
| document<mark style="color:red;">\*</mark>             | string | Documento do desenvolvedor |
| email<mark style="color:red;">\*</mark>                | string | E-mail do desenvolvedor    |
| phone<mark style="color:red;">\*</mark>                | string | Telefone do desenvolvedor  |
| corporation\_name<mark style="color:red;">\*</mark>    | string | Nome da empresa            |
| corporation\_cnpj<mark style="color:red;">\*</mark>    | string | CNPJ da empresa            |
| app\_name<mark style="color:red;">\*</mark>            | string | Nome do aplicativo         |
| app\_desc<mark style="color:red;">\*</mark>            | string | Descrição do aplicativo    |
| corporation\_address<mark style="color:red;">\*</mark> | string | Endereço da empresa        |

{% tabs %}
{% tab title="200 Conta criada com sucesso (Retornará o usuário)" %}

```javascript
[
    {
        "id": UUID, // ID DO USUÁRIO DESENVOLVEDOR
        "name": "Seu nome",
        "document": "123.456.789-98",
        "email": "email@email.com",
        "phone": "(00) 00 00000-9999",
        "corporation_name": "Empresa Teste",
        "corporation_cnpj": "00.000.000/0001-00",
        "corporation_address": "Rua teste, Nº 15, Bairro teste, Cidade-SP",
        "app_name": "teste-teste",
        "app_desc": "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.",
        "token": null,
        "token_status": 0,
        "created_at": null,
        "updated_at": null
    }
]
```

{% endtab %}

{% tab title="401 Não autorizado (Verifique os campos)" %}

{% endtab %}
{% endtabs %}

Agora vamos gerar o token da aplicação usando o `ID` do seu usuário:

## Gerar token do desenvolvedor

<mark style="color:green;">`POST`</mark> `https://api.themembers.com.br/api/generate-token`

O token de desenvolvedor sempre será utilizado em requisições. Assim que criado, garanta que ele sempre seja enviado sempre.

#### Request Body

| Name                                       | Type | Description                   |
| ------------------------------------------ | ---- | ----------------------------- |
| user\_id<mark style="color:red;">\*</mark> | UUID | ‘ID’ do usuário desenvolvedor |

{% tabs %}
{% tab title="200: OK Token gerado com sucesso" %}

```javascript
{
    "token" : "uuid"  //SALVE SEU TOKEN DE DESENVOLVEDOR
}
```

{% endtab %}

{% tab title="401: Unauthorized Usuário não encontrado" %}

```javascript
{
    // Response
}
```

{% endtab %}
{% endtabs %}

### Parabéns :tada:

Agora você pode se conectar fazer requisições na API de Registro e Atualização de usuários da The Members!


# Usuários

Nesta seção estão disponibilizados todos os métodos referentes á usuários desde á importação em massa até uma simples atualização de estado.

{% hint style="warning" %}
Atenção: O **{**&#x74;oken\_da\_plataform&#x61;**}** é disponibilizado pelo administrador da plataforma. Ele pode encontrar seu token acessando a dashboard, na página de: Plataforma > Configurações > Token.
{% endhint %}

<figure><img src="https://297705385-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FmbuonzfEbI223CTyjCzW%2Fuploads%2FQgj83HHN6T5MC7ccz4vb%2Fimage.png?alt=media&amp;token=372631e9-cd5f-4da5-89af-4d2443dcd35d" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
**Importante**: Sempre altere os dados entre chaves com o parâmetro respectivo.&#x20;

**Exemplo prático**:

No metodo estará descrevendo a rota com&#x6F;**:**

URL\_BASE/users/show-id/{id}/{token\_do\_desenvolvedor}/{token\_da\_plataforma}

Como ficará na prática:&#x20;

URL\_BASE/users/show-id/*<mark style="background-color:purple;">66caec96-...432</mark>*/*<mark style="color:green;background-color:purple;">66caec96-4749-...e07ed7</mark>*/*<mark style="background-color:purple;">66caec96-...4324</mark>*

{% endhint %}

## Buscando usuário

#### Busca de usuário por id, e-mail, documento e id de referência.

## Busca por ID.

<mark style="color:blue;">`GET`</mark> `URL_BASE/users/show-id/{id}/{token_do_desenvolvedor}/{token_da_plataforma}`

Nesta rota troque o termo {id} pelo id do usuário que deseja buscar.

{% tabs %}
{% tab title="200: OK Usuário encontrado com sucesso " %}

```javascript
{
    "user": {
        "id": "550e8400-e29b-41d4-a716-446655440000",
        "name": "João",
        "last_name": "Silva",
        "email": "joao.silva@email.com",
        "photo_url": null,
        "document": "123.456.789-00",
        "genre": null,
        "birth": null,
        "phone": "(11) 99999-9999",
        "status": 1,
        "reference_id": "ref-12345",
        "created_at": "2025-01-15T10:30:00.000000Z",
        "updated_at": "2025-06-18T14:00:00.000000Z"
    },
    "subscription": [
        {
            "id": 1234,
            "active": 1,
            "user_id": "550e8400-e29b-41d4-a716-446655440000",
            "package_id": "660e8400-e29b-41d4-a716-446655440001",
            "created_at": "2025-01-15T10:30:00.000000Z",
            "updated_at": "2025-06-18T14:00:00.000000Z",
            "expiration_date": "2026-01-15T00:00:00.000000Z",
            "cancel_date": null
        }
    ]
}
```

{% endtab %}

{% tab title="400: Bad Request Usuário não encontrado (Verifique o ID)" %}

{% endtab %}
{% endtabs %}

## Busca por documento.

<mark style="color:blue;">`GET`</mark> `URL_BASE/users/show-document/{document}/{token_do_desenvolvedor}/{token_da_plataforma}`

Nesta rota troque o termo {document} pelo documento do usuário que deseja buscar.

{% tabs %}
{% tab title="200: OK Usuário encontrado com sucesso " %}

```javascript
 {
            "id": "UUID",
            "name": "Novo",
            "last_name": "Aluno(a)",
            "email": "aluno@email.com",
            "photo_url": null,
            "document": "000.000.000-00",
            "genre": null,
            "birth": null,
            "phone": null,
            "status": 1,
            "created_at": "YYYY-MM-DD H:i:s",
            "updated_at": "YYYY-MM-DD H:i:s",
            "subscription": {
                "id": "0",
                "tenant_id": 0,
                "active": 1,
                "user_id": "UUID",
                "package_id": "UUID",
                "expiration_date": "YYYY-MM-DD H:i:s",
                "created_at": "YYYY-MM-DD H:i:s",
                "updated_at": "YYYY-MM-DD H:i:s",
            }
        }
```

{% endtab %}

{% tab title="400: Bad Request Usuário não encontrado (Verifique o documento)" %}

{% endtab %}
{% endtabs %}

## Busca por e-mail.

<mark style="color:blue;">`GET`</mark> `URL_BASE/users/show-email/{email}/{token_do_desenvolvedor}/{token_da_plataforma}`

Nesta rota troque o termo {email} pelo email do usuário que deseja buscar.

{% tabs %}
{% tab title="200: OK Usuário encontrado com sucesso " %}

```javascript
 {
            "id": "UUID",
            "name": "Novo",
            "last_name": "Aluno(a)",
            "email": "aluno@email.com",
            "photo_url": null,
            "document": "000.000.000-00",
            "genre": null,
            "birth": null,
            "phone": null,
            "status": 1,
            "created_at": "YYYY-MM-DD H:i:s",
            "updated_at": "YYYY-MM-DD H:i:s",
            "subscription": {
                "id": "0",
                "tenant_id": 0,
                "active": 1,
                "user_id": "UUID",
                "package_id": "UUID",
                "expiration_date": "YYYY-MM-DD H:i:s",
                "created_at": "YYYY-MM-DD H:i:s",
                "updated_at": "YYYY-MM-DD H:i:s",
            }
        }
```

{% endtab %}

{% tab title="400: Bad Request Usuário não encontrado (Verifique o documento)" %}

{% endtab %}
{% endtabs %}

## Busca por id de referência .

<mark style="color:blue;">`GET`</mark> `URL_BASE/users/show-reference/{reference_id}/{token_do_desenvolvedor}/{token_da_plataforma}`

Nesta rota troque o termo {reference\_id} pelo id de referência do usuário que deseja buscar.

{% tabs %}
{% tab title="200: OK Usuário encontrado com sucesso " %}

```javascript
 {
            "id": "UUID",
            "name": "Novo",
            "last_name": "Aluno(a)",
            "email": "aluno@email.com",
            "photo_url": null,
            "document": "000.000.000-00",
            "genre": null,
            "birth": null,
            "phone": null,
            "status": 1,
            "created_at": "YYYY-MM-DD H:i:s",
            "updated_at": "YYYY-MM-DD H:i:s",
            "subscription": {
                "id": "0",
                "tenant_id": 0,
                "active": 1,
                "user_id": "UUID",
                "package_id": "UUID",
                "expiration_date": "YYYY-MM-DD H:i:s",
                "created_at": "YYYY-MM-DD H:i:s",
                "updated_at": "YYYY-MM-DD H:i:s",
            }
        }
```

{% endtab %}

{% tab title="400: Bad Request Usuário não encontrado (Verifique o documento)" %}

{% endtab %}
{% endtabs %}

## Criando usuário(s)

Então vamos ao método de criação de usuário(s):

**Exemplo de JSON para criação de um ou mais usuários**:

## Criar um ou mais usuários.

<mark style="color:green;">`POST`</mark> `URL_BASE/users/create/{token_do_desenvolvedor}/{token_da_plataforma}`

Usar JSON de exemplo que esta logo abaixo.

{% tabs %}
{% tab title="200: OK Dados enviados para a fila." %}

{% endtab %}
{% endtabs %}

```json
{
	"product_id" : ["123456789"],
	"users": [
		{
		 "name": "Aluno",
		 "last_name":"teste",
		 "email":"aluno@teste.com.br", // dado obrigatório
		 "password": "senhadoalunoopcional", // dado opcional
		 "document":"123.456.789-10",
		 "phone":"(11)99999-9999",
		 "reference_id": "789456123546",
		 "accession_date" : "YYYY-MM-DD",
		},{
		 "name": "Aluno",
		 "last_name":"teste",
		 "email":"aluno@teste.com.br", // dado obrigatório
		 "password": "senhadoalunoopcional", // dado opcional		 
		 "document":"123.456.789-10",
		 "phone":"(11)99999-9999",
		 "reference_id": "789456123546",
		  "accession_date" : "YYYY-MM-DD",
		}
	]
}
```

{% hint style="info" %}
A propriedade product\_id refere-se ao product\_id registrado no plano criado no painel administrador da The Members. Essa propriedade é de extrema importancia. Com esse valor criamos a inscrição do aluno á plataforma do infoprodutor.
{% endhint %}

## Exclusão de usuário

## Excluir por id.

<mark style="color:red;">`DELETE`</mark> `URL_BASE/users/destroy-user-id/{user_id}/{token_do_desenvolvedor}/{token_da_plataforma}`

Após a exclusão do usuário a operação não poderá ser revertida.

{% tabs %}
{% tab title="200: OK Usuário excluído com sucesso." %}

```javascript
{
    // Response
}
```

{% endtab %}

{% tab title="400: Bad Request Usuário não encontrado." %}

```javascript
{
    // Response
}
```

{% endtab %}
{% endtabs %}

## Excluir por documento.

<mark style="color:red;">`DELETE`</mark> `URL_BASE/users/destroy-document/{document}/{token_do_desenvolvedor}/{token_da_plataforma}`

Após a exclusão do usuário a operação não poderá ser revertida.

{% tabs %}
{% tab title="200: OK Usuário excluído com sucesso." %}

```javascript
{
    // Response
}
```

{% endtab %}

{% tab title="400: Bad Request Usuário não encontrado." %}

```javascript
{
    // Response
}
```

{% endtab %}
{% endtabs %}

## Excluir por email.

<mark style="color:red;">`DELETE`</mark> `URL_BASE/users/destroy-email/{email}/{token_do_desenvolvedor}/{token_da_plataforma}`

Após a exclusão do usuário a operação não poderá ser revertida.

{% tabs %}
{% tab title="200: OK Usuário excluído com sucesso." %}

```javascript
{
    // Response
}
```

{% endtab %}

{% tab title="400: Bad Request Usuário não encontrado." %}

```javascript
{
    // Response
}
```

{% endtab %}
{% endtabs %}

## Excluir por id de referência.

<mark style="color:red;">`DELETE`</mark> `URL_BASE/users/destroy-reference-id/{reference_id}/{token_do_desenvolvedor}/{token_da_plataforma}`

Após a exclusão do usuário a operação não poderá ser revertida.

{% tabs %}
{% tab title="200: OK Usuário excluído com sucesso." %}

```javascript
{
    // Response
}
```

{% endtab %}

{% tab title="400: Bad Request Usuário não encontrado." %}

```javascript
{
    // Response
}
```

{% endtab %}
{% endtabs %}


# Assinaturas

Nesta seção estão disponibilizados todos os métodos referentes á assinatura do usuário.

## Criação de assinatura para um usuário

<mark style="color:blue;">`POST`</mark> `URL_BASE/users/create/user-subscription/{token_do_desenvolvedor}/{token_da_plataforma}`

#### Request Body

| Name                                          | Type   | Description                                            |
| --------------------------------------------- | ------ | ------------------------------------------------------ |
| product\_id<mark style="color:red;">\*</mark> | String | Id do produto                                          |
| user\_id                                      | String | Id do usuário (uuid)                                   |
| payment\_last\_date                           | Date   | Data do último pagamento - formato: Y-m-d H:i:s        |
| expiration\_date                              | Date   | Data de expiração da assinatura - formato: Y-m-d H:i:s |
| reference\_id                                 | String | Id referência                                          |

{% tabs %}
{% tab title="200: OK " %}

```json
{
    "check": true,
    "data": {
        "user_subscription": {
            "id": 1234,
            "tenant_id": 4451,
            "active": 1,
            "status": "active",
            "user_id": "550e8400-e29b-41d4-a716-446655440000",
            "package_id": "660e8400-e29b-41d4-a716-446655440001",
            "payment_last_date": "2025-06-18T10:30:00.000000Z",
            "expiration_date": "2026-06-18T00:00:00.000000Z",
            "accession_date": "2025-06-18T10:30:00.000000Z",
            "created_at": "2025-06-18T10:30:00.000000Z",
            "updated_at": "2025-06-18T10:30:00.000000Z"
        }
    },
    "errors": [],
    "messages": ["Subscription criada com sucesso!"]
}
```

{% endtab %}
{% endtabs %}

## Editar de assinatura para um usuário

<mark style="color:orange;">`PUT`</mark> `URL_BASE/users/update/user-subscription/{token_do_desenvolvedor}/{token_da_plataforma}`

#### Request Body

| Name                                          | Type   | Description                                            |
| --------------------------------------------- | ------ | ------------------------------------------------------ |
| product\_id<mark style="color:red;">\*</mark> | String | Id do produto                                          |
| user\_id<mark style="color:red;">\*</mark>    | String | Id do usuário (uuid)                                   |
| payment\_last\_date                           | Date   | Data do último pagamento - formato: Y-m-d H:i:s        |
| expiration\_date                              | Date   | Data de expiração da assinatura - formato: Y-m-d H:i:s |

{% tabs %}
{% tab title="200: OK " %}

```json
{
    "check": true,
    "data": [],
    "errors": [],
    "messages": ["Assinatura atualizada com sucesso!"]
}
```

{% endtab %}
{% endtabs %}

## Ativar a assinatura para um usuário

<mark style="color:orange;">`PUT`</mark> `URL_BASE/users/update/active-user-subscription/{token_do_desenvolvedor}/{token_da_plataforma}`

#### Request Body

| Name                                          | Type   | Description          |
| --------------------------------------------- | ------ | -------------------- |
| product\_id<mark style="color:red;">\*</mark> | String | Id do produto        |
| user\_id<mark style="color:red;">\*</mark>    | String | Id do usuário (uuid) |

{% tabs %}
{% tab title="200: OK " %}

```json
{
    "check": true,
    "data": [],
    "errors": [],
    "messages": ["Inscrição ativada com sucesso!"]
}
```

{% endtab %}
{% endtabs %}

## Desativar a assinatura para um usuário

<mark style="color:orange;">`PUT`</mark> `URL_BASE/users/update/disable-user-subscription/{token_do_desenvolvedor}/{token_da_plataforma}`

#### Request Body

| Name                                          | Type   | Description          |
| --------------------------------------------- | ------ | -------------------- |
| product\_id<mark style="color:red;">\*</mark> | String | Id do produto        |
| user\_id<mark style="color:red;">\*</mark>    | String | Id do usuário (uuid) |

{% tabs %}
{% tab title="200: OK " %}

```json
{
    "check": true,
    "data": [],
    "errors": [],
    "messages": ["Inscrição inativa com sucesso!"]
}
```

{% endtab %}
{% endtabs %}

## Deletar assinatura por id referência

<mark style="color:red;">`DELETE`</mark> `URL_BASE/users/destroy-subscription-reference-id/{reference_id}/{product_id}/{token_do_desenvolvedor}/{token_da_plataforma}`

Após a exclusão do usuário a operação não poderá ser revertida.

{% tabs %}
{% tab title="200: OK " %}

```json
{
    "check": true,
    "data": [],
    "errors": [],
    "messages": ["Subscription apagada"]
}
```

{% endtab %}

{% tab title="400: Bad Request " %}

{% endtab %}
{% endtabs %}

## Deletar assinatura por id do usuário

<mark style="color:red;">`DELETE`</mark> `URL_BASE/users/destroy-subscription-user-id/{user_id}/{product_id}/{token_do_desenvolvedor}/{token_da_plataforma}`

Após a exclusão do usuário a operação não poderá ser revertida.

{% tabs %}
{% tab title="200: OK " %}

```json
{
    "check": true,
    "data": [],
    "errors": [],
    "messages": ["Subscription apagada"]
}
```

{% endtab %}

{% tab title="400: Bad Request " %}

{% endtab %}
{% endtabs %}


# Ranking

Nesta seção estão disponibilizados todos os métodos referentes ao ranking.

{% hint style="info" %}
**Importante**: Sempre altere os dados entre chaves com o parâmetro respectivo.&#x20;

**Exemplo prático**:

No metodo estará descrevendo a rota com&#x6F;**:**

URL\_BASE/users/show-id/{id}/`{token_do_desenvolvedor}/{token_da_plataforma}`

Como ficará na prática:&#x20;

URL\_BASE/users/show-id/*<mark style="background-color:purple;">66caec96-...432</mark>*/*<mark style="color:green;background-color:purple;">66caec96-4749-...e07ed7</mark>*/*<mark style="background-color:purple;">66caec96-...4324</mark>*
{% endhint %}

## Adicionar pontos a um usuário específico

<mark style="color:orange;">`PUT`</mark> `URL_BASE/partners/ranking/add-points`

#### Request Body Json

{% code lineNumbers="true" %}

```json
{
    "user_id":"ID do usuário", //Ex:1feb1aa1-aa1d-11df-aa1e-1aa11b1aaaaa
    "points":"1",
    "developer_token": "token_do_desenvolvedor",
    "platform_token":"token_da_plataforma"
}
```

{% endcode %}

Possíveis retornos da requisição:

{% tabs %}
{% tab title="200: OK " %}

```javascript
{
    "user_id": "",
    "tenant_id": "",
    "score": "",
    "posts": "",
    "comments": "",
    "replies": ""
}
```

{% endtab %}

{% tab title="400: Bad Request " %}

```javascript
{
    "error": []
}
```

{% endtab %}
{% endtabs %}


# Produtos

Nesta seção estão disponibilizados todos os métodos referentes á produtos.

{% hint style="info" %}
**Importante**: Sempre altere os dados entre chaves com o parâmetro respectivo.&#x20;

**Exemplo prático**:

No metodo estará descrevendo a rota com&#x6F;**:**

URL\_BASE/users/show-id/{id}/`{token_do_desenvolvedor}/{token_da_plataforma}`

Como ficará na prática:&#x20;

URL\_BASE/users/show-id/*<mark style="background-color:purple;">66caec96-...432</mark>*/*<mark style="color:green;background-color:purple;">66caec96-4749-...e07ed7</mark>*/*<mark style="background-color:purple;">66caec96-...4324</mark>*
{% endhint %}

## Buscar todos os produtos

<mark style="color:$success;">`GET`</mark>`URL_BASE/products/all-products/{token_do_desenvolvedor}/{token_da_plataforma}`

Possíveis retornos da requisição:

{% tabs %}
{% tab title="200: OK " %}

```json
{
    "data": [
        {
            "id": "11111111-aaaa-4444-bbbb-1234567890ab",
            "title": "Curso Avançado de Marketing Digital",
            "description": "Aprenda estratégias avançadas de marketing digital para aumentar suas vendas online.",
            "period": "12 meses",
            "value": 997.50,
            "product_id": "prod-curso-marketing-001",
            "lifetime": 0,
            "status": "active",
            "type": "Recorrente",
            "checkout": "internal",
            "sales_page_url": "https://minhaempresa.com/curso-marketing-digital",
            "support_email": "suporte@minhaempresa.com",
            "trial": "7 dias",
            "upsell": "Pacote VIP",
            "upsell_url": "https://minhaempresa.com/pacote-vip",
            "checkout_id": 101,
            "interval": 1,
            "interval_type": "month",
            "created_at": "2025-01-15T10:30:00.000000Z",
            "updated_at": "2025-07-01T14:00:00.000000Z"
        }
    ]
}
```

{% endtab %}
{% endtabs %}

## Buscar todos os produtos

<mark style="color:$success;">`GET`</mark>`URL_BASE/products/show-product/{product_id}/{token_do_desenvolvedor}/{token_da_plataforma}`

Possíveis retornos da requisição:

{% tabs %}
{% tab title="200: OK " %}

```javascript
{
    "data": [
        {
            "id": "11111111-aaaa-4444-bbbb-1234567890ab",
            "title": "Curso Avançado de Marketing Digital",
            "description": "Aprenda estratégias avançadas de marketing digital para aumentar suas vendas online.",
            "period": "12 meses",
            "value": 997.50,
            "product_id": "prod-curso-marketing-001",
            "lifetime": 0,
            "status": "active",
            "type": "Recorrente",
            "checkout": "internal",
            "sales_page_url": "https://minhaempresa.com/curso-marketing-digital",
            "support_email": "suporte@minhaempresa.com",
            "trial": "7 dias",
            "upsell": "Pacote VIP",
            "upsell_url": "https://minhaempresa.com/pacote-vip",
            "checkout_id": 101,
            "interval": 1,
            "interval_type": "month",
            "created_at": "2025-01-15T10:30:00.000000Z",
            "updated_at": "2025-07-01T14:00:00.000000Z"
        }
    ]
}
```

{% endtab %}
{% endtabs %}


# Link Mágico

Gere um link mágico de autenticação para um aluno através da API.

O link mágico permite que o aluno acesse a plataforma sem precisar informar senha e possui um tempo de validade configurável.

### Endpoints

É possível gerar o link mágico utilizando o **ID do aluno** ou o **e-mail do aluno**.

#### Gerar pelo ID do aluno

```http
POST URL_BASE/students/{student_id}/magic-link
```

#### Gerar pelo e-mail do aluno

```http
POST URL_BASE/students/email/{email}/magic-link
```

> **Importante:** substitua os valores entre chaves `{}` pelos respectivos dados do aluno.

***

### Body

O parâmetro `expires_in` é opcional e define por quanto tempo o link mágico permanecerá válido.

```json
{
  "expires_in": 30
}
```

#### Parâmetro `expires_in`

| Campo        | Tipo      | Obrigatório | Descrição                                         |
| ------------ | --------- | ----------- | ------------------------------------------------- |
| `expires_in` | `integer` | Não         | Tempo de validade do link mágico, em **minutos**. |

Regras do parâmetro:

* **Mínimo:** `1` minuto.
* **Máximo:** `180` minutos (3 horas).
* **Padrão:** `5` minutos quando o parâmetro não é informado.
* **Unidade:** minutos.
* Valores menores que `1` são rejeitados com erro de validação.
* Valores não numéricos são rejeitados com erro de validação.
* Valores superiores a `180` são limitados automaticamente a `180` minutos.

A validade efetiva do link será sempre o menor valor entre `expires_in` e o TTL máximo do token de autenticação, que atualmente é de **180 minutos**.

***

### Exemplo usando o ID do aluno

```http
POST URL_BASE/students/{student_id}/magic-link
```

Body:

```json
{
  "expires_in": 30
}
```

Nesse exemplo, o link mágico será válido por **30 minutos**.

***

### Exemplo usando o e-mail do aluno

```http
POST URL_BASE/students/email/aluno@exemplo.com/magic-link
```

Body:

```json
{
  "expires_in": 60
}
```

Nesse exemplo, o link mágico será válido por **60 minutos**.

***

### Utilizando o valor padrão

Caso `expires_in` não seja informado:

```json
{}
```

o link mágico será válido por **5 minutos**.

***

### Resposta esperada

```json
{
  "status": "success",
  "url": "https://teste.themembers.com.br/login-magico/{token_magico}",
  "user": {
    "id": "{id_do_usuario}",
    "name": "{nome_do_usuario}",
    "last_name": "{sobrenome_do_usuario}",
    "email": "{email_do_usuario}"
  }
}
```

O valor retornado no campo `url` corresponde ao endereço que deve ser utilizado pelo aluno para realizar o acesso através do link mágico.


# Relatório de Curso DEPRECIADO

Página dedicada a emissão de relatórios por API.

#### Consumo do aluno sobre um curso

Filtro de aluno em cursos, onde recuperamos dados dos alunos no curso, data de primeiro e ultimo acesso e data de finalização do curso.

<mark style="color:$success;">`GET`</mark>`URL_BASE/partners/reports/courses/{token_do_desenvolvedor}/{token_da_plataforma}`

| Nome                  | Valor                                                                                               |
| --------------------- | --------------------------------------------------------------------------------------------------- |
| `limit`               | 1 até 500                                                                                           |
| `subscription_status` | `active`, `inactive`                                                                                |
| `accessed`            | `TRUE`, `FALSE`                                                                                     |
| `course_finished`     | `TRUE`, `FALSE`                                                                                     |
| `order_by[campo]`     | Chaves: `'user_name'`, `'course_name'`, `'course_created_at'`, `'created_at'`; Valor: `asc`, `desc` |
| `course_id`           | ID do curso                                                                                         |
| `user_id`             | ID do usuário                                                                                       |
| `course_started_at`   | Data/hora do primeiro acesso do aluno ao curso (formato: `Y-m-d H:i:s`)                             |

#### Exemplo de Resposta

```json
{
    "data": [
        {
            "id": "30cdedb8-a3aa-4ba9-9695-714c7f115e0d",
            "name": "Curso",
            "description": "Descrição do curso",
            "user_id": "e3b55d11-b568-40a2-87d1-2a67e5033619",
            "user_name": "John Doe",
            "user_email": "johndoe@example.com",
            "subscription_status": "active",
            "accessed": true,
            "last_access_at": "2025-09-01 17:31:10",
            "course_finished": false,
            "course_started_at": "2025-09-01 13:56:09",
            "course_finished_at": null,
            "updated_at": "2025-09-01 13:56:09"
        }
    ],
    "path": "http://registration.themembers.dev.br/api/partners/reports/courses/{token_do_desenvolvedor}/{token_da_plataforma}",
    "per_page": 500,
    "next_cursor": null,
    "next_page_url": null,
    "prev_cursor": null,
    "prev_page_url": null
}
```

#### Quantidade de usuários no curso

Este endpoint permite recuperar a quantidade de alunos no curso.

<mark style="color:$success;">`GET`</mark>`URL_BASE/partners/reports/courses/user-count/{token_do_desenvolvedor}/{token_da_plataforma}`<br>

**Filtros Disponíveis**:

| Nome                  | Valor                                                                                               |
| --------------------- | --------------------------------------------------------------------------------------------------- |
| `limit`               | 1 até 500                                                                                           |
| `subscription_status` | `active`, `inactive`(contar somente usuários com este status de assinatura)                         |
| `accessed`            | `TRUE`, `FALSE` (contar somente usuários que acessaram)                                             |
| `course_finished`     | `TRUE`, `FALSE`(contar somente usuários que concluíram)                                             |
| `order_by[campo]`     | Chaves: `'user_name'`, `'course_name'`, `'course_created_at'`, `'created_at'`; Valor: `asc`, `desc` |
| `course_id`           | ID do curso (buscar quantos alunos um único curso possui)                                           |
| `user_id`             | ID do usuário (saber quais cursos o aluno tem em sua assinatura)                                    |

#### Exemplo de Resposta

```json
{
    "data": [
        {
            "id": "6754aabe-1d8e-4a12-9f5d-686c7e79e0b1",
            "name": "Teste TMS 4723",
            "description": "Teste TMS 4723",
            "created_at": "2025-01-17 08:26:40",
            "users_quantity": 38
        }
    ],
    "path": "http://registration.themembers.dev.br/api/partners/reports/courses/{token_do_desenvolvedor}/{token_da_plataforma}",
    "per_page": 500,
    "next_cursor": null,
    "next_page_url": null,
    "prev_cursor": null,
    "prev_page_url": null
}
```


# Relatório de alunos inativos DEPRECIADO

Lista assinaturas inativas de alunos da plataforma com data de cancelamento no intervalo informado e o percentual de conclusão da trilha do pacote.

### Endpoint

<mark style="color:red;">`GET`</mark>` ``URL_BASE/partners/reports/inactive-students/{developer_token}/{platform_token}`

### Parâmetros de query

| Nome        | Tipo      | Obrigatório | Descrição                                                                        |
| ----------- | --------- | ----------- | -------------------------------------------------------------------------------- |
| `date_from` | `string`  | Sim         | Data inicial do período, formato `Y-m-d` (início do dia no servidor).            |
| `date_to`   | `string`  | Sim         | Data final do período, formato `Y-m-d` (fim do dia). Deve ser **≥** `date_from`. |
| `limit`     | `integer` | Não         | Tamanho da página. Entre **2** e **500**. Padrão **500**.                        |
| `cursor`    | `string`  | Não         | Cursor devolvido em `next_cursor` para a página seguinte.                        |

### Cabeçalhos HTTP

| Cabeçalho | Obrigatório | Observação          |
| --------- | ----------- | ------------------- |
| `Accept`  | Recomendado | `application/json`. |

### Exemplo de requisição

```http
GET /api/partners/reports/inactive-students/{developer_token}/{platform_token}?date_from=2025-01-01&date_to=2025-12-31&limit=50 HTTP/1.1
Accept: application/json
```

Substitua `{developer_token}` e `{platform_token}` pelos valores reais (sem chaves na URL final).

### Resposta (`200 OK`)

Paginação por **cursor**: `data`, `path`, `per_page`, `next_cursor`, `next_page_url`, `prev_cursor`, `prev_page_url`.&#x20;

#### Campos de cada item em `data`

| Campo                                                   | Descrição                                           |
| ------------------------------------------------------- | --------------------------------------------------- |
| `id`                                                    | ID da assinatura (`user_subscription.id`).          |
| `user_id`                                               | UUID do **aluno**.                                  |
| `first_name`, `last_name`, `phone`, `document`, `email` | Dados cadastrais do aluno.                          |
| `registration_date`                                     | `accession_date` da assinatura.                     |
| `last_access_at`                                        | Último login do aluno.                              |
| `subscription_expiration_date`                          | Data de expiração da assinatura.                    |
| `subscription_cancel_date`                              | Data de cancelamento (critério do relatório).       |
| `product_name`                                          | Título do pacote.                                   |
| `trail_completion_percent`                              | Percentual de aulas concluídas na trilha do pacote. |

### Exemplo de resposta (trecho)

```json
{
  "data": [
    {
      "id": 4810806,
      "user_id": "uuid-do-aluno",
      "first_name": "Maria",
      "last_name": "Silva",
      "phone": null,
      "document": "12345678900",
      "email": "maria@exemplo.com",
      "registration_date": "2024-06-01 10:00:00",
      "last_access_at": "2024-11-15 08:30:00",
      "subscription_expiration_date": "2025-06-01 00:00:00",
      "subscription_cancel_date": "2025-02-19 14:22:00",
      "product_name": "Produto Exemplo",
      "trail_completion_percent": "45.00"
    }
  ],
  "path": "/api/partners/reports/inactive-students/…",
  "per_page": 50,
  "next_cursor": "eyJ1c3UuaWQiOi4uLn0",
  "next_page_url": "/api/partners/reports/inactive-students/…?cursor=…",
  "prev_cursor": null,
  "prev_page_url": null
}
```

Os valores de `path` e `next_page_url` no ambiente real incluem host e query string completos.

### Paginação

1. Na **primeira** chamada, envie `date_from`, `date_to` e, se quiser, `limit`.
2. Nas **próximas** páginas, repita **os mesmos** `date_from`, `date_to` e `limit` e acrescente `cursor` com o valor de `next_cursor` (ou use `next_page_url`, conferindo se todos os query params necessários estão presentes).

Se a segunda página retornar **422** ou lista vazia indevida, verifique se `date_from`, `date_to` e `limit` foram reenviados junto com `cursor`.

### Erros

**Exemplo de corpo em validação (`422`):**

```json
{
  "message": "The given data was invalid.",
  "errors": {
    "date_from": ["The date from field is required."]
  }
}
```

| HTTP    | Situação                                                                 |
| ------- | ------------------------------------------------------------------------ |
| **401** | `developer_token` ou `platform_token` inválido ou ausente.               |
| **422** | Datas ausentes, formato inválido ou `limit` fora do intervalo permitido. |
| **403** | Possível bloqueio por WAF quando `User-Agent` não é enviado.             |


# Relatório de cursos engajados DEPRECIADO

Lista alunos × curso para os Top N cursos com maior média de percentual de conclusão entre matrículas ativas, com métricas por aluno e a média do curso no conjunto ranqueado.

### Endpoint

<mark style="color:red;">`GET`</mark> `URL_BASE/partners/reports/engaged-courses/{developer_token}/{platform_token}`

### Parâmetros de query

| Nome          | Tipo      | Obrigatório | Descrição                                                                                  |
| ------------- | --------- | ----------- | ------------------------------------------------------------------------------------------ |
| `top_courses` | `integer` | Não         | Quantidade de cursos no ranking (média de conclusão). Entre **1** e **50**. Padrão **10**. |
| `limit`       | `integer` | Não         | Itens por página. Entre **2** e **500**. Padrão **500**.                                   |
| `cursor`      | `string`  | Não         | Próxima página (`next_cursor`).                                                            |

Não há `date_from` / `date_to`: o relatório reflete o **estado atual** das matrículas ativas.

### Cabeçalhos HTTP

| Cabeçalho | Obrigatório | Observação          |
| --------- | ----------- | ------------------- |
| `Accept`  | Recomendado | `application/json`. |

### Exemplo de requisição

```http
GET /api/partners/reports/engaged-courses/{developer_token}/{platform_token}?top_courses=15&limit=20 HTTP/1.1
Accept: application/json
```

### Resposta (`200 OK`)

Estrutura de paginação por **cursor**: `data`, `path`, `per_page`, `next_cursor`, `next_page_url`, `prev_cursor`, `prev_page_url`. `path` e `next_page_url` são URLs absolutas geradas pelo servidor.

#### Campos de cada item em `data`

| Campo                                                   | Descrição                                                         |
| ------------------------------------------------------- | ----------------------------------------------------------------- |
| `id`                                                    | Chave composta: `user_id` + `\|` + `course_id` (string).          |
| `user_id`, `course_id`                                  | UUIDs.                                                            |
| `course_name`, `product_name`                           | Títulos do curso e do pacote.                                     |
| `first_name`, `last_name`, `phone`, `document`, `email` | Dados do aluno.                                                   |
| `registration_date`                                     | `accession_date` da assinatura da linha.                          |
| `course_completion_percent`                             | Percentual de conclusão do curso para o aluno.                    |
| `course_avg_engagement_score`                           | Média do curso no top (repetida nas linhas do mesmo `course_id`). |

### Exemplo de resposta (trecho)

```json
{
  "data": [
    {
      "id": "user-uuid|course-uuid",
      "user_id": "user-uuid",
      "course_id": "course-uuid",
      "course_name": "Nome do curso",
      "product_name": "Nome do produto",
      "first_name": "João",
      "last_name": null,
      "phone": null,
      "document": null,
      "email": "joao@exemplo.com",
      "registration_date": "2024-05-07 00:00:00",
      "course_completion_percent": "33.33",
      "course_avg_engagement_score": "28.50"
    }
  ],
  "path": "/api/partners/reports/engaged-courses/…",
  "per_page": 20,
  "next_cursor": "eyJwcm9nLnVzZXJfaWQiOi4uLn0",
  "next_page_url": "/api/partners/reports/engaged-courses/…?cursor=…",
  "prev_cursor": null,
  "prev_page_url": null
}
```

Na resposta real, `path` e `next_page_url` vêm como **URL absoluta**.

### Paginação

1. Primeira página: envie `top_courses` e `limit` (ou use os padrões).
2. Páginas seguintes: repita **exatamente** os mesmos `top_courses` e `limit` e envie `cursor`. Se usar apenas `next_page_url`, confira se `limit` e `top_courses` permanecem na query.

### Erros

| HTTP    | Situação                                                 |
| ------- | -------------------------------------------------------- |
| **401** | Tokens inválidos ou ausentes.                            |
| **422** | `top_courses` ou `limit` fora dos intervalos permitidos. |
| **403** | Possível bloqueio quando `User-Agent` não é enviado.     |


# Relatório de notas de quizzes DEPRECIADO

Lista respostas de quiz da sua plataforma, com dados do aluno, desempenho e nome da prova.

### Endpoint

<mark style="color:red;">`GET`</mark> `URL_BASE/partners/reports/student-grades/{developer_token}/{platform_token}`

### Parâmetros de query

| Nome     | Tipo      | Obrigatório | Descrição                                                |
| -------- | --------- | ----------- | -------------------------------------------------------- |
| `limit`  | `integer` | Não         | Tamanho da página entre **2** e **500**. Padrão **500**. |
| `cursor` | `string`  | Não         | Próxima página (`next_cursor`).                          |

***Não há filtros de data ou de curso neste endpoint.***

### Cabeçalhos HTTP

| Cabeçalho | Obrigatório | Observação          |
| --------- | ----------- | ------------------- |
| `Accept`  | Recomendado | `application/json`. |

### Exemplo de requisição

```http
GET /api/partners/reports/student-grades/{developer_token}/{platform_token}?limit=100 HTTP/1.1
Accept: application/json
```

### Resposta (`200 OK`)

Paginação por **cursor**.&#x20;

#### Campos de cada item em `data`

| Campo                        | Descrição                                                                                          |
| ---------------------------- | -------------------------------------------------------------------------------------------------- |
| `id`                         | Chave primária de `quiz_user_answer`.                                                              |
| `user_id`                    | UUID do aluno.                                                                                     |
| `student_name`               | Nome completo quando há sobrenome.                                                                 |
| `phone`, `document`, `email` | Contato / documento quando aplicável.                                                              |
| `registration_date`          | Primeira `accession_date` em assinaturas do **aluno** no tenant (pacotes da org); pode ser `null`. |
| `last_access_at`             | Último login.                                                                                      |
| `quiz_name`                  | Nome do quiz.                                                                                      |
| `performance_percent`        | Desempenho numérico (arredondado na serialização).                                                 |
| `approved`                   | Indicador de aprovação.                                                                            |
| `answered_at`                | `created_at` da resposta.                                                                          |

### Exemplo de resposta (trecho)

```json
{
  "data": [
    {
      "id": 891549,
      "user_id": "uuid-do-aluno",
      "student_name": "Nome Sobrenome",
      "phone": null,
      "document": null,
      "email": "aluno@exemplo.com",
      "registration_date": "2023-01-10 00:00:00",
      "last_access_at": "2025-03-01 12:00:00",
      "quiz_name": "Avaliação final",
      "performance_percent": "85.50",
      "approved": 1,
      "answered_at": "2025-03-15 18:45:00"
    }
  ],
  "path": "/api/partners/reports/student-grades/…",
  "per_page": 100,
  "next_cursor": null,
  "next_page_url": null,
  "prev_cursor": null,
  "prev_page_url": null
}
```

Na resposta real, `path` e `next_page_url` vêm como **URL absoluta** quando preenchidos.

Quando `next_cursor` é `null`, todos os registros couberam na página (`limit` ≥ total).

### Paginação

1. Primeira página: envie `limit` desejado (ou padrão).
2. Próximas: repita o mesmo `limit` e envie `cursor`.

### Erros

| HTTP    | Situação                                             |
| ------- | ---------------------------------------------------- |
| **401** | Tokens inválidos ou ausentes.                        |
| **422** | `limit` fora do intervalo permitido.                 |
| **403** | Possível bloqueio quando `User-Agent` não é enviado. |


# Push Notification API

Nesta seção disponibilizaremos rotas de api para gerenciamento de disparo de push notifications.

{% hint style="warning" %}
**IMPORTANTE**: O Push Notification funciona, no momento, apenas para alunos. Para que a notificação seja enviada com sucesso, o usuário precisa estar cadastrado na plataforma e ter feito login pelo menos uma vez no aplicativo. A notificação aparecerá somente quando o aplicativo estiver em segundo plano ou fechado.
{% endhint %}

## Disparar Push Notifications buscando o aluno pelo email

<mark style="color:green;">`POST`</mark> <https://api.themembers.dev.br/api/push-notification-by-email>

Com esta rota de API, você poderá enviar Push Notifications para um grupo de usuários que possuem os emails enviados na requisição.

**Headers**

| Name         | Value              |
| ------------ | ------------------ |
| Content-Type | `application/json` |
| Accept       | `application/json` |

**Body**

<table><thead><tr><th>Name</th><th width="203">Type</th><th>Description</th></tr></thead><tbody><tr><td>title</td><td>string</td><td>Titulo do Push Notification</td></tr><tr><td>body</td><td>string</td><td>Mensagem do Push Notification</td></tr><tr><td>emails</td><td>array</td><td>Um ou mais emails</td></tr><tr><td>developer_token</td><td>string</td><td>token_do_desenvolvedor</td></tr><tr><td>platform_token</td><td>string</td><td>token_da_plataforma</td></tr></tbody></table>

**Response**

{% tabs %}
{% tab title="200" %}

```json
{
    "message": "Push notification sent successfully"
}
```

{% endtab %}

{% tab title="400" %}

```json
{
  "error": "Bad Request"
}
```

{% endtab %}
{% endtabs %}

## Disparar Push Notifications buscando o(s) aluno(s) pelo ID de produto

<mark style="color:green;">`POST`</mark> <https://api.themembers.dev.br/api/push-notification-by-product>

Com esta rota de API, você poderá enviar Push Notifications para um grupo de alunos que possuem assinaturas nos mesmos produtos.

**Headers**

| Name         | Value              |
| ------------ | ------------------ |
| Content-Type | `application/json` |
| Accept       | `application/json` |

**Body**

<table><thead><tr><th>Name</th><th width="203">Type</th><th>Description</th></tr></thead><tbody><tr><td>title</td><td>string</td><td>Titulo do Push Notification</td></tr><tr><td>body</td><td>string</td><td>Mensagem do Push Notification</td></tr><tr><td>product_ids</td><td>array</td><td>Um ou mais IDs de produto</td></tr><tr><td>developer_token</td><td>string</td><td>token_do_desenvolvedor</td></tr><tr><td>platform_token</td><td>string</td><td>token_da_plataforma</td></tr></tbody></table>

**Response**

{% tabs %}
{% tab title="200" %}

```json
{
   "message": "Push notification sent successfully"
}
```

{% endtab %}

{% tab title="400" %}

```json
{
  "error": "Bad Request"
}
```

{% endtab %}
{% endtabs %}


# Webhooks da Área de Membros

Este documento descreve como integrar e consumir os webhooks enviados pela plataforma TheMembers. Os webhooks permitem que sistemas de clientes recebam notificações em tempo real sobre eventos relevantes, como conclusão de aulas, emissão de certificados, publicação de conteúdo e inatividade de usuários.

***

## Visão Geral

A plataforma TheMembers envia requisições HTTP POST para os endpoints de webhook registrados pelos clientes sempre que determinados eventos ocorrem. O payload enviado está no formato JSON e contém informações detalhadas sobre o evento.

Características principais:

* Protocolo: HTTP POST
* Formato: JSON
* Autenticação: HMAC-SHA256
* Timeout: 30 segundos
* Tentativas: Até 3 tentativas em caso de falha
* Intervalo entre tentativas: 30s, 60s, 120s

***

## Autenticação e Segurança

Cada requisição enviada para o webhook do cliente contém um cabeçalho de autenticação HMAC para garantir a integridade e autenticidade dos dados:

* Cabeçalho: X-Webhook-Signature
* Valor: Assinatura HMAC-SHA256 do corpo da requisição, usando o client\_token do cliente
* Cabeçalho adicional: X-Webhook-Event — Nome do evento disparado

Como validar:

1. Calcule o HMAC-SHA256 do corpo da requisição recebida (JSON bruto, sem formatação extra) usando seu client\_token como chave.

Importante: O JSON é serializado usando as seguintes regras:

* Barras / não são escapadas (sem \\/)
* Caracteres Unicode não são escapados (ex: á ao invés de \u00e1)

2. Certifique-se de que sua serialização JSON corresponda a esse comportamento.
3. Codifique o resultado em hexadecimal (hash\_hmac com raw\_output = false).
4. Compare com o valor do cabeçalho X-Webhook-Signature.

{% hint style="info" %}
A assinatura só corresponderá se o JSON for serializado exatamente conforme as regras acima (sem barras ou unicode escapados).
{% endhint %}

Exemplo em PHP:

{% code title="webhook-validate.php" %}

```php
<?php

$body = file_get_contents('php://input');

$clientToken = 'seu_client_token_aqui';

$expectedSignature = hash_hmac('sha256', $body, $clientToken);

$providedSignature = $_SERVER['HTTP_X_WEBHOOK_SIGNATURE'] ?? '';

if (!hash_equals($expectedSignature, $providedSignature)) {
    http_response_code(401);
    exit('Assinatura inválida');
}

// Processar o payload
$payload = json_decode($body, true);
```

{% endcode %}

Exemplo em JavaScript (Node.js):

{% code title="server.js" %}

```javascript
const crypto = require('crypto');
const express = require('express');
const app = express();

app.use(express.json({
    verify: (req, res, buf) => {
        req.rawBody = buf.toString('utf8');
    }
}));

app.post('/webhook', (req, res) => {
    const clientToken = 'seu_client_token_aqui';
    const providedSignature = req.headers['x-webhook-signature'];
    const expectedSignature = crypto
        .createHmac('sha256', clientToken)
        .update(req.rawBody)
        .digest('hex');

    if (expectedSignature !== providedSignature) {
        return res.status(401).send('Assinatura inválida');
    }

    // Processar o payload
    const payload = req.body;
    console.log('Evento recebido:', payload.event);
    res.status(200).send('OK');
});

app.listen(3000, () => {
    console.log('Servidor webhook rodando na porta 3000');
});
```

{% endcode %}

***

## Exemplo de Assinatura

Abaixo está um exemplo de corpo de requisição de webhook e o valor esperado para o cabeçalho X-Webhook-Signature, assumindo que o client\_token seja mySecretKey123.

Corpo da Requisição de Exemplo:

```json
{
  "type": "class_history",
  "event": "class.completed",
  "created": "2025-01-13T14:30:00.000000Z",
  "data": {
    "datetime": "2025-01-13T14:25:00.000000Z",
    "platform_id": 1,
    "platform_name": "Minha Plataforma",
    "student": {
      "id": 12345,
      "reference_id": "EXT-001",
      "name": "João da Silva",
      "email": "joao@exemplo.com",
      "phone": "+5511999999999",
      "document": "12345678900",
      "gender": "male"
    },
    "course": {
      "id": 100,
      "name": "Curso de Programação",
      "module": {
        "id": 10,
        "name": "Módulo 1 - Fundamentos",
        "class": {
          "id": 1,
          "name": "Introdução ao PHP"
        }
      }
    }
  }
}
```

Assinatura Esperada

Para o corpo acima e client\_token mySecretKey123, o valor do cabeçalho X-Webhook-Signature será (exemplo ilustrativo):

4a3d8c1e2f5b6a7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c

Nota: A assinatura acima é ilustrativa. O valor real dependerá da serialização exata do JSON e da chave secreta.

Importante: A assinatura só corresponderá se o JSON for serializado exatamente como acima, sem barras ou unicode escapados.

***

## Eventos Enviados

{% stepper %}
{% step %}

### Conclusão de Aula (class.completed)

Enviado quando um aluno conclui uma aula (progresso = 100% ou marcada como finalizada).

* Tipo de Evento: class.completed
* Tipo de Payload: class\_history

Exemplo de Payload:

```json
{
  "type": "class_history",
  "event": "class.completed",
  "created": "2025-01-13T14:30:00.000000Z",
  "data": {
    "datetime": "2025-01-13T14:25:00.000000Z",
    "platform_id": 1,
    "platform_name": "Minha Plataforma",
    "student": {
      "id": 12345,
      "reference_id": "EXT-001",
      "name": "João da Silva",
      "email": "joao@exemplo.com",
      "phone": "+5511999999999",
      "document": "12345678900",
      "gender": "male"
    },
    "course": {
      "id": 100,
      "name": "Curso de Programação",
      "module": {
        "id": 10,
        "name": "Módulo 1 - Fundamentos",
        "class": {
          "id": 1,
          "name": "Introdução ao PHP"
        }
      }
    }
  }
}
```

Campos principais:

* type (string): Tipo do payload, sempre class\_history para este evento
* event (string): Nome do evento, sempre class.completed
* created (string): Data/hora de criação do evento (ISO 8601)
* data (object): Dados do evento, incluindo:
  * datetime (string): Data/hora em que a aula foi concluída (ISO 8601)
  * platform\_id (integer)
  * platform\_name (string)
  * student (object): id, reference\_id, name, email, phone, document, gender
  * course (object): id, name, module (com id, name, class com id e name)
    {% endstep %}

{% step %}

### Publicação de Aula (class.published)

Enviado quando uma nova aula é publicada na plataforma (no momento da criação ou publicação manual).

* Tipo de Evento: class.published
* Tipo de Payload: class

Exemplo de Payload:

```json
{
  "type": "class",
  "event": "class.published",
  "created": "2025-01-13T14:30:00.000000Z",
  "data": {
    "datetime": "2025-01-13T14:30:00.000000Z",
    "platform_id": 1,
    "platform_name": "Minha Plataforma",
    "course": {
      "id": 100,
      "name": "Curso de Programação",
      "module": {
        "id": 10,
        "name": "Módulo 1 - Fundamentos",
        "class": {
          "id": 1,
          "name": "Introdução ao PHP"
        }
      }
    }
  }
}
```

Campos principais:

* type (string): Tipo do payload, sempre class para este evento
* event (string): Nome do evento, sempre class.published
* created (string): Data/hora de criação do evento (ISO 8601)
* data (object): Inclui datetime, platform\_id, platform\_name, course (id, name, status, module com id, name, status, class com id e name)
  {% endstep %}

{% step %}

### Certificado Emitido (certificate.issued)

Enviado quando um certificado é emitido para um aluno.

* Tipo de Evento: certificate.issued
* Tipo de Payload: certificate

Exemplo de Payload:

```json
{
  "type": "certificate",
  "event": "certificate.issued",
  "created": "2025-01-13T14:30:00.000000Z",
  "data": {
    "datetime": "2025-01-13T14:30:00.000000Z",
    "platform_id": 1,
    "platform_name": "Minha Plataforma",
    "student": {
      "id": 12345,
      "reference_id": "EXT-001",
      "name": "João da Silva",
      "email": "joao@exemplo.com",
      "phone": "+5511999999999",
      "document": "12345678900",
      "gender": "male"
    },
    "course": {
      "id": 100,
      "name": "Curso de Programação"
    },
    "certificate": {
      "id": 50,
      "name": "Certificado de Conclusão"
    }
  }
}
```

Campos principais:

* type (string): Tipo do payload, sempre certificate para este evento
* event (string): Nome do evento, sempre certificate.issued
* created (string): Data/hora de criação do evento (ISO 8601)
* data (object): Inclui datetime, platform\_id, platform\_name, student (id, reference\_id, name, email, phone, document, gender), course (id, name), certificate (id, name)
  {% endstep %}

{% step %}

### Usuário Inativo por 7 Dias (user.inactive\_for\_7\_days)

Enviado quando um usuário está inativo por exatamente 7 dias (sem login nos últimos 7 dias ou sem login desde a criação da conta).

Observação: Usuários inativos que permanecem inativos continuarão recebendo este evento a cada 7 dias.

* Tipo de Evento: user.inactive\_for\_7\_days
* Tipo de Payload: login\_history

Exemplo de Payload:

```json
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "type": "login_history",
  "event": "user.inactive_for_7_days",
  "created": "2025-01-13T14:30:00.000000Z",
  "data": {
    "datetime": "2025-01-06T14:30:00.000000Z",
    "inactive_days": 7,
    "platform_id": 1,
    "platform_name": "Minha Plataforma",
    "student": {
      "id": 12345,
      "reference_id": "EXT-001",
      "name": "João da Silva",
      "email": "joao@exemplo.com",
      "phone": "+5511999999999",
      "document": "12345678900",
      "gender": "female"
    }
  }
}
```

Campos principais:

* id (string): UUID único do evento
* type (string): Tipo do payload, sempre login\_history para este evento
* event (string): Nome do evento, sempre user.inactive\_for\_7\_days
* created (string): Data/hora de criação do evento (ISO 8601)
* data (object): Inclui datetime, inactive\_days, platform\_id, platform\_name, student (id, reference\_id, name, email, phone, document, gender)
  {% endstep %}
  {% endstepper %}

***

## Formato do Payload

* Todas as requisições são enviadas com o cabeçalho Content-Type: application/json
* Campos de data/hora seguem o padrão ISO 8601 (ex: 2025-01-13T14:30:00.000000Z)
* Campos podem conter valores null quando não aplicável
* O telefone é formatado no padrão E.164 quando disponível (ex: +5511999999999)
* Documentos (CPF/CNPJ) são retornados apenas com números, sem formatação

***

## Boas Práticas e Observações

Segurança

* Sempre valide a assinatura HMAC antes de processar o payload
* Mantenha seu client\_token seguro e não o compartilhe
* O client\_token é único para cada URL de webhook registrado
* Use HTTPS em seu endpoint de webhook

Resposta

* Responda rapidamente com HTTP 200 para evitar reenvio do evento
* Processe o evento de forma assíncrona se necessário
* Não execute operações demoradas na thread principal

Confiabilidade

* Implemente idempotência - o mesmo evento pode ser enviado mais de uma vez
* Registre logs de eventos recebidos para facilitar troubleshooting
* O endpoint deve estar disponível publicamente e aceitar requisições HTTPS

Tratamento de Erros

* Em caso de falha no envio, o sistema tentará reenviar o evento até 3 vezes
* Intervalos entre tentativas: 30s, 60s, 120s
* Após 3 falhas, o evento será marcado como falho e não será reenviado

Timeout

* O timeout da requisição é de 30 segundos
* Certifique-se de que seu endpoint responda dentro desse tempo

Performance

* O webhook pode receber múltiplos eventos em sequência
* Processe cada evento de forma independente e idempotente
* Considere usar filas para processar eventos de forma assíncrona


# Webhooks do Checkout

[https://dashboard.themembers.com.br](https://dashboard.themembers.com.br/)

Para realizar a configuração, acesse o caminho:

Checkout → Ferramentas → Webhooks

{% stepper %}
{% step %}

### Definir o nome do webhook

Nome descritivo para identificar o webhook.
{% endstep %}

{% step %}

### Informar a URL de destino

URL que receberá os eventos enviados pela plataforma.
{% endstep %}

{% step %}

### Selecionar os produtos

Escolha os produtos que deverão disparar notificações para esse webhook.
{% endstep %}

{% step %}

### Selecionar os eventos

Defina quais eventos serão enviados para a URL informada.
{% endstep %}

{% step %}

### Configurar o token de segurança

Token utilizado para validação da origem das requisições.
{% endstep %}
{% endstepper %}

Após a configuração, a plataforma passará a enviar automaticamente os eventos selecionados para a URL informada sempre que ocorrerem ações relacionadas aos produtos configurados.

{% hint style="info" %}
Observações importantes

* Todos os valores monetários estão em centavos
* Datas seguem o padrão YYYY-MM-DD HH:MM:SS
* Campos podem retornar `null` quando não aplicável
  {% endhint %}

{% content-ref url="/spaces/mbuonzfEbI223CTyjCzW/pages/b81b773b333dfb033326287953b4a1e8c594fdc7" %}
[Eventos de webhook](/webhooks/webhooks-do-checkout/eventos-de-webhook)
{% endcontent-ref %}

{% content-ref url="/spaces/mbuonzfEbI223CTyjCzW/pages/beac88ea3788736eda978cf6ae18d2f6e9ab02f9" %}
[Segurança](/webhooks/webhooks-do-checkout/seguranca)
{% endcontent-ref %}

{% content-ref url="/spaces/mbuonzfEbI223CTyjCzW/pages/2e2d65fd7b442c40aaeb5bf48a6d0d4751855cc6" %}
[Estrutura dos webhooks](/webhooks/webhooks-do-checkout/estrutura-dos-webhooks)
{% endcontent-ref %}


# Eventos de webhook

Abaixo estão listados os eventos disparados.

### Eventos de pedido

* `order.canceled` — Pedido cancelado
* `order.expired` — Pedido expirado
* `order.completed` — Pedido concluído

### Eventos de transação

* `transaction.approved` — Pedido aprovado
* `transaction.failed` — Pedido reprovado
* `transaction.refunded` — Pedido Reembolsado
* `transaction.charged\_back` — Chargeback de pedido
* `transaction.pending_refund` — Pedido com reembolso pendente
* `transaction.payment_cc_initiated` — Pagamento com cartão de crédito iniciado
* `transaction.pix_generated` — Pix gerado
* `transaction.boleto_generated` — Boleto gerado

### Eventos de acesso

* `release.access` — Liberar Acesso
* `revoke.access` — Revogar Acesso

### Eventos de compra

* `abandoned` — Abandono de carrinho


# Segurança

## **🔐 Validação de Assinatura de Webhooks**

Para garantir a **autenticidade** e a **integridade** das notificações enviadas pelo nosso sistema, todos os webhooks são assinados utilizando um segredo compartilhado (*webhook secret*), que realiza a assinatura do payload via HMAC SHA-256.

#### **📌 Como funciona**

Cada requisição enviada contém:

* O **payload** (corpo da requisição)
* Um header HTTP:

```
X-Signature: {assinatura}
```

Essa assinatura é gerada aplicando um **HMAC SHA-256** sobre o payload bruto utilizando o *token de segurança* configurado:

![image.png](https://297705385-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FmbuonzfEbI223CTyjCzW%2Fuploads%2FopEA1BgcoUgyDJOGqG5x%2Fimage.webp?alt=media\&token=de115e4b-9ad2-43c0-9eea-72fb906fb1e3)

***

#### **🎯 Objetivo da validação**

O sistema receptor deve validar a assinatura para garantir:

* ✔️ Que o payload **não foi alterado** (integridade)
* ✔️ Que a requisição foi **enviada por um remetente confiável** (autenticidade)
* ✔️ Que a comunicação é **segura contra ataques de replay ou spoofing**

***

### **⚙️ Passo a passo para validação**

Ao receber o webhook, seu sistema deve:

1. **Ler o payload bruto da requisição**
   * Importante: não utilize payload já parseado (ex: JSON decodificado)
2. **Obter o header `X-Signature`**
3. **Gerar uma nova assinatura localmente**
   * Utilizando:
     * O payload bruto
     * O *secret* compartilhado
4. **Comparar as assinaturas**
   * Utilize comparação segura (*timing-safe comparison*)
5. **Rejeitar a requisição caso a assinatura seja inválida**
   * Retorne HTTP `403 Forbidden`

***

### **💻 Exemplo em PHP (Laravel)**

```php
$newPayload = json_encode(
  json_decode(trim($payload)),
  JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES
);

$expectedSignature = hash_hmac(
  'sha256',
  $webhookURL . ':' . $newPayload,
  $secret
);
```

### **💻 Exemplo em NodeJS**

```javascript
const normalizedPayload = JSON.stringify(JSON.parse(req.body.toString('utf8')));

const data = `${webhookUrl}:${normalizedPayload}`;
const receivedSignature = req.headers['x-signature'];

const expected = crypto
  .createHmac('sha256', secret)
  .update(data, 'utf8')
  .digest('hex');

if (expected.length !== receivedSignature.length) {
  return false;
}

return crypto.timingSafeEqual(
  Buffer.from(expected, 'utf8'),
  Buffer.from(receivedSignature, 'utf8'),
);
```

***

### ⚠️ Boas práticas (importante)

#### 1. Use sempre o payload bruto

Qualquer transformação (ex: `json_decode` → `json_encode`) pode invalidar a assinatura.

***

#### 2. Nunca use comparação simples (`===`)

Utilize sempre:

```
hash_equals()
```

***

#### 3. Proteja seu webhook secret

* Nunca exponha no frontend
* Armazene em variáveis de ambiente seguras

***

#### 4. Valide antes de processar

A validação da assinatura deve ser o **primeiro passo** antes de qualquer lógica de negócio


# Estrutura dos webhooks

### Estrutura do webhook

{% code title="webhook.json" overflow="wrap" lineNumbers="true" expandable="true" %}

```json
{
  "webhookUrl": "https://hook.us2.make.com/",
  "httpVerb": "post",
  "proxy": null,
  "tries": 3,
  "requestTimeout": 3,
  "cert": null,
  "certPassphrase": null,
  "sslKey": null,
  "sslKeyPassphrase": null,
  "backoffStrategyClass": "BackoffStrategy",
  "signerClass": null,
  "headers": {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "x-signature": "{token}"
  },
  "verifySsl": true,
  "throwExceptionOnFailure": false,
  "queue": "queue",
  "payload": {
    ...
  },
  "meta": [],
  "tags": {
    "event": "order.completed",
    "relay": true
  },
  "uuid": "13ad0881-4756-402a-b3c3-3c10c9825f95",
  "outputType": "JSON",
  "response": null,
  "errorType": null,
  "errorMessage": null,
  "transferStats": null,
  "job": null,
  "connection": null,
  "delay": null,
  "afterCommit": null,
  "middleware": [],
  "chained": [],
  "chainConnection": null,
  "chainQueue": null,
  "chainCatchCallbacks": null
}

```

{% endcode %}

{% content-ref url="/spaces/mbuonzfEbI223CTyjCzW/pages/a1140aaaec16c2058cd8a92b83482cd3daee7d1a" %}
[Webhook de carrinho abandonado](/webhooks/webhooks-do-checkout/estrutura-dos-webhooks/webhook-de-carrinho-abandonado)
{% endcontent-ref %}

{% content-ref url="/spaces/mbuonzfEbI223CTyjCzW/pages/36a33166866b3f6f47deb13cbbf149b93fad50f3" %}
[Webhook de acesso](/webhooks/webhooks-do-checkout/estrutura-dos-webhooks/webhook-de-acesso)
{% endcontent-ref %}

{% content-ref url="/spaces/mbuonzfEbI223CTyjCzW/pages/76f027b216f03da1558750fbd3e33d53b275b166" %}
[Webhook de Pedido](/webhooks/webhooks-do-checkout/estrutura-dos-webhooks/webhook-de-pedido)
{% endcontent-ref %}

{% content-ref url="/spaces/mbuonzfEbI223CTyjCzW/pages/0ebfeb8231647b643b6508580e661e29c32f9a90" %}
[Webhook de Transação](/webhooks/webhooks-do-checkout/estrutura-dos-webhooks/webhook-de-transacao)
{% endcontent-ref %}


# Webhook de carrinho abandonado

Este webhook é disparado sempre que um carrinho de compras é identificado como abandonado. Ele permite que sistemas integrados sejam notificados automaticamente para ações como recuperação de vendas, envio de comunicações ao cliente ou análises de comportamento.

### Evento

abandoned

### Payload

```json
{
  "company": {
    "id": "7268299385367167832",
    "name": "company",
    "email": "company.test@email.com",
    "phone": "+55 11999999999",
    "document_type": "cnpj",
    "document_number": "00000000000000",
    "owner": {
      "id": "7268299385346197469",
      "name": "Lucas da Silva",
      "email": "lucas@company.com",
      "phone": "+5511999999999",
      "document_type": "cpf",
      "document_number": "00000000000"
    }
  },
  "payload": {
    "id": "712",
    "object": "shopping_cart",
    "event": "abandoned",
    "created_at": "2026-01-07 18:17:08",
    "data": {
      "products": [
        {
          "product_id": "2931346b-a686-4816-8f64-b476a669ea01",
          "product_name": "Produto 1",
          "category": "oneoff",
          "price": 100
        }
      ],
      "customer": {
        "name": null,
        "cpf": null,
        "email": "cliente@example.com",
        "phone": null
      },
      "checkout": {
        "checkout_link": "https://checkout.thebank.com.br/pt-BR/7338938162967740000"
      }
    }
  }
}

```

### Detalhes

![🏢](https://www.notion.so/Base64-Image-Removed) company

Dados da empresa.

| Campo            | Tipo           | Obrigatório | Descrição                                            |
| ---------------- | -------------- | ----------- | ---------------------------------------------------- |
| id               | string         | Sim         | Id da empresa                                        |
| name             | string         | Sim         | Nome da empresa                                      |
| email            | string         | Sim         | E-mail de contato da empresa                         |
| phone            | string \| null | Não         | Telefone de contato                                  |
| document\_type   | string         | Sim         | <p>Tipo de documento (<br>cpf<br>ou<br>cnpj<br>)</p> |
| document\_number | string         | Sim         | Número do documento da empresa                       |
| owner            | object         | Sim         | Dados do proprietário                                |

![👤](https://www.notion.so/Base64-Image-Removed) company.owner

Dados do responsável legal da empresa.

| Campo            | Tipo           | Obrigatório | Descrição                                            |
| ---------------- | -------------- | ----------- | ---------------------------------------------------- |
| id               | string         | Sim         | Id do proprietário                                   |
| name             | string         | Sim         | Nome completo                                        |
| email            | string         | Sim         | E-mail de contato                                    |
| phone            | string \| null | Não         | Telefone                                             |
| document\_type   | string         | Sim         | <p>Tipo de documento (<br>cpf<br>ou<br>cnpj<br>)</p> |
| document\_number | string         | Sim         | Número do documento                                  |

![📦](https://www.notion.so/Base64-Image-Removed) payload

Informações principais do evento de carrinho abandonado.

| Campo       | Tipo              | Obrigatório | Descrição                                                          |
| ----------- | ----------------- | ----------- | ------------------------------------------------------------------ |
| id          | string            | Sim         | Id do utm                                                          |
| object      | string            | Sim         | <p>Tipo do objeto relacionado ao evento. Ex:<br>shopping\_cart</p> |
| event       | string            | Sim         | <p>Evento disparado. (<br>abandoned<br>)</p>                       |
| created\_at | string (datetime) | Sim         | Data e hora em que o evento foi gerado                             |
| data        | object            | Sim         | Dados específicos do carrinho abandonado.                          |

![📄](https://www.notion.so/Base64-Image-Removed) payload.data

Dados específicos do carrinho abandonado.

| Campo    | Tipo   | Obrigatório | Descrição                                |
| -------- | ------ | ----------- | ---------------------------------------- |
| products | object | Sim         | Lista de produtos presentes no carrinho. |
| customer | object | Sim         | Dados do cliente (quando disponíveis).   |
| checkout | object | Sim         | Informações de acesso ao checkout.       |

![🛒](https://www.notion.so/Base64-Image-Removed) payload.data.products

Lista de produtos presentes no carrinho.

| Campo         | Tipo   | Obrigatório | Descrição                                                               |
| ------------- | ------ | ----------- | ----------------------------------------------------------------------- |
| product\_id   | string | Sim         | Identificador do produto                                                |
| product\_name | string | Sim         | Nome do produto                                                         |
| category      | string | Sim         | <p>Categoria do produto (<br>oneoff<br>,<br>subscription<br>, etc.)</p> |
| price         | number | Sim         | Valor do produto (em centavos)                                          |

![👤](https://www.notion.so/Base64-Image-Removed) payload.data.customer

Dados do cliente (quando disponíveis).

| Campo | Tipo   | Obrigatório | Descrição                    |
| ----- | ------ | ----------- | ---------------------------- |
| name  | string | Não         | Nome do cliente              |
| cpf   | string | Não         | CPF do cliente               |
| email | string | Não         | E-mail informado no checkout |
| phone | string | Não         | Telefone do cliente          |

{% hint style="warning" %}
Alguns campos podem ser null caso o cliente não tenha finalizado o preenchimento dos dados no checkout.
{% endhint %}

![🔗](https://www.notion.so/Base64-Image-Removed) payload.data.checkout

Informações de acesso ao checkout.

| Campo          | Tipo         | Obrigatório | Descrição                                         |
| -------------- | ------------ | ----------- | ------------------------------------------------- |
| checkout\_link | string (URL) | Sim         | Link do checkout associado ao carrinho abandonado |


# Webhook de acesso

Este webhook é disparado sempre que uma compra é aprovada ou cancelada. Ele é utilizado para gerenciar automaticamente o acesso do cliente à plataforma, permitindo a liberação do acesso em casos de aprovação e a remoção do acesso quando ocorre o cancelamento.

### Eventos

* revoke.access
* release.access

### Payload de exemplo

```json
{
  "company": {
    "id": "7268299385367167832",
    "name": "company",
    "email": "company.test@email.com",
    "phone": "+55 11999999999",
    "document_type": "cnpj",
    "document_number": "00000000000000",
    "owner": {
      "id": "7268299385346197469",
      "name": "Lucas da Silva",
      "email": "lucas@company.com",
      "phone": "+5511999999999",
      "document_type": "cpf",
      "document_number": "00000000000"
    }
  },
  "payload": {
    "id": "7407682939998804964",
    "object": "order",
    "event": "release.access",
    "data": {
      "status": "paid",
      "customer": {
        "id": "7394310639977632991",
        "name": "João da Silva",
        "email": "joao@example.com",
        "phone_country": null,
        "phone": "+55 11999999999",
        "document_type": "cpf",
        "document_number": "00000000000"
      },
      "product": {
        "id": "7338938162967740629",
        "name": "Produto 1",
        "price": 10000,
        "quantity": 1,
        "expires_in": "2026-01-08 18:32:19",
        "reference_id": "2931346b-a686-4816-8f64-b476a669ea01",
        "platform": {
          "id": "7268292516695246618",
          "name": "Company plataforma"
        }
      },
      "order": {
        "id": "7407682939998804964",
        "total": 10000,
        "transaction": {
          "paid_at": "2026-01-08 18:32:19",
          "payment_method": "credit_card",
          "instalments": 1,
          "currency": "BRL",
          "value": 11196,
          "status": "approved",
          "credit_card": {
            "instalments": 1,
            "brand": "VISA",
            "last_digit": "1234"
          }
        }
      }
    }
  }
}

```

### Detalhes

#### ![🏢](https://www.notion.so/Base64-Image-Removed) company

Dados da empresa responsável pelo produto ou serviço.

| Campo            | Tipo           | Obrigatório | Descrição                                            |
| ---------------- | -------------- | ----------- | ---------------------------------------------------- |
| id               | string         | Sim         | Id da empresa                                        |
| name             | string         | Sim         | Nome da empresa                                      |
| email            | string         | Sim         | E-mail de contato da empresa                         |
| phone            | string \| null | Não         | Telefone de contato                                  |
| document\_type   | string         | Sim         | <p>Tipo de documento (<br>cpf<br>ou<br>cnpj<br>)</p> |
| document\_number | string         | Sim         | Número do documento da empresa                       |
| owner            | object         | Sim         | Dados do proprietário                                |

#### ![👤](https://www.notion.so/Base64-Image-Removed) company.owner

Dados do proprietário (responsável legal da empresa).

| Campo            | Tipo           | Obrigatório | Descrição                                            |
| ---------------- | -------------- | ----------- | ---------------------------------------------------- |
| id               | string         | Sim         | Id                                                   |
| name             | string         | Sim         | Nome completo                                        |
| email            | string         | Sim         | E-mail de contato                                    |
| phone            | string \| null | Não         | Telefone                                             |
| document\_type   | string         | Sim         | <p>Tipo de documento (<br>cpf<br>ou<br>cnpj<br>)</p> |
| document\_number | string         | Sim         | Número do documento                                  |

#### ![📦](https://www.notion.so/Base64-Image-Removed) payload

Informações principais do evento de acesso.

| Campo  | Tipo   | Obrigatório | Descrição                                                         |
| ------ | ------ | ----------- | ----------------------------------------------------------------- |
| id     | string | Sim         | Id                                                                |
| object | string | Sim         | <p>Tipo do objeto relacionado ao evento. Valor fixo:<br>order</p> |
| event  | string | Sim         | <p>Evento disparado. Exemplo:<br>release.access</p>               |

#### ![📄](https://www.notion.so/Base64-Image-Removed) payload.data

Dados específicos relacionados ao acesso.

| Campo    | Tipo   | Obrigatório | Descrição                                                           |
| -------- | ------ | ----------- | ------------------------------------------------------------------- |
| status   | string | Sim         | <p>Status atual do pedido (<br>paid<br>,<br>canceled<br>, etc.)</p> |
| customer | object | Sim         | Dados do cliente                                                    |
| product  | object | Sim         | Dados do produto                                                    |
| order    | object | Sim         | Dados do pedido                                                     |

#### ![👤](https://www.notion.so/Base64-Image-Removed) payload.data.customer

Dados do cliente.

| Campo            | Tipo           | Obrigatório | Descrição                                            |
| ---------------- | -------------- | ----------- | ---------------------------------------------------- |
| id               | string         | Sim         | Id do cliente                                        |
| name             | string         | Sim         | Nome completo                                        |
| email            | string         | Sim         | E-mail do cliente                                    |
| phone\_country   | string \| null | Não         | Código do país do telefone                           |
| phone            | string \| null | Não         | Telefone do cliente                                  |
| document\_type   | string \| null | Não         | <p>Tipo de documento (<br>cpf<br>ou<br>cnpj<br>)</p> |
| document\_number | string \| null | Não         | Número do documento                                  |

#### ![📦](https://www.notion.so/Base64-Image-Removed) payload.data.product

Dados do produto adquirido.

| Campo         | Tipo              | Obrigatório | Descrição                              |
| ------------- | ----------------- | ----------- | -------------------------------------- |
| id            | string            | Sim         | Id do produto                          |
| name          | string            | Sim         | Nome do produto                        |
| price         | integer           | Sim         | Valor do produto (em centavos)         |
| quantity      | integer           | Sim         | Quantidade adquirida                   |
| expires\_in   | string (datetime) | Sim         | Data de expiração do acesso            |
| reference\_id | string            | Sim         | Id externo do produto                  |
| platform      | object            | Sim         | Plataforma onde o acesso será liberado |

#### ![🖥️](https://www.notion.so/Base64-Image-Removed) payload.data.product.platform

Dados da plataforma de acesso.

| Campo | Tipo   | Obrigatório | Descrição          |
| ----- | ------ | ----------- | ------------------ |
| id    | string | Sim         | Id da plataforma   |
| name  | string | Sim         | Nome da plataforma |

#### ![🧾](https://www.notion.so/Base64-Image-Removed) payload.data.order

Informações do pedido associado.

| Campo       | Tipo   | Obrigatório | Descrição                           |
| ----------- | ------ | ----------- | ----------------------------------- |
| id          | string | Sim         | Identificador do pedido             |
| total       | number | Sim         | Valor total do pedido (em centavos) |
| transaction | object | Sim         | Dados da transação                  |

#### ![💳](https://www.notion.so/Base64-Image-Removed) payload.data.order.transaction

Detalhes da transação de pagamento.

| Campo           | Tipo              | Obrigatório | Descrição                                                                          |
| --------------- | ----------------- | ----------- | ---------------------------------------------------------------------------------- |
| paid\_at        | string (datetime) | Sim         | Data e hora do pagamento                                                           |
| payment\_method | string            | Sim         | <p>Método de pagamento (<br>credit\_card<br>,<br>pix<br>,<br>boleto<br>, etc.)</p> |
| instalments     | integer           | Sim         | Número de parcelas                                                                 |
| currency        | string            | Sim         | Moeda da transação                                                                 |
| value           | integer           | Sim         | Valor pago (em centavos)                                                           |
| status          | string            | Sim         | Status da transação                                                                |
| credit\_card    | object \| null    | Não         | Dados do cartão de crédito                                                         |
| pix             | object \| null    | Não         | Dados do pix                                                                       |
| boleto          | object \| null    | Não         | Dados do boleto                                                                    |

#### ![💳](https://www.notion.so/Base64-Image-Removed) payload.data.order.transaction.credit\_card

| Campo       | Tipo   | Obrigatório | Descrição                 |
| ----------- | ------ | ----------- | ------------------------- |
| instalments | number | Sim         | Número de parcelas        |
| brand       | string | Sim         | Bandeira do cartão        |
| last\_digit | string | Sim         | Últimos dígitos do cartão |

#### ![💰](https://www.notion.so/Base64-Image-Removed) payload.data.order.transaction.pix

| Campo        | Tipo   | Obrigatório | Descrição                       |
| ------------ | ------ | ----------- | ------------------------------- |
| qrcode\_url  | string | Sim         | url do com o pix para pagamento |
| qrcode\_data | string | Sim         | código do pix copia e cola      |
| expiration   | number | Sim         | data de expiração               |

#### ![🧾](https://www.notion.so/Base64-Image-Removed) payload.data.order.transaction.boleto

| Campo         | Tipo   | Obrigatório | Descrição                       |
| ------------- | ------ | ----------- | ------------------------------- |
| barcode\_url  | string | Sim         | url do boleto para impressao    |
| barcode\_data | string | Sim         | código de barras para pagamento |
| expiration    | string | Sim         | data de expiração               |


# Webhook de Pedido

Este webhook é enviado sempre que ocorre uma operação relacionada a um pedido na plataforma. Ele é disparado automaticamente a cada evento associado ao ciclo de vida do pedido, permitindo que sistemas integrados acompanhem e processem alterações de status em tempo real.

### Eventos

* order.canceled
* order.expired
* order.completed

### Payload de exemplo

{% code title="payload.json" %}

```json
{
  "company": {
    "id": "7268299385367167832",
    "name": "company",
    "email": "company.test@email.com",
    "phone": "+55 11999999999",
    "document_type": "cnpj",
    "document_number": "00000000000000",
    "owner": {
      "id": "7268299385346197469",
      "name": "Lucas da Silva",
      "email": "lucas@company.com",
      "phone": "+5511999999999",
      "document_type": "cpf",
      "document_number": "00000000000"
    }
  },
  "payload": {
    "object": "order",
    "event": "order.completed",
    "created_at": "2026-01-07 15:08:42",
    "data": {
      "customer": {
        "id": "7407269030890449654",
        "name": "João da Silva",
        "email": "joao@example.com",
        "phone_country": null,
        "phone": "+55 11999999999",
        "document_type": "cpf",
        "document_number": "00000000000"
      },
      "main_product": {
        "id": 7338938162967740000,
        "title": "Produto 1",
        "price": 10000
      },
      "order_bump": [
        {
          "product_id": 7338938162967740000,
          "title": "Produto 1",
          "price": 10000,
          "order_bump": true
        }
      ],
      "transactions": [
        {
          "payment_method": "credit_card",
          "instalments": 1,
          "currency": "BRL",
          "value": 11400,
          "status": "approved",
          "credit_card": {
            "instalments": 1,
            "brand": "VISA",
            "last_digit": "1234"
          }
        }
      ],
      "utms": []
    }
  }
}

```

{% endcode %}

### Detalhes

| Campo   | Tipo   | Descrição                                     |
| ------- | ------ | --------------------------------------------- |
| company | object | Informações da empresa responsável pela venda |
| payload | object | Dados do evento disparado                     |

#### 🏢 company

Dados da empresa (organização) proprietária do pedido.

| Campo            | Tipo           | Obrigatório | Descrição                        |
| ---------------- | -------------- | ----------- | -------------------------------- |
| id               | string         | Sim         | Id da empresa                    |
| name             | string         | Sim         | Nome da empresa                  |
| email            | string \| null | Não         | Email principal da empresa       |
| phone            | string \| null | Não         | Telefone de contato              |
| document\_type   | string         | Sim         | Tipo de documento (cnpj ou cpf)  |
| document\_number | string         | Sim         | Número do documento              |
| owner            | object         | Sim         | Dados do proprietário da empresa |

#### 👤 company.owner

Dados do proprietário (responsável legal).

| Campo            | Tipo           | Obrigatório | Descrição                       |
| ---------------- | -------------- | ----------- | ------------------------------- |
| id               | string         | Sim         | Id do proprietário              |
| name             | string         | Sim         | Nome completo                   |
| email            | string         | Sim         | Email de contato                |
| phone            | string \| null | Não         | Telefone                        |
| document\_type   | string         | Sim         | Tipo de documento (cpf ou cnpj) |
| document\_number | string         | Sim         | Número do documento             |

#### 📦 payload

Informações do evento disparado.

| Campo       | Tipo   | Obrigatório | Descrição                                    |
| ----------- | ------ | ----------- | -------------------------------------------- |
| object      | string | Sim         | Tipo do objeto relacionado ao evento (order) |
| event       | string | Sim         | Nome do evento (order.completed)             |
| created\_at | string | Sim         | Data e hora de criação do evento (UTC)       |
| data        | object | Sim         | Dados específicos do pedido                  |

#### 🧾 payload.data

Dados detalhados do pedido.

| Campo         | Tipo   | Obrigatório | Descrição                                             |
| ------------- | ------ | ----------- | ----------------------------------------------------- |
| customer      | object | Sim         | Informações do comprador.                             |
| main\_product | object | Sim         | Produto principal do pedido.                          |
| order\_bump   | object | Sim         | Lista de produtos adicionais (order bump).            |
| transactions  | object | Sim         | Lista de transações financeiras associadas ao pedido. |
| utms          | array  | Sim         | Informações de UTM para rastreamento de campanha.     |

#### 👤 payload.data.customer

Informações do comprador.

| Campo            | Tipo           | Obrigatório | Descrição                     |
| ---------------- | -------------- | ----------- | ----------------------------- |
| id               | string         | Sim         | Id do cliente                 |
| name             | string         | Sim         | Nome completo                 |
| email            | string         | Sim         | Email do cliente              |
| phone\_country   | string \| null | Não         | Código do país do telefone    |
| phone            | string \| null | Não         | Telefone do cliente           |
| document\_type   | string \| null | Não         | Tipo de documento (cpf, cnpj) |
| document\_number | string \| null | Não         | Número do documento           |

#### 📦 payload.data.main\_product

Produto principal do pedido.

| Campo | Tipo    | Obrigatório | Descrição                    |
| ----- | ------- | ----------- | ---------------------------- |
| id    | number  | Sim         | Id do produto                |
| title | string  | Sim         | Nome do produto              |
| price | integer | Sim         | Preço do produto em centavos |

#### ➕ payload.data.order\_bump

Lista de produtos adicionais (order bump).

| Campo       | Tipo    | Obrigatório | Descrição                 |
| ----------- | ------- | ----------- | ------------------------- |
| product\_id | number  | Sim         | Id do produto             |
| title       | string  | Sim         | Nome do produto           |
| price       | number  | Sim         | Preço em centavos         |
| order\_bump | boolean | Sim         | Indica se é um order bump |

{% hint style="info" %}
Pode ser um array vazio caso não existam produtos adicionais.
{% endhint %}

#### 💳 payload.data.transactions

Lista de transações financeiras associadas ao pedido.

| Campo           | Tipo   | Obrigatório | Descrição                                       |
| --------------- | ------ | ----------- | ----------------------------------------------- |
| payment\_method | string | Sim         | Método de pagamento (credit\_card, pix, boleto) |
| instalments     | number | Sim         | Número de parcelas                              |
| currency        | string | Sim         | Moeda da transação (BRL)                        |
| value           | number | Sim         | Valor total pago em centavos                    |
| status          | string | Sim         | Status da transação (approved, failed, etc.)    |
| credit\_card    | object | Condicional | Dados do cartão (apenas se método for cartão)   |
| pix             | object | Condicional | Dados do pix (apenas se método for pix)         |
| boleto          | object | Condicional | Dados do boleto (apenas se método for boleto)   |

#### 💳 payload.data.transactions.credit\_card

Detalhes do cartão de crédito.

| Campo       | Tipo   | Obrigatório | Descrição                   |
| ----------- | ------ | ----------- | --------------------------- |
| instalments | number | Sim         | Número de parcelas          |
| brand       | string | Sim         | Bandeira do cartão          |
| last\_digit | string | Sim         | Últimos 4 dígitos do cartão |

#### 💰 payload.data.transactions.pix

Informações do pix.

| Campo        | Tipo   | Obrigatório | Descrição                       |
| ------------ | ------ | ----------- | ------------------------------- |
| qrcode\_url  | string | Sim         | url do com o pix para pagamento |
| qrcode\_data | string | Sim         | código do pix copia e cola      |
| expiration   | number | Sim         | data de expiração               |

#### 🧾 payload.data.transactions.boleto

Informações do boleto.

| Campo         | Tipo   | Obrigatório | Descrição                       |
| ------------- | ------ | ----------- | ------------------------------- |
| barcode\_url  | string | Sim         | url do boleto para impressao    |
| barcode\_data | string | Sim         | código de barras para pagamento |
| expiration    | string | Sim         | data de expiração               |

#### 📊 payload.data.utms

Informações de UTM para rastreamento de campanha.

| Campo | Tipo  | Obrigatório | Descrição                                |
| ----- | ----- | ----------- | ---------------------------------------- |
| utms  | array | Não         | Lista de parâmetros UTM (pode ser vazio) |


# Webhook de Transação

Este webhook é enviado sempre que ocorre uma transação relacionada ao pagamento de um pedido. Ele é disparado tanto para eventos de pagamento concluído quanto para a geração de meios de pagamento, como QR Code de Pix e boleto, permitindo o acompanhamento completo do fluxo de pagamento.

### Eventos

* transaction.approved
* transaction.failed
* transaction.refunded
* transaction.charged\_back
* transaction.pending\_refund
* transaction.payment\_cc\_initiated
* transaction.pix\_generated
* transaction.boleto\_generated

### Payload (produto com assinatura)

```json
{
  "object": "transaction",
  "event": "transaction.approved",
  "created_at": "2026-01-03 08:00:13",
  "data": {
    "id": 7405759151497423000,
    "paid_at": "2026-01-03T11:00:13+00:00",
    "status": "approved",
    "transaction": {
      "currency": "brl",
      "amount": 12333,
      "buyer_fees": 0,
      "total_amount": 12333,
      "cupom": ""
    },
    "payment_details": {
      "payment_method": "credit_card",
      "credit_card": {
        "instalments": 1,
        "brand": "discover",
        "last_digit": 1234
      }
    },
    "comissions": [],
    "order": null,
    "subscription": {
      "code": "SB1B4H1HJ",
      "periodicity": "monthly",
      "periodicity_interval": 1,
      "price": 12333,
      "status": "active",
      "started_at": "2025-12-02 20:02:23",
      "next_billing_at": "2026-02-02 20:02:23",
      "suspended_at": null,
      "canceled_at": null,
      "created_at": "2025-12-02 20:02:23",
      "subscriber": {
        "id": "7394310639977632991",
        "name": "João da Silva",
        "email": "joao@example.com",
        "phone_country": null,
        "phone": "+55 11999999999",
        "document_type": "cpf",
        "document_number": "00000000000"
      },
      "product": {
        "id": 7394309835643586000,
        "title": "Produto de assinatura",
        "price": 12333
      },
      "invoice": {
        "code": "SBIN1B4H1M1",
        "attempts": 2,
        "status": "paid",
        "paid_at": "2026-01-03 11:00:13",
        "refunded_at": null,
        "charged_back_at": null,
        "billing_date": "2026-01-02 20:02:23",
        "created_at": "2026-01-03 11:00:09"
      },
      "transactions": [
        {
          "paid_at": "2026-01-03T11:00:13+00:00",
          "payment_method": "credit_card",
          "instalments": 1,
          "currency": "BRL",
          "value": 12333,
          "status": "approved",
          "credit_card": {
            "instalments": 1,
            "brand": "discover",
            "last_digit": 1234
          }
        },
        {
          "paid_at": "2026-01-03T11:00:13+00:00",
          "payment_method": "credit_card",
          "instalments": 1,
          "currency": "BRL",
          "value": 12333,
          "status": "approved",
          "credit_card": {
            "instalments": 1,
            "brand": "discover",
            "last_digit": 1234
          }
        }
      ]
    }
  }
}

```

### Payload (produto de venda única)

```json
{
  "company": {
    "id": "7268299385367167832",
    "name": "company",
    "email": "company.test@email.com",
    "phone": "+55 11999999999",
    "document_type": "cnpj",
    "document_number": "00000000000000",
    "owner": {
      "id": "7268299385346197469",
      "name": "Lucas da Silva",
      "email": "lucas@company.com",
      "phone": "+5511999999999",
      "document_type": "cpf",
      "document_number": "00000000000"
    }
  },
  "payload": {
    "object": "transaction",
    "event": "transaction.approved",
    "created_at": "2026-01-02 16:48:57",
    "data": {
      "id": 7405530052968814000,
      "paid_at": "2026-01-02T19:48:57+00:00",
      "status": "approved",
      "transaction": {
        "currency": "brl",
        "amount": 10260,
        "buyer_fees": 0,
        "total_amount": 10260,
        "cupom": ""
      },
      "payment_details": {
        "payment_method": "credit_card",
        "credit_card": {
          "instalments": 1,
          "brand": "mastercard",
          "last_digit": 7600
        }
      },
      "comissions": [],
      "order": {
        "id": 7405530048429536000,
        "customer": {
          "id": "7394310639977632991",
          "name": "João da Silva",
          "email": "joao@example.com",
          "phone_country": null,
          "phone": "+55 11999999999",
          "document_type": "cpf",
          "document_number": "00000000000"
        },
        "main_product": {
          "id": 7338938162967740000,
          "title": "Produto 1",
          "price": 10000
        },
        "order_bump": [
          {
            "product_id": 7338938162967740000,
            "title": "Produto 1",
            "price": 10000,
            "order_bump": true
          }
        ],
        "utms": []
      },
      "subscription": null
    }
  }
}

```

### Detalhes

#### ![🔹](https://www.notion.so/Base64-Image-Removed) Payload principal

| Campo       | Tipo              | Obrigatório | Descrição                                                         |
| ----------- | ----------------- | ----------- | ----------------------------------------------------------------- |
| object      | string            | Sim         | <p>Tipo do objeto relacionado ao evento (<br>transaction<br>)</p> |
| event       | string            | Sim         | <p>Nome do evento (<br>transaction.approved<br>)</p>              |
| created\_at | string (datetime) | Sim         | Data e hora de criação do webhook                                 |

### ![📦](https://www.notion.so/Base64-Image-Removed) data

Informações detalhadas da transação.

| Campo            | Tipo              | Obrigatório | Descrição                                                                |
| ---------------- | ----------------- | ----------- | ------------------------------------------------------------------------ |
| id               | number            | Sim         | Id único da transação                                                    |
| paid\_at         | string (ISO 8601) | Sim         | Data e hora da confirmação do pagamento                                  |
| status           | string            | Sim         | <p>Status atual da transação (<br>approved<br>,<br>failed<br>, etc.)</p> |
| transaction      | object            | Sim         | Dados da transação                                                       |
| payment\_details | object            | Sim         | Dados do pagamento                                                       |
| comissions       | object            | Sim         | Dados de comissão                                                        |
| order            | object \| null    | Não         | Dados do pedido (é null quando é um produto de assinatura)               |
| subscription     | object \| null    | Não         | Dados da assinatura (é null quando é um produto de venda única)          |

### ![💰](https://www.notion.so/Base64-Image-Removed) data.transaction

Dados financeiros da transação.

| Campo         | Tipo           | Obrigatório | Descrição                                        |
| ------------- | -------------- | ----------- | ------------------------------------------------ |
| currency      | string         | Sim         | <p>Moeda da transação (ISO 4217). Ex:<br>BRL</p> |
| amount        | number         | Sim         | Valor original da transação (em centavos)        |
| buyer\_fees   | number         | Sim         | Taxas aplicadas ao comprador                     |
| total\_amount | number         | Sim         | Valor total cobrado (em centavos)                |
| cupom         | string \| null | Não         | Código do cupom aplicado, se houver              |

### ![💳](https://www.notion.so/Base64-Image-Removed) data.payment\_details

Detalhes do meio de pagamento utilizado.

| Campo           | Tipo           | Obrigatório | Descrição                                                                          |
| --------------- | -------------- | ----------- | ---------------------------------------------------------------------------------- |
| payment\_method | string         | Sim         | <p>Método de pagamento (<br>credit\_card<br>,<br>pix<br>,<br>boleto<br>, etc.)</p> |
| credit\_card    | object \| null | Não         | Dados do cartão (apenas se método for cartão)                                      |
| pix             | object \| null | Não         | Dados do pix (apenas se método for pix)                                            |
| boleto          | object \| null | Não         | Dados do boleto (apenas se método for boleto)                                      |

#### ![💳](https://www.notion.so/Base64-Image-Removed) data.payment\_details.credit\_card

Informações do cartão de crédito.

| Campo       | Tipo   | Obrigatório | Descrição                   |
| ----------- | ------ | ----------- | --------------------------- |
| instalments | number | Sim         | Número de parcelas          |
| brand       | string | Sim         | Bandeira do cartão          |
| last\_digit | number | Sim         | Últimos 4 dígitos do cartão |

### ![💰](https://www.notion.so/Base64-Image-Removed) data.payment\_details.pix

Informações do pix.

| Campo        | Tipo   | Obrigatório | Descrição                       |
| ------------ | ------ | ----------- | ------------------------------- |
| qrcode\_url  | string | Sim         | url do com o pix para pagamento |
| qrcode\_data | string | Sim         | código do pix copia e cola      |
| expiration   | number | Sim         | data de expiração               |

### ![🧾](https://www.notion.so/Base64-Image-Removed) data.payment\_details.boleto

Informações do boleto.

| Campo         | Tipo   | Obrigatório | Descrição                       |
| ------------- | ------ | ----------- | ------------------------------- |
| barcode\_url  | string | Sim         | url do boleto para impressao    |
| barcode\_data | string | Sim         | código de barras para pagamento |
| expiration    | string | Sim         | data de expiração               |

### ![💸](https://www.notion.so/Base64-Image-Removed) data.comissions

Lista de comissões relacionadas à transação.

| Campo      | Tipo  | Obrigatório | Descrição                            |
| ---------- | ----- | ----------- | ------------------------------------ |
| comissions | array | Não         | Lista de comissões. Pode estar vazia |

### ![🧾](https://www.notion.so/Base64-Image-Removed) data.order

Informações do pedido associado.

| Campo | Tipo           | Obrigatório | Descrição                                                                       |
| ----- | -------------- | ----------- | ------------------------------------------------------------------------------- |
| order | object \| null | Não         | <p>Dados do pedido. (Retorna<br>null<br>quando a transação é de assinatura)</p> |

### ![🔁](https://www.notion.so/Base64-Image-Removed) data.subscription

Dados da assinatura vinculada à transação.

| Campo                 | Tipo                      | Obrigatório | Descrição                                                               |
| --------------------- | ------------------------- | ----------- | ----------------------------------------------------------------------- |
| code                  | string                    | Sim         | Código identificador da assinatura                                      |
| periodicity           | string                    | Sim         | <p>Periodicidade da cobrança (<br>monthly<br>,<br>yearly<br>, etc.)</p> |
| periodicity\_interval | number                    | Sim         | Intervalo entre cobranças                                               |
| price                 | number                    | Sim         | Valor da assinatura (em centavos)                                       |
| status                | string                    | Sim         | Status atual da assinatura                                              |
| started\_at           | string (datetime) \| null | Não         | Data de início da assinatura                                            |
| next\_billing\_at     | string (datetime) \| null | Não         | Próxima data de cobrança                                                |
| suspended\_at         | string (datetime) \| null | Não         | Data de suspensão da assinatura                                         |
| canceled\_at          | string (datetime) \| null | Não         | Data de cancelamento da assinatura                                      |
| created\_at           | string (datetime) \| null | Não         | Data de criação da assinatura                                           |
| subscriber            | object                    | Sim         | Dados do assinante                                                      |

### ![👤](https://www.notion.so/Base64-Image-Removed) data.subscription.subscriber

Dados do assinante.

| Campo            | Tipo           | Obrigatório | Descrição                                            |
| ---------------- | -------------- | ----------- | ---------------------------------------------------- |
| id               | string         | Sim         | Id do assinante                                      |
| name             | string         | Sim         | Nome completo                                        |
| email            | string         | Sim         | E-mail do assinante                                  |
| phone\_country   | string \| null | Não         | Código do país do telefone                           |
| phone            | string \| null | Não         | Número de telefone                                   |
| document\_type   | string \| null | Não         | <p>Tipo de documento (<br>cpf<br>ou<br>cnpj<br>)</p> |
| document\_number | string \| null | Não         | Número do documento                                  |

### ![📦](https://www.notion.so/Base64-Image-Removed) data.subscription.product

Produto vinculado à assinatura.

| Campo | Tipo   | Obrigatório | Descrição                      |
| ----- | ------ | ----------- | ------------------------------ |
| id    | number | Sim         | Id do produto                  |
| title | string | Sim         | Nome do produto                |
| price | number | Sim         | Valor do produto (em centavos) |

### ![🧾](https://www.notion.so/Base64-Image-Removed) data.subscription.invoice

Dados da fatura gerada para a assinatura.

| Campo             | Tipo                      | Obrigatório | Descrição                            |
| ----------------- | ------------------------- | ----------- | ------------------------------------ |
| code              | string                    | Sim         | Código da fatura                     |
| attempts          | number                    | Sim         | Quantidade de tentativas de cobrança |
| status            | string                    | Sim         | Status da fatura                     |
| paid\_at          | string (datetime) \| null | Não         | Data de pagamento                    |
| refunded\_at      | string (datetime) \| null | Não         | Data de estorno                      |
| charged\_back\_at | string (datetime) \| null | Não         | Data de chargeback                   |
| billing\_date     | string (datetime) \| null | Sim         | Data de vencimento                   |
| created\_at       | string (datetime) \| null | Sim         | Data de criação da fatura            |

### ![💳](https://www.notion.so/Base64-Image-Removed) data.subscription.transactions

Histórico de tentativas de pagamento da fatura.

| Campo           | Tipo                      | Obrigatório | Descrição                          |
| --------------- | ------------------------- | ----------- | ---------------------------------- |
| paid\_at        | string (datetime) \| null | Não         | Data de pagamento                  |
| payment\_method | string                    | Sim         | Método de pagamento                |
| instalments     | number                    | Sim         | Número de parcelas                 |
| currency        | string                    | Sim         | Moeda                              |
| value           | number                    | Sim         | Valor da transação (em centavos)   |
| status          | string                    | Sim         | Status da tentativa                |
| credit\_card    | object \| null            | Não         | Dados do cartão (quando aplicável) |
| pix             | object \| null            | Não         | Dados do pix (quando aplicável)    |
| boleto          | object \| null            | Não         | Dados do boleto (quando aplicável) |

#### ![💳](https://www.notion.so/Base64-Image-Removed) data.subscription.transactions.credit\_card

| Campo       | Tipo   | Obrigatório | Descrição                   |
| ----------- | ------ | ----------- | --------------------------- |
| instalments | number | Sim         | Número de parcelas          |
| brand       | string | Sim         | Bandeira do cartão          |
| last\_digit | number | Sim         | Últimos 4 dígitos do cartão |

#### ![💰](https://www.notion.so/Base64-Image-Removed) data.subscription.transactions.pix

Informações do pix.

| Campo        | Tipo   | Obrigatório | Descrição                       |
| ------------ | ------ | ----------- | ------------------------------- |
| qrcode\_url  | string | Sim         | url do com o pix para pagamento |
| qrcode\_data | string | Sim         | código do pix copia e cola      |
| expiration   | number | Sim         | data de expiração               |

#### ![🧾](https://www.notion.so/Base64-Image-Removed) data.subscription.transactions.boleto

Informações do boleto.

| Campo         | Tipo   | Obrigatório | Descrição                       |
| ------------- | ------ | ----------- | ------------------------------- |
| barcode\_url  | string | Sim         | url do boleto para impressao    |
| barcode\_data | string | Sim         | código de barras para pagamento |
| expiration    | string | Sim         | data de expiração               |


# Webhooks de Assinatura

{% hint style="warning" %}
É importante ficar atento à diferença entre os webhooks de compra e de renovação de assinaturas. Na compra, o webhook

transaction.approved

se refere ao pedido; já na renovação, ele se refere ao invoice. Por isso, os dados são enviados em campos diferentes.
{% endhint %}

No momento da compra de um produto de assinatura, é criado um pedido (order) e são enviados dois webhooks:

* Transação Aprovada (transaction.approved)
* Liberação de Acesso (release.access)

O primeiro webhook, referente à compra, está associado ao pedido, portanto as informações da compra estarão disponíveis no campo `order`:

{% stepper %}
{% step %}

### Compra (pedido criado)

Payload de exemplo (os dados principais aparecem em `order`):

```json
{"company":{...},"payload":{"object":"transaction","event":"transaction.approved","created_at":"2026-01-02 16:48:57","data":{...},"payment_details":{...},"comissions":[],"order":{"id":7405530048429536000,"customer":{"id":"7394310639977632991","name":"João da Silva","email":"joao@example.com","phone_country":null,"phone":"+55 11999999999","document_type":"cpf","document_number":"00000000000"},"main_product":{...},"order_bump":[...],"utms":[...]},"subscription":null}}
```

{% endstep %}

{% step %}

### Renovação (invoice)

Na renovação da assinatura, será enviado apenas o webhook de Transação Aprovada (transaction.approved), disparado quando o pagamento da renovação for realizado. Nesse caso, o webhook estará associado ao invoice gerado, e as informações da renovação estarão disponíveis no campo `subscription`:

```json
{"company":{...},"payload":{"object":"transaction","event":"transaction.approved","created_at":"2026-01-02 16:48:57","data":{...},"payment_details":{...},"comissions":[],"order":null,"main_product":{...},"order_bump":[...],"utms":[...]},"subscription":{"code":"SB1B4H1HJ","periodicity":"monthly","periodicity_interval":1,"price":12333,"status":"active","started_at":"2025-12-02 20:02:23","next_billing_at":"2026-02-02 20:02:23","suspended_at":null,"canceled_at":null,"created_at":"2025-12-02 20:02:23","subscriber":{"id":"7394310639977632991","name":"João da Silva","email":"joao@example.com","phone_country":null,"phone":"+55 11999999999","document_type":"cpf","document_number":"00000000000"},"product":{"id":7394309835643586000,"title":"Produto de assinatura","price":12333},"invoice":{"code":"SBIN1B4H1M1","attempts":2,"status":"paid","paid_at":"2026-01-03 11:00:13","refunded_at":null,"charged_back_at":null,"billing_date":"2026-01-02 20:02:23","created_at":"2026-01-03 11:00:09"},"transactions":[{"paid_at":"2026-01-03T11:00:13+00:00","payment_method":"credit_card","instalments":1,"currency":"BRL","value":12333,"status":"approved","credit_card":{"instalments":1,"brand":"discover","last_digit":1234}},{"paid_at":"2026-01-03T11:00:13+00:00","payment_method":"credit_card","instalments":1,"currency":"BRL","value":12333,"status":"approved","credit_card":{"instalments":1,"brand":"discover","last_digit":1234}}]}}
```

{% endstep %}
{% endstepper %}


