Developers

Data connector#

The data connector fills a NAMES LEGAL site from data that already exists elsewhere, without code on the site owner's side. The owner connects a source in their console (Integrations → Import my data), links columns to fields with drag and drop, runs a trial, and launches. Sources can be files or an API — yours.

This page is for developers of applications that want to be a source: what NAMES LEGAL expects from your API, and how to make the connection automatic.

How the connector reads your API#

The site owner enters:

  • the address of your API,
  • an authentication mode and its secret,
  • optionally, where the list is in your answer (data.items).

NAMES LEGAL then calls your API over HTTPS with GET, follows pagination, and turns every object into a line. Nested objects are flattened (author.name), lists of plain values are joined with commas.

Authentication#

Mode What is sent
None nothing
Key in a header <Header-Name>: <key> (default X-API-Key)
Key in the address ?<param>=<key> (default api_key)
Bearer token Authorization: Bearer <token>
Username and password Authorization: Basic …

Secrets are stored encrypted and are never shown again in the console. Give site owners a read-only key limited to published content: the connector only reads.

Finding the list#

If no path is given, the connector takes, in order: the items array, then the first array of objects found in the answer. A bare JSON array works too.

Pagination#

Any of these is followed automatically, up to 200 pages:

  • an HTTP Link: <…>; rel="next" header;
  • a next-page URL in the body: next, next_url, next_page_url, links.next, meta.next, pagination.next;
  • a cursor in the body: next_cursor, meta.next_cursor, pagination.next_cursor — sent back as ?cursor=.

Stop by returning an empty list or no next link.

Limits#

  • 5,000 lines per data set and synchronisation.
  • 10 MB per answer, 15 seconds per request.
  • Addresses must be public: private and local network addresses are refused, redirections included. On a redirection to another host, your key is not forwarded.

The NAMES LEGAL feed format#

Expose your data in this format and the site owner has nothing to link: each collection becomes a data set already connected to the matching section of the site.

1. An 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/"
  }
}

Collection names are the section keys listed in the field reference below (team, services, blog, events, faq, jobs…). URLs may be relative to the index.

2. One list per 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
}

Rules:

  • id — a stable identifier, different on every line. It is how an edited line updates the same entry instead of creating a new one.
  • Field names are those of the field reference.
  • Translated fields take one key per language: title_fr, title_en, description_de… A key without suffix goes to the site's default language.
  • Images and files are public URLs. They are downloaded once and downloaded again only when the URL changes. Google Drive and Dropbox share links are accepted.
  • Categories are given by name ("category": "Bachelor"); missing categories are created.
  • Dates are ISO 8601. Booleans are true/false.
  • Rich text fields accept HTML; it is cleaned (no scripts, no event handlers). Plain text becomes paragraphs.
  • Only return what may be published: drafts and private data should not appear in the feed.

Keeping the site up to date#

The site owner chooses, per section:

Option Effect
Every hour / every day NAMES LEGAL reads your API on schedule.
Only when I ask A button in the console.
Webhook You call the site's webhook address after each change: synchronisation within a minute. See Webhooks.

They also choose what happens when an entry changed on both sides (your data wins, the site wins, or ask), and when a line disappears from your feed (delete on the site, hide, or keep). A synchronisation that would remove a large share of a section stops and asks for confirmation first.

Writing back to your application ("my site → my source") is not available yet: the connector only reads.

Field reference#

Generated from the platform itself; it is always up to date. Required fields must be present on every line (for a translated field, in at least one language).

Team team

FieldField typeRequiredOne per language
first_name
First name
text ≤ 100
last_name
Last name
text ≤ 100
position
Position
text ≤ 150
short_bio
Short bio
longtext ≤ 300
bio
Bio
html
profile_image
Profile image
image ≤ 100
email
Email
email ≤ 254
phone
Phone
text ≤ 20
linkedin
Linkedin
url ≤ 200
website
Personal website
url ≤ 200
specialties
Specialties
text ≤ 200
education
Education
text ≤ 200
location
Location
text ≤ 100
years_experience
Years of experience
int
order
Order
int

Services services

