Conector REST do NetSuite
Documentação da API
Seção intitulada “Documentação da API”O REST API Browser do NetSuite documenta os endpoints de registros, e a referência do SuiteQL documenta a linguagem de consulta que este conector usa para extrair dados tabulares.
Como funciona a autenticação
Seção intitulada “Como funciona a autenticação”O conector se autentica com credenciais de cliente OAuth 2.0 usando uma declaração de cliente JWT PS256; não há login interativo nem token de atualização. Você gera um par de chaves RSA, envia o certificado público ao NetSuite e fornece ao PlaidCloud a chave privada correspondente mais três IDs. A cada extração, o PlaidCloud cria e assina uma declaração de curta duração, troca-a por um token de acesso e chama a API REST.
Configuração no lado do NetSuite
Seção intitulada “Configuração no lado do NetSuite”Faça isto no NetSuite antes de criar a conexão no PlaidCloud. É necessário ser administrador, e esta etapa está no caminho crítico.
1. Ative o recurso
Seção intitulada “1. Ative o recurso”Ative OAuth 2.0 e SuiteTalk (SOAP and REST Web Services) em Setup > Company > Enable Features > SuiteCloud.
2. Crie o par de chaves RSA
Seção intitulada “2. Crie o par de chaves RSA”Gere um par de chaves RSA de 2048 bits (ou maior) com um digest compatível com PS256. Por exemplo, com o OpenSSL:
openssl genrsa -out plaidcloud_netsuite.pem 2048openssl rsa -in plaidcloud_netsuite.pem -pubout -out plaidcloud_netsuite_public.pemMantenha a chave privada (plaidcloud_netsuite.pem) em segredo: ela vai para o PlaidCloud, nunca para o NetSuite.
3. Envie o certificado público → ID do certificado
Seção intitulada “3. Envie o certificado público → ID do certificado”Em Setup > Integration > OAuth 2.0 Client Credentials (M2M) Setup, associe o certificado público a uma integração, uma entidade e uma função. O NetSuite retorna um ID do certificado para a chave pública enviada; ele é o kid do JWT e não é um segredo. Anote-o.
4. Crie o registro de integração → ID do cliente
Seção intitulada “4. Crie o registro de integração → ID do cliente”Em Setup > Integration > Manage Integrations > New, crie uma integração com OAuth 2.0 ativado e a concessão Client Credentials selecionada. O NetSuite emite um ID do cliente (consumer key). Anote-o. Não há segredo do cliente no fluxo de credenciais de cliente com declaração.
5. Função e permissões
Seção intitulada “5. Função e permissões”Atribua à função usada no mapeamento M2M um conjunto de permissões que cubra o que você vai ler:
- REST Web Services (Setup) — necessária para qualquer chamada REST.
- SuiteAnalytics Workbook — necessária se o seu SuiteQL acessar dados de análise/workbook.
- Log in using OAuth 2.0 Access Tokens — necessária para a troca de token.
- Permissões de visualização em nível de registro para todo tipo de registro que suas consultas leem (transações, contas, entidades e assim por diante).
6. ID da conta
Seção intitulada “6. ID da conta”Encontre o ID da sua conta em Setup > Company > Company Information (o campo Account ID). Ele define o host da API:
| Ambiente | Formato do ID da conta | Host da API |
|---|---|---|
| Produção | 1234567 |
1234567.suitetalk.api.netsuite.com |
| Sandbox | 1234567_SB1 |
1234567-sb1.suitetalk.api.netsuite.com |
O PlaidCloud deriva o host do ID da conta automaticamente (convertendo para minúsculas e trocando _ por -). Informe o ID da conta exatamente como o NetSuite o mostra, incluindo o sufixo _SB1 em um sandbox.
Configuração
Seção intitulada “Configuração”Crie a conexão com o tipo de conexão NetSuite (não com o tipo REST genérico: somente o tipo NetSuite deriva o host e injeta o comportamento de paginação do SuiteQL). Estes campos aparecem no formulário:
Identificação
Seção intitulada “Identificação”| Campo | Tipo | Descrição |
|---|---|---|
| Nome | Texto | Nome de exibição desta conexão. |
| Alias | Texto (várias linhas) | Alias ou observações opcionais sobre a conexão. |
| Está ativa | Alternância | Indica se a conexão está ativada. Desative para pausá-la sem excluí-la. |
| Banco somente leitura | Alternância | Restringe a conexão a operações somente leitura. |
| Tipo de acesso | Seleção | Nível de acesso desta conexão: somente leitura, somente gravação ou leitura e gravação. |
Credenciais do NetSuite
Seção intitulada “Credenciais do NetSuite”| Campo | Tipo | Descrição |
|---|---|---|
| ID do cliente | Texto | O ID do cliente do registro de integração (etapa 4). |
| ID do certificado | Texto | O ID do certificado (kid do JWT) retornado quando você enviou o certificado público (etapa 3). Não é um segredo. |
| ID da conta do NetSuite | Texto | O ID da conta (etapa 6), por exemplo 1234567 ou 1234567_SB1. |
| Certificado privado do NetSuite | Texto (PEM) | A chave privada (etapa 2), colada como um bloco PEM completo de várias linhas. Armazenada de forma criptografada e nunca retornada em texto claro. |
Extrair dados com SuiteQL
Seção intitulada “Extrair dados com SuiteQL”A API de registros do NetSuite retorna apenas {id, links} por linha, por isso o PlaidCloud extrai dados tabulares com SuiteQL por meio da etapa Solicitação REST. Configure a etapa com a conexão do NetSuite:
- Método —
POST - Endpoint —
/services/rest/query/v1/suiteql(o caminho literal; o host vem da conexão) - Corpo — a consulta em JSON:
{"q": "SELECT ... FROM ... ORDER BY internalid"}
Não configure a paginação nem os cabeçalhos à mão
Seção intitulada “Não configure a paginação nem os cabeçalhos à mão”Em uma conexão do NetSuite, a etapa injeta automaticamente os detalhes do SuiteQL:
- Os cabeçalhos
Prefer: transienteContent-Type: application/json. - Paginação por deslocamento sobre os campos
items/hasMoreda resposta, com o tamanho de página fixado pelo serviço.
Não mexa nos controles de Paginação e análise nem nesses cabeçalhos: a conexão os define. Defina apenas o Endpoint, o Corpo e as colunas (abaixo).
Defina o tipo das colunas de valor e de data
Seção intitulada “Defina o tipo das colunas de valor e de data”O SuiteQL retorna todos os valores como strings JSON ("1234.56", "2026-01-15", "T"). Defina manualmente as colunas de saída com seus tipos reais — Currency/Decimal para valores, Date/Datetime para datas, Boolean para os indicadores "T"/"F" — e o PlaidCloud converte as strings em colunas tipadas ao gravá-las na tabela. Strings vazias viram null. (A detecção automática de esquema não aplica a configuração de serviço da conexão, então não consegue fazer isso por você: defina as colunas você mesmo.)
Limitações conhecidas
Seção intitulada “Limitações conhecidas”| Limitação | O que significa |
|---|---|
| Colunas manuais obrigatórias | A detecção automática de esquema não aplica a configuração de serviço do NetSuite, então defina à mão as colunas de valor, data e booleanas e seus tipos. |
| A paginação é fixada pelo serviço | O modo de paginação, os caminhos e o tamanho da página são definidos pela conexão e não podem ser ajustados na etapa. |
| Apenas substituição da tabela inteira | Cada extração relê todo o resultado; não há caminho incremental/delta. Uma extração agendada relê a tabela inteira a cada execução, então limite a cláusula WHERE ao recorte de que você precisa. |
| Multimoeda / subsidiárias | Em transaction/transactionline, amount está na moeda própria da transação. Um SUM(amount) simples entre subsidiárias está errado para fins de consolidação: selecione campos consolidados ou convertidos pela taxa de câmbio ao totalizar entre subsidiárias. |
| Limite de ~100.000 linhas no SuiteQL | O NetSuite limita uma única consulta a cerca de 100.000 linhas sem o SuiteAnalytics Connect. Uma consulta escrita à mão que ultrapasse esse limite falha com clareza, com uma mensagem pedindo um intervalo de datas menor ou outros filtros, em vez de truncar silenciosamente. As etapas prontas NetSuite: Importar saldos / NetSuite: Importar detalhes do razão geral dividem o intervalo de datas em janelas automaticamente para ficar abaixo desse limite. |
| Contabilidade multilivro | Em uma conta com Multi-Book Accounting, TransactionAccountingLine traz uma linha por livro para cada linha de transação; um SUM sem filtro entre livros conta em dobro (ou N vezes). As etapas de importação prontas usam o livro principal por padrão; uma consulta escrita à mão deve filtrar accountingbook = 1 (ou o livro que você escolher) explicitamente, a menos que um total entre livros seja realmente o que você quer. |
| Envelope da resposta | O envelope exato da resposta e o escopo/função aceitos são confirmados na virada para produção; o conector segue o formato documentado do NetSuite. |
Consultas de exemplo
Seção intitulada “Consultas de exemplo”Financeira — linhas de transação do razão geral para um período, tipadas e ordenadas:
SELECT tl.transaction AS transaction_id, t.trandate AS tran_date, a.acctnumber AS account_number, tl.subsidiary AS subsidiary_id, tl.foreignamount AS amountFROM transactionline tlJOIN transaction t ON t.id = tl.transactionJOIN account a ON a.id = tl.expenseaccountWHERE t.trandate BETWEEN TO_DATE('2026-01-01', 'YYYY-MM-DD') AND TO_DATE('2026-01-31', 'YYYY-MM-DD')ORDER BY tl.transaction, tl.idOperacional — pedidos de venda em aberto por cliente:
SELECT so.tranid AS order_number, so.entity AS customer_id, so.trandate AS order_date, so.status AS order_statusFROM transaction soWHERE so.type = 'SalesOrd' AND so.status = 'SalesOrd:B'ORDER BY so.id