API · version 2026-08-31

API et webhooks.

Lisez et écrivez les contacts, sociétés, rendez-vous, deals et leads de votre espace, et recevez ses événements dès qu'ils arrivent. Zapier, Make, n8n, votre site ou votre outil de BI s'y branchent avec une clé, sans attendre une intégration.

URL de base
https://iwmtiwjknbwymbajbzaz.supabase.co/functions/v1/api-v1
Authentification
Authorization: Bearer lmk_live_…
Format
REST et JSON, en UTF-8
Limite
120 requêtes par 10 secondes et par clé
Formules
Entreprise Plus et Premium

Démarrer en trois étapes

1. Créer une clé

Un administrateur de l'espace la crée dans Réglages, API et MCP, et lui donne le nom de l'outil qui s'en servira. Cochez « Autoriser l'écriture » si l'outil doit créer ou modifier des fiches. La clé ne s'affiche qu'une fois : rangez-la dans le coffre de votre outil, jamais dans le code d'une page web.

2. Vérifier la clé

GET / renvoie la version de l'API, les chemins en lecture et les opérations d'écriture. Une erreur 401 : la clé est mal copiée ou révoquée.

Vérifier la clé
curl https://iwmtiwjknbwymbajbzaz.supabase.co/functions/v1/api-v1 \
  -H "Authorization: Bearer lmk_live_…"

3. Lire et écrire

Chaque ressource se liste, se lit par son identifiant et, pour la plupart, se crée (POST) et se modifie (PATCH). La réponse d'une écriture est l'objet créé ou modifié.

Lister les contacts
curl "https://iwmtiwjknbwymbajbzaz.supabase.co/functions/v1/api-v1/contacts?limit=50" \
  -H "Authorization: Bearer lmk_live_…"
Créer un contact
curl -X POST https://iwmtiwjknbwymbajbzaz.supabase.co/functions/v1/api-v1/contacts \
  -H "Authorization: Bearer lmk_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "first_name": "Camille",
    "last_name": "Martin",
    "phone": "+33612345678",
    "custom_fields": { "call_status": "to_call" }
  }'

Authentification

Chaque requête porte la clé dans l'en-tête Authorization: Bearer lmk_live_…, jamais dans l'adresse. Une clé appartient à un espace et ne voit que lui.

  • Deux scopes : read, toujours présent, et write, choisi à la création, pour POST et PATCH. Une clé ne change pas de scopes : créez-en une autre.
  • Jusqu'à 10 clés actives par espace, une par outil, chacune nommée : en révoquer une ne coupe pas les autres.
  • uggo ne garde qu'une empreinte de la clé (SHA-256) : une clé perdue se remplace, elle ne se retrouve pas.
  • La révocation, depuis les Réglages, prend effet à la requête suivante.

Pagination et synchronisation

Les listes vont de la fiche la plus récente à la plus ancienne, par pages, avec un curseur : une fiche ajoutée pendant la lecture ne décale pas les pages suivantes.

Une page de contacts
{
  "object": "list",
  "data": [
    { "id": "8f0c…", "first_name": "Camille", "last_name": "Martin", "…": "…" }
  ],
  "has_more": true,
  "next_cursor": "eyJj…"
}
ParamètreDéfautDescription
limit50Taille de la page, de 1 à 200.
cursoraucunnext_cursor de la page précédente (opaque).
updated_sinceaucunNe renvoie que les lignes modifiées depuis cette date (ISO 8601), pour une synchronisation incrémentale.

Pour synchroniser un outil, gardez la date de votre dernière lecture et passez-la dans updated_since ; suivez next_cursor tant que has_more vaut true.

Ce qui a changé depuis le 1er octobre
curl "https://iwmtiwjknbwymbajbzaz.supabase.co/functions/v1/api-v1/contacts?updated_since=2026-10-01T00:00:00Z&limit=200" \
  -H "Authorization: Bearer lmk_live_…"

