Connecteur de données#
Le connecteur de données remplit un site NAMES LEGAL à partir de données qui existent déjà ailleurs, sans code du côté du propriétaire du site. Le propriétaire connecte une source dans sa console (Intégrations → Importer mes données), relie les colonnes aux champs par glisser-déposer, effectue un essai à blanc, puis lance. Les sources peuvent être des fichiers ou une API — la vôtre.
Cette page s'adresse aux développeurs d'applications qui souhaitent devenir une source : ce que NAMES LEGAL attend de votre API, et comment rendre la connexion automatique.
Comment le connecteur lit votre API#
Le propriétaire du site saisit :
- l'adresse de votre API,
- un mode d'authentification et son secret,
- éventuellement, où se trouve la liste dans votre réponse (
data.items).
NAMES LEGAL appelle ensuite votre API en HTTPS avec GET, suit la pagination, et transforme chaque objet en une fiche. Les objets imbriqués sont aplatis (author.name), les listes de valeurs simples sont jointes par des virgules.
Authentification#
| Mode | Ce qui est envoyé |
|---|---|
| Aucune | rien |
| Clé dans un en-tête | <Header-Name>: <key> (par défaut X-API-Key) |
| Clé dans l'adresse | ?<param>=<key> (par défaut api_key) |
| Jeton Bearer | Authorization: Bearer <token> |
| Nom d'utilisateur et mot de passe | Authorization: Basic … |
Les secrets sont stockés chiffrés et ne sont plus jamais affichés dans la console. Donnez aux propriétaires de site une clé en lecture seule, limitée au contenu publié : le connecteur ne fait que lire.
Trouver la liste#
Si aucun chemin n'est indiqué, le connecteur prend, dans l'ordre : le tableau items, puis le premier tableau d'objets trouvé dans la réponse. Un tableau JSON nu fonctionne aussi.
Pagination#
N'importe lequel de ces éléments est suivi automatiquement, jusqu'à 200 pages :
- un en-tête HTTP
Link: <…>; rel="next"; - une URL de page suivante dans le corps :
next,next_url,next_page_url,links.next,meta.next,pagination.next; - un curseur dans le corps :
next_cursor,meta.next_cursor,pagination.next_cursor— renvoyé sous la forme?cursor=.
Arrêtez en renvoyant une liste vide ou aucun lien suivant.
Limites#
- 5 000 fiches par jeu de données et par synchronisation.
- 10 Mo par réponse, 15 secondes par requête.
- Les adresses doivent être publiques : les adresses de réseau privé et local sont refusées, redirections comprises. Lors d'une redirection vers un autre hôte, votre clé n'est pas transmise.
Le format de flux NAMES LEGAL#
Exposez vos données dans ce format et le propriétaire du site n'a rien à relier : chaque collection devient un jeu de données déjà connecté à la rubrique correspondante du site.
1. Un index#
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/"
}
}
Les noms de collections sont les clés de rubrique listées dans la référence des champs ci-dessous (team, services, blog, events, faq, jobs…). Les URL peuvent être relatives à l'index.
2. Une liste par collection#
{
"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
}
Règles :
id— un identifiant stable, différent pour chaque fiche. C'est ce qui permet à une fiche modifiée de mettre à jour la même entrée plutôt que d'en créer une nouvelle.- Les noms de champs sont ceux de la référence des champs.
- Les champs traduits prennent une clé par langue :
title_fr,title_en,description_de… Une clé sans suffixe va à la langue par défaut du site. - Les images et fichiers sont des URL publiques. Ils sont téléchargés une fois, puis retéléchargés uniquement si l'URL change. Les liens de partage Google Drive et Dropbox sont acceptés.
- Les catégories sont données par leur nom (
"category": "Bachelor") ; les catégories manquantes sont créées. - Les dates sont au format ISO 8601. Les booléens sont
true/false. - Les champs de texte enrichi acceptent le HTML ; il est nettoyé (pas de scripts, pas de gestionnaires d'événements). Le texte brut devient des paragraphes.
- Ne renvoyez que ce qui peut être publié : les brouillons et données privées ne doivent pas apparaître dans le flux.
Garder le site à jour#
Le propriétaire du site choisit, par rubrique :
| Option | Effet |
|---|---|
| Toutes les heures / tous les jours | NAMES LEGAL lit votre API selon un calendrier. |
| Seulement quand je le demande | Un bouton dans la console. |
| Webhook | Vous appelez l'adresse de webhook du site après chaque modification : synchronisation en moins d'une minute. Voir Webhooks. |
Il choisit aussi ce qui se passe lorsqu'une fiche a changé des deux côtés (vos données l'emportent, le site l'emporte, ou on demande), et lorsqu'une fiche disparaît de votre flux (supprimer sur le site, masquer, ou conserver). Une synchronisation qui supprimerait une grande partie d'une rubrique s'arrête et demande d'abord confirmation.
Écrire en retour vers votre application (« mon site → ma source ») n'est pas encore disponible : le connecteur ne fait que lire.
Référence des champs#
Générée depuis la plateforme elle-même ; elle est toujours à jour. Les champs obligatoires doivent être présents sur chaque fiche (pour un champ traduit, dans au moins une langue).
Équipe team
| Champ | Type de champ | Obligatoire | Un par langue |
|---|---|---|---|
first_namePrénom |
text ≤ 100 | ✓ | |
last_nameNom |
text ≤ 100 | ✓ | |
positionPosition |
text ≤ 150 | ✓ | |
short_bioBiographie courte |
longtext ≤ 300 | ||
bioBio |
html | ||
profile_imageImage de profil |
image ≤ 100 | ||
email |
email ≤ 254 | ||
phoneTéléphone |
text ≤ 20 | ||
linkedin |
url ≤ 200 | ||
websiteSite web personnel |
url ≤ 200 | ||
specialtiesSpécialités |
text ≤ 200 | ||
educationÉducation |
text ≤ 200 | ||
locationEmplacement |
text ≤ 100 | ||
years_experienceAnnées d'expérience |
int | ||
orderOrdre |
int |
Services services
| Champ | Type de champ | Obligatoire | Un par langue |
|---|---|---|---|
titleTitre |
text ≤ 100 | ✓ | title_fr, title_en… |
descriptionDescription |
longtext | ✓ | description_fr, description_en… |
iconIcône |
text ≤ 50 | ||
categoryCatégorie |
category | ||
is_featuredService mis en avant |
bool | ||
orderOrdre |
int |
Projets projects
| Champ | Type de champ | Obligatoire | Un par langue |
|---|---|---|---|
titleTitre |
text ≤ 150 | ✓ | title_fr, title_en… |
descriptionDescription courte |
longtext | ✓ | description_fr, description_en… |
detailed_descriptionDescription détaillée |
html | detailed_description_fr, detailed_description_en… |
|
categoryCatégorie |
category | ✓ | |
imageImage mise en avant |
image ≤ 100 | ||
clientClient |
text ≤ 100 | client_fr, client_en… |
|
project_dateDate du projet |
text ≤ 20 | ||
durationDurée |
text ≤ 50 | duration_fr, duration_en… |
|
project_urlUrl du projet en ligne |
url ≤ 200 | ||
technologiesTechnologies |
text ≤ 200 | technologies_fr, technologies_en… |
|
tagsTags |
text ≤ 200 | tags_fr, tags_en… |
|
statusStatut |
choice ≤ 20completed, in_progress, on_hold, planning |
||
is_featuredProjet mis en avant |
bool | ||
orderOrdre |
int |
Blog / actualités blog
| Champ | Type de champ | Obligatoire | Un par langue |
|---|---|---|---|
titleTitre |
text ≤ 200 | ✓ | title_fr, title_en… |
excerptExtrait |
longtext ≤ 500 | ✓ | excerpt_fr, excerpt_en… |
contentContenu |
html | ✓ | content_fr, content_en… |
categoryCatégorie |
category | ✓ | |
featured_imageImage mise en avant |
image ≤ 100 | ||
published_dateDate publiée |
datetime | ||
statusStatut |
choice ≤ 20draft, published, featured |
||
orderOrdre |
int |
Événements events
| Champ | Type de champ | Obligatoire | Un par langue |
|---|---|---|---|
titleTitre |
text ≤ 200 | ✓ | title_fr, title_en… |
descriptionDescription |
html | ✓ | description_fr, description_en… |
start_dateDate de début |
datetime | ✓ | |
end_dateDate de fin |
datetime | ✓ | |
locationEmplacement |
text ≤ 200 | ✓ | location_fr, location_en… |
is_onlineEst en ligne |
bool | ||
event_typeType d'événement |
choice ≤ 20conference, workshop, webinar, seminar, training, meeting |
||
registration_urlUrl d'enregistrement |
url ≤ 200 | ||
meeting_urlUrl de réunion |
url ≤ 200 | ||
featured_imageImage mise en avant |
image ≤ 100 | ||
is_featuredMis en avant |
bool | ||
orderOrdre |
int |
FAQ faq
| Champ | Type de champ | Obligatoire | Un par langue |
|---|---|---|---|
questionQuestion |
text ≤ 300 | ✓ | question_fr, question_en… |
answerRépondre |
html | ✓ | answer_fr, answer_en… |
categoryCatégorie |
category | ||
is_featuredMis en avant |
bool | ||
orderOrdre |
int |
Offres d'emploi jobs
| Champ | Type de champ | Obligatoire | Un par langue |
|---|---|---|---|
titleIntitulé du poste |
text ≤ 200 | ✓ | |
categoryCatégorie |
category | ✓ | |
descriptionDescription du poste |
html | ✓ | |
requirementsExigences |
html | ✓ | |
responsibilitiesResponsabilités |
html | ||
benefitsAvantages |
html | ||
locationEmplacement |
text ≤ 200 | ✓ | |
contract_typeType de contrat |
choice ≤ 20full_time, part_time, contract, freelance, internship, temporary |
||
experience_levelNiveau d'expérience |
choice ≤ 20entry, junior, mid, senior, lead, executive |
||
remote_optionOption de télétravail |
choice ≤ 20onsite, remote, hybrid |
||
application_deadlineApplication deadline |
date | ||
is_activeActif |
bool |
Ressources resources
| Champ | Type de champ | Obligatoire | Un par langue |
|---|---|---|---|
titleTitre |
text ≤ 200 | ✓ | title_fr, title_en… |
descriptionDescription |
html | ✓ | description_fr, description_en… |
fileDéposer |
file ≤ 100 | ✓ | |
resource_typeType de ressource |
choice ≤ 20guide, ebook, whitepaper, template, checklist, case_study |
||
thumbnailVignette |
image ≤ 100 | ||
orderOrdre |
int |
Publications publications
| Champ | Type de champ | Obligatoire | Un par langue |
|---|---|---|---|
titleTitre |
text ≤ 255 | ✓ | title_fr, title_en… |
authorsAuteurs |
text ≤ 255 | ✓ | authors_fr, authors_en… |
yearAnnée |
text ≤ 10 | ✓ | |
journalJournal |
text ≤ 255 | journal_fr, journal_en… |
|
abstractAbstrait |
html | abstract_fr, abstract_en… |
|
linkLien |
url ≤ 200 | ||
categoryCatégorie |
category | ||
is_featuredPublication mise en avant |
bool | ||
orderOrdre |
int |
Témoignages testimonials
| Champ | Type de champ | Obligatoire | Un par langue |
|---|---|---|---|
nameNom |
text ≤ 100 | ✓ | name_fr, name_en… |
positionPosition |
text ≤ 100 | ✓ | position_fr, position_en… |
testimonialTémoignage |
longtext | ✓ | testimonial_fr, testimonial_en… |
ratingNotation |
int | ||
imageImage |
image ≤ 100 | ||
orderOrdre |
int |
Compétences skills
| Champ | Type de champ | Obligatoire | Un par langue |
|---|---|---|---|
nameNom |
text ≤ 100 | ✓ | name_fr, name_en… |
levelNiveau |
int | ||
orderOrdre |
int |
Chiffres clés stats
| Champ | Type de champ | Obligatoire | Un par langue |
|---|---|---|---|
titleTitre |
text ≤ 100 | ✓ | title_fr, title_en… |
valueValeur |
text ≤ 20 | ✓ | |
iconIcône |
text ≤ 50 | ||
orderOrdre |
int |