NURA Connect
API Docs
v2.0
Third Party API

API de Integração de Plataforma Nura

Documentação oficial para integração de aplicativos de terceiros com nossa plataforma

Introdução

Esta API permite que terceiros empresariais integrem seus aplicativos com o nosso sistema. A API oferece acesso a produtos, verificação de disponibilidade, lista de datacenters e cotações detalhadas — incluindo produtos EPL (Metro e Data), PORTS e suporte a dupla moeda (BRL + USD).

URL Base

https://api.nuraconnect.com

Versão Atual

v2.0

Formato de Resposta

JSON

Requisições por Minuto (Modo Sandbox)

60

Autenticação

Todas as requisições à API devem ser autenticadas usando um token de acesso. Este token deve ser incluído no header Nura-Third-Party-Token de cada requisição.

Token de Autenticação

O token é uma string única que identifica sua aplicação e controla o acesso à API.

Como obter um token

  1. Entre em contato com nosso suporte para solicitar um token

Exemplo de header de autenticação

Nura-Third-Party-Token: B7C9F9839e9FC3F14607....

Importante

Mantenha seu token seguro. Não compartilhe ou exponha seu token em código-fonte público, URLs ou aplicativos cliente. Em caso de comprometimento, solicite imediatamente um novo token.

Modo Sandbox

O modo sandbox permite testar a integração com a API sem afetar dados reais ou gerar transações. Para ativar o modo sandbox, inclua o header Nura-Api-Mode em suas requisições.

Ativando o Modo Sandbox

Adicione o header abaixo para ativar o modo sandbox em suas requisições.

Nura-Api-Mode: sandbox

Características do Modo Sandbox

  • Retorna dados mockados para testes
  • Disponível para todos os endpoints
  • Simula todos os cenários de erro possíveis

Dados de Teste

O modo sandbox fornece dados consistentes para testes.

[
  {
    "id": "1",
    "name": "SANDBOX_DIA",
    "description": "Dedicated Internet Access (Sandbox)"
  },
  {
    "id": "2",
    "name": "SANDBOX_BROADBAND",
    "description": "Broadband Internet (Sandbox)"
  }
]

Endpoints

GET

/products

Retorna todos os produtos disponíveis no sistema.

Parâmetros

Esta rota não requer parâmetros.

Exemplo de Requisição

curl -X GET "https://api.nuraconnect.com/products" \
  -H "Nura-Third-Party-Token: B7C9F9839e9FC3F14607...."

Exemplo de Resposta

[
  {
    "id": "2",
    "name": "DIA",
    "description": "Dedicated Internet"
  },
  {
    "id": "4",
    "name": "Broadband",
    "description": "Broadband"
  }
]

Propriedades da Resposta

PropriedadeTipoDescrição
idStringIdentificador único do produto
nameStringNome do produto
descriptionStringDescrição detalhada do produto
GET

/available

Verifica a disponibilidade de um produto em uma localização específica. Para produtos EPL (epl-metro, epl-data), retorna o code da ponta A — use as coordenadas de lat/lng do datacenter desejado obtidas em /datacenters.

Parâmetros de Query

ParâmetroTipoObrigatórioDescrição
productNameStringObrigatórioNome do produto: broadband, dia, epl-metro, epl-data, ports
latitudeNumberObrigatórioLatitude da localização da ponta A
longitudeNumberObrigatórioLongitude da localização da ponta A

Exemplo de Requisição

curl -X GET "https://api.nuraconnect.com/available?productName=BROADBAND&latitude=-23.5838308&longitude=-46.6835412" \
  -H "Nura-Third-Party-Token: B7C9F9839e9FC3F14607...."

Exemplo de Resposta

[
  {
    "area": "NnIs8WSOn60Wabof728WQfIaJyfF4bWgQbfRoLzXOIS9AeFDDFS/Vbvbj634QU1zG228UAXcrp5cpAPzfk/FP36LEdHyIEh4H+7dtWeBg1F2jzZ2GYoIVWdL8QaodMU="
  }
]

Propriedades da Resposta

PropriedadeTipoDescrição
areaStringCódigo encriptado da área geográfica — usado como parâmetro code no /quotes

Importante

O código de área retornado é necessário para obter cotações através do endpoint /quotes. Este código é criptografado e contém informações sobre a localização e o produto.