Erreurs

Toute erreur renvoie le même JSON : code, stable, à tester dans votre code ; message, ce qui ne va pas ; hint, ce qu'il faut faire pour corriger.

Réponse 401
{
  "error": {
    "code": "unauthorized",
    "message": "Clé API inconnue ou révoquée.",
    "hint": "Envoie l'en-tête `Authorization: Bearer lmk_live_…` avec une clé active, créée dans uggo : Réglages, API."
  }
}
HTTPCodeQuand
400invalid_requestUn paramètre ou un champ est invalide : limit, cursor, updated_since, uuid, champ inconnu ou mal typé.
401unauthorizedLa clé est absente, inconnue ou révoquée.
403forbiddenLa clé n'a pas le scope write, requis pour POST et PATCH.
403plan_gatedLa formule de l'espace ne comprend pas l'API, ou elle écrit une fiche d'objet sans le Builder.
404not_foundRessource ou objet introuvable dans l'espace de la clé.
405method_not_allowedMéthode non prise en charge, ou écriture sur une ressource en lecture seule (appels). L'en-tête Allow liste les méthodes possibles.
409already_existsUn lead a déjà été poussé avec cet external_id.
422invalid_referencecompany_id, mission_id, contact_id ou stage_id n'appartient pas à l'espace.
422invalid_custom_fieldsUne valeur est refusée par le catalogue des champs (GET /fields), ou un champ obligatoire manque à la création.
422invalid_dataUne clé hors du catalogue de l'objet, ou une valeur au mauvais type.
429rate_limitedPlus de 120 requêtes en 10 secondes pour cette clé : réessayez après Retry-After secondes.
500internal_errorErreur de notre côté : réessayez, puis écrivez au support avec l'heure de la requête si elle persiste.

Référence

Toutes les opérations, par ressource. La même description existe au format OpenAPI 3.1, à importer dans Postman, Insomnia ou un agent IA : openapi.json.

Les champs sont ceux de uggo, sans donnée technique ni identifiant de fournisseur. Un champ inconnu ou non modifiable renvoie 400 ; custom_fields est fusionné en PATCH, null efface une clé.

Point d'entrée

Pour vérifier une clé : la réponse donne la version de l'API, les chemins en lecture et les opérations d'écriture.

Point d'entrée de l'API

GET /

Vérifie la clé et renvoie la version de l'API, les chemins en lecture et les opérations d'écriture.

Contacts

Les prospects de l'espace et leurs notes. Le statut de prospection est dans custom_fields.call_status.

Lister les contacts

GET /contacts

Liste les contacts de l'espace de la clé, du plus récent au plus ancien, par pages de 50 (jusqu'à 200) avec un curseur. updated_since ne renvoie que les lignes modifiées depuis une date.

Pagination : limit, cursor, updated_since (voir Pagination).

Créer un contact

POST /contacts scope write

Crée un contact (scope write) ; au moins un de first_name, last_name, email, phone ou mobile. custom_fields.call_status accepte : nouveau, to_call, not_reachable, callback, called, interested, booked, refused, wrong_number, dnc, mv_timing, mv_cible, no_follow_up.

Corps JSON : les champs acceptés en écriture.

Lire un contact

GET /contacts/{id}

Renvoie un contact de l'espace de la clé par son identifiant.

Modifier un contact

PATCH /contacts/{id} scope write

Modifie les champs envoyés d'un contact (scope write) ; les autres restent tels quels, null efface une valeur. Renvoie l'objet modifié.

Corps JSON : les champs acceptés en écriture.

Lister les notes d'un contact

GET /contacts/{id}/notes

Renvoie les notes d'un contact, de la plus récente à la plus ancienne, jusqu'à limit (200 au plus), en une seule page.

limit : Taille de la page, de 1 à 200.

Ajouter une note à un contact

POST /contacts/{id}/notes scope write

Ajoute une note à un contact (scope write), avec source = api. Le corps ne contient que content.

