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

# Obter contas de negócio

> Obter informações sobre suas contas do WhatsApp Business, números de telefone e templates disponíveis

## Descrição

Este endpoint retorna todas as informações associadas à sua API Key: dados da empresa, números de telefone com suas cotas de envio e templates aprovados com suas variáveis.

## Header de autenticação

<ParamField header="X-API-Key" type="string" required>
  Sua API Key da Mindo. Formato: `mindo_xxxxxxxxxxxxxxxxxxxxxxxx`
</ParamField>

## Resposta

<ResponseField name="companyName" type="string">
  Nome da sua empresa.
</ResponseField>

<ResponseField name="apiKeyName" type="string">
  Nome da API Key usada na requisição.
</ResponseField>

<ResponseField name="phoneNumbers" type="array">
  Números de telefone do WhatsApp associados à sua conta.

  <Expandable title="Propriedades de phoneNumbers">
    <ResponseField name="id" type="integer">
      ID interno do número de telefone.
    </ResponseField>

    <ResponseField name="phoneNumberId" type="string">
      **ID do número de telefone do WhatsApp na Meta.** Use este valor para enviar mensagens.
    </ResponseField>

    <ResponseField name="displayPhoneNumber" type="string">
      Número de telefone formatado para exibição.
    </ResponseField>

    <ResponseField name="verifiedName" type="string">
      Nome verificado pela Meta para este número.
    </ResponseField>

    <ResponseField name="businessName" type="string">
      Nome da conta do WhatsApp Business à qual este número pertence.
    </ResponseField>

    <ResponseField name="isPrimary" type="boolean">
      Se este é o número principal da conta.
    </ResponseField>

    <ResponseField name="messagingLimitTier" type="string">
      Nível de limite de envio atribuído pela Meta. Consulte a [tabela de níveis](#niveis-de-limite-de-envio).
    </ResponseField>

    <ResponseField name="quota" type="object">
      Informações da cota de envio atual.

      <Expandable title="Propriedades de quota">
        <ResponseField name="dailyLimit" type="integer">
          Limite diário de conversas únicas.
        </ResponseField>

        <ResponseField name="uniqueNumbersSent24h" type="integer">
          Números únicos contatados nas últimas 24 horas.
        </ResponseField>

        <ResponseField name="remaining" type="integer">
          Conversas disponíveis restantes.
        </ResponseField>

        <ResponseField name="usagePercentage" type="float">
          Percentual de uso do limite (0-100).
        </ResponseField>

        <ResponseField name="canSend" type="boolean">
          Se o número pode enviar mensagens neste momento.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="templates" type="array">
      Templates aprovados disponíveis para envio neste número.

      <Expandable title="Propriedades de templates">
        <ResponseField name="name" type="string">
          Nome do template. Use este valor para enviar mensagens.
        </ResponseField>

        <ResponseField name="language" type="string">
          Idioma do template (`es`, `en`, etc.).
        </ResponseField>

        <ResponseField name="category" type="string">
          Categoria do template (`MARKETING`, `UTILITY`, etc.).
        </ResponseField>

        <ResponseField name="variables" type="array">
          Variáveis dinâmicas do template.

          <Expandable title="Propriedades de variables">
            <ResponseField name="name" type="string">
              Nome da variável.
            </ResponseField>

            <ResponseField name="type" type="string">
              Tipo de dado. Consulte os [tipos de variáveis](#tipos-de-variaveis).
            </ResponseField>

            <ResponseField name="position" type="integer">
              Posição da variável dentro do componente.
            </ResponseField>

            <ResponseField name="isRequired" type="boolean">
              Se a variável é obrigatória.
            </ResponseField>

            <ResponseField name="component" type="string">
              Componente onde a variável aparece (`HEADER`, `BODY`, `FOOTER`, `BUTTON`).
            </ResponseField>
          </Expandable>
        </ResponseField>

        <ResponseField name="buttons" type="array">
          Botões do template (array vazio se não possui botões).
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

<RequestExample>
  ```bash cURL theme={null}
  curl -X GET https://api.mindosoftware.com/api/v1/business-accounts/ \
    -H "X-API-Key: mindo_xxxxxxxxxxxxxxxxxxxxxxxx"
  ```

  ```python Python theme={null}
  import requests

  response = requests.get(
      "https://api.mindosoftware.com/api/v1/business-accounts/",
      headers={"X-API-Key": "mindo_xxxxxxxxxxxxxxxxxxxxxxxx"}
  )

  data = response.json()
  print(data)
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch(
    "https://api.mindosoftware.com/api/v1/business-accounts/",
    {
      headers: { "X-API-Key": "mindo_xxxxxxxxxxxxxxxxxxxxxxxx" }
    }
  );

  const data = await response.json();
  console.log(data);
  ```
</RequestExample>

<ResponseExample>
  ```json 200 - OK theme={null}
  {
    "companyName": "Mi Empresa SRL",
    "apiKeyName": "Production API Key",
    "phoneNumbers": [
      {
        "id": 123,
        "phoneNumberId": "813497231850626",
        "displayPhoneNumber": "+54 9 223 675-0780",
        "verifiedName": "Mi Empresa",
        "businessName": "Mi Empresa SRL",
        "isPrimary": true,
        "messagingLimitTier": "TIER_1000",
        "quota": {
          "dailyLimit": 1000,
          "uniqueNumbersSent24h": 45,
          "remaining": 955,
          "usagePercentage": 4.5,
          "canSend": true
        },
        "templates": [
          {
            "name": "welcome_message",
            "language": "es",
            "category": "MARKETING",
            "variables": [
              {
                "name": "customer_name",
                "type": "TEXT",
                "position": 1,
                "isRequired": true,
                "component": "BODY"
              }
            ],
            "buttons": []
          },
          {
            "name": "order_confirmation",
            "language": "es",
            "category": "UTILITY",
            "variables": [
              {
                "name": "order_id",
                "type": "TEXT",
                "position": 1,
                "isRequired": true,
                "component": "BODY"
              },
              {
                "name": "total_amount",
                "type": "CURRENCY",
                "position": 2,
                "isRequired": true,
                "component": "BODY"
              },
              {
                "name": "delivery_date",
                "type": "DATE_TIME",
                "position": 3,
                "isRequired": true,
                "component": "BODY"
              }
            ],
            "buttons": []
          }
        ]
      }
    ]
  }
  ```

  ```json 401 - API Key não enviada theme={null}
  {
    "error": "Este endpoint requiere autenticacion con API Key (header X-API-Key)"
  }
  ```

  ```json 401 - API Key expirada theme={null}
  {
    "error": "API Key expirada"
  }
  ```

  ```json 403 - Sem acesso theme={null}
  {
    "error": "API Key no tiene acceso a este recurso"
  }
  ```
</ResponseExample>

## Níveis de limite de envio

Os níveis de envio são atribuídos pela Meta e determinam quantas conversas únicas você pode iniciar por dia.

| Nível            | Limite diário     | Velocidade recomendada  | Tempo estimado (1000 msgs) |
| ---------------- | ----------------- | ----------------------- | -------------------------- |
| `TIER_50`        | 50 conversas      | 1,2s entre mensagens    | 20 minutos                 |
| `TIER_250`       | 250 conversas     | 0,24s entre mensagens   | 4 minutos                  |
| `TIER_1000`      | 1.000 conversas   | 0,06s entre mensagens   | 1 minuto                   |
| `TIER_10000`     | 10.000 conversas  | 0,006s entre mensagens  | 6 segundos                 |
| `TIER_100000`    | 100.000 conversas | 0,0006s entre mensagens | \< 1 segundo               |
| `TIER_UNLIMITED` | Sem limite        | Sem atraso              | Instantâneo                |

<Note>
  O nível aumenta automaticamente com base no uso e na qualidade do número.
</Note>

## Tipos de variáveis

As variáveis do template podem ser dos seguintes tipos:

| Tipo        | Descrição        | Exemplo                       |
| ----------- | ---------------- | ----------------------------- |
| `TEXT`      | Texto simples    | `"Juan Perez"`                |
| `CURRENCY`  | Valor com moeda  | `"$1.250,00"`                 |
| `DATE_TIME` | Data e/ou hora   | `"25 de novembro"`, `"18:30"` |
| `IMAGE`     | URL de imagem    | `"https://..."`               |
| `VIDEO`     | URL de vídeo     | `"https://..."`               |
| `DOCUMENT`  | URL de documento | `"https://..."`               |

## Casos de uso

<AccordionGroup>
  <Accordion title="Obter phone_number_id para enviar mensagens">
    O campo `phoneNumberId` é o ID da Meta que você precisa para enviar mensagens pela API.

    ```javascript theme={null}
    const data = await getBusinessAccounts();

    // Obter o primeiro número do WhatsApp
    const firstPhone = data.phoneNumbers[0];
    const phoneNumberId = firstPhone.phoneNumberId;

    console.log('Phone Number ID:', phoneNumberId);
    // Output: "813497231850626"

    // Usar este ID para enviar mensagens
    await sendTemplate({
      phone_number_id: phoneNumberId,
      template_name: 'welcome_message',
      recipient_phone: '+5491112345678',
      variables: { customer_name: 'Juan' }
    });
    ```
  </Accordion>

  <Accordion title="Verificar cota disponível antes de enviar">
    Antes de enviar mensagens, verifique se o número tem cota disponível.

    ```javascript theme={null}
    const data = await getBusinessAccounts();
    const phone = data.phoneNumbers[0];

    if (!phone.quota.canSend) {
      console.error('Não é possível enviar: limite atingido');
      console.log(`Usado: ${phone.quota.uniqueNumbersSent24h}/${phone.quota.dailyLimit}`);
      return;
    }

    if (phone.quota.usagePercentage > 80) {
      console.warn('Alerta: Uso em ' + phone.quota.usagePercentage + '%');
    }

    console.log('Cota disponível:', phone.quota.remaining);
    ```
  </Accordion>

  <Accordion title="Listar templates com suas variáveis">
    Obtenha a lista de templates disponíveis e suas variáveis para construir envios.

    ```javascript theme={null}
    const data = await getBusinessAccounts();
    const phone = data.phoneNumbers[0];

    console.log('Templates disponíveis:');
    phone.templates.forEach(template => {
      console.log(`\n${template.name} (${template.language})`);
      console.log(`  Categoria: ${template.category}`);
      console.log(`  Variáveis:`);

      template.variables.forEach(variable => {
        const required = variable.isRequired ? '(obrigatório)' : '(opcional)';
        console.log(`  - ${variable.name} [${variable.type}] ${required}`);
      });
    });
    ```
  </Accordion>

  <Accordion title="Construir payload dinamicamente a partir das variáveis do template">
    Use as informações das variáveis para construir o payload de envio automaticamente.

    ```javascript theme={null}
    const data = await getBusinessAccounts();
    const template = data.phoneNumbers[0].templates
      .find(t => t.name === 'order_confirmation');

    // Construir variáveis automaticamente
    const variables = {};
    template.variables.forEach(variable => {
      switch (variable.type) {
        case 'TEXT':
          variables[variable.name] = 'Valor de texto';
          break;
        case 'CURRENCY':
          variables[variable.name] = 'R$1.250,00';
          break;
        case 'DATE_TIME':
          variables[variable.name] = new Date().toLocaleDateString('pt-BR');
          break;
      }
    });

    console.log('Variáveis construídas:', variables);
    // Output: { order_id: 'Valor de texto', total_amount: 'R$1.250,00', delivery_date: '16/11/2025' }
    ```
  </Accordion>

  <Accordion title="Selecionar número por disponibilidade de cota">
    Se você tem múltiplos números, selecione automaticamente aquele com mais cota disponível.

    ```javascript theme={null}
    const data = await getBusinessAccounts();
    const phones = data.phoneNumbers;

    // Ordenar por cota restante (maior primeiro)
    const sortedPhones = phones.sort((a, b) => b.quota.remaining - a.quota.remaining);

    // Selecionar o que tem mais cota disponível
    const bestPhone = sortedPhones.find(phone => phone.quota.canSend);

    if (!bestPhone) {
      console.error('Nenhum número tem cota disponível');
      return;
    }

    console.log(`Usando número: ${bestPhone.displayPhoneNumber}`);
    console.log(`  Cota restante: ${bestPhone.quota.remaining}`);
    console.log(`  Phone Number ID: ${bestPhone.phoneNumberId}`);
    ```
  </Accordion>
</AccordionGroup>