GET

/datacenters

Retorna a lista de todos os datacenters disponíveis na plataforma, com suas coordenadas geográficas. Use latitude e longitude de um datacenter como parâmetros latB/lngB no /quotes para cotações EPL ponta-a-datacenter ou datacenter-a-datacenter.

Parâmetros

Esta rota não requer parâmetros.

Exemplo de Requisição

curl -X GET "https://api.nuraconnect.com/datacenters" \
  -H "Nura-Third-Party-Token: B7C9F9839e9FC3F14607...."

Exemplo de Resposta

[
  {
    "id": "dc-uuid-001",
    "name": "Equinix SP4",
    "alias": "SP4",
    "correlationId": "DC-SP4",
    "address": {
      "latitude": -23.5101,
      "longitude": -46.697,
      "city": "São Paulo",
      "state": "São Paulo",
      "stateShortName": "SP",
      "countryName": "Brasil",
      "shortName": "BR",
      "formattedAddress": "Av. das Nações Unidas, 8501 - SP"
    }
  },
  {
    "id": "dc-uuid-002",
    "name": "Equinix RJ1",
    "alias": "RJ1",
    "correlationId": "DC-RJ1",
    "address": {
      "latitude": -22.9068,
      "longitude": -43.1729,
      "city": "Rio de Janeiro",
      "stateShortName": "RJ",
      "countryName": "Brasil",
      "shortName": "BR"
    }
  }
]

Propriedades da Resposta

PropriedadeTipoDescrição
idStringIdentificador único do datacenter
nameStringNome do datacenter
aliasStringAlias ou código curto (ex: SP4, RJ1)
correlationIdStringID de correlação com o sistema interno
address.latitudeNumberLatitude — usar como latB no /quotes
address.longitudeNumberLongitude — usar como lngB no /quotes
address.cityStringCidade do datacenter
address.stateShortNameStringSigla do estado (ex: SP, RJ)
address.countryNameStringNome do país
GET

/quotes

Retorna cotações detalhadas para um código de área. Suporta moeda simples (BRL ou USD) e dupla moeda (BRL + USD simultaneamente com taxa PTAX). Para produtos EPL, requer as coordenadas da ponta B (latB/lngB).

Parâmetros de Query

ParâmetroTipoObrigatórioDescrição
codeStringObrigatórioCódigo encriptado obtido do /available (ponta A)
bothBooleanRetorna preços em BRL e USD simultaneamente com taxa PTAX do dia. Passe both=true para ativar.
currencyStringMoeda de retorno: BRL (padrão) ou USD. Ignorado se both=true.
codeBStringEPLCódigo encriptado obtido do /available para a ponta B — obrigatório para produtos EPL. Chame /available com as coordenadas da ponta B (ex: lat/lng do datacenter escolhido no /datacenters).

Exemplo de Requisição

curl -X GET "https://api.nuraconnect.com/quotes?code=aH2RfrO3dNgCHLPZlEzwfZcTA62vE9COTgb7s0V1D1fmLw3AStpPHRC2EWQJfsqrVDlEibGZ52CWgwQ3rNcD39HaipD1LmvYMCYKQvVwMe10vlvToQwYaqni7ZYphWI=" \
  -H "Nura-Third-Party-Token: B7C9F9839e9FC3F14607...."

Exemplo de Resposta

{
  "speed": 20,
  "currency": "BRL",
  "plans": [
    {
      "term": 12,
      "monthlyCost": 89.98,
      "installationCost": 590,
      "forInterState": false,
      "forOutSide": false
    },
    {
      "term": 24,
      "monthlyCost": 85.48,
      "installationCost": 590,
      "forInterState": false,
      "forOutSide": false
    },
    {
      "term": 36,
      "monthlyCost": 81.2,
      "installationCost": 590,
      "forInterState": false,
      "forOutSide": false
    },
    {
      "term": 48,
      "monthlyCost": 78.77,
      "installationCost": 590,
      "forInterState": false,
      "forOutSide": false
    },
    {
      "term": 60,
      "monthlyCost": 77.19,
      "installationCost": 590,
      "forInterState": false,
      "forOutSide": false
    }
  ]
}

Propriedades da Resposta