Corps JSON : les champs acceptés en écriture.

Champs d'un contact, en lecture (19)
ChampTypeDescription
iduuidIdentifiant (uuid).
first_nametextePrénom.
last_nametexteNom.
emaile-mailAdresse e-mail.
phonetexteTéléphone fixe ou principal, de préférence au format E.164 (+33…).
mobiletexteTéléphone portable, de préférence au format E.164.
job_titletextePoste.
linkedin_urlURLURL du profil LinkedIn.
sourcetexteProvenance du contact (texte libre : salon, import, site…).
tagsliste de texteÉtiquettes libres.
custom_fieldsobjetChamps personnalisés de l'espace, par clé (catalogue : GET /fields). Fusionnés en PATCH : une clé absente est gardée, null l'efface. call_status porte le statut de prospection d'un contact.
company_iduuidSociété de rattachement (GET /companies).
mission_iduuidMission ou campagne de rattachement.
callback_atdate et heureRappel planifié (ISO 8601).
last_call_atdate et heureDernier appel.
last_activity_atdate et heureDernière activité.
nrp_countentierAppels sans réponse d'affilée (NRP).
created_atdate et heureCréation.
updated_atdate et heureDernière modification.
Champs d'un contact, en écriture (13)
ChampTypeDescription
first_nametextePrénom.
last_nametexteNom.
emaile-mailAdresse e-mail.
phonetexteTéléphone fixe ou principal, de préférence au format E.164 (+33…).
mobiletexteTéléphone portable, de préférence au format E.164.
job_titletextePoste.
linkedin_urlURLURL du profil LinkedIn.
sourcetexteProvenance du contact (texte libre : salon, import, site…).
tagsliste de texteÉtiquettes libres.
custom_fieldsobjetChamps personnalisés de l'espace, par clé (catalogue : GET /fields). Fusionnés en PATCH : une clé absente est gardée, null l'efface. call_status porte le statut de prospection d'un contact.
company_iduuidSociété de rattachement (GET /companies).
mission_iduuidMission ou campagne de rattachement.
callback_atdate et heureRappel planifié (ISO 8601).
Champs d'une note, en lecture (6)
ChampTypeDescription
iduuidIdentifiant (uuid).
contact_iduuidContact de la note.
contenttexteTexte de la note.
sourcetexteOrigine (api pour une note créée par l'API).
created_atdate et heureCréation.
updated_atdate et heureDernière modification.
Champs d'une note, en écriture (1)
ChampTypeDescription
contenttexte, requisTexte de la note.

Sociétés

Les sociétés de l'espace, avec SIREN, code NAF, effectif et domaine.

Lister les sociétés

GET /companies

Liste les sociétés de l'espace de la clé, du plus récent au plus ancien, par pages de 50 (jusqu'à 200) avec un curseur. updated_since ne renvoie que les lignes modifiées depuis une date.

Pagination : limit, cursor, updated_since (voir Pagination).

Créer un société

POST /companies scope write

Crée un société dans l'espace de la clé (scope write). Renvoie l'objet créé.

Corps JSON : les champs acceptés en écriture.

Lire un société

GET /companies/{id}

Renvoie un société de l'espace de la clé par son identifiant.

Modifier un société

PATCH /companies/{id} scope write

Modifie les champs envoyés d'un société (scope write) ; les autres restent tels quels, null efface une valeur. Renvoie l'objet modifié.

Corps JSON : les champs acceptés en écriture.

