> ## 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.

# Obtener cuentas de negocio

> Obtiene la información de tus cuentas de WhatsApp Business, números de teléfono y templates disponibles

## Descripción

Este endpoint devuelve toda la información asociada a tu API Key: datos de la empresa, números de teléfono con su cuota de mensajería y templates aprobados con sus variables.

## Header de autenticación

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

## Respuesta

<ResponseField name="companyName" type="string">
  Nombre de tu empresa.
</ResponseField>

<ResponseField name="apiKeyName" type="string">
  Nombre de la API Key utilizada en la solicitud.
</ResponseField>

<ResponseField name="phoneNumbers" type="array">
  Números de WhatsApp asociados a tu cuenta.

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

    <ResponseField name="phoneNumberId" type="string">
      **ID de Meta del número de WhatsApp.** Usar este valor para enviar mensajes.
    </ResponseField>

    <ResponseField name="displayPhoneNumber" type="string">
      Número de teléfono formateado para mostrar al usuario.
    </ResponseField>

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

    <ResponseField name="businessName" type="string">
      Nombre de la cuenta de WhatsApp Business a la que pertenece este número.
    </ResponseField>

    <ResponseField name="isPrimary" type="boolean">
      Indica si es el número principal de la cuenta.
    </ResponseField>

    <ResponseField name="messagingLimitTier" type="string">
      Tier de límite de mensajería asignado por Meta. Ver [tabla de tiers](#messaging-limit-tiers).
    </ResponseField>

    <ResponseField name="quota" type="object">
      Información de cuota de mensajería actual.

      <Expandable title="Propiedades de quota">
        <ResponseField name="dailyLimit" type="integer">
          Límite diario de conversaciones únicas.
        </ResponseField>

        <ResponseField name="uniqueNumbersSent24h" type="integer">
          Números únicos contactados en las últimas 24 horas.
        </ResponseField>

        <ResponseField name="remaining" type="integer">
          Conversaciones restantes disponibles.
        </ResponseField>

        <ResponseField name="usagePercentage" type="float">
          Porcentaje de uso del límite (0-100).
        </ResponseField>

        <ResponseField name="canSend" type="boolean">
          Indica si el número puede enviar mensajes en este momento.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="templates" type="array">
      Templates aprobados disponibles para envío en este número.

      <Expandable title="Propiedades de templates">
        <ResponseField name="name" type="string">
          Nombre del template. Usar este valor para enviar mensajes.
        </ResponseField>

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

        <ResponseField name="category" type="string">
          Categoría del template (`MARKETING`, `UTILITY`, etc.).
        </ResponseField>

        <ResponseField name="variables" type="array">
          Variables dinámicas del template.

          <Expandable title="Propiedades de variables">
            <ResponseField name="name" type="string">
              Nombre de la variable.
            </ResponseField>

            <ResponseField name="type" type="string">
              Tipo de dato. Ver [tipos de variables](#tipos-de-variables).
            </ResponseField>

            <ResponseField name="position" type="integer">
              Posición de la variable dentro del componente.
            </ResponseField>

            <ResponseField name="isRequired" type="boolean">
              Indica si la variable es obligatoria.
            </ResponseField>

            <ResponseField name="component" type="string">
              Componente donde aparece la variable (`HEADER`, `BODY`, `FOOTER`, `BUTTON`).
            </ResponseField>
          </Expandable>
        </ResponseField>

        <ResponseField name="buttons" type="array">
          Botones del template (array vacío si no tiene botones).
        </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 no 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 - Sin acceso theme={null}
  {
    "error": "API Key no tiene acceso a este recurso"
  }
  ```
</ResponseExample>

## Messaging Limit Tiers

Los tiers de mensajería son asignados por Meta y determinan cuántas conversaciones únicas puedes iniciar por día.

| Tier             | Límite diario          | Velocidad recomendada  | Tiempo estimado (1000 msgs) |
| ---------------- | ---------------------- | ---------------------- | --------------------------- |
| `TIER_50`        | 50 conversaciones      | 1.2s entre mensajes    | 20 minutos                  |
| `TIER_250`       | 250 conversaciones     | 0.24s entre mensajes   | 4 minutos                   |
| `TIER_1000`      | 1,000 conversaciones   | 0.06s entre mensajes   | 1 minuto                    |
| `TIER_10000`     | 10,000 conversaciones  | 0.006s entre mensajes  | 6 segundos                  |
| `TIER_100000`    | 100,000 conversaciones | 0.0006s entre mensajes | \< 1 segundo                |
| `TIER_UNLIMITED` | Sin límite             | Sin delay              | Instantáneo                 |

<Note>
  El tier aumenta automáticamente según el uso y la calidad del número.
</Note>

## Tipos de variables

Las variables en los templates pueden ser de los siguientes tipos:

| Tipo        | Descripción      | Ejemplo                        |
| ----------- | ---------------- | ------------------------------ |
| `TEXT`      | Texto simple     | `"Juan Pérez"`                 |
| `CURRENCY`  | Monto con moneda | `"$1,250.00"`                  |
| `DATE_TIME` | Fecha y/o hora   | `"25 de Noviembre"`, `"18:30"` |
| `IMAGE`     | URL de imagen    | `"https://..."`                |
| `VIDEO`     | URL de video     | `"https://..."`                |
| `DOCUMENT`  | URL de documento | `"https://..."`                |

## Casos de uso

<AccordionGroup>
  <Accordion title="Obtener phone_number_id para enviar mensajes">
    El campo `phoneNumberId` es el ID de Meta que necesitas para enviar mensajes a través de la API.

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

    // Obtener el primer número de WhatsApp
    const firstPhone = data.phoneNumbers[0];
    const phoneNumberId = firstPhone.phoneNumberId;

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

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

  <Accordion title="Verificar cuota disponible antes de enviar">
    Antes de enviar mensajes, verifica que el número tenga cuota disponible.

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

    if (!phone.quota.canSend) {
      console.error('No se puede enviar: límite alcanzado');
      console.log(`Usado: ${phone.quota.uniqueNumbersSent24h}/${phone.quota.dailyLimit}`);
      return;
    }

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

    console.log('Cuota disponible:', phone.quota.remaining);
    ```
  </Accordion>

  <Accordion title="Listar templates con sus variables">
    Obtén la lista de templates disponibles y sus variables para construir los envíos.

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

    console.log('Templates disponibles:');
    phone.templates.forEach(template => {
      console.log(`\n${template.name} (${template.language})`);
      console.log(`  Categoría: ${template.category}`);
      console.log(`  Variables:`);

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

  <Accordion title="Construir payload dinámicamente según variables del template">
    Usa la información de variables para construir el payload de envío automáticamente.

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

    // Construir variables automáticamente
    const variables = {};
    template.variables.forEach(variable => {
      switch (variable.type) {
        case 'TEXT':
          variables[variable.name] = 'Valor de texto';
          break;
        case 'CURRENCY':
          variables[variable.name] = '$1,250.00';
          break;
        case 'DATE_TIME':
          variables[variable.name] = new Date().toLocaleDateString('es-AR');
          break;
      }
    });

    console.log('Variables construidas:', variables);
    // Output: { order_id: 'Valor de texto', total_amount: '$1,250.00', delivery_date: '16/11/2025' }
    ```
  </Accordion>

  <Accordion title="Seleccionar número según disponibilidad de cuota">
    Si tienes múltiples números, selecciona automáticamente el que tenga más cuota disponible.

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

    // Ordenar por cuota restante (mayor primero)
    const sortedPhones = phones.sort((a, b) => b.quota.remaining - a.quota.remaining);

    // Seleccionar el que tiene más cuota disponible
    const bestPhone = sortedPhones.find(phone => phone.quota.canSend);

    if (!bestPhone) {
      console.error('Ningún número tiene cuota disponible');
      return;
    }

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