PropriedadeTipoDescrição
speedNumberVelocidade contratada (em Mbps)
currencyStringMoeda utilizada (presente apenas sem both=true)
plansArrayLista de planos disponíveis
plans[].termNumberDuração do contrato (em meses)
plans[].monthlyCostSemImpNumberCusto mensal sem impostos (valor bruto do fornecedor)
plans[].installationCostSemImpNumberCusto de instalação sem impostos (valor bruto do fornecedor)
plans[].monthlyCostNumberCusto mensal com impostos e margem Nura incluídos
plans[].installationCostNumberCusto de instalação com impostos e margem Nura incluídos
plans[].forInterStateBooleanSe o plano está disponível para instalação inter-estadual
plans[].forOutSideBooleanSe o plano está disponível para instalação fora do país
plans[].pricesObjectPreços em dupla moeda (presente apenas com both=true)
plans[].prices.brlObjectPreço em BRL: monthlyCost (com imposto) e installationCost (com imposto)
plans[].prices.usdObjectPreço em USD: monthlyCost (com imposto) e installationCost (com imposto)
exchangeRateNumberTaxa PTAX (BRL/USD) usada na conversão
exchangeDateStringData/hora da cotação PTAX
POSTGETPATCH

/invoice

Gerencia pedidos de contratação de serviços. Suporta pedido único (POST /invoice) e pedidos em lote com Project (POST /invoice/bulk). Cada Order representa um produto; múltiplos prazos são representados como segmentos internos que podem ser cancelados individualmente.

Regra central

1 produto = 1 Order. Sempre. Cliente com EPL Metro + EPL Data → 2 Orders via /invoice/bulk. Cliente com DIA em múltiplos prazos → 1 Order com múltiplos segmentos.

Operações de escrita (POST, PATCH) são bloqueadas em modo sandbox. Leituras (GET) funcionam normalmente.

Endpoints disponíveis

POSTPOST /invoiceCria 1 Order (1 produto, 1 ou mais prazos)
POSTPOST /invoice/bulkCria Project + N Orders (múltiplos produtos)
GETGET /invoiceLista todas as Orders do usuário autenticado
GETGET /invoice/:idDetalhe de uma Order específica
PATCHPATCH /invoice/:id/cancelCancela a Order inteira e todos os segmentos ativos
PATCHPATCH /invoice/:id/segments/:sid/cancelCancela 1 segmento (prazo) específico dentro de uma Order

Parâmetros — POST /invoice

CampoTipoObrigatórioDescrição
productNameStringObrigatórioNome do produto: BROADBAND, DIA, EPL-METRO, EPL-DATA ou PORTS
productCodeStringObrigatórioHash retornado pelo GET /available (codeA para EPL)
productCodeBStringEPLHash da ponta B — obrigatório apenas para EPL-METRO e EPL-DATA
speedStringObrigatórioVelocidade contratada (ex: "100 Mbps")
currencyStringMoeda: BRL (padrão) ou USD
countryStringCódigo ISO do país (ex: BR, HK, US). Define qual empresa do usuário fatura. Padrão: BR
addressStringObrigatórioEndereço de instalação do serviço
emailStringObrigatórioE-mail de contato do pedido
paymentTypeStringTipo de pagamento. Padrão: invoice
extraServiceObjectServiços adicionais: { burstable?, wifi?, ip?: { ipType, cidrSuffix, price }, ports? }
segmentsArrayObrigatórioLista de prazos/cotações. Mínimo 1.
↳ termNumberObrigatórioPrazo em meses: 12, 24 ou 36
↳ monthlyCostNumberObrigatórioCusto mensal com imposto — use o valor retornado pelo GET /quotes
↳ installationCostNumberObrigatórioCusto de instalação com imposto — use o valor retornado pelo GET /quotes

Parâmetros — POST /invoice/bulk

CampoTipoObrigatórioDescrição
projectNameStringObrigatórioNome do projeto que agrupa as Orders
projectDescriptionStringDescrição opcional do projeto
countryStringCódigo ISO do país para resolver a empresa. Padrão: BR
ordersArrayObrigatórioArray de Orders — cada item segue o mesmo formato do POST /invoice

Exemplos de Requisição

POST /invoice — DIA com 2 prazos