Champs d'une société, en lecture (16)
ChampTypeDescription
iduuidIdentifiant (uuid).
nametexteRaison sociale ou nom d'usage.
sirentexteSIREN (9 chiffres).
naf_codetexteCode NAF ou APE.
industrytexteSecteur.
sizetexteTranche d'effectif.
citytexteVille.
domaintexteNom de domaine (exemple.fr).
websiteURLSite web.
phonetexteStandard.
generic_emailtexteAdresse e-mail générique (contact@…).
tagsliste de texteÉtiquettes libres.
custom_fieldsobjetChamps personnalisés de l'espace, par clé (catalogue : GET /fields). Fusionnés en PATCH : une clé absente est gardée, null l'efface. call_status porte le statut de prospection d'un contact.
mission_iduuidMission ou campagne de rattachement.
created_atdate et heureCréation.
updated_atdate et heureDernière modification.
Champs d'une société, en écriture (13)
ChampTypeDescription
nametexteRaison sociale ou nom d'usage.
sirentexteSIREN (9 chiffres).
naf_codetexteCode NAF ou APE.
industrytexteSecteur.
sizetexteTranche d'effectif.
citytexteVille.
domaintexteNom de domaine (exemple.fr).
websiteURLSite web.
phonetexteStandard.
generic_emailtexteAdresse e-mail générique (contact@…).
tagsliste de texteÉtiquettes libres.
custom_fieldsobjetChamps personnalisés de l'espace, par clé (catalogue : GET /fields). Fusionnés en PATCH : une clé absente est gardée, null l'efface. call_status porte le statut de prospection d'un contact.
mission_iduuidMission ou campagne de rattachement.

Appels

Les appels passés et reçus, en lecture seule : ils naissent de la téléphonie. La transcription n'est rendue que sur le détail d'un appel.

Lister les appels

GET /calls

Liste les appels de l'espace de la clé, du plus récent au plus ancien, par pages de 50 (jusqu'à 200) avec un curseur. updated_since ne renvoie que les lignes modifiées depuis une date.

Pagination : limit, cursor, updated_since (voir Pagination).

Lire un appel

GET /calls/{id}

Renvoie un appel de l'espace de la clé par son identifiant, avec les champs du détail.

Champs d'un appel, en lecture (14)
ChampTypeDescription
iduuidIdentifiant (uuid).
contact_iduuidContact appelé ou appelant.
directiontexteSens de l'appel. Valeurs : inbound, outbound.
remote_numbertexteNuméro du correspondant.
started_atdate et heureDébut de l'appel.
duration_secentierDurée en secondes.
statustexteStatut téléphonique (répondu, sans réponse…).
outcometexteRésultat noté par le commercial.
summarytexteRésumé rédigé par Hunter.
recording_urlURLLien de l'enregistrement.
mission_iduuidMission ou campagne.
created_atdate et heureCréation.
updated_atdate et heureDernière modification.
transcripttexteTranscription de l'appel.

Rendez-vous

Les rendez-vous, appelés découvertes dans un espace Entreprise. Un changement de statut est tracé dans l'historique.

Lister les rendez-vous

GET /meetings

Liste les rendez-vous de l'espace de la clé, du plus récent au plus ancien, par pages de 50 (jusqu'à 200) avec un curseur. updated_since ne renvoie que les lignes modifiées depuis une date.

Pagination : limit, cursor, updated_since (voir Pagination).

Créer un rendez-vous

POST /meetings scope write

Crée un rendez-vous ou une découverte (scope write) : scheduled_at requis ; company_name, ou un contact ou une société rattachés ; mission_id requis hors espace Entreprise. Statut booked par défaut.

Corps JSON : les champs acceptés en écriture.

Lire un rendez-vous

GET /meetings/{id}

Renvoie un rendez-vous de l'espace de la clé par son identifiant.

Modifier un rendez-vous

PATCH /meetings/{id} scope write

Modifie les champs envoyés d'un rendez-vous (scope write) ; les autres restent tels quels, null efface une valeur. Renvoie l'objet modifié.

Corps JSON : les champs acceptés en écriture.

