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.comVersão Atual
Formato de Resposta
Requisições por Minuto (Modo Sandbox)
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
- Entre em contato com nosso suporte para solicitar um token
Exemplo de header de autenticação
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.
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)"
}
][
{
"area": "SANDBOX_AREA_CODE_123456789"
}
]{
"speed": 100,
"currency": "BRL",
"plans": [
{
"term": 12,
"monthlyCost": 99.99,
"installationCost": 500,
"forInterState": false,
"forOutSide": false
},
{
"term": 24,
"monthlyCost": 89.99,
"installationCost": 500,
"forInterState": false,
"forOutSide": false
}
]
}Endpoints
/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...."
const response = await fetch('https://api.nuraconnect.com/products', {
method: 'GET',
headers: {
'Nura-Third-Party-Token': 'B7C9F9839e9FC3F14607....'
}
});
const data = await response.json();
console.log(data);import requests
headers = {
'Nura-Third-Party-Token': 'B7C9F9839e9FC3F14607....'
}
response = requests.get('https://api.nuraconnect.com/products', headers=headers)
data = response.json()
print(data)Exemplo de Resposta
[
{
"id": "2",
"name": "DIA",
"description": "Dedicated Internet"
},
{
"id": "4",
"name": "Broadband",
"description": "Broadband"
}
]Propriedades da Resposta
| Propriedade | Tipo | Descrição |
|---|---|---|
id | String | Identificador único do produto |
name | String | Nome do produto |
description | String | Descrição detalhada do produto |
/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âmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
productName | String | Obrigatório | Nome do produto: broadband, dia, epl-metro, epl-data, ports |
latitude | Number | Obrigatório | Latitude da localização da ponta A |
longitude | Number | Obrigatório | Longitude 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...."
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....'
}
});
const data = await response.json();
console.log(data);import requests
headers = {
'Nura-Third-Party-Token': 'B7C9F9839e9FC3F14607....'
}
params = {
'productName': 'BROADBAND',
'latitude': -23.5838308,
'longitude': -46.6835412
}
response = requests.get('https://api.nuraconnect.com/available', headers=headers, params=params)
data = response.json()
print(data)Exemplo de Resposta
[
{
"area": "NnIs8WSOn60Wabof728WQfIaJyfF4bWgQbfRoLzXOIS9AeFDDFS/Vbvbj634QU1zG228UAXcrp5cpAPzfk/FP36LEdHyIEh4H+7dtWeBg1F2jzZ2GYoIVWdL8QaodMU="
}
]Propriedades da Resposta
| Propriedade | Tipo | Descrição |
|---|---|---|
area | String | Có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.
/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...."
const response = await fetch('https://api.nuraconnect.com/datacenters', {
method: 'GET',
headers: {
'Nura-Third-Party-Token': 'B7C9F9839e9FC3F14607....'
}
});
const datacenters = await response.json();
console.log(datacenters);import requests
headers = {
'Nura-Third-Party-Token': 'B7C9F9839e9FC3F14607....'
}
response = requests.get('https://api.nuraconnect.com/datacenters', headers=headers)
data = response.json()
print(data)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
| Propriedade | Tipo | Descrição |
|---|---|---|
id | String | Identificador único do datacenter |
name | String | Nome do datacenter |
alias | String | Alias ou código curto (ex: SP4, RJ1) |
correlationId | String | ID de correlação com o sistema interno |
address.latitude | Number | Latitude — usar como latB no /quotes |
address.longitude | Number | Longitude — usar como lngB no /quotes |
address.city | String | Cidade do datacenter |
address.stateShortName | String | Sigla do estado (ex: SP, RJ) |
address.countryName | String | Nome do país |
/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âmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
code | String | Obrigatório | Código encriptado obtido do /available (ponta A) |
both | Boolean | — | Retorna preços em BRL e USD simultaneamente com taxa PTAX do dia. Passe both=true para ativar. |
currency | String | — | Moeda de retorno: BRL (padrão) ou USD. Ignorado se both=true. |
codeB | String | EPL | Có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...."
const code = 'aH2RfrO3dNgCHLPZlEzwfZcTA62vE9COTgb7s0V1D1fmLw3AStpPHRC2EWQJfsqrVDlEibGZ52CWgwQ3rNcD39HaipD1LmvYMCYKQvVwMe10vlvToQwYaqni7ZYphWI=';
const params = new URLSearchParams({ code });
const response = await fetch(`https://api.nuraconnect.com/quotes?${params}`, {
method: 'GET',
headers: {
'Nura-Third-Party-Token': 'B7C9F9839e9FC3F14607....'
}
});
const data = await response.json();
console.log(data);import requests
headers = {
'Nura-Third-Party-Token': 'B7C9F9839e9FC3F14607....'
}
params = {
'code': 'aH2RfrO3dNgCHLPZlEzwfZcTA62vE9COTgb7s0V1D1fmLw3AStpPHRC2EWQJfsqrVDlEibGZ52CWgwQ3rNcD39HaipD1LmvYMCYKQvVwMe10vlvToQwYaqni7ZYphWI='
}
response = requests.get('https://api.nuraconnect.com/quotes', headers=headers, params=params)
data = response.json()
print(data)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
| Propriedade | Tipo | Descrição |
|---|---|---|
speed | Number | Velocidade contratada (em Mbps) |
currency | String | Moeda utilizada (presente apenas sem both=true) |
plans | Array | Lista de planos disponíveis |
plans[].term | Number | Duração do contrato (em meses) |
plans[].monthlyCostSemImp | Number | Custo mensal sem impostos (valor bruto do fornecedor) |
plans[].installationCostSemImp | Number | Custo de instalação sem impostos (valor bruto do fornecedor) |
plans[].monthlyCost | Number | Custo mensal com impostos e margem Nura incluídos |
plans[].installationCost | Number | Custo de instalação com impostos e margem Nura incluídos |
plans[].forInterState | Boolean | Se o plano está disponível para instalação inter-estadual |
plans[].forOutSide | Boolean | Se o plano está disponível para instalação fora do país |
plans[].prices | Object | Preços em dupla moeda (presente apenas com both=true) |
plans[].prices.brl | Object | Preço em BRL: monthlyCost (com imposto) e installationCost (com imposto) |
plans[].prices.usd | Object | Preço em USD: monthlyCost (com imposto) e installationCost (com imposto) |
exchangeRate | Number | Taxa PTAX (BRL/USD) usada na conversão |
exchangeDate | String | Data/hora da cotação PTAX |
/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
| POST | POST /invoice | Cria 1 Order (1 produto, 1 ou mais prazos) |
| POST | POST /invoice/bulk | Cria Project + N Orders (múltiplos produtos) |
| GET | GET /invoice | Lista todas as Orders do usuário autenticado |
| GET | GET /invoice/:id | Detalhe de uma Order específica |
| PATCH | PATCH /invoice/:id/cancel | Cancela a Order inteira e todos os segmentos ativos |
| PATCH | PATCH /invoice/:id/segments/:sid/cancel | Cancela 1 segmento (prazo) específico dentro de uma Order |
Parâmetros — POST /invoice
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
productName | String | Obrigatório | Nome do produto: BROADBAND, DIA, EPL-METRO, EPL-DATA ou PORTS |
productCode | String | Obrigatório | Hash retornado pelo GET /available (codeA para EPL) |
productCodeB | String | EPL | Hash da ponta B — obrigatório apenas para EPL-METRO e EPL-DATA |
speed | String | Obrigatório | Velocidade contratada (ex: "100 Mbps") |
currency | String | — | Moeda: BRL (padrão) ou USD |
country | String | — | Código ISO do país (ex: BR, HK, US). Define qual empresa do usuário fatura. Padrão: BR |
address | String | Obrigatório | Endereço de instalação do serviço |
email | String | Obrigatório | E-mail de contato do pedido |
paymentType | String | — | Tipo de pagamento. Padrão: invoice |
extraService | Object | — | Serviços adicionais: { burstable?, wifi?, ip?: { ipType, cidrSuffix, price }, ports? } |
segments | Array | Obrigatório | Lista de prazos/cotações. Mínimo 1. |
↳ term | Number | Obrigatório | Prazo em meses: 12, 24 ou 36 |
↳ monthlyCost | Number | Obrigatório | Custo mensal com imposto — use o valor retornado pelo GET /quotes |
↳ installationCost | Number | Obrigatório | Custo de instalação com imposto — use o valor retornado pelo GET /quotes |
Parâmetros — POST /invoice/bulk
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
projectName | String | Obrigatório | Nome do projeto que agrupa as Orders |
projectDescription | String | — | Descrição opcional do projeto |
country | String | — | Código ISO do país para resolver a empresa. Padrão: BR |
orders | Array | Obrigatório | Array 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 }
]
}'const response = await fetch(`https://api.nuraconnect.com/invoice`, {
method: 'POST',
headers: {
'Nura-Third-Party-Token': 'B7C9F9839e9FC3F14607....',
'Content-Type': 'application/json'
},
body: JSON.stringify({
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 }
]
})
});
const data = await response.json();
console.log(data);import requests
headers = {
'Nura-Third-Party-Token': 'B7C9F9839e9FC3F14607....',
'Content-Type': 'application/json'
}
body = {
'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 }
]
}
response = requests.post('https://api.nuraconnect.com/invoice', json=body, headers=headers)
data = response.json()
print(data)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 }]
}
]
}'const response = await fetch(`https://api.nuraconnect.com/invoice/bulk`, {
method: 'POST',
headers: {
'Nura-Third-Party-Token': 'B7C9F9839e9FC3F14607....',
'Content-Type': 'application/json'
},
body: JSON.stringify({
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 }]
}
]
})
});
const data = await response.json();
console.log(data);import requests
headers = {
'Nura-Third-Party-Token': 'B7C9F9839e9FC3F14607....',
'Content-Type': 'application/json'
}
body = {
'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 }]
}
]
}
response = requests.post('https://api.nuraconnect.com/invoice/bulk', json=body, headers=headers)
data = response.json()
print(data)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
| Propriedade | Tipo | Descrição |
|---|---|---|
orderId | String | ID único da Order |
productName | String | Nome do produto contratado |
speed | String | Velocidade contratada |
currency | String | Moeda dos valores |
status | String | Status: pending | active | cancelled | completed |
project | Object | null | Projeto associado (null para orders avulsas) |
company | Object | Empresa que fatura este pedido |
segments | Array | Lista de segmentos (prazos) da Order |
↳ segmentId | String | ID único do segmento |
↳ term | Number | Prazo em meses |
↳ monthlyCost | Number | Custo mensal com imposto |
↳ installationCost | Number | Custo de instalação com imposto |
↳ status | String | Status: pending | active | cancelled | completed |
Ciclo de status
Order/Segment: pending → active → completed ou cancelled
Project: active → completed ou cancelled
Erros comuns
| 400 | Escrita bloqueada em sandbox — remover header nura-api-mode: sandbox |
| 401 | Token ausente ou inválido |
| 403 | Order pertence a outro usuário |
| 404 | Order ou segmento não encontrado |
| 422 | Empresa não cadastrada para o país — usar POST /users/:id/companies primeiro |
/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âmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
both | Boolean | Não | Retorna 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...."
const params = new URLSearchParams({ both: 'true' });
const response = await fetch(`https://api.nuraconnect.com/available-equipments?${params}`, {
method: 'GET',
headers: {
'Nura-Third-Party-Token': 'B7C9F9839e9FC3F14607....'
}
});
const data = await response.json();
console.log(data);import requests
headers = {
'Nura-Third-Party-Token': 'B7C9F9839e9FC3F14607....'
}
params = { 'both': 'true' }
response = requests.get('https://api.nuraconnect.com/available-equipments', headers=headers, params=params)
data = response.json()
print(data)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
| Propriedade | Tipo | Descrição |
|---|---|---|
taxIncluded | Boolean | Indica se os preços incluem impostos e margem Nura. Sempre true após S06. |
items | Array | Lista de equipamentos disponíveis |
items[].id | String | Identificador único do equipamento |
items[].model | String | Modelo do equipamento |
items[].provider | String | Fornecedor do equipamento |
items[].plans | Array | Planos de preço por prazo |
items[].plans[].term | Number | Prazo do contrato em meses (12, 24 ou 36) |
items[].plans[].monthlyCostSemImp | Number | Custo mensal sem impostos — valor bruto do fornecedor (BRL) |
items[].plans[].installationCostSemImp | Number | Custo de instalação sem impostos — valor bruto do fornecedor (BRL) |
items[].plans[].monthlyCost | Number | Custo mensal com impostos e margem Nura incluídos (BRL) |
items[].plans[].installationCost | Number | Custo de instalação com impostos e margem Nura incluídos (BRL) |
items[].plans[].prices | Object | Preços em dupla moeda (presente apenas com both=true) |
exchangeRate | Number | Taxa PTAX (BRL/USD) usada na conversão |
exchangeDate | String | Data/hora da cotação PTAX |
/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âmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
product | String | Não | Filtro por produto: DEDICATED INTERNET ACCESS ou BROADBAND |
ipType | String | Não | Filtro por tipo de IP: IPv4 ou IPv6 |
both | Boolean | Não | Retorna 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...."
const params = new URLSearchParams({
product: 'DEDICATED INTERNET ACCESS',
both: 'true'
});
const response = await fetch(`https://api.nuraconnect.com/available-ips?${params}`, {
method: 'GET',
headers: {
'Nura-Third-Party-Token': 'B7C9F9839e9FC3F14607....'
}
});
const data = await response.json();
console.log(data);import requests
headers = {
'Nura-Third-Party-Token': 'B7C9F9839e9FC3F14607....'
}
params = {
'product': 'DEDICATED INTERNET ACCESS',
'both': 'true'
}
response = requests.get('https://api.nuraconnect.com/available-ips', headers=headers, params=params)
data = response.json()
print(data)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
| Propriedade | Tipo | Descrição |
|---|---|---|
items | Array | Lista de entradas de precificação de IP |
items[].id | Number | Identificador único |
items[].ipType | String | Tipo de IP: IPv4 ou IPv6 |
items[].cidrSuffix | String | Prefixo CIDR do bloco (ex: /30, /29, /28) |
items[].product | String | Produto ao qual o preço se aplica |
items[].price | Number | Preço em BRL (presente apenas sem both=true) |
items[].prices | Object | Preços em dupla moeda (presente apenas com both=true) |
items[].prices.brl | Number | Preço em BRL |
items[].prices.usd | Number | Preço em USD (convertido via PTAX) |
exchangeRate | Number | Taxa PTAX (BRL/USD) usada na conversão |
exchangeDate | String | Data/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ódigo | Descrição | Possíveis Causas |
|---|---|---|
200 OK | Requisição bem-sucedida | A requisição foi processada com sucesso |
400 Bad Request | Requisição inválida | Parâmetros ausentes ou inválidos |
401 Unauthorized | Não autorizado | Token de autenticação ausente ou inválido |
403 Forbidden | Proibido | O token não tem permissão para acessar o recurso |
404 Not Found | Não encontrado | O recurso solicitado não existe |
429 Too Many Requests | Muitas requisições | Limite de requisições excedido |
500 Internal Server Error | Erro interno do servidor | Erro 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 datacenter3. 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)"
}
]