curl -X POST "https://api.nuraconnect.com/invoice" \
  -H "Nura-Third-Party-Token: B7C9F9839e9FC3F14607...." \
  -H "Content-Type: application/json" \
  -d '{
  "productName": "DIA",
  "productCode": "abc123hash",
  "speed": "100 Mbps",
  "currency": "BRL",
  "country": "BR",
  "address": "Av. Paulista, 1000 - São Paulo, SP",
  "email": "[email protected]",
  "segments": [
    { "term": 24, "monthlyCost": 1250.00, "installationCost": 500.00 },
    { "term": 36, "monthlyCost": 1100.00, "installationCost": 500.00 }
  ]
}'

POST /invoice/bulk — EPL Metro + EPL Data

curl -X POST "https://api.nuraconnect.com/invoice/bulk" \
  -H "Nura-Third-Party-Token: B7C9F9839e9FC3F14607...." \
  -H "Content-Type: application/json" \
  -d '{
  "projectName": "Expansão DC São Paulo - ACME",
  "country": "BR",
  "orders": [
    {
      "productName": "EPL-METRO",
      "productCode": "hashPontaA_metro",
      "productCodeB": "hashPontaB_metro",
      "speed": "10000 Mbps",
      "currency": "BRL",
      "address": "Equinix SP2 - São Paulo, SP",
      "email": "[email protected]",
      "segments": [{ "term": 24, "monthlyCost": 8500.00, "installationCost": 0.00 }]
    },
    {
      "productName": "EPL-DATA",
      "productCode": "hashPontaA_data",
      "productCodeB": "hashPontaB_data",
      "speed": "10000 Mbps",
      "currency": "BRL",
      "address": "Equinix SP4 - São Paulo, SP",
      "email": "[email protected]",
      "segments": [{ "term": 24, "monthlyCost": 9200.00, "installationCost": 0.00 }]
    }
  ]
}'

Exemplo de Resposta

POST /invoice — 201 Created

{
  "orderId": "01960000-0000-7000-0000-000000000001",
  "productName": "DIA",
  "speed": "100 Mbps",
  "currency": "BRL",
  "status": "pending",
  "segments": [
    {
      "segmentId": "01960000-0000-7000-0000-000000000011",
      "term": 24,
      "monthlyCost": 1250.00,
      "installationCost": 500.00,
      "status": "pending"
    },
    {
      "segmentId": "01960000-0000-7000-0000-000000000012",
      "term": 36,
      "monthlyCost": 1100.00,
      "installationCost": 500.00,
      "status": "pending"
    }
  ],
  "createdAt": "2026-03-21T18:00:00.000Z"
}

GET /invoice — 200 OK

[
  {
    "orderId": "01960000-0000-7000-0000-000000000001",
    "productName": "DIA",
    "productCode": "abc123hash",
    "productCodeB": null,
    "speed": "100 Mbps",
    "currency": "BRL",
    "address": "Av. Paulista, 1000 - São Paulo, SP",
    "email": "[email protected]",
    "status": "pending",
    "paymentType": "invoice",
    "extraService": null,
    "project": null,
    "company": { "id": "...", "name": "Empresa ACME", "country": "Brazil" },
    "segments": [
      {
        "segmentId": "01960000-0000-7000-0000-000000000011",
        "term": 24,
        "monthlyCost": 1250.00,
        "installationCost": 500.00,
        "status": "pending",
        "createdAt": "2026-03-21T18:00:00.000Z"
      }
    ],
    "createdAt": "2026-03-21T18:00:00.000Z",
    "updatedAt": "2026-03-21T18:00:00.000Z"
  }
]

Propriedades da Resposta

PropriedadeTipoDescrição
orderIdStringID único da Order
productNameStringNome do produto contratado
speedStringVelocidade contratada
currencyStringMoeda dos valores
statusStringStatus: pending | active | cancelled | completed
projectObject | nullProjeto associado (null para orders avulsas)
companyObjectEmpresa que fatura este pedido
segmentsArrayLista de segmentos (prazos) da Order
↳ segmentIdStringID único do segmento
↳ termNumberPrazo em meses
↳ monthlyCostNumberCusto mensal com imposto
↳ installationCostNumberCusto de instalação com imposto
↳ statusStringStatus: pending | active | cancelled | completed

Ciclo de status

Order/Segment: pending → active → completed ou cancelled