Champs d'un rendez-vous, en lecture (20)
ChampTypeDescription
iduuidIdentifiant (uuid).
scheduled_atdate et heureDate et heure du rendez-vous (ISO 8601). Requis à la création.
statustexteStatut du rendez-vous. Valeurs : booked, validated, paid, rescheduled, no_show, cancelled, rejected.
company_nametexteSociété du rendez-vous (requis sans crm_contact_id ni crm_company_id rattaché à une société).
contact_nametexteNom de la personne rencontrée.
contact_emaile-mailE-mail de la personne rencontrée.
contact_phonetexteTéléphone de la personne rencontrée.
notestexteNotes.
reporttexteCompte rendu du rendez-vous.
crm_contact_iduuidContact rencontré ; société et coordonnées en sont déduites.
crm_company_iduuidSociété rencontrée.
mission_iduuidMission du client ; requise hors espace Entreprise.
origintexteEspace Entreprise : origine de la découverte. Valeurs : outbound, inbound.
assigned_user_iduuidEspace Entreprise : closer attribué (membre actif de l'espace).
sdr_user_iduuidMembre qui a posé le rendez-vous.
held_autobooléenValidé automatiquement à J+5.
invite_prospectbooléenInvite le contact à l'événement d'agenda.
calendar_event_idtexteÉvénement d'agenda lié.
created_atdate et heureCréation.
updated_atdate et heureDernière modification.
Champs d'un rendez-vous, en écriture (13)
ChampTypeDescription
company_nametexteSociété du rendez-vous (requis sans crm_contact_id ni crm_company_id rattaché à une société).
contact_nametexteNom de la personne rencontrée.
contact_emaile-mailE-mail de la personne rencontrée.
contact_phonetexteTéléphone de la personne rencontrée.
scheduled_atdate et heureDate et heure du rendez-vous (ISO 8601). Requis à la création.
statustexteStatut du rendez-vous. Valeurs : booked, validated, paid, rescheduled, no_show, cancelled, rejected.
notestexteNotes.
crm_contact_iduuidContact rencontré ; société et coordonnées en sont déduites.
crm_company_iduuidSociété rencontrée.
mission_iduuidMission du client ; requise hors espace Entreprise.
origintexteEspace Entreprise : origine de la découverte. Valeurs : outbound, inbound.
assigned_user_iduuidEspace Entreprise : closer attribué (membre actif de l'espace).
invite_prospectbooléenInvite le contact à l'événement d'agenda.

Deals

Le pipeline, appelé opportunités dans un espace Entreprise. Changer d'étape pose ou retire won_at, lost_at et lost_reason comme dans l'app.

Lister les deals

GET /deals

Liste les deals de l'espace de la clé, du plus récent au plus ancien, par pages de 50 (jusqu'à 200) avec un curseur. updated_since ne renvoie que les lignes modifiées depuis une date.

Pagination : limit, cursor, updated_since (voir Pagination).

Créer un deal

POST /deals scope write

Crée un deal (scope write) sur la première étape ouverte du pipeline, ou sur stage_id. Sans title, le titre vient de la société ou du contact.

Corps JSON : les champs acceptés en écriture.

Lire un deal

GET /deals/{id}

Renvoie un deal de l'espace de la clé par son identifiant.

Modifier un deal

PATCH /deals/{id} scope write

Modifie les champs envoyés d'un deal (scope write) ; les autres restent tels quels, null efface une valeur. Renvoie l'objet modifié.

Corps JSON : les champs acceptés en écriture.

Champs d'un deal, en lecture (16)
ChampTypeDescription
iduuidIdentifiant (uuid).
titletexteTitre du deal.
amountnombreMontant.
currencytexteDevise (EUR…).
probabilitynombreProbabilité de gain, de 0 à 100.
stage_iduuidÉtape du pipeline ; won_at, lost_at et lost_reason suivent le type d'étape.
contact_iduuidContact du deal (création seulement).
company_iduuidSociété du deal (création seulement ; déduite du contact sinon).
notestexteNotes.
expected_close_datedate et heureDate de signature attendue.
won_atdate et heureGagné le.
lost_atdate et heurePerdu le.
lost_reasontexteMotif de perte.
custom_fieldsobjetChamps personnalisés de l'espace, par clé (catalogue : GET /fields). Fusionnés en PATCH : une clé absente est gardée, null l'efface. call_status porte le statut de prospection d'un contact.
created_atdate et heureCréation.
updated_atdate et heureDernière modification.
Champs d'un deal, en écriture (10)
ChampTypeDescription
titletexteTitre du deal.
amountnombreMontant.
probabilitynombreProbabilité de gain, de 0 à 100.
notestexteNotes.
expected_close_datedate et heureDate de signature attendue.
stage_iduuidÉtape du pipeline ; won_at, lost_at et lost_reason suivent le type d'étape.
lost_reasontexteMotif de perte.
custom_fieldsobjetChamps personnalisés de l'espace, par clé (catalogue : GET /fields). Fusionnés en PATCH : une clé absente est gardée, null l'efface. call_status porte le statut de prospection d'un contact.
contact_iduuidContact du deal (création seulement).
company_iduuidSociété du deal (création seulement ; déduite du contact sinon).

Leads entrants

Les leads poussés par un site ou un outil no-code arrivent dans le bac de réception, comme une réponse de formulaire : aucune fiche n'est créée avant qualification.

Lister les leads entrants

GET /leads

Liste les leads entrants de l'espace de la clé, du plus récent au plus ancien, par pages de 50 (jusqu'à 200) avec un curseur. updated_since ne renvoie que les lignes modifiées depuis une date.

