Conector de dados#
O conector de dados preenche um site NAMES LEGAL a partir de dados que já existem noutro local, sem código do lado do proprietário do site. O proprietário liga uma fonte na sua consola (Integrações → Importar os meus dados), associa colunas a campos por arrastar e largar, executa um teste e lança. As fontes podem ser ficheiros ou uma API — a sua.
Esta página destina-se a programadores de aplicações que pretendem ser uma fonte: o que o NAMES LEGAL espera da sua API, e como tornar a ligação automática.
Como o conector lê a sua API#
O proprietário do site introduz:
- o endereço da sua API,
- um modo de autenticação e o respetivo segredo,
- opcionalmente, onde está a lista na sua resposta (
data.items).
O NAMES LEGAL chama então a sua API através de HTTPS com GET, segue a paginação e transforma cada objeto numa linha. Os objetos aninhados são achatados (author.name), as listas de valores simples são unidas com vírgulas.
Autenticação#
| Modo | O que é enviado |
|---|---|
| Nenhum | nada |
| Chave num cabeçalho | <Header-Name>: <key> (predefinição X-API-Key) |
| Chave no endereço | ?<param>=<key> (predefinição api_key) |
| Token Bearer | Authorization: Bearer <token> |
| Nome de utilizador e palavra-passe | Authorization: Basic … |
Os segredos são armazenados encriptados e nunca voltam a ser mostrados na consola. Forneça aos proprietários de sites uma chave só de leitura, limitada ao conteúdo publicado: o conector apenas lê.
Localizar a lista#
Se não for indicado nenhum caminho, o conector utiliza, por ordem: a matriz items, depois a primeira matriz de objetos encontrada na resposta. Uma matriz JSON simples também funciona.
Paginação#
Qualquer um destes é seguido automaticamente, até 200 páginas:
- um cabeçalho HTTP
Link: <…>; rel="next"; - um URL da página seguinte no corpo:
next,next_url,next_page_url,links.next,meta.next,pagination.next; - um cursor no corpo:
next_cursor,meta.next_cursor,pagination.next_cursor— devolvido como?cursor=.
Para parar, devolva uma lista vazia ou nenhuma ligação seguinte.
Limites#
- 5000 linhas por conjunto de dados e sincronização.
- 10 MB por resposta, 15 segundos por pedido.
- Os endereços têm de ser públicos: endereços privados e de rede local são recusados, incluindo redirecionamentos. Num redirecionamento para outro anfitrião, a chave não é reencaminhada.
O formato de feed NAMES LEGAL#
Exponha os seus dados neste formato e o proprietário do site não tem nada para associar: cada coleção torna-se num conjunto de dados já ligado à secção correspondente do site.
1. Um índice#
GET https://app.example.com/api/names-legal/
{
"names_legal_feed": 1,
"collections": {
"team": "https://app.example.com/api/names-legal/team/",
"services": "https://app.example.com/api/names-legal/programmes/",
"blog": "https://app.example.com/api/names-legal/news/"
}
}
Os nomes das coleções são as chaves de secção listadas na referência de campos abaixo (team, services, blog, events, faq, jobs…). Os URLs podem ser relativos ao índice.
2. Uma lista por coleção#
{
"items": [
{
"id": "T-104",
"first_name": "Awa",
"last_name": "Diop",
"position": "Mathematics teacher",
"short_bio": "Twelve years of teaching.",
"profile_image": "https://app.example.com/media/staff/104.jpg",
"email": "a.diop@example.com"
}
],
"next": null
}
Regras:
id— um identificador estável, diferente em cada linha. É através dele que uma linha editada atualiza a mesma ficha em vez de criar uma nova.- Os nomes dos campos são os da referência de campos.
- Os campos traduzidos têm uma chave por idioma:
title_fr,title_en,description_de… Uma chave sem sufixo vai para o idioma predefinido do site. - As imagens e os ficheiros são URLs públicos. São transferidos uma vez e voltam a ser transferidos apenas quando o URL muda. São aceites ligações de partilha do Google Drive e do Dropbox.
- As categorias são indicadas pelo nome (
"category": "Bachelor"); as categorias em falta são criadas. - As datas estão em ISO 8601. Os booleanos são
true/false. - Os campos de texto formatado aceitam HTML; este é limpo (sem scripts, sem manipuladores de eventos). O texto simples transforma-se em parágrafos.
- Devolva apenas o que pode ser publicado: rascunhos e dados privados não devem aparecer no feed.
Manter o site atualizado#
O proprietário do site escolhe, por secção:
| Opção | Efeito |
|---|---|
| De hora a hora / diariamente | O NAMES LEGAL lê a API de forma programada. |
| Apenas quando eu pedir | Um botão na consola. |
| Webhook | A API chama o endereço de webhook do site após cada alteração: sincronização em menos de um minuto. Consulte Webhooks. |
Também é escolhido o que acontece quando uma ficha foi alterada em ambos os lados (os dados da fonte prevalecem, o site prevalece, ou é pedida confirmação), e quando uma linha desaparece do feed (eliminar no site, ocultar, ou manter). Uma sincronização que removesse uma grande parte de uma secção é interrompida e pede confirmação primeiro.
Escrever de volta na aplicação de origem ("o meu site → a minha fonte") ainda não está disponível: o conector apenas lê.
Referência de campos#
Gerada a partir da própria plataforma; está sempre atualizada. Os campos obrigatórios têm de estar presentes em cada linha (no caso de um campo traduzido, em pelo menos um idioma).
Tamanho da equipe team
| Campo | Tipo de campo | Obrigatório | Um por idioma |
|---|---|---|---|
first_nameNome |
text ≤ 100 | ✓ | |
last_nameSobrenome |
text ≤ 100 | ✓ | |
positionPosição |
text ≤ 150 | ✓ | |
short_bioBiografia breve |
longtext ≤ 300 | ||
bioBio |
html | ||
profile_imageImagem de perfil |
image ≤ 100 | ||
email |
email ≤ 254 | ||
phoneTelefone |
text ≤ 20 | ||
linkedin |
url ≤ 200 | ||
websiteSite pessoal |
url ≤ 200 | ||
specialtiesEspecialidades |
text ≤ 200 | ||
educationEducação |
text ≤ 200 | ||
locationLocalização |
text ≤ 100 | ||
years_experienceAnos de experiência |
int | ||
orderOrdem |
int |
Serviços services
| Campo | Tipo de campo | Obrigatório | Um por idioma |
|---|---|---|---|
titleTítulo |
text ≤ 100 | ✓ | title_fr, title_en… |
descriptionDescrição |
longtext | ✓ | description_fr, description_en… |
iconÍcone |
text ≤ 50 | ||
categoryCategoria |
category | ||
is_featuredServiço em destaque |
bool | ||
orderOrdem |
int |
Projetos projects
| Campo | Tipo de campo | Obrigatório | Um por idioma |
|---|---|---|---|
titleTítulo |
text ≤ 150 | ✓ | title_fr, title_en… |
descriptionDescrição breve |
longtext | ✓ | description_fr, description_en… |
detailed_descriptionDescrição detalhada |
html | detailed_description_fr, detailed_description_en… |
|
categoryCategoria |
category | ✓ | |
imageImagem em destaque |
image ≤ 100 | ||
clientCliente |
text ≤ 100 | client_fr, client_en… |
|
project_dateData do projeto |
text ≤ 20 | ||
durationDuração |
text ≤ 50 | duration_fr, duration_en… |
|
project_urlUrl do projeto ao vivo |
url ≤ 200 | ||
technologiesTecnologias |
text ≤ 200 | technologies_fr, technologies_en… |
|
tagsTags |
text ≤ 200 | tags_fr, tags_en… |
|
statusStatus |
choice ≤ 20completed, in_progress, on_hold, planning |
||
is_featuredProjeto em destaque |
bool | ||
orderOrdem |
int |
Blogue / notícias blog
| Campo | Tipo de campo | Obrigatório | Um por idioma |
|---|---|---|---|
titleTítulo |
text ≤ 200 | ✓ | title_fr, title_en… |
excerptTrecho |
longtext ≤ 500 | ✓ | excerpt_fr, excerpt_en… |
contentContato |
html | ✓ | content_fr, content_en… |
categoryCategoria |
category | ✓ | |
featured_imageImagem em destaque |
image ≤ 100 | ||
published_dateData publicada |
datetime | ||
statusStatus |
choice ≤ 20draft, published, featured |
||
orderOrdem |
int |
Eventos events
| Campo | Tipo de campo | Obrigatório | Um por idioma |
|---|---|---|---|
titleTítulo |
text ≤ 200 | ✓ | title_fr, title_en… |
descriptionDescrição |
html | ✓ | description_fr, description_en… |
start_dateData de início |
datetime | ✓ | |
end_dateData de término |
datetime | ✓ | |
locationLocalização |
text ≤ 200 | ✓ | location_fr, location_en… |
is_onlineEstá online |
bool | ||
event_typeTipo de evento |
choice ≤ 20conference, workshop, webinar, seminar, training, meeting |
||
registration_urlUrl de registro |
url ≤ 200 | ||
meeting_urlEncontrar url |
url ≤ 200 | ||
featured_imageImagem em destaque |
image ≤ 100 | ||
is_featuredEm destaque |
bool | ||
orderOrdem |
int |
Perguntas frequentes faq
| Campo | Tipo de campo | Obrigatório | Um por idioma |
|---|---|---|---|
questionPergunta |
text ≤ 300 | ✓ | question_fr, question_en… |
answerResponder |
html | ✓ | answer_fr, answer_en… |
categoryCategoria |
category | ||
is_featuredEm destaque |
bool | ||
orderOrdem |
int |
Vagas de emprego jobs
| Campo | Tipo de campo | Obrigatório | Um por idioma |
|---|---|---|---|
titleTítulo do cargo |
text ≤ 200 | ✓ | |
categoryCategoria |
category | ✓ | |
descriptionDescrição da vaga |
html | ✓ | |
requirementsRequisitos |
html | ✓ | |
responsibilitiesResponsabilidades |
html | ||
benefitsBenefícios |
html | ||
locationLocalização |
text ≤ 200 | ✓ | |
contract_typeTipo de contrato |
choice ≤ 20full_time, part_time, contract, freelance, internship, temporary |
||
experience_levelNível de experiência |
choice ≤ 20entry, junior, mid, senior, lead, executive |
||
remote_optionOpção de trabalho remoto |
choice ≤ 20onsite, remote, hybrid |
||
application_deadlineApplication deadline |
date | ||
is_activeAcção |
bool |
Recursos resources
| Campo | Tipo de campo | Obrigatório | Um por idioma |
|---|---|---|---|
titleTítulo |
text ≤ 200 | ✓ | title_fr, title_en… |
descriptionDescrição |
html | ✓ | description_fr, description_en… |
fileArquivo |
file ≤ 100 | ✓ | |
resource_typeTipo de recurso |
choice ≤ 20guide, ebook, whitepaper, template, checklist, case_study |
||
thumbnailMiniatura |
image ≤ 100 | ||
orderOrdem |
int |
Publicações publications
| Campo | Tipo de campo | Obrigatório | Um por idioma |
|---|---|---|---|
titleTítulo |
text ≤ 255 | ✓ | title_fr, title_en… |
authorsAutores |
text ≤ 255 | ✓ | authors_fr, authors_en… |
yearAno |
text ≤ 10 | ✓ | |
journalJornal |
text ≤ 255 | journal_fr, journal_en… |
|
abstractResumo |
html | abstract_fr, abstract_en… |
|
linkLink |
url ≤ 200 | ||
categoryCategoria |
category | ||
is_featuredPublicação em destaque |
bool | ||
orderOrdem |
int |
Depoimentos testimonials
| Campo | Tipo de campo | Obrigatório | Um por idioma |
|---|---|---|---|
nameNome |
text ≤ 100 | ✓ | name_fr, name_en… |
positionPosição |
text ≤ 100 | ✓ | position_fr, position_en… |
testimonialDepoimento |
longtext | ✓ | testimonial_fr, testimonial_en… |
ratingAvaliação |
int | ||
imageImagem |
image ≤ 100 | ||
orderOrdem |
int |
Habilidades skills
| Campo | Tipo de campo | Obrigatório | Um por idioma |
|---|---|---|---|
nameNome |
text ≤ 100 | ✓ | name_fr, name_en… |
levelNível |
int | ||
orderOrdem |
int |
Números-chave stats
| Campo | Tipo de campo | Obrigatório | Um por idioma |
|---|---|---|---|
titleTítulo |
text ≤ 100 | ✓ | title_fr, title_en… |
valueValor |
text ≤ 20 | ✓ | |
iconÍcone |
text ≤ 50 | ||
orderOrdem |
int |