Project: active → completed ou cancelled

pendingCriado, aguardando ativação pela Nura
activeServiço ativo
cancelledCancelado pelo integrador ou pela Nura
completedContrato encerrado ao fim do prazo

Erros comuns

400Escrita bloqueada em sandbox — remover header nura-api-mode: sandbox
401Token ausente ou inválido
403Order pertence a outro usuário
404Order ou segmento não encontrado
422Empresa não cadastrada para o país — usar POST /users/:id/companies primeiro
GET

/available-equipments

Retorna a lista de equipamentos disponíveis para contratação com seus respectivos planos de preço por prazo (12, 24 e 36 meses). Preços exibidos sem impostos — os valores com impostos estarão disponíveis após a implementação do TaxCalculatorService (S06).

Parâmetros de Query

ParâmetroTipoObrigatórioDescrição
bothBooleanNãoRetorna preços em BRL e USD simultaneamente com taxa PTAX do dia. Passe both=true para ativar.

Exemplo de Requisição

curl -X GET "https://api.nuraconnect.com/available-equipments?both=true" \
  -H "Nura-Third-Party-Token: B7C9F9839e9FC3F14607...."

Exemplo de Resposta

{
  "taxIncluded": false,
  "items": [
    {
      "id": "uuid-eq-001",
      "model": "Cisco ISR 1100",
      "provider": "Nura",
      "correlationId": "EQ-001",
      "plans": [
        {
          "term": 12,
          "prices": {
            "brl": { "monthlyCost": 320.00, "installationCost": 0 },
            "usd": { "monthlyCost": 60.95, "installationCost": 0 }
          }
        },
        {
          "term": 24,
          "prices": {
            "brl": { "monthlyCost": 290.00, "installationCost": 0 },
            "usd": { "monthlyCost": 55.24, "installationCost": 0 }
          }
        }
      ]
    }
  ],
  "exchangeRate": 5.84,
  "exchangeDate": "2026-03-21T13:00:00"
}

Propriedades da Resposta

PropriedadeTipoDescrição
taxIncludedBooleanIndica se os preços incluem impostos e margem Nura. Sempre true após S06.
itemsArrayLista de equipamentos disponíveis
items[].idStringIdentificador único do equipamento
items[].modelStringModelo do equipamento
items[].providerStringFornecedor do equipamento
items[].plansArrayPlanos de preço por prazo
items[].plans[].termNumberPrazo do contrato em meses (12, 24 ou 36)
items[].plans[].monthlyCostSemImpNumberCusto mensal sem impostos — valor bruto do fornecedor (BRL)
items[].plans[].installationCostSemImpNumberCusto de instalação sem impostos — valor bruto do fornecedor (BRL)
items[].plans[].monthlyCostNumberCusto mensal com impostos e margem Nura incluídos (BRL)
items[].plans[].installationCostNumberCusto de instalação com impostos e margem Nura incluídos (BRL)
items[].plans[].pricesObjectPreços em dupla moeda (presente apenas com both=true)
exchangeRateNumberTaxa PTAX (BRL/USD) usada na conversão
exchangeDateStringData/hora da cotação PTAX
GET

/available-ips

Retorna a tabela de preços de endereços IP (IPv4 e IPv6) por prefixo CIDR e produto. Preços armazenados em BRL; conversão para USD via PTAX disponível com both=true.

Parâmetros de Query

ParâmetroTipoObrigatórioDescrição
productStringNãoFiltro por produto: DEDICATED INTERNET ACCESS ou BROADBAND
ipTypeStringNãoFiltro por tipo de IP: IPv4 ou IPv6
bothBooleanNãoRetorna preços em BRL e USD simultaneamente com taxa PTAX do dia. Passe both=true para ativar.

Exemplo de Requisição

curl -X GET "https://api.nuraconnect.com/available-ips?product=DEDICATED+INTERNET+ACCESS&both=true" \
  -H "Nura-Third-Party-Token: B7C9F9839e9FC3F14607...."

Exemplo de Resposta

