Developers

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

ChampType de champObligatoireUn par langue
first_name
Prénom
text ≤ 100
last_name
Nom
text ≤ 100
position
Position
text ≤ 150
short_bio
Biographie courte
longtext ≤ 300
bio
Bio
html
profile_image
Image de profil
image ≤ 100
email
E-mail
email ≤ 254
phone
Téléphone
text ≤ 20
linkedin
Linkedin
url ≤ 200
website
Site web personnel
url ≤ 200
specialties
Spécialités
text ≤ 200
education
Éducation
text ≤ 200
location
Emplacement
text ≤ 100
years_experience
Années d'expérience
int
order
Ordre
int

Services services

ChampType de champObligatoireUn par langue
title
Titre
text ≤ 100 title_fr, title_en
description
Description
longtext description_fr, description_en
icon
Icône
text ≤ 50
category
Catégorie
category
is_featured
Service mis en avant
bool
order
Ordre
int

Projets projects

ChampType de champObligatoireUn par langue
title
Titre
text ≤ 150 title_fr, title_en
description
Description courte
longtext description_fr, description_en
detailed_description
Description détaillée
html detailed_description_fr, detailed_description_en
category
Catégorie
category
image
Image mise en avant
image ≤ 100
client
Client
text ≤ 100 client_fr, client_en
project_date
Date du projet
text ≤ 20
duration
Durée
text ≤ 50 duration_fr, duration_en
project_url
Url du projet en ligne
url ≤ 200
technologies
Technologies
text ≤ 200 technologies_fr, technologies_en
tags
Tags
text ≤ 200 tags_fr, tags_en
status
Statut
choice ≤ 20
completed, in_progress, on_hold, planning
is_featured
Projet mis en avant
bool
order
Ordre
int

Blog / actualités blog

ChampType de champObligatoireUn par langue
title
Titre
text ≤ 200 title_fr, title_en
excerpt
Extrait
longtext ≤ 500 excerpt_fr, excerpt_en
content
Contenu
html content_fr, content_en
category
Catégorie
category
featured_image
Image mise en avant
image ≤ 100
published_date
Date publiée
datetime
status
Statut
choice ≤ 20
draft, published, featured
order
Ordre
int

Événements events

ChampType de champObligatoireUn par langue
title
Titre
text ≤ 200 title_fr, title_en
description
Description
html description_fr, description_en
start_date
Date de début
datetime
end_date
Date de fin
datetime
location
Emplacement
text ≤ 200 location_fr, location_en
is_online
Est en ligne
bool
event_type
Type d'événement
choice ≤ 20
conference, workshop, webinar, seminar, training, meeting
registration_url
Url d'enregistrement
url ≤ 200
meeting_url
Url de réunion
url ≤ 200
featured_image
Image mise en avant
image ≤ 100
is_featured
Mis en avant
bool
order
Ordre
int

FAQ faq

ChampType de champObligatoireUn par langue
question
Question
text ≤ 300 question_fr, question_en
answer
Répondre
html answer_fr, answer_en
category
Catégorie
category
is_featured
Mis en avant
bool
order
Ordre
int

Offres d'emploi jobs

ChampType de champObligatoireUn par langue
title
Intitulé du poste
text ≤ 200
category
Catégorie
category
description
Description du poste
html
requirements
Exigences
html
responsibilities
Responsabilités
html
benefits
Avantages
html
location
Emplacement
text ≤ 200
contract_type
Type de contrat
choice ≤ 20
full_time, part_time, contract, freelance, internship, temporary
experience_level
Niveau d'expérience
choice ≤ 20
entry, junior, mid, senior, lead, executive
remote_option
Option de télétravail
choice ≤ 20
onsite, remote, hybrid
application_deadline
Application deadline
date
is_active
Actif
bool

Ressources resources

ChampType de champObligatoireUn par langue
title
Titre
text ≤ 200 title_fr, title_en
description
Description
html description_fr, description_en
file
Déposer
file ≤ 100
resource_type
Type de ressource
choice ≤ 20
guide, ebook, whitepaper, template, checklist, case_study
thumbnail
Vignette
image ≤ 100
order
Ordre
int

Publications publications

ChampType de champObligatoireUn par langue
title
Titre
text ≤ 255 title_fr, title_en
authors
Auteurs
text ≤ 255 authors_fr, authors_en
year
Année
text ≤ 10
journal
Journal
text ≤ 255 journal_fr, journal_en
abstract
Abstrait
html abstract_fr, abstract_en
link
Lien
url ≤ 200
category
Catégorie
category
is_featured
Publication mise en avant
bool
order
Ordre
int

Témoignages testimonials

ChampType de champObligatoireUn par langue
name
Nom
text ≤ 100 name_fr, name_en
position
Position
text ≤ 100 position_fr, position_en
testimonial
Témoignage
longtext testimonial_fr, testimonial_en
rating
Notation
int
image
Image
image ≤ 100
order
Ordre
int

Compétences skills

ChampType de champObligatoireUn par langue
name
Nom
text ≤ 100 name_fr, name_en
level
Niveau
int
order
Ordre
int

Chiffres clés stats

ChampType de champObligatoireUn par langue
title
Titre
text ≤ 100 title_fr, title_en
value
Valeur
text ≤ 20
icon
Icône
text ≤ 50
order
Ordre
int