Pagination : limit, cursor, updated_since (voir Pagination).

Créer un lead

POST /leads scope write

Pousse un lead entrant dans le bac de réception (scope write), comme une réponse de formulaire : aucune fiche n'est touchée avant qualification. identity.email ou identity.phone_e164 requis ; external_id est unique par espace.

Corps JSON : les champs acceptés en écriture.

Lire un lead

GET /leads/{id}

Renvoie un lead de l'espace de la clé par son identifiant.

Champs d'un lead, en lecture (21)
ChampTypeDescription
iduuidIdentifiant (uuid).
sourcetexteOrigine du lead (api, form, signup…).
form_iduuidFormulaire public d'origine.
statustexteÉtat dans le bac de réception.
scorenombreScore de qualification.
identityobjetIdentité du prospect ; email ou phone_e164 requis.
identity.emaile-mailE-mail.
identity.phone_e164texteTéléphone au format E.164 (+33612345678).
identity.first_nametextePrénom.
identity.last_nametexteNom.
identity.companytexteSociété.
identity.job_titletextePoste.
identity.websitetexteSite web de la société.
payloadobjetRéponses ou données brutes du formulaire d'origine.
utmobjetParamètres UTM de la visite (utm_source, utm_campaign…).
referrertextePage d'origine.
contact_iduuidContact créé ou rapproché.
company_iduuidSociété créée ou rapprochée.
owner_iduuidMembre actif de l'espace à qui confier le lead.
created_atdate et heureCréation.
handled_atdate et heureTraité le.
Champs d'un lead, en écriture (15)
ChampTypeDescription
identityobjet, requisIdentité du prospect ; email ou phone_e164 requis.
identity.emaile-mailE-mail.
identity.phone_e164texteTéléphone au format E.164 (+33612345678).
identity.first_nametextePrénom.
identity.last_nametexteNom.
identity.companytexteSociété.
identity.job_titletextePoste.
identity.websitetexteSite web de la société.
payloadobjetRéponses ou données brutes du formulaire d'origine.
utmobjetParamètres UTM de la visite (utm_source, utm_campaign…).
referrertextePage d'origine.
external_sourcetexteSystème d'origine (site, Typeform…).
external_idtexteIdentifiant dans le système d'origine ; unique par espace.
owner_iduuidMembre actif de l'espace à qui confier le lead.
scorenombreScore de qualification.

Champs et objets personnalisés