{
  "items": [
    {
      "id": 1,
      "ipType": "IPv4",
      "cidrSuffix": "/30",
      "product": "DEDICATED INTERNET ACCESS",
      "prices": { "brl": 0, "usd": 0 }
    },
    {
      "id": 2,
      "ipType": "IPv4",
      "cidrSuffix": "/29",
      "product": "DEDICATED INTERNET ACCESS",
      "prices": { "brl": 120.00, "usd": 22.86 }
    },
    {
      "id": 7,
      "ipType": "IPv6",
      "cidrSuffix": "/64",
      "product": "DEDICATED INTERNET ACCESS",
      "prices": { "brl": 0, "usd": 0 }
    }
  ],
  "exchangeRate": 5.84,
  "exchangeDate": "2026-03-21T13:00:00"
}

Propriedades da Resposta

PropriedadeTipoDescrição
itemsArrayLista de entradas de precificação de IP
items[].idNumberIdentificador único
items[].ipTypeStringTipo de IP: IPv4 ou IPv6
items[].cidrSuffixStringPrefixo CIDR do bloco (ex: /30, /29, /28)
items[].productStringProduto ao qual o preço se aplica
items[].priceNumberPreço em BRL (presente apenas sem both=true)
items[].pricesObjectPreços em dupla moeda (presente apenas com both=true)
items[].prices.brlNumberPreço em BRL
items[].prices.usdNumberPreço em USD (convertido via PTAX)
exchangeRateNumberTaxa PTAX (BRL/USD) usada na conversão
exchangeDateStringData/hora da cotação PTAX

Códigos de Erro

A API utiliza códigos de status HTTP padrão para indicar o sucesso ou falha de uma requisição.

Códigos de Status HTTP

CódigoDescriçãoPossíveis Causas
200 OKRequisição bem-sucedidaA requisição foi processada com sucesso
400 Bad RequestRequisição inválidaParâmetros ausentes ou inválidos
401 UnauthorizedNão autorizadoToken de autenticação ausente ou inválido
403 ForbiddenProibidoO token não tem permissão para acessar o recurso
404 Not FoundNão encontradoO recurso solicitado não existe
429 Too Many RequestsMuitas requisiçõesLimite de requisições excedido
500 Internal Server ErrorErro interno do servidorErro inesperado no servidor

Exemplo de Resposta de Erro

{
  "error": {
    "code": "INVALID_PARAMETERS",
    "message": "Parâmetros inválidos ou ausentes",
    "details": "O parâmetro 'latitude' é obrigatório"
  }
}

Exemplos de Uso

Abaixo estão exemplos de fluxos completos de integração com a API.

Fluxo Completo — Produto Padrão (DIA / Broadband)

Este exemplo demonstra como obter uma cotação completa em três etapas.

1. Listar Produtos Disponíveis

// Requisição
const response = await fetch('https://api.nuraconnect.com/products', {
  method: 'GET',
  headers: {
    'Nura-Third-Party-Token': 'B7C9F9839e9FC3F14607....'
  }
});

// Resposta
[
  {
    "id": "2",
    "name": "DIA",
    "description": "Dedicated Internet"
  },
  {
    "id": "4",
    "name": "Broadband",
    "description": "Broadband"
  }
]

2. Verificar Disponibilidade

// Requisição
const params = new URLSearchParams({
  productName: 'BROADBAND',
  latitude: -23.5838308,
  longitude: -46.6835412
});

const response = await fetch(`https://api.nuraconnect.com/available?${params}`, {
  method: 'GET',
  headers: {
    'Nura-Third-Party-Token': 'B7C9F9839e9FC3F14607....'
  }
});

// Resposta
[
  {
    "area": "NnIs8WSOn60Wabof728WQfIaJyfF4bWgQbfRoLzXOIS9AeFDDFS/Vbvbj634QU1zG228UAXcrp5cpAPzfk/FP36LEdHyIEh4H+7dtWeBg1F2jzZ2GYoIVWdL8QaodMU="
  }
]

3. Obter Cotações (dupla moeda)

// Requisição
const areaCode = "NnIs8WSOn60Wabof728WQfIaJyfF4bWgQbfRoLzXOIS9AeFDDFS/Vbvbj634QU1zG228UAXcrp5cpAPzfk/FP36LEdHyIEh4H+7dtWeBg1F2jzZ2GYoIVWdL8QaodMU=";
const params = new URLSearchParams({ code: areaCode });