FieldField typeRequiredOne per language
title
Title
text ≤ 100 title_fr, title_en
description
Description
longtext description_fr, description_en
icon
Icon
text ≤ 50
category
Category
category
is_featured
Featured service
bool
order
Order
int

Projects projects

FieldField typeRequiredOne per language
title
Title
text ≤ 150 title_fr, title_en
description
Short description
longtext description_fr, description_en
detailed_description
Detailed description
html detailed_description_fr, detailed_description_en
category
Category
category
image
Featured image
image ≤ 100
client
Client
text ≤ 100 client_fr, client_en
project_date
Project date
text ≤ 20
duration
Duration
text ≤ 50 duration_fr, duration_en
project_url
Live project url
url ≤ 200
technologies
Technologies
text ≤ 200 technologies_fr, technologies_en
tags
Tags
text ≤ 200 tags_fr, tags_en
status
Status
choice ≤ 20
completed, in_progress, on_hold, planning
is_featured
Featured project
bool
order
Order
int

Blog / news blog

FieldField typeRequiredOne per language
title
Title
text ≤ 200 title_fr, title_en
excerpt
Excerpt
longtext ≤ 500 excerpt_fr, excerpt_en
content
Content
html content_fr, content_en
category
Category
category
featured_image
Featured image
image ≤ 100
published_date
Published date
datetime
status
Status
choice ≤ 20
draft, published, featured
order
Order
int

Events events

FieldField typeRequiredOne per language
title
Title
text ≤ 200 title_fr, title_en
description
Description
html description_fr, description_en
start_date
Start date
datetime
end_date
End date
datetime
location
Location
text ≤ 200 location_fr, location_en
is_online
Is online
bool
event_type
Event type
choice ≤ 20
conference, workshop, webinar, seminar, training, meeting
registration_url
Registration url
url ≤ 200
meeting_url
Meeting url
url ≤ 200
featured_image
Featured image
image ≤ 100
is_featured
Is featured
bool
order
Order
int

FAQ faq

FieldField typeRequiredOne per language
question
Question
text ≤ 300 question_fr, question_en
answer
Answer
html answer_fr, answer_en
category
Category
category
is_featured
Is featured
bool
order
Order
int

Job openings jobs

FieldField typeRequiredOne per language
title
Job title
text ≤ 200
category
Category
category
description
Job description
html
requirements
Requirements
html
responsibilities
Responsibilities
html
benefits
Benefits
html
location
Location
text ≤ 200
contract_type
Contract type
choice ≤ 20
full_time, part_time, contract, freelance, internship, temporary
experience_level
Experience level
choice ≤ 20
entry, junior, mid, senior, lead, executive
remote_option
Remote option
choice ≤ 20
onsite, remote, hybrid
application_deadline
Application deadline
date
is_active
Active
bool

Resources resources

FieldField typeRequiredOne per language
title
Title
text ≤ 200 title_fr, title_en
description
Description
html description_fr, description_en
file
File
file ≤ 100
resource_type
Resource type
choice ≤ 20
guide, ebook, whitepaper, template, checklist, case_study
thumbnail
Thumbnail
image ≤ 100
order
Order
int

Publications publications

FieldField typeRequiredOne per language
title
Title
text ≤ 255 title_fr, title_en
authors
Authors
text ≤ 255 authors_fr, authors_en
year
Year
text ≤ 10
journal
Journal
text ≤ 255 journal_fr, journal_en
abstract
Abstract
html abstract_fr, abstract_en
link
Link
url ≤ 200
category
Category
category
is_featured
Featured publication
bool
order
Order
int

Testimonials testimonials

FieldField typeRequiredOne per language
name
Name
text ≤ 100 name_fr, name_en
position
Position
text ≤ 100 position_fr, position_en
testimonial
Testimonial
longtext testimonial_fr, testimonial_en
rating
Rating
int
image
Image
image ≤ 100
order
Order
int

Skills skills

FieldField typeRequiredOne per language
name
Name
text ≤ 100 name_fr, name_en
level
Level
int
order
Order
int

Key figures stats

FieldField typeRequiredOne per language
title
Title
text ≤ 100 title_fr, title_en
value
Value
text ≤ 20
icon
Icon
text ≤ 50
order
Order
int