Some checks failed
App Prod-Parity E2E Dispatch / dispatch (push) Failing after 10s
CD Storybook UI / build (push) Failing after 3m25s
CD Storybook UI / dispatch (push) Has been skipped
CD deploy main / website-changed-files (push) Successful in 18m8s
CI Agent Skills / changed-files-check (push) Successful in 18m9s
CI Create App E2E minimal / changed-files-check (push) Successful in 24s
CI Create App / changed-files-check (push) Successful in 26s
CI Docs / changed-files-check (push) Successful in 26s
CI Emails / changed-files-check (push) Successful in 28s
CI Example App Hello World / changed-files-check (push) Successful in 23s
CI Front / changed-files-check (push) Has been skipped
CI Example App Postcard / changed-files-check (push) Successful in 27s
CI UI / changed-files-check (push) Has been skipped
CI Utils Test / changed-files-check (push) Successful in 45s
CI Twenty Apps / discover (push) Successful in 1m3s
CD deploy main / deploy-main (push) Failing after 3s
CI Agent Skills / agent-skills-validate (push) Has been skipped
CI Create App / create-app-test (lint) (push) Has been skipped
CI Emails / emails-test (push) Has been skipped
CI Front / front-task (lingui:compile) (push) Has been skipped
CI Front / front-task (lint) (push) Has been skipped
CI Example App Postcard / example-app-postcard (push) Has been skipped
CI UI / ui-task (lint) (push) Has been skipped
CI UI / ui-task (pack-size) (push) Has been skipped
CI UI / ui-task (size) (push) Has been skipped
CI UI / ui-task (test) (push) Has been skipped
CI UI / ui-task (typecheck) (push) Has been skipped
CI Utils Test / utils-test (push) Has been skipped
CI Twenty Apps / ${{ matrix.app.name }} (push) Has been skipped
CI Emails / ci-emails-status-check (push) Successful in 2s
CI Example App Hello World / ci-example-app-hello-world-status-check (push) Successful in 2s
CI Example App Postcard / ci-example-app-postcard-status-check (push) Successful in 3s
CI UI / ui-sb-test (push) Has been skipped
CI Utils Test / ci-utils-test-status-check (push) Successful in 2s
CI Twenty Apps / ci-twenty-apps-status-check (push) Successful in 2s
CI UI / ci-ui-status-check (push) Successful in 2s
CI Desktop / desktop (push) Failing after 1m8s
Push docs to Crowdin / Push documentation to Crowdin (push) Failing after 55s
Push translations to Crowdin / Extract and upload translations (push) Failing after 5s
Push website translations to Crowdin / Extract and upload website translations (push) Failing after 5s
CI Create App / create-app-test (test) (push) Has been skipped
CI Create App / create-app-test (typecheck) (push) Has been skipped
CI Docs / docs-lint (push) Has been skipped
CI Example App Hello World / example-app-hello-world (push) Has been skipped
CI Front / front-task (lingui:extract) (push) Has been skipped
CI Front / front-task (test) (push) Has been skipped
CI Front / front-task (typecheck) (push) Has been skipped
CI UI / ui-sb-build (push) Failing after 1m32s
CI Twenty Apps / ${{ matrix.app.name }} (${{ matrix.server-source }}) (push) Has been skipped
CI Agent Skills / agent-skills-publish (push) Has been skipped
CI Create App / ci-create-app-status-check (push) Successful in 2s
CI Agent Skills / agent-skills-remote-source (push) Has been skipped
CI Create App E2E minimal / create-app-e2e-minimal (push) Has been cancelled
CI E2E Main / e2e-test (push) Has been cancelled
CI Front / front-sb-build (push) Has been cancelled
CI Front / front-build (push) Has been cancelled
CI Create App E2E minimal / ci-create-app-e2e-minimal-status-check (push) Has been cancelled
CI E2E Main / ci-e2e-main-status-check (push) Has been cancelled
CI E2E Main / notify-main-ci-failure (push) Has been cancelled
CI E2E Main / qa-scout-comment (push) Has been cancelled
CI Front / front-sb-test (push) Has been cancelled
CI Front / front-sb-screenshots (push) Has been cancelled
CI Front / ci-front-status-check (push) Has been cancelled
DPA Sub-Processor Sync / sync-subprocessors (push) Failing after 3s
AI Catalog Sync / sync-catalog (push) Failing after 2s
177 lines
7.6 KiB
Plaintext
177 lines
7.6 KiB
Plaintext
---
|
|
title: Importar dados via API
|
|
description: Quando e como usar as APIs da Twenty para importações de dados em larga escala.
|
|
---
|
|
|
|
## Visão Geral
|
|
|
|
A Twenty oferece tanto **GraphQL** como **APIs REST** para a importação programática de dados. Use a API quando a importação por CSV não for prática para o seu volume de dados ou quando precisar de importações automatizadas e recorrentes.
|
|
|
|
## Quando usar a importação via API
|
|
|
|
| Cenário | Método recomendado |
|
|
| ---------------------------------- | ----------------------------------------- |
|
|
| Menos de 10 000 registos | Importação CSV |
|
|
| 10 000 - 50 000 registos | Importação CSV (dividida em ficheiros) |
|
|
| **Mais de 50 000 registos** | **Importação via API** |
|
|
| Migração única | Qualquer um dos dois (com base no volume) |
|
|
| **Importações recorrentes** | **Importação via API** |
|
|
| **Sincronização em tempo real** | **Importação via API** |
|
|
| **Integração com outros sistemas** | **Importação via API** |
|
|
|
|
<Note>Para conjuntos de dados na casa das centenas de milhares, a API é significativamente mais rápida e mais fiável do que múltiplas importações CSV.</Note>
|
|
|
|
## Limites de taxa da API
|
|
|
|
A Twenty impõe limites de taxa para assegurar a estabilidade do sistema:
|
|
|
|
| Limite | Valor |
|
|
| -------------------------------- | ---------------------- |
|
|
| **Pedidos por minuto** | 100 |
|
|
| **Registos por chamada em lote** | 60 |
|
|
| **Taxa de transferência máxima** | ~6 000 registos/minuto |
|
|
|
|
<Warning>
|
|
**Planeie a sua importação em função destes limites.**
|
|
|
|
Para 100 000 registos à taxa de transferência máxima, conte com aproximadamente 17 minutos de tempo de importação. Adicione tempo de margem para tratamento de erros e novas tentativas.
|
|
</Warning>
|
|
|
|
## Primeiros passos
|
|
|
|
### Passo 1: Obtenha a sua chave de API
|
|
|
|
1. Vá para **Configurações → Programadores**
|
|
2. Clique em **+ Criar chave de API**
|
|
3. Dê à sua chave um nome descritivo
|
|
4. Copie imediatamente a chave de API (não será mostrada novamente)
|
|
5. Guarde-a em segurança
|
|
|
|
<Warning>
|
|
**Mantenha a sua chave de API em segredo.**
|
|
|
|
Qualquer pessoa com a sua chave de API pode aceder e modificar os dados do seu espaço de trabalho. Nunca a faça commit em repositórios de código nem a partilhe publicamente.
|
|
</Warning>
|
|
|
|
### Passo 2: Escolha a sua API
|
|
|
|
A Twenty suporta dois tipos de API:
|
|
|
|
| API | Melhor para | Documentação |
|
|
| ----------- | ------------------------------------------------------------------------ | --------------------------------------------- |
|
|
| **GraphQL** | Consultas flexíveis, obtenção de dados relacionados, operações complexas | [Documentação da API](/l/pt/developers/extend/api) |
|
|
| **REST** | Operações CRUD simples, padrões REST familiares | [Documentação da API](/l/pt/developers/extend/api) |
|
|
|
|
Ambas as APIs suportam:
|
|
|
|
* Criar, ler, atualizar e eliminar registos
|
|
* **Operações em lote** — criar ou atualizar até 60 registos por chamada
|
|
|
|
**Para importações, use operações em lote** para maximizar a taxa de transferência dentro dos limites de taxa.
|
|
|
|
### Passo 3: Planeie a ordem da importação
|
|
|
|
Tal como nas importações por CSV, **a ordem importa** para as relações:
|
|
|
|
1. **Empresas** primeiro (sem dependências)
|
|
2. **Pessoas** em segundo (podem ligar-se a Empresas)
|
|
3. **Oportunidades** em terceiro (podem ligar-se a Empresas e Pessoas)
|
|
4. **Tarefas/Notas** (podem ligar-se a qualquer um dos anteriores)
|
|
5. **Objetos personalizados** (seguindo as suas dependências)
|
|
|
|
## Melhores Práticas
|
|
|
|
### Agrupe os seus pedidos
|
|
|
|
* Não envie registos um de cada vez
|
|
* Agrupe até **60 registos por chamada de API**
|
|
* Isto maximiza a taxa de transferência dentro dos limites de taxa
|
|
|
|
### Lide com os limites de taxa
|
|
|
|
* Implemente atrasos entre pedidos (mínimo de 600 ms para importações contínuas)
|
|
* Use backoff exponencial quando atingir os limites
|
|
* Monitorize respostas 429 (Too Many Requests)
|
|
|
|
### Valide os dados primeiro
|
|
|
|
* Limpe e valide os seus dados antes de importar
|
|
* Verifique se os campos obrigatórios estão preenchidos
|
|
* Verifique se os formatos correspondem aos requisitos da Twenty (veja [Mapeamento de Campos](/l/pt/user-guide/data-migration/capabilities/field-mapping))
|
|
|
|
### Registe tudo
|
|
|
|
* Registe cada registo importado (incluindo IDs)
|
|
* Registe erros com todo o contexto
|
|
* Isto ajuda a depurar problemas e a verificar a conclusão
|
|
|
|
### Teste primeiro
|
|
|
|
* Teste com um pequeno lote (10-20 registos)
|
|
* Verifique se os dados aparecem corretamente na Twenty
|
|
* Depois, execute a importação completa
|
|
|
|
### Upsert para evitar duplicados
|
|
|
|
A API GraphQL suporta **upsert em lote** — atualize se o registo existir, crie se não existir. Isto evita duplicados ao voltar a executar importações.
|
|
|
|
## Encontrar nomes de objetos e campos
|
|
|
|
Para ver os objetos e campos disponíveis:
|
|
|
|
1. Vá para **Configurações → API e Webhooks**
|
|
2. Explore a **API de Metadados**
|
|
3. Veja todos os objetos padrão e personalizados com os seus campos
|
|
|
|
A documentação mostra todos os objetos padrão e personalizados, os seus campos e os tipos de dados esperados.
|
|
|
|
## Serviços Profissionais
|
|
|
|
Para migrações de API complexas, os nossos parceiros podem ajudar:
|
|
|
|
| Serviço | O que está incluído |
|
|
| ------------------------------------- | -------------------------------------------- |
|
|
| **Conceção do Modelo de Dados** | conceber a sua estrutura de dados ideal |
|
|
| **Scripts de migração** | escrever e executar os scripts de importação |
|
|
| **Transformação de dados** | tratar de mapeamentos complexos e limpeza |
|
|
| **Validação e Garantia de Qualidade** | verificar que a migração está concluída |
|
|
|
|
**Melhor para:**
|
|
|
|
* Migrações de mais de 100 000 registos
|
|
* Transformações de dados complexas
|
|
* Prazos apertados
|
|
* Equipas sem recursos de programadores
|
|
|
|
Contacte-nos em [contact@twenty.com](mailto:contact@twenty.com) ou explore os nossos [Serviços de Implementação](/l/pt/user-guide/getting-started/capabilities/implementation-services).
|
|
|
|
## Perguntas Frequentes
|
|
|
|
<AccordionGroup>
|
|
<Accordion title="Qual é a diferença entre GraphQL e REST?">
|
|
O GraphQL permite solicitar exatamente os dados de que precisa numa única consulta e é melhor para operações complexas. O REST utiliza métodos HTTP padrão (GET, POST, PUT, DELETE) e pode ser mais familiar se já trabalhou com APIs tradicionais.
|
|
</Accordion>
|
|
|
|
<Accordion title="Posso atualizar registos existentes via API?">
|
|
Sim! Utilize mutations de atualização (GraphQL) ou pedidos PUT/PATCH (REST) com o `id` do registo.
|
|
</Accordion>
|
|
|
|
<Accordion title="Como devo lidar com duplicados?">
|
|
Pesquise primeiro por registos existentes usando identificadores únicos (email, domínio). Atualize se existir, crie se não existir.
|
|
</Accordion>
|
|
|
|
<Accordion title="Posso eliminar registos via API?">
|
|
Sim, utilize mutations de eliminação (GraphQL) ou pedidos DELETE (REST).
|
|
</Accordion>
|
|
|
|
<Accordion title="Existe um SDK para Python ou Node.js?">
|
|
De momento não, mas ambas as APIs funcionam com qualquer cliente HTTP em qualquer linguagem.
|
|
</Accordion>
|
|
</AccordionGroup>
|
|
|
|
## Documentação da API
|
|
|
|
Para detalhes completos de implementação, exemplos de código e referência de esquema:
|
|
|
|
* [Documentação da API](/l/pt/developers/extend/api)
|