Le catalogue des champs de l'espace (les clés à envoyer dans custom_fields) et les objets créés avec le Builder (Contrats, Projets…), adressés par leur slug.

Lister les champs personnalisés

GET /fields

Renvoie le catalogue des champs personnalisés des contacts, sociétés et deals : clés à envoyer dans custom_fields, types et choix.

Lister les objets personnalisés

GET /objects

Renvoie les objets personnalisés de l'espace (Contrats, Projets…) et leurs champs.

Lire un objet personnalisé

GET /objects/{slug}

Renvoie un objet personnalisé et ses champs, par son slug.

Lister les fiches d'un objet

GET /objects/{slug}/records

Liste les fiches actives d'un objet personnalisé, avec la même pagination que les autres listes ; q cherche dans le titre, archived=true inclut les archivées.

Pagination : limit, cursor, updated_since (voir Pagination).

q : Recherche dans le titre des fiches.

archived : true inclut les fiches archivées.

Créer une fiche d'objet

POST /objects/{slug}/records scope write

Crée une fiche d'objet personnalisé (scope write, formule avec le Builder). data n'accepte que les clés du catalogue de l'objet.

Corps JSON : les champs acceptés en écriture.

Lire une fiche d'objet

GET /objects/{slug}/records/{record_id}

Renvoie une fiche d'objet personnalisé par son identifiant.

Modifier une fiche d'objet

PATCH /objects/{slug}/records/{record_id} scope write

Modifie une fiche d'objet personnalisé (scope write, formule avec le Builder) : data est fusionné, archived archive ou restaure.

Corps JSON : les champs acceptés en écriture.