const response = await fetch(`https://api.nuraconnect.com/quotes?${params}`, {
  method: 'GET',
  headers: {
    'Nura-Third-Party-Token': 'B7C9F9839e9FC3F14607....'
  }
});

// Resposta
{
  "speed": 20,
  "currency": "BRL",
  "plans": [
    {
      "term": 12,
      "monthlyCost": 89.98,
      "installationCost": 590,
      "forInterState": false,
      "forOutSide": false
    },
    {
      "term": 24,
      "monthlyCost": 85.48,
      "installationCost": 590,
      "forInterState": false,
      "forOutSide": false
    }
  ]
}

Fluxo EPL — Ponta a Datacenter

Para produtos EPL (epl-metro, epl-data), o fluxo envolve listar datacenters, obter o code da ponta A e passar a lat/lng do datacenter escolhido como ponta B.

1. Listar Datacenters disponíveis

// Requisição
const response = await fetch('https://api.nuraconnect.com/datacenters', {
  headers: { 'Nura-Third-Party-Token': 'B7C9F9839e9FC3F14607....' }
});

// Resposta
[
  { "id": "dc-uuid-001", "name": "Equinix SP4", "alias": "SP4",
    "address": { "latitude": -23.5101, "longitude": -46.697, "city": "São Paulo" } },
  { "id": "dc-uuid-002", "name": "Equinix RJ1", "alias": "RJ1",
    "address": { "latitude": -22.9068, "longitude": -43.1729, "city": "Rio de Janeiro" } }
]

2. Verificar disponibilidade da ponta A (epl-metro)

// Requisição
// Ponta A: localização do cliente
const paramsA = new URLSearchParams({
  productName: 'epl-metro',
  latitude: -23.5505,
  longitude: -46.6333
});
const resA = await fetch(`https://api.nuraconnect.com/available?${paramsA}`, {
  headers: { 'Nura-Third-Party-Token': 'B7C9F9839e9FC3F14607....' }
});
const [{ area: codeA }] = await resA.json();

// Ponta B: coordenadas do datacenter escolhido (Equinix SP4)
const paramsB = new URLSearchParams({
  productName: 'epl-metro',
  latitude: -23.5101,  // address.latitude do /datacenters
  longitude: -46.697   // address.longitude do /datacenters
});
const resB = await fetch(`https://api.nuraconnect.com/available?${paramsB}`, {
  headers: { 'Nura-Third-Party-Token': 'B7C9F9839e9FC3F14607....' }
});
const [{ area: codeB }] = await resB.json();

// Resposta
// codeA = "NnIs8WSOn60Wabof728WQ...."
// codeB = "aH2RfrO3dNgCHLPZlEzwfZ...."  ← code da ponta datacenter

3. Obter cotação EPL (ponta A → datacenter B, dupla moeda)

// Passa codeA e codeB — sem lat/lng no /quotes
const params = new URLSearchParams({
  code: codeA,
  codeB: codeB,
  both: 'true'
});

const response = await fetch(`https://api.nuraconnect.com/quotes?${params}`, {
  headers: { 'Nura-Third-Party-Token': 'B7C9F9839e9FC3F14607....' }
});

// Resposta
[{
  "speed": 100,
  "plans": [{
    "term": 12,
    "prices": {
      "brl": { "monthlyCost": 1800.00, "installationCost": 2400.00 },
      "usd": { "monthlyCost": 342.86, "installationCost": 457.14 }
    },
    "originLpu": "PROVEDOR-A",
    "destinationLpu": "PROVEDOR-DC"
  }],
  "exchangeRate": 5.84,
  "exchangeDate": "2026-03-21T13:00:00"
}]

Testando com o Modo Sandbox

Este exemplo demonstra como usar o modo sandbox para testar a integração.

// Requisição com modo sandbox ativado
const response = await fetch('https://api.nuraconnect.com/products', {
  method: 'GET',
  headers: {
    'Nura-Third-Party-Token': 'B7C9F9839e9FC3F14607....',
    'Nura-Api-Mode': 'sandbox'
  }
});

// Resposta (dados mockados)
[
  {
    "id": "1",
    "name": "SANDBOX_DIA",
    "description": "Dedicated Internet Access (Sandbox)"
  },
  {
    "id": "2",
    "name": "SANDBOX_BROADBAND",
    "description": "Broadband Internet (Sandbox)"
  }
]