Champs d'un champ du catalogue, en lecture (8)
ChampTypeDescription
objettexteFiche du champ : contact, company, deal, ou obj:<id> pour un objet personnalisé.
cletexteClé à envoyer dans custom_fields ou data.
libelletexteLibellé affiché.
typetexteType du champ (texte, nombre, date, choix…).
obligatoirebooléenRequis à la création.
choixliste d'objetsChoix possibles d'une liste ; s'envoient par id (ou par libellé).
plusieursbooléenPlusieurs choix possibles.
aidetexteTexte d'aide.
Champs d'une fiche d'objet, en lecture (9)
ChampTypeDescription
iduuidIdentifiant (uuid).
objecttexteSlug de l'objet.
titletexteValeur du champ titre.
dataobjetValeurs, par clé de champ.
owner_iduuidResponsable de la fiche.
created_byuuidAuteur ; null pour une création par clé API.
created_atdate et heureCréation.
updated_atdate et heureDernière modification.
archived_atdate et heureArchivée le ; null si active.
Champs d'une fiche d'objet, en écriture (2)
ChampTypeDescription
dataobjet, requisValeurs par clé du catalogue de l'objet ; le champ titre est requis.
owner_iduuidResponsable (membre actif de l'espace).

Webhooks

uggo envoie les événements de l'espace à vos adresses, en POST JSON, dans la minute. Un administrateur les ajoute dans Réglages, API et MCP, Webhooks sortants, et choisit les événements de chaque adresse (aucun choisi : tous). Un webhook Zapier, Make ou n8n se branche tel quel.

Événements

ÉvénementQuand
meeting.createdUn rendez-vous est créé, dans uggo ou par l'API.
meeting.updatedLe statut d'un rendez-vous change ; previous_status donne l'ancien.
meeting.assignedUn closer est attribué ou changé sur une découverte (espace Entreprise).
contact.status_changedLe statut de prospection d'un contact (custom_fields.call_status) change.
callback.createdUn rappel est planifié ou déplacé (callback_at).
deal.createdUn deal est créé ; meeting_id quand il naît d'une découverte tenue.
deal.stage_changedUn deal change d'étape, gagné et perdu compris ; stage_label donne le nom de l'étape.
call.completedUn appel est enregistré. Durée et résumé arrivent ensuite : relisez GET /calls/{id}.
lead.createdUn lead entrant arrive (formulaire public, API, inscription), avec ses réponses.
booking.createdUn prospect prend un rendez-vous en ligne.
booking.rescheduledUn prospect replanifie un rendez-vous pris en ligne.
booking.cancelledUn prospect annule un rendez-vous pris en ligne.
record.createdUne fiche d'objet personnalisé est créée : la fiche, l'objet et ses champs (clé, libellé, type, valeur).
record.updatedUne fiche d'objet change ; changed liste les champs modifiés. Une écriture sans changement n'envoie rien.
record.archivedUne fiche d'objet est archivée.

S'y ajoutent automation.triggered, envoyé par l'action « Envoyer à un webhook » d'une automatisation du Builder à l'adresse qu'elle choisit, et ping, le test lancé depuis les Réglages.

Format d'un envoi

Requête reçue par votre adresse
POST https://votre-outil.example/webhooks/uggo
Content-Type: application/json
x-uggo-event: meeting.created
x-uggo-delivery: 5b1e…
x-uggo-signature: t=1793109600,v1=3f9a…

{
  "id": "5b1e…",
  "event": "meeting.created",
  "created_at": "2026-10-27T14:00:00Z",
  "attempt": 1,
  "data": { "…": "…" }
}

Vérifier la signature

Chaque adresse a son secret whsec_…, affiché dans les Réglages. v1 est le HMAC-SHA256 de <t>.<corps brut> avec ce secret. Recalculez-le sur le corps reçu, avant tout traitement, et refusez un envoi dont t a plus de 5 minutes : un envoi rejoué ne passe pas.

Vérification en Node.js
import crypto from "node:crypto";

// header : en-tête x-uggo-signature ; body : le corps brut, avant JSON.parse ;
// secret : le whsec_… de l'adresse, affiché dans Réglages.
export function signatureValide(header, body, secret) {
  const { t, v1 } = Object.fromEntries(header.split(",").map((part) => part.split("=")));
  if (Math.abs(Date.now() / 1000 - Number(t)) > 300) return false; // plus de 5 minutes : rejeu
  const attendu = crypto.createHmac("sha256", secret).update(`${t}.${body}`).digest("hex");
  return v1.length === attendu.length && crypto.timingSafeEqual(Buffer.from(v1), Buffer.from(attendu));
}

Relances

  • Une réponse 2xx en moins de 8 secondes vaut livraison. Sinon, uggo réessaie après 1 minute, 5 minutes, 30 minutes puis 2 heures, et abandonne à la 5e tentative.
  • Après 20 échecs d'affilée, l'adresse est désactivée ; elle se réactive dans les Réglages, où s'affichent ses 20 derniers envois.
  • L'ordre est gardé pour une même adresse. Une relance porte le même id : dédupliquez sur id pour traiter chaque événement une fois.

Serveur MCP

Pour piloter l'espace depuis Claude, ChatGPT, Gemini ou tout client MCP. Le jeton de l'espace se trouve dans Réglages, API et MCP ; il passe dans l'en-tête Authorization, ou à la fin de l'adresse pour les clients sans en-têtes.

Adresse du serveur (Streamable HTTP, JSON-RPC 2.0)
https://iwmtiwjknbwymbajbzaz.supabase.co/functions/v1/crm-mcp
Authorization: Bearer <jeton>

https://iwmtiwjknbwymbajbzaz.supabase.co/functions/v1/crm-mcp/<jeton>

Ses outils cherchent et lisent les prospects, notent un appel, créent rappels, tâches, deals et rendez-vous, gèrent les listes d'appel, importent des contacts, lisent objectifs et KPI, et fournissent les données d'un rapport d'activité.

Une question sur l'API ?

Un endpoint qui manque, une intégration à monter : écrivez à support@uggo.app. L'API, les webhooks et le serveur MCP sont compris dans les formules Entreprise Plus et Premium : voir les tarifs.