Mosavo
Se connecterCréer ma page
Développeurs

Référence de l'API

Chaque route de /api/v1, générée depuis le code, avec ses paramètres, ses champs et un exemple de requête.

Sommaire
Ancienne API

La spécification complète est aussi disponible au format OpenAPI 3.1, à importer dans Postman ou Insomnia.

Statut

1 route

État des services

GET/api/v1/status

État actuel de chaque service Mosavo, incidents en cours et maintenances prévues. Les mêmes données que la page de statut publique.

AccèsPublic, clé facultativePortéeAucune

Champs de la réponse

  • overallenumobligatoire

    Valeursoperationalpartialmajormaintenance

  • generatedAtdate-timeobligatoire
  • componentsobject[]obligatoire
  • incidentsobject[]obligatoire
  • maintenancesobject[]obligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/status"
Réponse200
{
  "data": {
    "overall": "operational",
    "generatedAt": "2026-10-30T12:00:00.000Z",
    "components": [
      {
        "id": "site",
        "state": "operational",
        "uptime": 0.9998
      }
    ],
    "incidents": [],
    "maintenances": []
  }
}

Pages

4 routes

Pages publiques

GET/api/v1/pages

Pages publiées, comme sur la page Explorer. Filtre par texte ou par tag et trie par dernière mise à jour ou par nombre d'abonnés. Un curseur ne fonctionne qu'avec le tri pour lequel il a été émis.

AccèsPublic, clé facultativePortéeAucune

Paramètres

  • limitintegerqueryfacultatif

    Nombre d'éléments par page, entre 1 et 100.

  • cursorstringqueryfacultatif

    Curseur opaque renvoyé dans meta.nextCursor par la page précédente.

  • qstringqueryfacultatif

    Texte cherché dans le titre, l'adresse, la bio et les tags.

  • tagstringqueryfacultatif

    Tag exact.

  • sortenumqueryfacultatif

    recent : les plus récemment mises à jour d'abord. popular : les plus suivies d'abord.

    Valeursrecentpopular

Champs de la réponse

Chaque élément de data contient ces champs.

  • idstringobligatoire
  • slugstringobligatoire
  • urlstringobligatoire
  • kindenumobligatoire

    personal : la page d'un membre. agency : une page d'équipe. member : une page de membre publiée dans une agence.

    Valeurspersonalagencymember

  • titlestringobligatoire
  • biostring | nullobligatoire
  • locationstring | nullobligatoire
  • tagsstring[]obligatoire
  • avatarstring | nullobligatoire
  • followersintegerobligatoire
  • updatedAtdate-timeobligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/pages"
Réponse200
{
  "data": [
    {
      "id": "clp0example",
      "slug": "ada",
      "url": "https://mosavo.fr/ada",
      "kind": "personal",
      "title": "Ada Lovelace",
      "bio": "Mathematician and writer.",
      "location": "London",
      "tags": [
        "math"
      ],
      "avatar": null,
      "followers": 42,
      "updatedAt": "2026-10-28T18:02:00.000Z"
    }
  ],
  "meta": {
    "nextCursor": null,
    "limit": 20
  }
}

Page publique

GET/api/v1/pages/{slug}

Une page publiée avec ses blocs, son thème, son propriétaire public et son équipe. Seul ce que montre la page publique est renvoyé. Les pages non publiées, modérées, appartenant à un compte banni ou dont le propriétaire a refusé l'API publique répondent not_found. Les pages de membre d'une agence se trouvent sous /api/v1/pages/{slug}/members/{member}.

AccèsPublic, clé facultativePortéeAucune

Paramètres

  • slugstringcheminobligatoire

    Adresse de la page, comme dans mosavo.fr/<slug>.

Champs de la réponse

  • idstringobligatoire
  • slugstringobligatoire
  • urlstringobligatoire
  • kindenumobligatoire

    personal : la page d'un membre. agency : une page d'équipe. member : une page de membre publiée dans une agence.

    Valeurspersonalagencymember

  • titlestringobligatoire
  • biostring | nullobligatoire
  • locationstring | nullobligatoire
  • tagsstring[]obligatoire
  • avatarstring | nullobligatoire
  • themeobjectobligatoire
  • ownerobject | nullobligatoire

    null pour les pages d'agence.

  • teamobject | nullobligatoire

    Renseigné pour les pages d'agence.

  • agencyobject | nullobligatoire

    Renseigné pour les pages de membre.

  • membersobject[]obligatoire

    Pages de membre publiques d'une agence.

  • followersinteger | nullobligatoire

    null quand les statistiques publiques sont désactivées.

  • blocksobject[]obligatoire
  • createdAtdate-timeobligatoire
  • updatedAtdate-timeobligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/pages/<slug>"
Réponse200
{
  "data": {
    "id": "clp0example",
    "slug": "ada",
    "url": "https://mosavo.fr/ada",
    "kind": "personal",
    "title": "Ada Lovelace",
    "bio": "Mathematician and writer.",
    "location": "London",
    "tags": [
      "math",
      "code"
    ],
    "avatar": "https://mosavo.fr/uploads/avatars/ada.webp",
    "theme": {
      "preset": "nuit"
    },
    "owner": {
      "pseudo": "ada",
      "avatar": "https://mosavo.fr/uploads/avatars/ada.webp",
      "badges": [
        {
          "id": "clb0example",
          "name": "Early supporter",
          "color": "#A560D4",
          "description": "Joined during the beta.",
          "icon": "star"
        }
      ]
    },
    "team": null,
    "agency": null,
    "members": [],
    "followers": 42,
    "blocks": [
      {
        "id": "clk0example",
        "type": "LINK",
        "layout": {
          "order": 0,
          "x": 0,
          "y": 0,
          "w": 4,
          "h": 2
        },
        "style": null,
        "content": {
          "title": "My notes",
          "url": "https://example.com",
          "description": ""
        }
      }
    ],
    "createdAt": "2026-01-15T09:30:00.000Z",
    "updatedAt": "2026-10-28T18:02:00.000Z"
  }
}

Page publique d'un membre d'agence

GET/api/v1/pages/{slug}/members/{member}

Une page de membre publiée dans une agence, comme mosavo.fr/<slug>/<member>. Mêmes règles et même format que GET /api/v1/pages/{slug}, avec l'agence dans agency.

AccèsPublic, clé facultativePortéeAucune

Paramètres

  • slugstringcheminobligatoire

    Adresse de la page d'agence.

  • memberstringcheminobligatoire

    Adresse de la page de membre dans l'agence.

Champs de la réponse

  • idstringobligatoire
  • slugstringobligatoire
  • urlstringobligatoire
  • kindenumobligatoire

    personal : la page d'un membre. agency : une page d'équipe. member : une page de membre publiée dans une agence.

    Valeurspersonalagencymember

  • titlestringobligatoire
  • biostring | nullobligatoire
  • locationstring | nullobligatoire
  • tagsstring[]obligatoire
  • avatarstring | nullobligatoire
  • themeobjectobligatoire
  • ownerobject | nullobligatoire

    null pour les pages d'agence.

  • teamobject | nullobligatoire

    Renseigné pour les pages d'agence.

  • agencyobject | nullobligatoire

    Renseigné pour les pages de membre.

  • membersobject[]obligatoire

    Pages de membre publiques d'une agence.

  • followersinteger | nullobligatoire

    null quand les statistiques publiques sont désactivées.

  • blocksobject[]obligatoire
  • createdAtdate-timeobligatoire
  • updatedAtdate-timeobligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/pages/<slug>/members/<member>"
Réponse200
{
  "data": {
    "id": "clp0example",
    "slug": "studio/ada",
    "url": "https://mosavo.fr/studio/ada",
    "kind": "member",
    "title": "Ada Lovelace",
    "bio": "Mathematician and writer.",
    "location": "London",
    "tags": [
      "math",
      "code"
    ],
    "avatar": "https://mosavo.fr/uploads/avatars/ada.webp",
    "theme": {
      "preset": "nuit"
    },
    "owner": {
      "pseudo": "ada",
      "avatar": "https://mosavo.fr/uploads/avatars/ada.webp",
      "badges": [
        {
          "id": "clb0example",
          "name": "Early supporter",
          "color": "#A560D4",
          "description": "Joined during the beta.",
          "icon": "star"
        }
      ]
    },
    "team": null,
    "agency": {
      "slug": "studio",
      "title": "Studio"
    },
    "members": [],
    "followers": 42,
    "blocks": [
      {
        "id": "clk0example",
        "type": "LINK",
        "layout": {
          "order": 0,
          "x": 0,
          "y": 0,
          "w": 4,
          "h": 2
        },
        "style": null,
        "content": {
          "title": "My notes",
          "url": "https://example.com",
          "description": ""
        }
      }
    ],
    "createdAt": "2026-01-15T09:30:00.000Z",
    "updatedAt": "2026-10-28T18:02:00.000Z"
  }
}

Profil public

GET/api/v1/users/{pseudo}

Profil public d'un membre et ses pages publiques. Les comptes sans aucune page visible dans l'API publique répondent not_found. Le vrai nom et l'email ne sont jamais renvoyés.

AccèsPublic, clé facultativePortéeAucune

Paramètres

  • pseudostringcheminobligatoire

    Pseudo du membre.

Champs de la réponse

  • pseudostringobligatoire
  • avatarstring | nullobligatoire
  • badgesobject[]obligatoire
  • pagesobject[]obligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/users/<pseudo>"
Réponse200
{
  "data": {
    "pseudo": "ada",
    "avatar": null,
    "badges": [
      {
        "id": "clb0example",
        "name": "Early supporter",
        "color": "#A560D4",
        "description": "Joined during the beta.",
        "icon": "star"
      }
    ],
    "pages": [
      {
        "id": "clp0example",
        "slug": "ada",
        "url": "https://mosavo.fr/ada",
        "kind": "personal",
        "title": "Ada Lovelace",
        "bio": "Mathematician and writer.",
        "location": "London",
        "tags": [
          "math"
        ],
        "avatar": null,
        "followers": 42,
        "updatedAt": "2026-10-28T18:02:00.000Z"
      }
    ]
  }
}

Compte

5 routes

Compte actuel

GET/api/v1/me

Profil du compte propriétaire de la clé API, la clé elle même, les limites qui s'y appliquent et sa consommation récente. Ne renvoie jamais de secret.

AccèsClé personnellePortéeprofile:read

Champs de la réponse

  • idstringobligatoire
  • pseudostring | nullobligatoire
  • namestring | nullobligatoire
  • imagestring | nullobligatoire
  • planenumobligatoire

    ValeursFREEETUDIANTPREMIUM

  • accountTypeenumobligatoire

    ValeursINDIVIDUALBUSINESS

  • tierenumobligatoire

    Valeursanonymousfreestudentpremiumbusinessstaff

  • localestring | nullobligatoire
  • createdAtdate-timeobligatoire
  • keyobjectobligatoire
  • limitsobjectobligatoire
  • usageobjectobligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/me" \
  -H "Authorization: Bearer msk_your_key"
Réponse200
{
  "data": {
    "id": "clx0example",
    "pseudo": "ada",
    "name": "Ada Lovelace",
    "image": null,
    "plan": "FREE",
    "accountType": "INDIVIDUAL",
    "tier": "free",
    "locale": "en",
    "createdAt": "2026-01-15T09:30:00.000Z",
    "key": {
      "id": "clx1example",
      "name": "Sync script",
      "kind": "personal",
      "prefix": "msk_AbCdEfGh",
      "scopes": [
        "profile:read",
        "pages:read"
      ],
      "expiresAt": null
    },
    "limits": {
      "perMinute": 60,
      "perDay": 5000,
      "keys": 2,
      "webhooks": 1
    },
    "usage": {
      "today": 12,
      "last7Days": 240
    }
  }
}

Modifier mon profil public

PATCH/api/v1/me

Change ton pseudo et ton nom affiché. Les champs omis gardent leur valeur, null les efface. L'email, le mot de passe et les réglages de sécurité ne se changent que dans les réglages du compte.

AccèsClé personnellePortéeprofile:write

Paramètres

  • pseudostring | nullcorpsfacultatif

    Pseudo, de 3 à 30 lettres, chiffres, points, tirets ou tirets bas.

  • namestring | nullcorpsfacultatif

    Nom affiché.

Champs de la réponse

  • idstringobligatoire
  • pseudostring | nullobligatoire
  • namestring | nullobligatoire
  • imagestring | nullobligatoire
RequêtecURL
curl -X PATCH "https://mosavo.fr/api/v1/me" \
  -H "Authorization: Bearer msk_your_key" \
  -H "Content-Type: application/json" \
  -d '{"pseudo":"ada","name":"Ada Lovelace"}'
Réponse200
{
  "data": {
    "id": "clx0example",
    "pseudo": "ada",
    "name": "Ada Lovelace",
    "image": null
  }
}

Mes badges

GET/api/v1/me/badges

Badges attribués à ton compte, dans l'ordre d'affichage.

AccèsClé personnellePortéeprofile:read

Champs de la réponse

Chaque élément de data contient ces champs.

  • idstringobligatoire
  • namestringobligatoire
  • colorstringobligatoire
  • descriptionstring | nullobligatoire
  • iconstring | nullobligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/me/badges" \
  -H "Authorization: Bearer msk_your_key"
Réponse200
{
  "data": [
    {
      "id": "clb0example",
      "name": "Early supporter",
      "color": "#A560D4",
      "description": "Joined during the beta.",
      "icon": "star"
    }
  ]
}

Exporter mes données

GET/api/v1/me/export

Le même contenu que l'export de données des réglages du compte (RGPD). Limité à un export par heure. Les secrets et les adresses IP ne sont jamais inclus.

AccèsClé personnellePortéeexport:read
RequêtecURL
curl "https://mosavo.fr/api/v1/me/export" \
  -H "Authorization: Bearer msk_your_key"
Réponse200
{
  "data": {
    "format": "mosavo-export",
    "version": 1,
    "generatedAt": "2026-10-30T12:00:00.000Z",
    "account": {
      "pseudo": "ada"
    }
  }
}

Mes domaines personnalisés

GET/api/v1/me/domains

Domaines personnalisés rattachés à tes pages et leur état de vérification. Le jeton de vérification n'est pas renvoyé : copie le depuis le tableau de bord.

AccèsClé personnellePortéedomains:read

Champs de la réponse

Chaque élément de data contient ces champs.

  • domainstringobligatoire
  • verifiedbooleanobligatoire
  • verifiedAtdate-time | nullobligatoire
  • lastCheckedAtdate-time | nullobligatoire
  • checkErrorstring | nullobligatoire
  • createdAtdate-timeobligatoire
  • pageobjectobligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/me/domains" \
  -H "Authorization: Bearer msk_your_key"
Réponse200
{
  "data": [
    {
      "domain": "ada.dev",
      "verified": true,
      "verifiedAt": "2026-10-30T12:00:00.000Z",
      "lastCheckedAt": "2026-10-30T12:00:00.000Z",
      "checkError": null,
      "createdAt": "2026-10-30T12:00:00.000Z",
      "page": {
        "id": "clp0example",
        "slug": "ada",
        "title": "Ada Lovelace"
      }
    }
  ]
}

Mes pages

20 routes

Mes pages

GET/api/v1/me/pages

Toutes les pages que tu peux ouvrir dans le tableau de bord : tes propres pages, brouillons compris, et les pages des équipes dont tu fais partie, avec ton rôle.

AccèsClé personnellePortéepages:read

Champs de la réponse

Chaque élément de data contient ces champs.

  • idstringobligatoire
  • slugstringobligatoire
  • urlstringobligatoire
  • kindenumobligatoire

    Valeurspersonalagencymember

  • titlestringobligatoire
  • biostring | nullobligatoire
  • locationstring | nullobligatoire
  • tagsstring[]obligatoire
  • publishedbooleanobligatoire
  • noIndexbooleanobligatoire
  • publicApibooleanobligatoire

    false quand la page est masquée de l'API publique.

  • themeobjectobligatoire
  • teamIdstring | nullobligatoire
  • parentIdstring | nullobligatoire

    Page d'agence qui contient cette page de membre.

  • roleenum | nullobligatoire

    Ton rôle dans l'équipe pour une page d'équipe, null pour tes propres pages.

    ValeursADMINEDITORMEMBER

  • canEditbooleanobligatoire
  • domainobject | nullobligatoire
  • blockCountintegerobligatoire
  • projectCountintegerobligatoire
  • createdAtdate-timeobligatoire
  • updatedAtdate-timeobligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/me/pages" \
  -H "Authorization: Bearer msk_your_key"
Réponse200
{
  "data": [
    {
      "id": "clp0example",
      "slug": "ada",
      "url": "https://mosavo.fr/ada",
      "kind": "personal",
      "title": "Ada Lovelace",
      "bio": "Mathematician and writer.",
      "location": "London",
      "tags": [
        "math"
      ],
      "published": true,
      "noIndex": false,
      "publicApi": true,
      "theme": {
        "preset": "nuit"
      },
      "teamId": null,
      "parentId": null,
      "role": null,
      "canEdit": true,
      "domain": null,
      "blockCount": 8,
      "projectCount": 2,
      "createdAt": "2026-01-15T09:30:00.000Z",
      "updatedAt": "2026-10-28T18:02:00.000Z"
    }
  ]
}

Créer une page

POST/api/v1/me/pages

Crée une page en brouillon. Avec teamId, crée une page de cette équipe : tu dois en être administrateur. Les limites de palier s'appliquent exactement comme dans le tableau de bord.

AccèsClé personnellePortéepages:write

Paramètres

  • Idempotency-Keystringen têtefacultatif

    Identifiant unique facultatif de la requête. Un nouvel essai avec la même clé et le même corps dans les 24 heures rejoue la première réponse au lieu d'agir deux fois.

  • slugstringcorpsobligatoire
  • titlestringcorpsobligatoire
  • biostringcorpsfacultatif
  • teamIdstringcorpsfacultatif

    Équipe propriétaire de la page.

Champs de la réponse

  • idstringobligatoire
  • slugstringobligatoire
  • urlstringobligatoire
  • kindenumobligatoire

    Valeurspersonalagencymember

  • titlestringobligatoire
  • biostring | nullobligatoire
  • locationstring | nullobligatoire
  • tagsstring[]obligatoire
  • publishedbooleanobligatoire
  • noIndexbooleanobligatoire
  • publicApibooleanobligatoire

    false quand la page est masquée de l'API publique.

  • themeobjectobligatoire
  • teamIdstring | nullobligatoire
  • parentIdstring | nullobligatoire

    Page d'agence qui contient cette page de membre.

  • roleenum | nullobligatoire

    Ton rôle dans l'équipe pour une page d'équipe, null pour tes propres pages.

    ValeursADMINEDITORMEMBER

  • canEditbooleanobligatoire
  • domainobject | nullobligatoire
  • blockCountintegerobligatoire
  • projectCountintegerobligatoire
  • createdAtdate-timeobligatoire
  • updatedAtdate-timeobligatoire
RequêtecURL
curl -X POST "https://mosavo.fr/api/v1/me/pages" \
  -H "Authorization: Bearer msk_your_key" \
  -H "Idempotency-Key: <unique id>" \
  -H "Content-Type: application/json" \
  -d '{"slug":"ada","title":"Ada Lovelace","bio":"Mathematician and writer."}'
Réponse201
{
  "data": {
    "id": "clp0example",
    "slug": "ada",
    "url": "https://mosavo.fr/ada",
    "kind": "personal",
    "title": "Ada Lovelace",
    "bio": "Mathematician and writer.",
    "location": "London",
    "tags": [
      "math"
    ],
    "published": false,
    "noIndex": false,
    "publicApi": true,
    "theme": {
      "preset": "nuit"
    },
    "teamId": null,
    "parentId": null,
    "role": null,
    "canEdit": true,
    "domain": null,
    "blockCount": 0,
    "projectCount": 0,
    "createdAt": "2026-01-15T09:30:00.000Z",
    "updatedAt": "2026-10-28T18:02:00.000Z"
  }
}

Une de mes pages

GET/api/v1/me/pages/{id}

Réglages, thème et domaine personnalisé d'une page qui t'appartient ou qui appartient à une de tes équipes. Tout autre identifiant répond not_found.

AccèsClé personnellePortéepages:read

Paramètres

  • idstringcheminobligatoire

    Identifiant de la page, tel que renvoyé par GET /api/v1/me/pages.

Champs de la réponse

  • idstringobligatoire
  • slugstringobligatoire
  • urlstringobligatoire
  • kindenumobligatoire

    Valeurspersonalagencymember

  • titlestringobligatoire
  • biostring | nullobligatoire
  • locationstring | nullobligatoire
  • tagsstring[]obligatoire
  • publishedbooleanobligatoire
  • noIndexbooleanobligatoire
  • publicApibooleanobligatoire

    false quand la page est masquée de l'API publique.

  • themeobjectobligatoire
  • teamIdstring | nullobligatoire
  • parentIdstring | nullobligatoire

    Page d'agence qui contient cette page de membre.

  • roleenum | nullobligatoire

    Ton rôle dans l'équipe pour une page d'équipe, null pour tes propres pages.

    ValeursADMINEDITORMEMBER

  • canEditbooleanobligatoire
  • domainobject | nullobligatoire
  • blockCountintegerobligatoire
  • projectCountintegerobligatoire
  • createdAtdate-timeobligatoire
  • updatedAtdate-timeobligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/me/pages/<id>" \
  -H "Authorization: Bearer msk_your_key"
Réponse200
{
  "data": {
    "id": "clp0example",
    "slug": "ada",
    "url": "https://mosavo.fr/ada",
    "kind": "personal",
    "title": "Ada Lovelace",
    "bio": "Mathematician and writer.",
    "location": "London",
    "tags": [
      "math"
    ],
    "published": true,
    "noIndex": false,
    "publicApi": true,
    "theme": {
      "preset": "nuit"
    },
    "teamId": null,
    "parentId": null,
    "role": null,
    "canEdit": true,
    "domain": null,
    "blockCount": 8,
    "projectCount": 2,
    "createdAt": "2026-01-15T09:30:00.000Z",
    "updatedAt": "2026-10-28T18:02:00.000Z"
  }
}

Modifier une page

PATCH/api/v1/me/pages/{id}

Change le titre, l'adresse, la bio, le lieu, les tags, l'indexation, la visibilité dans l'API publique ou le thème d'une page que tu peux modifier. Les champs omis gardent leur valeur. Utilise les routes publish et unpublish pour changer la publication.

AccèsClé personnellePortéepages:write

Paramètres

  • idstringcheminobligatoire

    Identifiant de la page, tel que renvoyé par GET /api/v1/me/pages.

  • slugstringcorpsfacultatif
  • titlestringcorpsfacultatif
  • biostringcorpsfacultatif
  • noIndexbooleancorpsfacultatif
  • publicApibooleancorpsfacultatif
  • locationstringcorpsfacultatif
  • tagsstring[]corpsfacultatif
  • themeobject | nullcorpsfacultatif

    Thème complet de la page. null rétablit le thème par défaut.

Champs de la réponse

  • idstringobligatoire
  • slugstringobligatoire
  • urlstringobligatoire
  • kindenumobligatoire

    Valeurspersonalagencymember

  • titlestringobligatoire
  • biostring | nullobligatoire
  • locationstring | nullobligatoire
  • tagsstring[]obligatoire
  • publishedbooleanobligatoire
  • noIndexbooleanobligatoire
  • publicApibooleanobligatoire

    false quand la page est masquée de l'API publique.

  • themeobjectobligatoire
  • teamIdstring | nullobligatoire
  • parentIdstring | nullobligatoire

    Page d'agence qui contient cette page de membre.

  • roleenum | nullobligatoire

    Ton rôle dans l'équipe pour une page d'équipe, null pour tes propres pages.

    ValeursADMINEDITORMEMBER

  • canEditbooleanobligatoire
  • domainobject | nullobligatoire
  • blockCountintegerobligatoire
  • projectCountintegerobligatoire
  • createdAtdate-timeobligatoire
  • updatedAtdate-timeobligatoire
RequêtecURL
curl -X PATCH "https://mosavo.fr/api/v1/me/pages/<id>" \
  -H "Authorization: Bearer msk_your_key" \
  -H "Content-Type: application/json" \
  -d '{"title":"Ada Lovelace","tags":["math","poetry"],"theme":{"preset":"papier"}}'
Réponse200
{
  "data": {
    "id": "clp0example",
    "slug": "ada",
    "url": "https://mosavo.fr/ada",
    "kind": "personal",
    "title": "Ada Lovelace",
    "bio": "Mathematician and writer.",
    "location": "London",
    "tags": [
      "math"
    ],
    "published": true,
    "noIndex": false,
    "publicApi": true,
    "theme": {
      "preset": "nuit"
    },
    "teamId": null,
    "parentId": null,
    "role": null,
    "canEdit": true,
    "domain": null,
    "blockCount": 8,
    "projectCount": 2,
    "createdAt": "2026-01-15T09:30:00.000Z",
    "updatedAt": "2026-10-28T18:02:00.000Z"
  }
}

Supprimer une page

DELETE/api/v1/me/pages/{id}

Supprime une page que tu peux modifier, avec ses blocs, ses projets, ses statistiques et ses pages de membre. C'est définitif.

AccèsClé personnellePortéepages:write

Paramètres

  • idstringcheminobligatoire

    Identifiant de la page, tel que renvoyé par GET /api/v1/me/pages.

Champs de la réponse

  • idstringobligatoire
  • deletedbooleanobligatoire
RequêtecURL
curl -X DELETE "https://mosavo.fr/api/v1/me/pages/<id>" \
  -H "Authorization: Bearer msk_your_key"
Réponse200
{
  "data": {
    "id": "clp0example",
    "deleted": true
  }
}

Publier une page

POST/api/v1/me/pages/{id}/publish

Rend la page visible à son adresse publique. La première publication est annoncée sur le Discord de Mosavo, comme depuis le tableau de bord.

AccèsClé personnellePortéepages:write

Paramètres

  • idstringcheminobligatoire

    Identifiant de la page, tel que renvoyé par GET /api/v1/me/pages.

  • Idempotency-Keystringen têtefacultatif

    Identifiant unique facultatif de la requête. Un nouvel essai avec la même clé et le même corps dans les 24 heures rejoue la première réponse au lieu d'agir deux fois.

Champs de la réponse

  • idstringobligatoire
  • slugstringobligatoire
  • urlstringobligatoire
  • kindenumobligatoire

    Valeurspersonalagencymember

  • titlestringobligatoire
  • biostring | nullobligatoire
  • locationstring | nullobligatoire
  • tagsstring[]obligatoire
  • publishedbooleanobligatoire
  • noIndexbooleanobligatoire
  • publicApibooleanobligatoire

    false quand la page est masquée de l'API publique.

  • themeobjectobligatoire
  • teamIdstring | nullobligatoire
  • parentIdstring | nullobligatoire

    Page d'agence qui contient cette page de membre.

  • roleenum | nullobligatoire

    Ton rôle dans l'équipe pour une page d'équipe, null pour tes propres pages.

    ValeursADMINEDITORMEMBER

  • canEditbooleanobligatoire
  • domainobject | nullobligatoire
  • blockCountintegerobligatoire
  • projectCountintegerobligatoire
  • createdAtdate-timeobligatoire
  • updatedAtdate-timeobligatoire
RequêtecURL
curl -X POST "https://mosavo.fr/api/v1/me/pages/<id>/publish" \
  -H "Authorization: Bearer msk_your_key" \
  -H "Idempotency-Key: <unique id>"
Réponse200
{
  "data": {
    "id": "clp0example",
    "slug": "ada",
    "url": "https://mosavo.fr/ada",
    "kind": "personal",
    "title": "Ada Lovelace",
    "bio": "Mathematician and writer.",
    "location": "London",
    "tags": [
      "math"
    ],
    "published": true,
    "noIndex": false,
    "publicApi": true,
    "theme": {
      "preset": "nuit"
    },
    "teamId": null,
    "parentId": null,
    "role": null,
    "canEdit": true,
    "domain": null,
    "blockCount": 8,
    "projectCount": 2,
    "createdAt": "2026-01-15T09:30:00.000Z",
    "updatedAt": "2026-10-28T18:02:00.000Z"
  }
}

Dépublier une page

POST/api/v1/me/pages/{id}/unpublish

Met la page hors ligne. Son contenu est conservé et elle peut être publiée à nouveau.

AccèsClé personnellePortéepages:write

Paramètres

  • idstringcheminobligatoire

    Identifiant de la page, tel que renvoyé par GET /api/v1/me/pages.

  • Idempotency-Keystringen têtefacultatif

    Identifiant unique facultatif de la requête. Un nouvel essai avec la même clé et le même corps dans les 24 heures rejoue la première réponse au lieu d'agir deux fois.

Champs de la réponse

  • idstringobligatoire
  • slugstringobligatoire
  • urlstringobligatoire
  • kindenumobligatoire

    Valeurspersonalagencymember

  • titlestringobligatoire
  • biostring | nullobligatoire
  • locationstring | nullobligatoire
  • tagsstring[]obligatoire
  • publishedbooleanobligatoire
  • noIndexbooleanobligatoire
  • publicApibooleanobligatoire

    false quand la page est masquée de l'API publique.

  • themeobjectobligatoire
  • teamIdstring | nullobligatoire
  • parentIdstring | nullobligatoire

    Page d'agence qui contient cette page de membre.

  • roleenum | nullobligatoire

    Ton rôle dans l'équipe pour une page d'équipe, null pour tes propres pages.

    ValeursADMINEDITORMEMBER

  • canEditbooleanobligatoire
  • domainobject | nullobligatoire
  • blockCountintegerobligatoire
  • projectCountintegerobligatoire
  • createdAtdate-timeobligatoire
  • updatedAtdate-timeobligatoire
RequêtecURL
curl -X POST "https://mosavo.fr/api/v1/me/pages/<id>/unpublish" \
  -H "Authorization: Bearer msk_your_key" \
  -H "Idempotency-Key: <unique id>"
Réponse200
{
  "data": {
    "id": "clp0example",
    "slug": "ada",
    "url": "https://mosavo.fr/ada",
    "kind": "personal",
    "title": "Ada Lovelace",
    "bio": "Mathematician and writer.",
    "location": "London",
    "tags": [
      "math"
    ],
    "published": false,
    "noIndex": false,
    "publicApi": true,
    "theme": {
      "preset": "nuit"
    },
    "teamId": null,
    "parentId": null,
    "role": null,
    "canEdit": true,
    "domain": null,
    "blockCount": 8,
    "projectCount": 2,
    "createdAt": "2026-01-15T09:30:00.000Z",
    "updatedAt": "2026-10-28T18:02:00.000Z"
  }
}

Rattacher un domaine personnalisé

PUT/api/v1/me/pages/{id}/domain

Rattache un domaine à une de tes propres pages, ou remplace son domaine. Un nouveau domaine doit être vérifié à nouveau. Les limites de palier s'appliquent comme dans le tableau de bord. Le jeton de vérification n'est jamais renvoyé par l'API : copie la valeur TXT depuis les réglages de domaine de la page dans le tableau de bord.

AccèsClé personnellePortéedomains:write

Paramètres

  • idstringcheminobligatoire

    Identifiant de la page, tel que renvoyé par GET /api/v1/me/pages.

  • domainstringcorpsobligatoire

    Nom de domaine, par exemple ada.dev ou www.ada.dev.

Champs de la réponse

  • pageIdstringobligatoire
  • domainstringobligatoire
  • verifiedbooleanobligatoire
  • verifiedAtdate-time | nullobligatoire
  • checkErrorenum | nullobligatoire

    Résultat de la dernière vérification, quand elle a échoué.

    ValeurstxtNotFoundtxtUnresolvable

  • recordsobject[]obligatoire

    Enregistrements DNS à créer chez ton registraire.

RequêtecURL
curl -X PUT "https://mosavo.fr/api/v1/me/pages/<id>/domain" \
  -H "Authorization: Bearer msk_your_key" \
  -H "Content-Type: application/json" \
  -d '{"domain":"ada.dev"}'
Réponse200
{
  "data": {
    "pageId": "clp0example",
    "domain": "ada.dev",
    "verified": false,
    "verifiedAt": null,
    "checkError": null,
    "records": [
      {
        "type": "TXT",
        "name": "_mosavo-verify.ada.dev",
        "value": null,
        "purpose": "verification"
      },
      {
        "type": "CNAME",
        "name": "ada.dev",
        "value": "mosavo.fr",
        "purpose": "routing"
      }
    ]
  }
}

Vérifier un domaine personnalisé

POST/api/v1/me/pages/{id}/domain/verify

Interroge maintenant l'enregistrement TXT du domaine. S'il manque, la réponse est 200 avec verified à false et checkError renseigné : les changements DNS peuvent mettre quelques minutes à se propager.

AccèsClé personnellePortéedomains:write

Paramètres

  • idstringcheminobligatoire

    Identifiant de la page, tel que renvoyé par GET /api/v1/me/pages.

  • Idempotency-Keystringen têtefacultatif

    Identifiant unique facultatif de la requête. Un nouvel essai avec la même clé et le même corps dans les 24 heures rejoue la première réponse au lieu d'agir deux fois.

Champs de la réponse

  • pageIdstringobligatoire
  • domainstringobligatoire
  • verifiedbooleanobligatoire
  • verifiedAtdate-time | nullobligatoire
  • checkErrorenum | nullobligatoire

    Résultat de la dernière vérification, quand elle a échoué.

    ValeurstxtNotFoundtxtUnresolvable

  • recordsobject[]obligatoire

    Enregistrements DNS à créer chez ton registraire.

RequêtecURL
curl -X POST "https://mosavo.fr/api/v1/me/pages/<id>/domain/verify" \
  -H "Authorization: Bearer msk_your_key" \
  -H "Idempotency-Key: <unique id>"
Réponse200
{
  "data": {
    "pageId": "clp0example",
    "domain": "ada.dev",
    "verified": true,
    "verifiedAt": "2026-11-01T12:00:00.000Z",
    "checkError": null,
    "records": [
      {
        "type": "TXT",
        "name": "_mosavo-verify.ada.dev",
        "value": null,
        "purpose": "verification"
      },
      {
        "type": "CNAME",
        "name": "ada.dev",
        "value": "mosavo.fr",
        "purpose": "routing"
      }
    ]
  }
}

Retirer un domaine personnalisé

DELETE/api/v1/me/pages/{id}/domain

Détache le domaine personnalisé d'une de tes pages. La page reste disponible à son adresse Mosavo.

AccèsClé personnellePortéedomains:write

Paramètres

  • idstringcheminobligatoire

    Identifiant de la page, tel que renvoyé par GET /api/v1/me/pages.

Champs de la réponse

  • pageIdstringobligatoire
  • deletedbooleanobligatoire
RequêtecURL
curl -X DELETE "https://mosavo.fr/api/v1/me/pages/<id>/domain" \
  -H "Authorization: Bearer msk_your_key"
Réponse200
{
  "data": {
    "pageId": "clp0example",
    "deleted": true
  }
}

Blocs d'une page

GET/api/v1/me/pages/{id}/blocks

Blocs d'une page que tu peux modifier, dans l'ordre d'affichage, avec leur configuration complète. Les pages d'équipe demandent le rôle administrateur ou éditeur.

AccèsClé personnellePortéeblocks:read

Paramètres

  • idstringcheminobligatoire

    Identifiant de la page, tel que renvoyé par GET /api/v1/me/pages.

Champs de la réponse

Chaque élément de data contient ces champs.

  • idstringobligatoire
  • typeenumobligatoire

    ValeursLINKTEXTIMAGESOCIALCONTACTCONTACT_FORMYOUTUBEGALLERYVIDEOSPOTIFYSOUNDCLOUDTWITCHTIP_JARPRODUCTPOLLCOUNTDOWNSTATSTESTIMONIALCALENDARDISCORDMAPPHONEVCARDHOURSQR_CODEFILEFAQEMBEDRSSIFRAMEGITHUBNPMCHESSSTEAMINSTAGRAMTEAM_MEMBERSTEAM_PROJECTSTEAM_CONTACT

  • orderintegerobligatoire
  • xintegerobligatoire
  • yintegerobligatoire
  • wintegerobligatoire
  • hintegerobligatoire
  • styleobject | nullobligatoire
  • configobjectobligatoire

    Configuration complète du bloc, telle qu'enregistrée par l'éditeur. Les secrets ne sont jamais renvoyés.

  • createdAtdate-timeobligatoire
  • updatedAtdate-timeobligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/me/pages/<id>/blocks" \
  -H "Authorization: Bearer msk_your_key"
Réponse200
{
  "data": [
    {
      "id": "clk0example",
      "type": "LINK",
      "order": 0,
      "x": 0,
      "y": 0,
      "w": 4,
      "h": 2,
      "style": null,
      "config": {
        "title": "My notes",
        "url": "https://example.com",
        "description": ""
      },
      "createdAt": "2026-01-15T09:30:00.000Z",
      "updatedAt": "2026-10-28T18:02:00.000Z"
    }
  ]
}

Ajouter un bloc

POST/api/v1/me/pages/{id}/blocks

Ajoute un bloc à une page que tu peux modifier. La configuration est validée par le catalogue des blocs, exactement comme dans l'éditeur. Sans config, la configuration par défaut du type est utilisée ; sans position, le bloc se place sous les autres avec sa taille par défaut. Une page contient 60 blocs au plus.

AccèsClé personnellePortéeblocks:write

Paramètres

  • idstringcheminobligatoire

    Identifiant de la page, tel que renvoyé par GET /api/v1/me/pages.

  • Idempotency-Keystringen têtefacultatif

    Identifiant unique facultatif de la requête. Un nouvel essai avec la même clé et le même corps dans les 24 heures rejoue la première réponse au lieu d'agir deux fois.

  • typeenumcorpsobligatoire

    ValeursLINKTEXTIMAGESOCIALCONTACTCONTACT_FORMYOUTUBEGALLERYVIDEOSPOTIFYSOUNDCLOUDTWITCHTIP_JARPRODUCTPOLLCOUNTDOWNSTATSTESTIMONIALCALENDARDISCORDMAPPHONEVCARDHOURSQR_CODEFILEFAQEMBEDRSSIFRAMEGITHUBNPMCHESSSTEAMINSTAGRAMTEAM_MEMBERSTEAM_PROJECTSTEAM_CONTACT

  • configobjectcorpsfacultatif

    Configuration du bloc, telle que renvoyée par GET /blocks.

  • styleobjectcorpsfacultatif
  • xintegercorpsfacultatif

    Colonne, de 0 à 11.

  • yintegercorpsfacultatif

    Ligne, en partant du haut.

  • wintegercorpsfacultatif

    Largeur en colonnes, 12 au plus.

  • hintegercorpsfacultatif

    Hauteur en lignes.

Champs de la réponse

  • idstringobligatoire
  • typeenumobligatoire

    ValeursLINKTEXTIMAGESOCIALCONTACTCONTACT_FORMYOUTUBEGALLERYVIDEOSPOTIFYSOUNDCLOUDTWITCHTIP_JARPRODUCTPOLLCOUNTDOWNSTATSTESTIMONIALCALENDARDISCORDMAPPHONEVCARDHOURSQR_CODEFILEFAQEMBEDRSSIFRAMEGITHUBNPMCHESSSTEAMINSTAGRAMTEAM_MEMBERSTEAM_PROJECTSTEAM_CONTACT

  • orderintegerobligatoire
  • xintegerobligatoire
  • yintegerobligatoire
  • wintegerobligatoire
  • hintegerobligatoire
  • styleobject | nullobligatoire
  • configobjectobligatoire

    Configuration complète du bloc, telle qu'enregistrée par l'éditeur. Les secrets ne sont jamais renvoyés.

  • createdAtdate-timeobligatoire
  • updatedAtdate-timeobligatoire
RequêtecURL
curl -X POST "https://mosavo.fr/api/v1/me/pages/<id>/blocks" \
  -H "Authorization: Bearer msk_your_key" \
  -H "Idempotency-Key: <unique id>" \
  -H "Content-Type: application/json" \
  -d '{"type":"LINK","config":{"title":"My notes","url":"https://example.com","description":""}}'
Réponse201
{
  "data": {
    "id": "clk0example",
    "type": "LINK",
    "order": 0,
    "x": 0,
    "y": 0,
    "w": 4,
    "h": 2,
    "style": null,
    "config": {
      "title": "My notes",
      "url": "https://example.com",
      "description": ""
    },
    "createdAt": "2026-01-15T09:30:00.000Z",
    "updatedAt": "2026-10-28T18:02:00.000Z"
  }
}

Modifier un bloc

PATCH/api/v1/me/pages/{id}/blocks/{blockId}

Remplace la configuration ou le style d'un bloc, ou le déplace et le redimensionne. Les champs omis gardent leur valeur. Le type d'un bloc ne peut pas changer.

AccèsClé personnellePortéeblocks:write

Paramètres

  • idstringcheminobligatoire

    Identifiant de la page, tel que renvoyé par GET /api/v1/me/pages.

  • blockIdstringcheminobligatoire

    Identifiant du bloc.

  • configobjectcorpsfacultatif
  • styleobjectcorpsfacultatif
  • xintegercorpsfacultatif

    Colonne, de 0 à 11.

  • yintegercorpsfacultatif

    Ligne, en partant du haut.

  • wintegercorpsfacultatif

    Largeur en colonnes, 12 au plus.

  • hintegercorpsfacultatif

    Hauteur en lignes.

Champs de la réponse

  • idstringobligatoire
  • typeenumobligatoire

    ValeursLINKTEXTIMAGESOCIALCONTACTCONTACT_FORMYOUTUBEGALLERYVIDEOSPOTIFYSOUNDCLOUDTWITCHTIP_JARPRODUCTPOLLCOUNTDOWNSTATSTESTIMONIALCALENDARDISCORDMAPPHONEVCARDHOURSQR_CODEFILEFAQEMBEDRSSIFRAMEGITHUBNPMCHESSSTEAMINSTAGRAMTEAM_MEMBERSTEAM_PROJECTSTEAM_CONTACT

  • orderintegerobligatoire
  • xintegerobligatoire
  • yintegerobligatoire
  • wintegerobligatoire
  • hintegerobligatoire
  • styleobject | nullobligatoire
  • configobjectobligatoire

    Configuration complète du bloc, telle qu'enregistrée par l'éditeur. Les secrets ne sont jamais renvoyés.

  • createdAtdate-timeobligatoire
  • updatedAtdate-timeobligatoire
RequêtecURL
curl -X PATCH "https://mosavo.fr/api/v1/me/pages/<id>/blocks/<blockId>" \
  -H "Authorization: Bearer msk_your_key" \
  -H "Content-Type: application/json" \
  -d '{"config":{"title":"My notes","url":"https://example.com/notes","description":""},"w":6}'
Réponse200
{
  "data": {
    "id": "clk0example",
    "type": "LINK",
    "order": 0,
    "x": 0,
    "y": 0,
    "w": 4,
    "h": 2,
    "style": null,
    "config": {
      "title": "My notes",
      "url": "https://example.com",
      "description": ""
    },
    "createdAt": "2026-01-15T09:30:00.000Z",
    "updatedAt": "2026-10-28T18:02:00.000Z"
  }
}

Supprimer un bloc

DELETE/api/v1/me/pages/{id}/blocks/{blockId}

Retire un bloc d'une page. La disposition précédente reste disponible dans l'historique des révisions de l'éditeur.

AccèsClé personnellePortéeblocks:write

Paramètres

  • idstringcheminobligatoire

    Identifiant de la page, tel que renvoyé par GET /api/v1/me/pages.

  • blockIdstringcheminobligatoire

    Identifiant du bloc.

Champs de la réponse

  • idstringobligatoire
  • deletedbooleanobligatoire
RequêtecURL
curl -X DELETE "https://mosavo.fr/api/v1/me/pages/<id>/blocks/<blockId>" \
  -H "Authorization: Bearer msk_your_key"
Réponse200
{
  "data": {
    "id": "clk0example",
    "deleted": true
  }
}

Réorganiser les blocs

PUT/api/v1/me/pages/{id}/blocks/layout

Fixe d'un coup la position et la taille de chaque bloc de la page. Indique chaque bloc exactement une fois. L'ordre d'affichage suit les positions : de haut en bas, puis de gauche à droite.

AccèsClé personnellePortéeblocks:write

Paramètres

  • idstringcheminobligatoire

    Identifiant de la page, tel que renvoyé par GET /api/v1/me/pages.

  • blocksobject[]corpsobligatoire

    Tous les blocs de la page avec leur nouvelle position.

Champs de la réponse

Chaque élément de data contient ces champs.

  • idstringobligatoire
  • typeenumobligatoire

    ValeursLINKTEXTIMAGESOCIALCONTACTCONTACT_FORMYOUTUBEGALLERYVIDEOSPOTIFYSOUNDCLOUDTWITCHTIP_JARPRODUCTPOLLCOUNTDOWNSTATSTESTIMONIALCALENDARDISCORDMAPPHONEVCARDHOURSQR_CODEFILEFAQEMBEDRSSIFRAMEGITHUBNPMCHESSSTEAMINSTAGRAMTEAM_MEMBERSTEAM_PROJECTSTEAM_CONTACT

  • orderintegerobligatoire
  • xintegerobligatoire
  • yintegerobligatoire
  • wintegerobligatoire
  • hintegerobligatoire
  • styleobject | nullobligatoire
  • configobjectobligatoire

    Configuration complète du bloc, telle qu'enregistrée par l'éditeur. Les secrets ne sont jamais renvoyés.

  • createdAtdate-timeobligatoire
  • updatedAtdate-timeobligatoire
RequêtecURL
curl -X PUT "https://mosavo.fr/api/v1/me/pages/<id>/blocks/layout" \
  -H "Authorization: Bearer msk_your_key" \
  -H "Content-Type: application/json" \
  -d '{"blocks":[{"id":"clk0example","x":0,"y":0,"w":6,"h":2},{"id":"clk1example","x":6,"y":0,"w":6,"h":2}]}'
Réponse200
{
  "data": [
    {
      "id": "clk0example",
      "type": "LINK",
      "order": 0,
      "x": 0,
      "y": 0,
      "w": 4,
      "h": 2,
      "style": null,
      "config": {
        "title": "My notes",
        "url": "https://example.com",
        "description": ""
      },
      "createdAt": "2026-01-15T09:30:00.000Z",
      "updatedAt": "2026-10-28T18:02:00.000Z"
    }
  ]
}

Projets d'une page

GET/api/v1/me/pages/{id}/projects

Projets affichés sur une de tes propres pages, dans l'ordre d'affichage.

AccèsClé personnellePortéeprojects:read

Paramètres

  • idstringcheminobligatoire

    Identifiant de la page, tel que renvoyé par GET /api/v1/me/pages.

Champs de la réponse

Chaque élément de data contient ces champs.

  • idstringobligatoire
  • titlestringobligatoire
  • descriptionstring | nullobligatoire
  • urlstring | nullobligatoire
  • orderintegerobligatoire
  • createdAtdate-timeobligatoire
  • updatedAtdate-timeobligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/me/pages/<id>/projects" \
  -H "Authorization: Bearer msk_your_key"
Réponse200
{
  "data": [
    {
      "id": "clr0example",
      "title": "Analytical engine notes",
      "description": "Annotated translation.",
      "url": "https://example.com",
      "order": 0,
      "createdAt": "2026-01-15T09:30:00.000Z",
      "updatedAt": "2026-10-28T18:02:00.000Z"
    }
  ]
}

Ajouter un projet

POST/api/v1/me/pages/{id}/projects

Ajoute un projet à une de tes propres pages.

AccèsClé personnellePortéeprojects:write

Paramètres

  • idstringcheminobligatoire

    Identifiant de la page, tel que renvoyé par GET /api/v1/me/pages.

  • Idempotency-Keystringen têtefacultatif

    Identifiant unique facultatif de la requête. Un nouvel essai avec la même clé et le même corps dans les 24 heures rejoue la première réponse au lieu d'agir deux fois.

  • titlestringcorpsobligatoire
  • descriptionstringcorpsfacultatif
  • urluri | stringcorpsfacultatif

Champs de la réponse

  • idstringobligatoire
  • titlestringobligatoire
  • descriptionstring | nullobligatoire
  • urlstring | nullobligatoire
  • orderintegerobligatoire
  • createdAtdate-timeobligatoire
  • updatedAtdate-timeobligatoire
RequêtecURL
curl -X POST "https://mosavo.fr/api/v1/me/pages/<id>/projects" \
  -H "Authorization: Bearer msk_your_key" \
  -H "Idempotency-Key: <unique id>" \
  -H "Content-Type: application/json" \
  -d '{"title":"Analytical engine notes","description":"Annotated translation.","url":"https://example.com"}'
Réponse201
{
  "data": {
    "id": "clr0example",
    "title": "Analytical engine notes",
    "description": "Annotated translation.",
    "url": "https://example.com",
    "order": 0,
    "createdAt": "2026-01-15T09:30:00.000Z",
    "updatedAt": "2026-10-28T18:02:00.000Z"
  }
}

Modifier un projet

PATCH/api/v1/me/pages/{id}/projects/{projectId}

Change le titre, la description, le lien ou la position d'un projet. Une url vide retire le lien.

AccèsClé personnellePortéeprojects:write

Paramètres

  • idstringcheminobligatoire

    Identifiant de la page, tel que renvoyé par GET /api/v1/me/pages.

  • projectIdstringcheminobligatoire

    Identifiant du projet.

  • titlestringcorpsfacultatif
  • descriptionstringcorpsfacultatif
  • urluri | stringcorpsfacultatif
  • orderintegercorpsfacultatif

Champs de la réponse

  • idstringobligatoire
  • titlestringobligatoire
  • descriptionstring | nullobligatoire
  • urlstring | nullobligatoire
  • orderintegerobligatoire
  • createdAtdate-timeobligatoire
  • updatedAtdate-timeobligatoire
RequêtecURL
curl -X PATCH "https://mosavo.fr/api/v1/me/pages/<id>/projects/<projectId>" \
  -H "Authorization: Bearer msk_your_key" \
  -H "Content-Type: application/json" \
  -d '{"title":"Analytical engine notes, second edition"}'
Réponse200
{
  "data": {
    "id": "clr0example",
    "title": "Analytical engine notes",
    "description": "Annotated translation.",
    "url": "https://example.com",
    "order": 0,
    "createdAt": "2026-01-15T09:30:00.000Z",
    "updatedAt": "2026-10-28T18:02:00.000Z"
  }
}

Supprimer un projet

DELETE/api/v1/me/pages/{id}/projects/{projectId}
AccèsClé personnellePortéeprojects:write

Paramètres

  • idstringcheminobligatoire

    Identifiant de la page, tel que renvoyé par GET /api/v1/me/pages.

  • projectIdstringcheminobligatoire

    Identifiant du projet.

Champs de la réponse

  • idstringobligatoire
  • deletedbooleanobligatoire
RequêtecURL
curl -X DELETE "https://mosavo.fr/api/v1/me/pages/<id>/projects/<projectId>" \
  -H "Authorization: Bearer msk_your_key"
Réponse200
{
  "data": {
    "id": "clr0example",
    "deleted": true
  }
}

Statistiques d'une page

GET/api/v1/me/pages/{id}/analytics

Vues, visiteurs uniques, clics par bloc, sources de trafic et pays sur une période. Les mêmes chiffres que le tableau de bord. Les visiteurs ne sont jamais identifiés.

AccèsClé personnellePortéeanalytics:read

Paramètres

  • idstringcheminobligatoire

    Identifiant de la page, tel que renvoyé par GET /api/v1/me/pages.

  • rangeenumqueryfacultatif

    Période qui se termine maintenant.

    Valeurs7d30d90d

Champs de la réponse

  • rangeenumobligatoire

    Valeurs7d30d90d

  • fromdate-timeobligatoire
  • todate-timeobligatoire
  • totalsobjectobligatoire
  • seriesobject[]obligatoire
  • blocksobject[]obligatoire
  • projectsobject[]obligatoire
  • sourcesobject[]obligatoire
  • countriesobject[]obligatoire
  • devicesobject[]obligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/me/pages/<id>/analytics" \
  -H "Authorization: Bearer msk_your_key"
Réponse200
{
  "data": {
    "range": "30d",
    "from": "2026-09-30T12:00:00.000Z",
    "to": "2026-10-30T12:00:00.000Z",
    "totals": {
      "views": {
        "current": 1200,
        "previous": 950
      },
      "visitors": {
        "current": 840,
        "previous": 700
      },
      "clicks": {
        "current": 310,
        "previous": 260
      },
      "ctr": {
        "current": 0.26,
        "previous": 0.27
      },
      "avgDuration": {
        "current": 41,
        "previous": 37
      },
      "followers": {
        "current": 6,
        "previous": 4
      },
      "shares": {
        "current": 3,
        "previous": 1
      }
    },
    "series": [
      {
        "key": "2026-10-30",
        "views": 52,
        "visitors": 40,
        "clicks": 12
      }
    ],
    "blocks": [
      {
        "id": "clk0example",
        "type": "LINK",
        "label": "My notes",
        "clicks": 120,
        "share": 0.39
      }
    ],
    "projects": [],
    "sources": [
      {
        "key": "google.com",
        "label": "google.com",
        "value": 300,
        "share": 0.25
      }
    ],
    "countries": [
      {
        "key": "FR",
        "label": "France",
        "value": 600,
        "share": 0.5
      }
    ],
    "devices": [
      {
        "key": "mobile",
        "label": "Mobile",
        "value": 700,
        "share": 0.58
      }
    ]
  }
}

Réseau

9 routes

Abonnés de mes pages

GET/api/v1/me/followers

Membres abonnés à une de tes pages, les plus récents d'abord.

AccèsClé personnellePortéefollowers:read

Paramètres

  • limitintegerqueryfacultatif

    Nombre d'éléments par page, entre 1 et 100.

  • cursorstringqueryfacultatif

    Curseur opaque renvoyé dans meta.nextCursor par la page précédente.

Champs de la réponse

Chaque élément de data contient ces champs.

  • idstringobligatoire
  • followerobjectobligatoire
  • pageobjectobligatoire
  • followedAtdate-timeobligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/me/followers" \
  -H "Authorization: Bearer msk_your_key"
Réponse200
{
  "data": [
    {
      "id": "clf0example",
      "follower": {
        "pseudo": "grace",
        "name": "grace",
        "avatar": null,
        "pageSlug": "grace"
      },
      "page": {
        "id": "clp0example",
        "slug": "ada",
        "title": "Ada Lovelace"
      },
      "followedAt": "2026-10-30T12:00:00.000Z"
    }
  ],
  "meta": {
    "nextCursor": null,
    "limit": 20
  }
}

Mes abonnements

GET/api/v1/me/following

Pages publiées auxquelles tu es abonné, les abonnements les plus récents d'abord.

AccèsClé personnellePortéefollowers:read

Paramètres

  • limitintegerqueryfacultatif

    Nombre d'éléments par page, entre 1 et 100.

  • cursorstringqueryfacultatif

    Curseur opaque renvoyé dans meta.nextCursor par la page précédente.

Champs de la réponse

Chaque élément de data contient ces champs.

  • idstringobligatoire
  • pageobjectobligatoire
  • followedAtdate-timeobligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/me/following" \
  -H "Authorization: Bearer msk_your_key"
Réponse200
{
  "data": [
    {
      "id": "clf0example",
      "page": {
        "id": "clp1example",
        "slug": "grace",
        "title": "Grace Hopper",
        "bio": null,
        "updatedAt": "2026-10-30T12:00:00.000Z"
      },
      "followedAt": "2026-10-30T12:00:00.000Z"
    }
  ],
  "meta": {
    "nextCursor": null,
    "limit": 20
  }
}

S'abonner à une page

PUT/api/v1/me/following/{pageId}

S'abonne à une page publiée. S'abonner deux fois à la même page n'a aucun effet. Le propriétaire est prévenu comme quand tu t'abonnes depuis le site.

AccèsClé personnellePortéefollows:write

Paramètres

  • pageIdstringcheminobligatoire

    Identifiant d'une page publiée, tel que renvoyé par GET /api/v1/pages/{slug}.

Champs de la réponse

  • pageIdstringobligatoire
  • followingbooleanobligatoire
  • followersintegerobligatoire
RequêtecURL
curl -X PUT "https://mosavo.fr/api/v1/me/following/<pageId>" \
  -H "Authorization: Bearer msk_your_key"
Réponse200
{
  "data": {
    "pageId": "clp1example",
    "following": true,
    "followers": 12
  }
}

Se désabonner d'une page

DELETE/api/v1/me/following/{pageId}

Se désabonne d'une page. Se désabonner d'une page à laquelle tu n'es pas abonné n'a aucun effet.

AccèsClé personnellePortéefollows:write

Paramètres

  • pageIdstringcheminobligatoire

    Identifiant d'une page publiée, tel que renvoyé par GET /api/v1/pages/{slug}.

Champs de la réponse

  • pageIdstringobligatoire
  • followingbooleanobligatoire
  • followersintegerobligatoire
RequêtecURL
curl -X DELETE "https://mosavo.fr/api/v1/me/following/<pageId>" \
  -H "Authorization: Bearer msk_your_key"
Réponse200
{
  "data": {
    "pageId": "clp1example",
    "following": false,
    "followers": 12
  }
}

Mes notifications

GET/api/v1/me/notifications

Notifications de ton compte, les plus récentes d'abord. Les lire par l'API ne les marque pas comme lues.

AccèsClé personnellePortéenotifications:read

Paramètres

  • limitintegerqueryfacultatif

    Nombre d'éléments par page, entre 1 et 100.

  • cursorstringqueryfacultatif

    Curseur opaque renvoyé dans meta.nextCursor par la page précédente.

  • unreadenumqueryfacultatif

    true pour ne renvoyer que les notifications non lues.

    Valeurstruefalse

Champs de la réponse

Chaque élément de data contient ces champs.

  • idstringobligatoire
  • typestringobligatoire
  • dataobjectobligatoire
  • linkstring | nullobligatoire

    Chemin sur mosavo.fr lié à la notification.

  • readbooleanobligatoire
  • readAtdate-time | nullobligatoire
  • createdAtdate-timeobligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/me/notifications" \
  -H "Authorization: Bearer msk_your_key"
Réponse200
{
  "data": [
    {
      "id": "cln0example",
      "type": "newFollower",
      "data": {
        "portfolioTitle": "Ada Lovelace",
        "actor": "grace"
      },
      "link": "/dashboard/abonnements?vue=abonnes",
      "read": false,
      "readAt": null,
      "createdAt": "2026-10-30T12:00:00.000Z"
    }
  ],
  "meta": {
    "nextCursor": null,
    "limit": 20
  }
}

Marquer des notifications comme lues

POST/api/v1/me/notifications/read

Marque jusqu'à 100 notifications comme lues, ou toutes avec "all". Les identifiants d'autres comptes sont ignorés.

AccèsClé personnellePortéenotifications:write

Paramètres

  • Idempotency-Keystringen têtefacultatif

    Identifiant unique facultatif de la requête. Un nouvel essai avec la même clé et le même corps dans les 24 heures rejoue la première réponse au lieu d'agir deux fois.

  • idsstring | string[]corpsobligatoire

    Identifiants des notifications, ou "all".

Champs de la réponse

  • unreadintegerobligatoire

    Notifications encore non lues.

RequêtecURL
curl -X POST "https://mosavo.fr/api/v1/me/notifications/read" \
  -H "Authorization: Bearer msk_your_key" \
  -H "Idempotency-Key: <unique id>" \
  -H "Content-Type: application/json" \
  -d '{"ids":["cln0example"]}'
Réponse200
{
  "data": {
    "unread": 3
  }
}

Messages des formulaires de contact

GET/api/v1/me/messages

Messages envoyés par les formulaires de contact des pages que tu peux modifier, les plus récents d'abord. Les lire par l'API ne les marque pas comme lus.

AccèsClé personnellePortéemessages:read

Paramètres

  • limitintegerqueryfacultatif

    Nombre d'éléments par page, entre 1 et 100.

  • cursorstringqueryfacultatif

    Curseur opaque renvoyé dans meta.nextCursor par la page précédente.

  • pagestringqueryfacultatif

    Uniquement les messages de cette page.

  • unreadenumqueryfacultatif

    true pour ne renvoyer que les messages non lus.

    Valeurstruefalse

Champs de la réponse

Chaque élément de data contient ces champs.

  • idstringobligatoire
  • pageIdstringobligatoire
  • blockIdstringobligatoire
  • namestringobligatoire
  • emailstringobligatoire
  • subjectstringobligatoire
  • messagestringobligatoire
  • readbooleanobligatoire
  • createdAtdate-timeobligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/me/messages" \
  -H "Authorization: Bearer msk_your_key"
Réponse200
{
  "data": [
    {
      "id": "clm0example",
      "pageId": "clp0example",
      "blockId": "clk0example",
      "name": "Grace",
      "email": "[email protected]",
      "subject": "Hello",
      "message": "Loved your notes.",
      "read": false,
      "createdAt": "2026-10-30T12:00:00.000Z"
    }
  ],
  "meta": {
    "nextCursor": null,
    "limit": 20
  }
}

Marquer un message comme lu ou non lu

PATCH/api/v1/me/messages/{id}

Change l'état de lecture d'un message du formulaire de contact reçu sur une page que tu peux modifier.

AccèsClé personnellePortéemessages:write

Paramètres

  • idstringcheminobligatoire

    Identifiant du message, tel que renvoyé par GET /api/v1/me/messages.

  • readbooleancorpsobligatoire

Champs de la réponse

  • idstringobligatoire
  • pageIdstringobligatoire
  • readbooleanobligatoire
RequêtecURL
curl -X PATCH "https://mosavo.fr/api/v1/me/messages/<id>" \
  -H "Authorization: Bearer msk_your_key" \
  -H "Content-Type: application/json" \
  -d '{"read":true}'
Réponse200
{
  "data": {
    "id": "clm0example",
    "pageId": "clp0example",
    "read": true
  }
}

Supprimer un message

DELETE/api/v1/me/messages/{id}

Supprime un message du formulaire de contact reçu sur une page que tu peux modifier.

AccèsClé personnellePortéemessages:write

Paramètres

  • idstringcheminobligatoire

    Identifiant du message, tel que renvoyé par GET /api/v1/me/messages.

Champs de la réponse

  • idstringobligatoire
  • deletedbooleanobligatoire
RequêtecURL
curl -X DELETE "https://mosavo.fr/api/v1/me/messages/<id>" \
  -H "Authorization: Bearer msk_your_key"
Réponse200
{
  "data": {
    "id": "clm0example",
    "deleted": true
  }
}

Équipes

9 routes

Mes équipes

GET/api/v1/me/teams

Équipes dont tu fais partie, avec ton rôle.

AccèsClé personnellePortéeteams:read

Champs de la réponse

Chaque élément de data contient ces champs.

  • idstringobligatoire
  • namestringobligatoire
  • avatarstring | nullobligatoire
  • roleenumobligatoire

    ValeursADMINEDITORMEMBER

  • memberCountintegerobligatoire
  • createdAtdate-timeobligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/me/teams" \
  -H "Authorization: Bearer msk_your_key"
Réponse200
{
  "data": [
    {
      "id": "clt0example",
      "name": "Studio",
      "avatar": null,
      "role": "ADMIN",
      "memberCount": 4,
      "createdAt": "2026-10-30T12:00:00.000Z"
    }
  ]
}

Créer une équipe

POST/api/v1/me/teams

Crée une équipe dont tu es l'administrateur. Le nombre d'équipes que tu peux créer dépend de ton palier, comme dans le tableau de bord.

AccèsClé personnellePortéeteams:write

Paramètres

  • Idempotency-Keystringen têtefacultatif

    Identifiant unique facultatif de la requête. Un nouvel essai avec la même clé et le même corps dans les 24 heures rejoue la première réponse au lieu d'agir deux fois.

  • namestringcorpsobligatoire

    Nom de l'équipe, de 1 à 50 caractères.

Champs de la réponse

  • idstringobligatoire
  • namestringobligatoire
  • avatarstring | nullobligatoire
  • roleenumobligatoire

    ValeursADMINEDITORMEMBER

  • memberCountintegerobligatoire
  • createdAtdate-timeobligatoire
RequêtecURL
curl -X POST "https://mosavo.fr/api/v1/me/teams" \
  -H "Authorization: Bearer msk_your_key" \
  -H "Idempotency-Key: <unique id>" \
  -H "Content-Type: application/json" \
  -d '{"name":"Studio"}'
Réponse201
{
  "data": {
    "id": "clt0example",
    "name": "Studio",
    "avatar": null,
    "role": "ADMIN",
    "memberCount": 1,
    "createdAt": "2026-11-01T12:00:00.000Z"
  }
}

Une de mes équipes

GET/api/v1/me/teams/{id}

Membres et rôles d'une équipe dont tu fais partie, et ses pages. Les invitations en attente ne sont renvoyées qu'aux administrateurs de l'équipe. Tout autre identifiant répond not_found.

AccèsClé personnellePortéeteams:read

Paramètres

  • idstringcheminobligatoire

    Identifiant de l'équipe.

Champs de la réponse

  • idstringobligatoire
  • namestringobligatoire
  • avatarstring | nullobligatoire
  • roleenumobligatoire

    ValeursADMINEDITORMEMBER

  • memberCountintegerobligatoire
  • createdAtdate-timeobligatoire
  • membersobject[]obligatoire
  • invitesobject[] | nullobligatoire

    null sauf si tu es administrateur de l'équipe.

  • pagesobject[]obligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/me/teams/<id>" \
  -H "Authorization: Bearer msk_your_key"
Réponse200
{
  "data": {
    "id": "clt0example",
    "name": "Studio",
    "avatar": null,
    "role": "ADMIN",
    "memberCount": 2,
    "createdAt": "2026-10-30T12:00:00.000Z",
    "members": [
      {
        "userId": "clx0example",
        "pseudo": "ada",
        "name": "Ada Lovelace",
        "avatar": null,
        "role": "ADMIN",
        "joinedAt": "2026-10-30T12:00:00.000Z"
      }
    ],
    "invites": [
      {
        "id": "cli0example",
        "email": "[email protected]",
        "role": "EDITOR",
        "createdAt": "2026-10-30T12:00:00.000Z",
        "expiresAt": "2026-10-30T12:00:00.000Z"
      }
    ],
    "pages": [
      {
        "id": "clp2example",
        "slug": "studio",
        "title": "Studio",
        "published": true
      }
    ]
  }
}

Renommer une équipe ou changer sa marque

PATCH/api/v1/me/teams/{id}

Réservé aux administrateurs de l'équipe. brand remplace toute la marque de l'équipe (couleurs, arrondi des angles, police) appliquée aux pages de l'équipe ; null la retire.

AccèsClé personnellePortéeteams:write

Paramètres

  • idstringcheminobligatoire

    Identifiant de l'équipe, tel que renvoyé par GET /api/v1/me/teams.

  • namestringcorpsfacultatif

    Nom de l'équipe, de 1 à 50 caractères.

  • brandobject | nullcorpsfacultatif

    Marque de l'équipe. Les couleurs suivent le format #RRGGBB.

Champs de la réponse

  • idstringobligatoire
  • namestringobligatoire
  • avatarstring | nullobligatoire
  • roleenumobligatoire

    ValeursADMINEDITORMEMBER

  • memberCountintegerobligatoire
  • createdAtdate-timeobligatoire
  • brandobject | nullobligatoire
RequêtecURL
curl -X PATCH "https://mosavo.fr/api/v1/me/teams/<id>" \
  -H "Authorization: Bearer msk_your_key" \
  -H "Content-Type: application/json" \
  -d '{"name":"Studio Lovelace","brand":{"accent":"#A560D4","borderRadius":12,"font":"rounded","applyToMembers":true}}'
Réponse200
{
  "data": {
    "id": "clt0example",
    "name": "Studio Lovelace",
    "avatar": null,
    "role": "ADMIN",
    "memberCount": 1,
    "createdAt": "2026-11-01T12:00:00.000Z",
    "brand": {
      "accent": "#A560D4",
      "borderRadius": 12,
      "font": "rounded",
      "applyToMembers": true
    }
  }
}

Inviter un membre

POST/api/v1/me/teams/{id}/invites

Réservé aux administrateurs de l'équipe. Envoie un email d'invitation valable 7 jours. La personne rejoint l'équipe quand elle l'accepte depuis Mosavo.

AccèsClé personnellePortéeteams:write

Paramètres

  • idstringcheminobligatoire

    Identifiant de l'équipe, tel que renvoyé par GET /api/v1/me/teams.

  • Idempotency-Keystringen têtefacultatif

    Identifiant unique facultatif de la requête. Un nouvel essai avec la même clé et le même corps dans les 24 heures rejoue la première réponse au lieu d'agir deux fois.

  • emailemailcorpsobligatoire
  • roleenumcorpsfacultatif

    ValeursADMINEDITORMEMBER

Champs de la réponse

  • idstringobligatoire
  • emailstringobligatoire
  • roleenumobligatoire

    ValeursADMINEDITORMEMBER

  • createdAtdate-timeobligatoire
  • expiresAtdate-timeobligatoire
RequêtecURL
curl -X POST "https://mosavo.fr/api/v1/me/teams/<id>/invites" \
  -H "Authorization: Bearer msk_your_key" \
  -H "Idempotency-Key: <unique id>" \
  -H "Content-Type: application/json" \
  -d '{"email":"[email protected]","role":"EDITOR"}'
Réponse201
{
  "data": {
    "id": "cli0example",
    "email": "[email protected]",
    "role": "EDITOR",
    "createdAt": "2026-11-01T12:00:00.000Z",
    "expiresAt": "2026-11-08T12:00:00.000Z"
  }
}

Annuler une invitation

DELETE/api/v1/me/teams/{id}/invites/{inviteId}

Réservé aux administrateurs de l'équipe. Le lien d'invitation cesse de fonctionner.

AccèsClé personnellePortéeteams:write

Paramètres

  • idstringcheminobligatoire

    Identifiant de l'équipe, tel que renvoyé par GET /api/v1/me/teams.

  • inviteIdstringcheminobligatoire

    Identifiant de l'invitation, tel que renvoyé par GET /api/v1/me/teams/{id}.

Champs de la réponse

  • idstringobligatoire
  • deletedbooleanobligatoire
RequêtecURL
curl -X DELETE "https://mosavo.fr/api/v1/me/teams/<id>/invites/<inviteId>" \
  -H "Authorization: Bearer msk_your_key"
Réponse200
{
  "data": {
    "id": "cli0example",
    "deleted": true
  }
}

Changer le rôle d'un membre

PATCH/api/v1/me/teams/{id}/members/{userId}

Réservé aux administrateurs de l'équipe. Une équipe garde toujours au moins un administrateur.

AccèsClé personnellePortéeteams:write

Paramètres

  • idstringcheminobligatoire

    Identifiant de l'équipe, tel que renvoyé par GET /api/v1/me/teams.

  • userIdstringcheminobligatoire

    Identifiant du compte du membre.

  • roleenumcorpsobligatoire

    ValeursADMINEDITORMEMBER

Champs de la réponse

  • teamIdstringobligatoire
  • userIdstringobligatoire
  • roleenumobligatoire

    ValeursADMINEDITORMEMBER

RequêtecURL
curl -X PATCH "https://mosavo.fr/api/v1/me/teams/<id>/members/<userId>" \
  -H "Authorization: Bearer msk_your_key" \
  -H "Content-Type: application/json" \
  -d '{"role":"EDITOR"}'
Réponse200
{
  "data": {
    "teamId": "clt0example",
    "userId": "clx1example",
    "role": "EDITOR"
  }
}

Retirer un membre

DELETE/api/v1/me/teams/{id}/members/{userId}

Les administrateurs de l'équipe peuvent retirer n'importe quel membre ; chacun peut se retirer lui même. Les pages de membre de la personne retirée dans les pages de l'équipe sont supprimées, comme dans le tableau de bord. Le dernier administrateur ne peut pas partir.

AccèsClé personnellePortéeteams:write

Paramètres

  • idstringcheminobligatoire

    Identifiant de l'équipe, tel que renvoyé par GET /api/v1/me/teams.

  • userIdstringcheminobligatoire

    Identifiant du compte du membre.

Champs de la réponse

  • teamIdstringobligatoire
  • userIdstringobligatoire
  • removedbooleanobligatoire
RequêtecURL
curl -X DELETE "https://mosavo.fr/api/v1/me/teams/<id>/members/<userId>" \
  -H "Authorization: Bearer msk_your_key"
Réponse200
{
  "data": {
    "teamId": "clt0example",
    "userId": "clx1example",
    "removed": true
  }
}

Quitter une équipe

POST/api/v1/me/teams/{id}/leave

Te retire de l'équipe. Le dernier administrateur ne peut pas partir : nomme d'abord un autre membre administrateur.

AccèsClé personnellePortéeteams:write

Paramètres

  • idstringcheminobligatoire

    Identifiant de l'équipe, tel que renvoyé par GET /api/v1/me/teams.

  • Idempotency-Keystringen têtefacultatif

    Identifiant unique facultatif de la requête. Un nouvel essai avec la même clé et le même corps dans les 24 heures rejoue la première réponse au lieu d'agir deux fois.

Champs de la réponse

  • teamIdstringobligatoire
  • leftbooleanobligatoire
RequêtecURL
curl -X POST "https://mosavo.fr/api/v1/me/teams/<id>/leave" \
  -H "Authorization: Bearer msk_your_key" \
  -H "Idempotency-Key: <unique id>"
Réponse200
{
  "data": {
    "teamId": "clt0example",
    "left": true
  }
}

Webhooks

9 routes

Mes webhooks

GET/api/v1/me/webhooks

Webhooks de ton compte. Le secret de signature n'est plus jamais renvoyé après la création.

AccèsClé personnellePortéewebhooks:read

Champs de la réponse

Chaque élément de data contient ces champs.

  • idstringobligatoire
  • urlstringobligatoire
  • descriptionstring | nullobligatoire
  • eventsstring[]obligatoire
  • teamobject | nullobligatoire

    Équipe dont les événements sont envoyés, ou null pour tes propres pages.

  • enabledbooleanobligatoire
  • failureCountintegerobligatoire

    Tentatives échouées d'affilée. Le webhook est désactivé à 20.

  • disabledAtdate-time | nullobligatoire
  • disabledReasonenum | nullobligatoire

    failures : désactivé automatiquement, owner : suspendu par toi, admin : désactivé par l'équipe Mosavo.

    Valeursfailuresowneradmin

  • lastDeliveryAtdate-time | nullobligatoire
  • lastStatusinteger | nullobligatoire

    Statut HTTP de la dernière tentative, null quand l'adresse n'a pas pu être jointe.

  • createdAtdate-timeobligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/me/webhooks" \
  -H "Authorization: Bearer msk_your_key"
Réponse200
{
  "data": [
    {
      "id": "clw0example",
      "url": "https://hooks.example.com/mosavo",
      "description": "Sync to my CRM",
      "events": [
        "page.published",
        "message.received"
      ],
      "team": null,
      "enabled": true,
      "failureCount": 0,
      "disabledAt": null,
      "disabledReason": null,
      "lastDeliveryAt": "2026-11-01T12:00:00.000Z",
      "lastStatus": 200,
      "createdAt": "2026-11-01T12:00:00.000Z"
    }
  ]
}

Créer un webhook

POST/api/v1/me/webhooks

Enregistre une adresse https qui reçoit les événements choisis. La réponse contient signingSecret : il n'est affiché qu'une fois. Le nombre de webhooks dépend de ton palier. Événements : page.published, page.unpublished, page.updated, block.created, block.updated, block.deleted, message.received, follower.added, follower.removed, team.member_joined, team.member_left, ticket.replied.

AccèsClé personnellePortéewebhooks:write

Paramètres

  • Idempotency-Keystringen têtefacultatif

    Identifiant unique facultatif de la requête. Un nouvel essai avec la même clé et le même corps dans les 24 heures rejoue la première réponse au lieu d'agir deux fois.

  • urlstringcorpsobligatoire

    Adresse HTTPS qui reçoit les événements.

  • eventsenum[]corpsobligatoire

    Événements à recevoir.

    Valeurspage.publishedpage.unpublishedpage.updatedblock.createdblock.updatedblock.deletedmessage.receivedfollower.addedfollower.removedteam.member_joinedteam.member_leftticket.replied

  • descriptionstring | nullcorpsfacultatif

    Une note pour reconnaître le webhook.

  • teamIdstring | nullcorpsfacultatif

    Équipe dont les pages et les membres déclenchent les événements. Tu dois en être administrateur.

Champs de la réponse

  • idstringobligatoire
  • urlstringobligatoire
  • descriptionstring | nullobligatoire
  • eventsstring[]obligatoire
  • teamobject | nullobligatoire

    Équipe dont les événements sont envoyés, ou null pour tes propres pages.

  • enabledbooleanobligatoire
  • failureCountintegerobligatoire

    Tentatives échouées d'affilée. Le webhook est désactivé à 20.

  • disabledAtdate-time | nullobligatoire
  • disabledReasonenum | nullobligatoire

    failures : désactivé automatiquement, owner : suspendu par toi, admin : désactivé par l'équipe Mosavo.

    Valeursfailuresowneradmin

  • lastDeliveryAtdate-time | nullobligatoire
  • lastStatusinteger | nullobligatoire

    Statut HTTP de la dernière tentative, null quand l'adresse n'a pas pu être jointe.

  • createdAtdate-timeobligatoire
  • signingSecretstringobligatoire

    Secret de signature, affiché une seule fois.

RequêtecURL
curl -X POST "https://mosavo.fr/api/v1/me/webhooks" \
  -H "Authorization: Bearer msk_your_key" \
  -H "Idempotency-Key: <unique id>" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://hooks.example.com/mosavo","events":["page.published","message.received"],"description":"Sync to my CRM"}'
Réponse201
{
  "data": {
    "id": "clw0example",
    "url": "https://hooks.example.com/mosavo",
    "description": "Sync to my CRM",
    "events": [
      "page.published",
      "message.received"
    ],
    "team": null,
    "enabled": true,
    "failureCount": 0,
    "disabledAt": null,
    "disabledReason": null,
    "lastDeliveryAt": null,
    "lastStatus": null,
    "createdAt": "2026-11-01T12:00:00.000Z",
    "signingSecret": "whsec_9Qm2example"
  }
}

Un de mes webhooks

GET/api/v1/me/webhooks/{id}
AccèsClé personnellePortéewebhooks:read

Paramètres

  • idstringcheminobligatoire

    Identifiant du webhook, tel que renvoyé par GET /api/v1/me/webhooks.

Champs de la réponse

  • idstringobligatoire
  • urlstringobligatoire
  • descriptionstring | nullobligatoire
  • eventsstring[]obligatoire
  • teamobject | nullobligatoire

    Équipe dont les événements sont envoyés, ou null pour tes propres pages.

  • enabledbooleanobligatoire
  • failureCountintegerobligatoire

    Tentatives échouées d'affilée. Le webhook est désactivé à 20.

  • disabledAtdate-time | nullobligatoire
  • disabledReasonenum | nullobligatoire

    failures : désactivé automatiquement, owner : suspendu par toi, admin : désactivé par l'équipe Mosavo.

    Valeursfailuresowneradmin

  • lastDeliveryAtdate-time | nullobligatoire
  • lastStatusinteger | nullobligatoire

    Statut HTTP de la dernière tentative, null quand l'adresse n'a pas pu être jointe.

  • createdAtdate-timeobligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/me/webhooks/<id>" \
  -H "Authorization: Bearer msk_your_key"
Réponse200
{
  "data": {
    "id": "clw0example",
    "url": "https://hooks.example.com/mosavo",
    "description": "Sync to my CRM",
    "events": [
      "page.published",
      "message.received"
    ],
    "team": null,
    "enabled": true,
    "failureCount": 0,
    "disabledAt": null,
    "disabledReason": null,
    "lastDeliveryAt": "2026-11-01T12:00:00.000Z",
    "lastStatus": 200,
    "createdAt": "2026-11-01T12:00:00.000Z"
  }
}

Modifier un webhook

PATCH/api/v1/me/webhooks/{id}

Change l'adresse, les événements ou la description, ou suspend et reprend le webhook. Le reprendre remet le compteur d'échecs à zéro.

AccèsClé personnellePortéewebhooks:write

Paramètres

  • idstringcheminobligatoire

    Identifiant du webhook, tel que renvoyé par GET /api/v1/me/webhooks.

  • urlstringcorpsfacultatif

    Adresse HTTPS qui reçoit les événements.

  • eventsenum[]corpsfacultatif

    Événements à recevoir.

    Valeurspage.publishedpage.unpublishedpage.updatedblock.createdblock.updatedblock.deletedmessage.receivedfollower.addedfollower.removedteam.member_joinedteam.member_leftticket.replied

  • descriptionstring | nullcorpsfacultatif

    Une note pour reconnaître le webhook.

  • enabledbooleancorpsfacultatif

    false suspend les envois, true les reprend et remet le compteur d'échecs à zéro.

Champs de la réponse

  • idstringobligatoire
  • urlstringobligatoire
  • descriptionstring | nullobligatoire
  • eventsstring[]obligatoire
  • teamobject | nullobligatoire

    Équipe dont les événements sont envoyés, ou null pour tes propres pages.

  • enabledbooleanobligatoire
  • failureCountintegerobligatoire

    Tentatives échouées d'affilée. Le webhook est désactivé à 20.

  • disabledAtdate-time | nullobligatoire
  • disabledReasonenum | nullobligatoire

    failures : désactivé automatiquement, owner : suspendu par toi, admin : désactivé par l'équipe Mosavo.

    Valeursfailuresowneradmin

  • lastDeliveryAtdate-time | nullobligatoire
  • lastStatusinteger | nullobligatoire

    Statut HTTP de la dernière tentative, null quand l'adresse n'a pas pu être jointe.

  • createdAtdate-timeobligatoire
RequêtecURL
curl -X PATCH "https://mosavo.fr/api/v1/me/webhooks/<id>" \
  -H "Authorization: Bearer msk_your_key" \
  -H "Content-Type: application/json" \
  -d '{"events":["page.published"],"enabled":true}'
Réponse200
{
  "data": {
    "id": "clw0example",
    "url": "https://hooks.example.com/mosavo",
    "description": "Sync to my CRM",
    "events": [
      "page.published",
      "message.received"
    ],
    "team": null,
    "enabled": true,
    "failureCount": 0,
    "disabledAt": null,
    "disabledReason": null,
    "lastDeliveryAt": "2026-11-01T12:00:00.000Z",
    "lastStatus": 200,
    "createdAt": "2026-11-01T12:00:00.000Z"
  }
}

Supprimer un webhook

DELETE/api/v1/me/webhooks/{id}

Supprime le webhook et son journal d'envois. Les nouveaux essais en attente sont abandonnés.

AccèsClé personnellePortéewebhooks:write

Paramètres

  • idstringcheminobligatoire

    Identifiant du webhook, tel que renvoyé par GET /api/v1/me/webhooks.

Champs de la réponse

  • idstringobligatoire
  • deletedbooleanobligatoire
RequêtecURL
curl -X DELETE "https://mosavo.fr/api/v1/me/webhooks/<id>" \
  -H "Authorization: Bearer msk_your_key"
Réponse200
{
  "data": {
    "id": "clw0example",
    "deleted": true
  }
}

Régénérer le secret de signature

POST/api/v1/me/webhooks/{id}/secret

Remplace le secret de signature. L'ancien secret cesse aussitôt de fonctionner. Le nouveau n'est affiché qu'une fois.

AccèsClé personnellePortéewebhooks:write

Paramètres

  • idstringcheminobligatoire

    Identifiant du webhook, tel que renvoyé par GET /api/v1/me/webhooks.

  • Idempotency-Keystringen têtefacultatif

    Identifiant unique facultatif de la requête. Un nouvel essai avec la même clé et le même corps dans les 24 heures rejoue la première réponse au lieu d'agir deux fois.

Champs de la réponse

  • idstringobligatoire
  • signingSecretstringobligatoire
RequêtecURL
curl -X POST "https://mosavo.fr/api/v1/me/webhooks/<id>/secret" \
  -H "Authorization: Bearer msk_your_key" \
  -H "Idempotency-Key: <unique id>"
Réponse200
{
  "data": {
    "id": "clw0example",
    "signingSecret": "whsec_7Hk1example"
  }
}

Envoyer un événement de test

POST/api/v1/me/webhooks/{id}/test

Envoie aussitôt un événement test.ping et renvoie l'envoi. Un test échoué n'est pas retenté mais compte pour la désactivation automatique.

AccèsClé personnellePortéewebhooks:write

Paramètres

  • idstringcheminobligatoire

    Identifiant du webhook, tel que renvoyé par GET /api/v1/me/webhooks.

  • Idempotency-Keystringen têtefacultatif

    Identifiant unique facultatif de la requête. Un nouvel essai avec la même clé et le même corps dans les 24 heures rejoue la première réponse au lieu d'agir deux fois.

Champs de la réponse

  • idstringobligatoire
  • eventstringobligatoire
  • statusenumobligatoire

    ValeursPENDINGSUCCESSFAILED

  • attemptsintegerobligatoire
  • nextAttemptAtdate-time | nullobligatoire

    Prochain essai, tant que l'envoi est en attente.

  • responseStatusinteger | nullobligatoire
  • responseExcerptstring | nullobligatoire

    Les 500 premiers caractères de la réponse, ou l'erreur réseau.

  • durationMsinteger | nullobligatoire
  • createdAtdate-timeobligatoire
  • payloadanyobligatoire

    Corps exact qui a été envoyé.

RequêtecURL
curl -X POST "https://mosavo.fr/api/v1/me/webhooks/<id>/test" \
  -H "Authorization: Bearer msk_your_key" \
  -H "Idempotency-Key: <unique id>"
Réponse200
{
  "data": {
    "id": "cld0example",
    "event": "test.ping",
    "status": "SUCCESS",
    "attempts": 1,
    "nextAttemptAt": null,
    "responseStatus": 200,
    "responseExcerpt": "ok",
    "durationMs": 182,
    "createdAt": "2026-11-01T12:00:00.000Z",
    "payload": {
      "id": "evt_3f9a",
      "event": "test.ping",
      "createdAt": "2026-11-01T12:00:00.000Z",
      "data": {
        "message": "This is a test event sent from Mosavo.",
        "webhookId": "clw0example"
      }
    }
  }
}

Envois d'un webhook

GET/api/v1/me/webhooks/{id}/deliveries

Journal des envois d'un webhook, les plus récents d'abord. Les envois sont gardés 30 jours.

AccèsClé personnellePortéewebhooks:read

Paramètres

  • idstringcheminobligatoire

    Identifiant du webhook, tel que renvoyé par GET /api/v1/me/webhooks.

  • limitintegerqueryfacultatif

    Nombre d'éléments par page, entre 1 et 100.

  • cursorstringqueryfacultatif

    Curseur opaque renvoyé dans meta.nextCursor par la page précédente.

Champs de la réponse

Chaque élément de data contient ces champs.

  • idstringobligatoire
  • eventstringobligatoire
  • statusenumobligatoire

    ValeursPENDINGSUCCESSFAILED

  • attemptsintegerobligatoire
  • nextAttemptAtdate-time | nullobligatoire

    Prochain essai, tant que l'envoi est en attente.

  • responseStatusinteger | nullobligatoire
  • responseExcerptstring | nullobligatoire

    Les 500 premiers caractères de la réponse, ou l'erreur réseau.

  • durationMsinteger | nullobligatoire
  • createdAtdate-timeobligatoire
  • payloadanyobligatoire

    Corps exact qui a été envoyé.

RequêtecURL
curl "https://mosavo.fr/api/v1/me/webhooks/<id>/deliveries" \
  -H "Authorization: Bearer msk_your_key"
Réponse200
{
  "data": [
    {
      "id": "cld0example",
      "event": "test.ping",
      "status": "SUCCESS",
      "attempts": 1,
      "nextAttemptAt": null,
      "responseStatus": 200,
      "responseExcerpt": "ok",
      "durationMs": 182,
      "createdAt": "2026-11-01T12:00:00.000Z",
      "payload": {
        "id": "evt_3f9a",
        "event": "test.ping",
        "createdAt": "2026-11-01T12:00:00.000Z",
        "data": {
          "message": "This is a test event sent from Mosavo.",
          "webhookId": "clw0example"
        }
      }
    }
  ],
  "meta": {
    "nextCursor": null,
    "limit": 20
  }
}

Renvoyer un envoi

POST/api/v1/me/webhooks/{id}/deliveries/{deliveryId}/redeliver

Renvoie aussitôt le même contenu, comme un nouvel envoi. L'identifiant de l'événement reste le même pour que ton adresse puisse ignorer les doublons.

AccèsClé personnellePortéewebhooks:write

Paramètres

  • idstringcheminobligatoire

    Identifiant du webhook, tel que renvoyé par GET /api/v1/me/webhooks.

  • deliveryIdstringcheminobligatoire

    Identifiant de l'envoi.

  • Idempotency-Keystringen têtefacultatif

    Identifiant unique facultatif de la requête. Un nouvel essai avec la même clé et le même corps dans les 24 heures rejoue la première réponse au lieu d'agir deux fois.

Champs de la réponse

  • idstringobligatoire
  • eventstringobligatoire
  • statusenumobligatoire

    ValeursPENDINGSUCCESSFAILED

  • attemptsintegerobligatoire
  • nextAttemptAtdate-time | nullobligatoire

    Prochain essai, tant que l'envoi est en attente.

  • responseStatusinteger | nullobligatoire
  • responseExcerptstring | nullobligatoire

    Les 500 premiers caractères de la réponse, ou l'erreur réseau.

  • durationMsinteger | nullobligatoire
  • createdAtdate-timeobligatoire
  • payloadanyobligatoire

    Corps exact qui a été envoyé.

RequêtecURL
curl -X POST "https://mosavo.fr/api/v1/me/webhooks/<id>/deliveries/<deliveryId>/redeliver" \
  -H "Authorization: Bearer msk_your_key" \
  -H "Idempotency-Key: <unique id>"
Réponse201
{
  "data": {
    "id": "cld1example",
    "event": "test.ping",
    "status": "SUCCESS",
    "attempts": 1,
    "nextAttemptAt": null,
    "responseStatus": 200,
    "responseExcerpt": "ok",
    "durationMs": 182,
    "createdAt": "2026-11-01T12:00:00.000Z",
    "payload": {
      "id": "evt_3f9a",
      "event": "test.ping",
      "createdAt": "2026-11-01T12:00:00.000Z",
      "data": {
        "message": "This is a test event sent from Mosavo.",
        "webhookId": "clw0example"
      }
    }
  }
}

Support

5 routes

Mes tickets de support

GET/api/v1/me/tickets

Tes 100 derniers tickets de support, les plus récemment actifs d'abord.

AccèsClé personnellePortéesupport:read

Champs de la réponse

Chaque élément de data contient ces champs.

  • referencestringobligatoire
  • subjectstringobligatoire
  • categoryenumobligatoire

    Valeursaccounteditorbillingdomainbugabuseother

  • statusenumobligatoire

    ValeursOPENPENDINGRESOLVEDCLOSED

  • unreadbooleanobligatoire

    true quand le support a répondu depuis ta dernière ouverture du ticket.

  • pageIdstring | nullobligatoire
  • lastMessageAtdate-timeobligatoire
  • resolvedAtdate-time | nullobligatoire
  • createdAtdate-timeobligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/me/tickets" \
  -H "Authorization: Bearer msk_your_key"
Réponse200
{
  "data": [
    {
      "reference": "MOS-4F2K9",
      "subject": "Custom domain not verified",
      "category": "domain",
      "status": "PENDING",
      "unread": true,
      "pageId": "clp0example",
      "lastMessageAt": "2026-10-30T12:00:00.000Z",
      "resolvedAt": null,
      "createdAt": "2026-10-30T12:00:00.000Z"
    }
  ]
}

Ouvrir un ticket de support

POST/api/v1/me/tickets

Ouvre un ticket auprès du support. 5 tickets ouverts au plus par compte, avec les mêmes limites de débit que le tableau de bord.

AccèsClé personnellePortéesupport:write

Paramètres

  • Idempotency-Keystringen têtefacultatif

    Identifiant unique facultatif de la requête. Un nouvel essai avec la même clé et le même corps dans les 24 heures rejoue la première réponse au lieu d'agir deux fois.

  • categoryenumcorpsobligatoire

    Valeursaccounteditorbillingdomainbugabuseother

  • subjectstringcorpsobligatoire
  • bodystringcorpsobligatoire
  • pageIdstring | nullcorpsfacultatif

    Une de tes pages, quand la demande la concerne.

Champs de la réponse

  • referencestringobligatoire
  • statusstringobligatoire
RequêtecURL
curl -X POST "https://mosavo.fr/api/v1/me/tickets" \
  -H "Authorization: Bearer msk_your_key" \
  -H "Idempotency-Key: <unique id>" \
  -H "Content-Type: application/json" \
  -d '{"category":"domain","subject":"Custom domain not verified","body":"My domain stays pending since yesterday."}'
Réponse201
{
  "data": {
    "reference": "MOS-4F2K9",
    "status": "OPEN"
  }
}

Un de mes tickets de support

GET/api/v1/me/tickets/{reference}

Un ticket et sa conversation. Les notes internes de l'équipe ne sont jamais renvoyées. Le lire par l'API ne le marque pas comme lu.

AccèsClé personnellePortéesupport:read

Paramètres

  • referencestringcheminobligatoire

    Référence du ticket, telle qu'affichée dans le tableau de bord.

Champs de la réponse

  • referencestringobligatoire
  • subjectstringobligatoire
  • categoryenumobligatoire

    Valeursaccounteditorbillingdomainbugabuseother

  • statusenumobligatoire

    ValeursOPENPENDINGRESOLVEDCLOSED

  • unreadbooleanobligatoire

    true quand le support a répondu depuis ta dernière ouverture du ticket.

  • pageIdstring | nullobligatoire
  • lastMessageAtdate-timeobligatoire
  • resolvedAtdate-time | nullobligatoire
  • createdAtdate-timeobligatoire
  • messagesobject[]obligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/me/tickets/<reference>" \
  -H "Authorization: Bearer msk_your_key"
Réponse200
{
  "data": {
    "reference": "MOS-4F2K9",
    "subject": "Custom domain not verified",
    "category": "domain",
    "status": "PENDING",
    "unread": true,
    "pageId": "clp0example",
    "lastMessageAt": "2026-10-30T12:00:00.000Z",
    "resolvedAt": null,
    "createdAt": "2026-10-30T12:00:00.000Z",
    "messages": [
      {
        "id": "clsm0example",
        "author": "USER",
        "mine": true,
        "body": "My domain stays pending.",
        "event": null,
        "createdAt": "2026-10-30T12:00:00.000Z"
      }
    ]
  }
}

Répondre à un ticket

POST/api/v1/me/tickets/{reference}/messages

Ajoute ta réponse à un de tes tickets. Répondre à un ticket résolu le rouvre, dans le délai de réouverture.

AccèsClé personnellePortéesupport:write

Paramètres

  • referencestringcheminobligatoire

    Référence du ticket, telle qu'affichée dans le tableau de bord.

  • Idempotency-Keystringen têtefacultatif

    Identifiant unique facultatif de la requête. Un nouvel essai avec la même clé et le même corps dans les 24 heures rejoue la première réponse au lieu d'agir deux fois.

  • bodystringcorpsobligatoire

Champs de la réponse

  • referencestringobligatoire
  • statusstringobligatoire
  • reopenedbooleanobligatoire
RequêtecURL
curl -X POST "https://mosavo.fr/api/v1/me/tickets/<reference>/messages" \
  -H "Authorization: Bearer msk_your_key" \
  -H "Idempotency-Key: <unique id>" \
  -H "Content-Type: application/json" \
  -d '{"body":"Thanks, it works now."}'
Réponse201
{
  "data": {
    "reference": "MOS-4F2K9",
    "status": "OPEN",
    "reopened": false
  }
}

Fermer un ticket

POST/api/v1/me/tickets/{reference}/close

Ferme un de tes tickets quand ton problème est réglé.

AccèsClé personnellePortéesupport:write

Paramètres

  • referencestringcheminobligatoire

    Référence du ticket, telle qu'affichée dans le tableau de bord.

  • Idempotency-Keystringen têtefacultatif

    Identifiant unique facultatif de la requête. Un nouvel essai avec la même clé et le même corps dans les 24 heures rejoue la première réponse au lieu d'agir deux fois.

Champs de la réponse

  • referencestringobligatoire
  • statusstringobligatoire
RequêtecURL
curl -X POST "https://mosavo.fr/api/v1/me/tickets/<reference>/close" \
  -H "Authorization: Bearer msk_your_key" \
  -H "Idempotency-Key: <unique id>"
Réponse200
{
  "data": {
    "reference": "MOS-4F2K9",
    "status": "CLOSED"
  }
}

Administration

29 routes

Vue d'ensemble de la plateforme

GET/api/v1/admin/overview

Quelques chiffres globaux sur la plateforme. Demande une clé d'administration.

AccèsClé d'administrationPortéeadmin

Champs de la réponse

  • generatedAtdate-timeobligatoire
  • usersobjectobligatoire
  • pagesobjectobligatoire
  • teamsobjectobligatoire
  • apiKeysobjectobligatoire
  • apiCallsobjectobligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/admin/overview" \
  -H "Authorization: Bearer msk_admin_your_key"
Réponse200
{
  "data": {
    "generatedAt": "2026-10-30T12:00:00.000Z",
    "users": {
      "total": 1520,
      "verified": 1384,
      "banned": 3,
      "newLast7Days": 42
    },
    "pages": {
      "total": 1810,
      "published": 1502
    },
    "teams": {
      "total": 37
    },
    "apiKeys": {
      "personal": 64,
      "admin": 1
    },
    "apiCalls": {
      "today": 5120,
      "last7Days": 38210
    }
  }
}

Statistiques de la plateforme

GET/api/v1/admin/stats

Les mêmes chiffres que la page de statistiques de l'administration : totaux comparés à la période précédente, séries, paliers, types de blocs, pages les plus vues, sites référents et cohortes.

AccèsClé d'administrationPortéeadmin

Paramètres

  • periodenumqueryfacultatif

    Valeurs7d30d90d12m

Champs de la réponse

  • periodenumobligatoire

    Valeurs7d30d90d12m

  • bucketenumobligatoire

    Valeursdayweek

  • startstringobligatoire
  • endstringobligatoire
  • generatedAtstringobligatoire
  • totalsobjectobligatoire
  • activeobjectobligatoire
  • seriesobjectobligatoire
  • signupMethodsobject[]obligatoire
  • plansobject[]obligatoire
  • blockTypesobject[]obligatoire
  • topPagesobject[]obligatoire
  • referrersobject[]obligatoire
  • cohortsobject[]obligatoire
  • publishedTotalintegerobligatoire
  • usersTotalintegerobligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/admin/stats" \
  -H "Authorization: Bearer msk_admin_your_key"
Réponse200
{
  "data": {
    "period": "30d",
    "bucket": "day",
    "start": "2026-09-30",
    "end": "2026-10-30",
    "generatedAt": "2026-10-30T12:00:00.000Z",
    "totals": {
      "signups": {
        "current": 120,
        "previous": 100,
        "delta": 20,
        "ratio": 0.2
      }
    },
    "active": {
      "current": 640,
      "previous": 600,
      "delta": 40,
      "ratio": 0.07
    },
    "series": {
      "signups": [
        {
          "date": "2026-10-30",
          "value": 5
        }
      ]
    },
    "signupMethods": [
      {
        "key": "github",
        "label": "GitHub",
        "value": 40
      }
    ],
    "plans": [
      {
        "key": "FREE",
        "label": "FREE",
        "value": 1300
      }
    ],
    "blockTypes": [
      {
        "type": "LINK",
        "current": 300,
        "previous": 280
      }
    ],
    "topPages": [
      {
        "key": "clp0example",
        "label": "Ada Lovelace",
        "value": 1200,
        "slug": "ada",
        "published": true
      }
    ],
    "referrers": [],
    "cohorts": [],
    "publishedTotal": 1502,
    "usersTotal": 1520
  }
}

Rechercher des membres

GET/api/v1/admin/users

Comptes, les plus récents d'abord, filtrés comme la page des membres de l'administration. La recherche porte sur l'email, le nom, le pseudo ou l'identifiant.

AccèsClé d'administrationPortéeadmin

Paramètres

  • qstringqueryfacultatif

    Texte recherché.

  • filterenumqueryfacultatif

    Valeursalladminspaidbusinessunverifiedbanned

  • limitintegerqueryfacultatif

    Nombre d'éléments par page, entre 1 et 100.

  • cursorstringqueryfacultatif

    Curseur opaque renvoyé dans meta.nextCursor par la page précédente.

Champs de la réponse

Chaque élément de data contient ces champs.

  • idstringobligatoire
  • pseudostring | nullobligatoire
  • namestring | nullobligatoire
  • emailstringobligatoire
  • imagestring | nullobligatoire
  • rolestringobligatoire
  • planstringobligatoire
  • accountTypestringobligatoire
  • emailVerifiedbooleanobligatoire
  • bannedAtdate-time | nullobligatoire
  • createdAtdate-timeobligatoire
  • pageCountintegerobligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/admin/users" \
  -H "Authorization: Bearer msk_admin_your_key"
Réponse200
{
  "data": [
    {
      "id": "clx0example",
      "pseudo": "ada",
      "name": "Ada Lovelace",
      "email": "[email protected]",
      "image": null,
      "role": "USER",
      "plan": "FREE",
      "accountType": "INDIVIDUAL",
      "emailVerified": true,
      "bannedAt": null,
      "createdAt": "2026-10-30T12:00:00.000Z",
      "pageCount": 2
    }
  ],
  "meta": {
    "nextCursor": null,
    "limit": 20
  }
}

Un membre

GET/api/v1/admin/users/{id}

Fiche du compte comme dans l'administration, sans aucun secret : ni mot de passe, ni secret de double authentification, ni jeton.

AccèsClé d'administrationPortéeadmin

Paramètres

  • idstringcheminobligatoire

Champs de la réponse

  • idstringobligatoire
  • pseudostring | nullobligatoire
  • namestring | nullobligatoire
  • emailstringobligatoire
  • imagestring | nullobligatoire
  • rolestringobligatoire
  • planstringobligatoire
  • accountTypestringobligatoire
  • emailVerifiedbooleanobligatoire
  • bannedAtdate-time | nullobligatoire
  • createdAtdate-timeobligatoire
  • pageCountintegerobligatoire
  • banReasonstring | nullobligatoire
  • updatedAtdate-timeobligatoire
  • twoFactorEnabledbooleanobligatoire
  • hasPasswordbooleanobligatoire
  • providersstring[]obligatoire
  • sessionsobjectobligatoire
  • apiKeyCountintegerobligatoire
  • followCountintegerobligatoire
  • lastLoginAtdate-time | nullobligatoire
  • businessobject | nullobligatoire
  • teamsobject[]obligatoire
  • pagesobject[]obligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/admin/users/<id>" \
  -H "Authorization: Bearer msk_admin_your_key"
Réponse200
{
  "data": {
    "id": "clx0example",
    "pseudo": "ada",
    "name": "Ada Lovelace",
    "email": "[email protected]",
    "image": null,
    "role": "USER",
    "plan": "FREE",
    "accountType": "INDIVIDUAL",
    "emailVerified": true,
    "bannedAt": null,
    "createdAt": "2026-10-30T12:00:00.000Z",
    "pageCount": 2,
    "banReason": null,
    "updatedAt": "2026-10-30T12:00:00.000Z",
    "twoFactorEnabled": true,
    "hasPassword": true,
    "providers": [
      "github"
    ],
    "sessions": {
      "total": 4,
      "active": 1
    },
    "apiKeyCount": 1,
    "followCount": 3,
    "lastLoginAt": "2026-10-30T12:00:00.000Z",
    "business": null,
    "teams": [],
    "pages": [
      {
        "id": "clp0example",
        "slug": "ada",
        "title": "Ada Lovelace",
        "published": true,
        "bannedAt": null,
        "teamId": null,
        "views": 1200,
        "updatedAt": "2026-10-30T12:00:00.000Z"
      }
    ]
  }
}

Bannir un compte

POST/api/v1/admin/users/{id}/ban

Bannit un compte avec un motif : ses sessions et ses clés API cessent aussitôt de fonctionner. Un compte super admin, défini dans la configuration du serveur, est refusé, et un compte administrateur demande une clé créée par un super admin.

AccèsClé d'administrationPortéeadmin

Paramètres

  • idstringcheminobligatoire
  • Idempotency-Keystringen têtefacultatif

    Identifiant unique facultatif de la requête. Un nouvel essai avec la même clé et le même corps dans les 24 heures rejoue la première réponse au lieu d'agir deux fois.

  • reasonstringcorpsobligatoire

Champs de la réponse

  • idstringobligatoire
  • donebooleanobligatoire
RequêtecURL
curl -X POST "https://mosavo.fr/api/v1/admin/users/<id>/ban" \
  -H "Authorization: Bearer msk_admin_your_key" \
  -H "Idempotency-Key: <unique id>" \
  -H "Content-Type: application/json" \
  -d '{"reason":"Repeated spam."}'
Réponse200
{
  "data": {
    "id": "clx1example",
    "done": true
  }
}

Lever le bannissement d'un compte

POST/api/v1/admin/users/{id}/unban
AccèsClé d'administrationPortéeadmin

Paramètres

  • idstringcheminobligatoire
  • Idempotency-Keystringen têtefacultatif

    Identifiant unique facultatif de la requête. Un nouvel essai avec la même clé et le même corps dans les 24 heures rejoue la première réponse au lieu d'agir deux fois.

Champs de la réponse

  • idstringobligatoire
  • donebooleanobligatoire
RequêtecURL
curl -X POST "https://mosavo.fr/api/v1/admin/users/<id>/unban" \
  -H "Authorization: Bearer msk_admin_your_key" \
  -H "Idempotency-Key: <unique id>"
Réponse200
{
  "data": {
    "id": "clx1example",
    "done": true
  }
}

Rechercher des pages

GET/api/v1/admin/pages

Toutes les pages, brouillons et pages modérées compris, les plus récentes d'abord. La recherche porte sur le titre, l'adresse, le propriétaire ou l'identifiant.

AccèsClé d'administrationPortéeadmin

Paramètres

  • qstringqueryfacultatif

    Texte recherché.

  • filterenumqueryfacultatif

    Valeursallpublisheddraftsbannedteams

  • limitintegerqueryfacultatif

    Nombre d'éléments par page, entre 1 et 100.

  • cursorstringqueryfacultatif

    Curseur opaque renvoyé dans meta.nextCursor par la page précédente.

Champs de la réponse

Chaque élément de data contient ces champs.

  • idstringobligatoire
  • slugstringobligatoire
  • titlestringobligatoire
  • publishedbooleanobligatoire
  • bannedAtdate-time | nullobligatoire
  • viewsintegerobligatoire
  • blockCountintegerobligatoire
  • teamIdstring | nullobligatoire
  • teamNamestring | nullobligatoire
  • parentIdstring | nullobligatoire
  • ownerobjectobligatoire
  • createdAtdate-timeobligatoire
  • updatedAtdate-timeobligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/admin/pages" \
  -H "Authorization: Bearer msk_admin_your_key"
Réponse200
{
  "data": [
    {
      "id": "clp0example",
      "slug": "ada",
      "title": "Ada Lovelace",
      "published": true,
      "bannedAt": null,
      "views": 1200,
      "blockCount": 8,
      "teamId": null,
      "teamName": null,
      "parentId": null,
      "owner": {
        "id": "clx0example",
        "name": "Ada Lovelace",
        "email": "[email protected]"
      },
      "createdAt": "2026-10-30T12:00:00.000Z",
      "updatedAt": "2026-10-30T12:00:00.000Z"
    }
  ],
  "meta": {
    "nextCursor": null,
    "limit": 20
  }
}

Une page

GET/api/v1/admin/pages/{id}

Fiche de la page avec ses statistiques, ses blocs et ses projets, comme dans l'administration.

AccèsClé d'administrationPortéeadmin

Paramètres

  • idstringcheminobligatoire

Champs de la réponse

  • idstringobligatoire
  • slugstringobligatoire
  • titlestringobligatoire
  • publishedbooleanobligatoire
  • bannedAtdate-time | nullobligatoire
  • viewsintegerobligatoire
  • blockCountintegerobligatoire
  • teamIdstring | nullobligatoire
  • teamNamestring | nullobligatoire
  • parentIdstring | nullobligatoire
  • ownerobjectobligatoire
  • createdAtdate-timeobligatoire
  • updatedAtdate-timeobligatoire
  • biostring | nullobligatoire
  • locationstring | nullobligatoire
  • tagsstring[]obligatoire
  • parentobject | nullobligatoire
  • memberPagesobject[]obligatoire
  • domainobject | nullobligatoire
  • views30dintegerobligatoire
  • followCountintegerobligatoire
  • shareCountintegerobligatoire
  • blocksobject[]obligatoire
  • projectsobject[]obligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/admin/pages/<id>" \
  -H "Authorization: Bearer msk_admin_your_key"
Réponse200
{
  "data": {
    "id": "clp0example",
    "slug": "ada",
    "title": "Ada Lovelace",
    "published": true,
    "bannedAt": null,
    "views": 1200,
    "blockCount": 8,
    "teamId": null,
    "teamName": null,
    "parentId": null,
    "owner": {
      "id": "clx0example",
      "name": "Ada Lovelace",
      "email": "[email protected]"
    },
    "createdAt": "2026-10-30T12:00:00.000Z",
    "updatedAt": "2026-10-30T12:00:00.000Z",
    "bio": null,
    "location": null,
    "tags": [],
    "parent": null,
    "memberPages": [],
    "domain": null,
    "views30d": 320,
    "followCount": 6,
    "shareCount": 2,
    "blocks": [
      {
        "id": "clk0example",
        "type": "LINK",
        "clicks": 40,
        "createdAt": "2026-10-30T12:00:00.000Z"
      }
    ],
    "projects": []
  }
}

Dépublier une page

POST/api/v1/admin/pages/{id}/unpublish

Met une page hors ligne au nom de l'administration. Avec ban, la page est aussi bloquée pour que son propriétaire ne puisse pas la republier.

AccèsClé d'administrationPortéeadmin

Paramètres

  • idstringcheminobligatoire
  • Idempotency-Keystringen têtefacultatif

    Identifiant unique facultatif de la requête. Un nouvel essai avec la même clé et le même corps dans les 24 heures rejoue la première réponse au lieu d'agir deux fois.

  • banbooleancorpsfacultatif

Champs de la réponse

  • idstringobligatoire
  • donebooleanobligatoire
RequêtecURL
curl -X POST "https://mosavo.fr/api/v1/admin/pages/<id>/unpublish" \
  -H "Authorization: Bearer msk_admin_your_key" \
  -H "Idempotency-Key: <unique id>" \
  -H "Content-Type: application/json" \
  -d '{"ban":false}'
Réponse200
{
  "data": {
    "id": "clp0example",
    "done": true
  }
}

Rechercher des équipes

GET/api/v1/admin/teams
AccèsClé d'administrationPortéeadmin

Paramètres

  • qstringqueryfacultatif

    Texte recherché.

  • limitintegerqueryfacultatif

    Nombre d'éléments par page, entre 1 et 100.

  • cursorstringqueryfacultatif

    Curseur opaque renvoyé dans meta.nextCursor par la page précédente.

Champs de la réponse

Chaque élément de data contient ces champs.

  • idstringobligatoire
  • namestringobligatoire
  • imagestring | nullobligatoire
  • memberCountintegerobligatoire
  • pageCountintegerobligatoire
  • pendingInviteCountintegerobligatoire
  • creatorobjectobligatoire
  • createdAtdate-timeobligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/admin/teams" \
  -H "Authorization: Bearer msk_admin_your_key"
Réponse200
{
  "data": [
    {
      "id": "clt0example",
      "name": "Studio",
      "image": null,
      "memberCount": 4,
      "pageCount": 2,
      "pendingInviteCount": 1,
      "creator": {
        "id": "clx0example",
        "label": "Ada Lovelace"
      },
      "createdAt": "2026-10-30T12:00:00.000Z"
    }
  ],
  "meta": {
    "nextCursor": null,
    "limit": 20
  }
}

Une équipe

GET/api/v1/admin/teams/{id}

Équipe avec ses membres et ses invitations.

AccèsClé d'administrationPortéeadmin

Paramètres

  • idstringcheminobligatoire

Champs de la réponse

  • idstringobligatoire
  • namestringobligatoire
  • imagestring | nullobligatoire
  • memberCountintegerobligatoire
  • pageCountintegerobligatoire
  • pendingInviteCountintegerobligatoire
  • creatorobjectobligatoire
  • createdAtdate-timeobligatoire
  • updatedAtdate-timeobligatoire
  • membersobject[]obligatoire
  • invitesobject[]obligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/admin/teams/<id>" \
  -H "Authorization: Bearer msk_admin_your_key"
Réponse200
{
  "data": {
    "id": "clt0example",
    "name": "Studio",
    "image": null,
    "memberCount": 4,
    "pageCount": 2,
    "pendingInviteCount": 1,
    "creator": {
      "id": "clx0example",
      "label": "Ada Lovelace"
    },
    "createdAt": "2026-10-30T12:00:00.000Z",
    "updatedAt": "2026-10-30T12:00:00.000Z",
    "members": [
      {
        "userId": "clx0example",
        "name": "Ada Lovelace",
        "email": "[email protected]",
        "role": "ADMIN",
        "joinedAt": "2026-10-30T12:00:00.000Z"
      }
    ],
    "invites": []
  }
}

Signalements

GET/api/v1/admin/reports

Signalements regroupés par page, 15 pages par appel, comme la boîte des signalements de l'administration.

AccèsClé d'administrationPortéeadmin

Paramètres

  • filterenumqueryfacultatif

    Valeursopenresolveddismissedall

  • cursorstringqueryfacultatif

    Curseur opaque renvoyé dans meta.nextCursor par la page précédente.

Champs de la réponse

Chaque élément de data contient ces champs.

  • pageIdstringobligatoire
  • pageobject | nullobligatoire
  • openCountintegerobligatoire
  • reportsobject[]obligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/admin/reports" \
  -H "Authorization: Bearer msk_admin_your_key"
Réponse200
{
  "data": [
    {
      "pageId": "clp0example",
      "page": {
        "id": "clp0example",
        "slug": "ada",
        "title": "Ada Lovelace",
        "ownerId": "clx0example",
        "bannedAt": null
      },
      "openCount": 1,
      "reports": [
        {
          "id": "clrp0example",
          "reason": "spam",
          "status": "OPEN",
          "message": "Fake giveaway.",
          "ip": "203.0.113.7",
          "reporter": null,
          "createdAt": "2026-10-30T12:00:00.000Z"
        }
      ]
    }
  ],
  "meta": {
    "nextCursor": null,
    "limit": 20
  }
}

Un signalement

GET/api/v1/admin/reports/{id}

Un signalement avec les autres signalements de la même page, de la même adresse IP et du même compte.

AccèsClé d'administrationPortéeadmin

Paramètres

  • idstringcheminobligatoire

Champs de la réponse

  • idstringobligatoire
  • reasonstringobligatoire
  • statusstringobligatoire
  • messagestring | nullobligatoire
  • ipstring | nullobligatoire

    Adresse IP de l'auteur du signalement, réservée à l'administration.

  • reporterobject | nullobligatoire
  • createdAtdate-timeobligatoire
  • pageIdstringobligatoire
  • userAgentstring | nullobligatoire
  • resolutionNotestring | nullobligatoire
  • handledAtdate-time | nullobligatoire
  • handledByobject | nullobligatoire
  • pageobject | nullobligatoire
  • ownerobject | nullobligatoire
  • samePageobject[]obligatoire
  • sameIpobject[]obligatoire
  • sameUserobject[]obligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/admin/reports/<id>" \
  -H "Authorization: Bearer msk_admin_your_key"
Réponse200
{
  "data": {
    "id": "clrp0example",
    "reason": "spam",
    "status": "OPEN",
    "message": "Fake giveaway.",
    "ip": "203.0.113.7",
    "reporter": null,
    "createdAt": "2026-10-30T12:00:00.000Z",
    "pageId": "clp0example",
    "userAgent": null,
    "resolutionNote": null,
    "handledAt": null,
    "handledBy": null,
    "page": null,
    "owner": null,
    "samePage": [],
    "sameIp": [],
    "sameUser": []
  }
}

Traiter un signalement

POST/api/v1/admin/reports/{id}/resolve

Marque un signalement comme traité ou écarté, avec une note facultative. L'auteur du signalement est prévenu comme depuis l'administration.

AccèsClé d'administrationPortéeadmin

Paramètres

  • idstringcheminobligatoire
  • Idempotency-Keystringen têtefacultatif

    Identifiant unique facultatif de la requête. Un nouvel essai avec la même clé et le même corps dans les 24 heures rejoue la première réponse au lieu d'agir deux fois.

  • decisionenumcorpsobligatoire

    ValeursRESOLVEDDISMISSED

  • notestringcorpsfacultatif

Champs de la réponse

  • idstringobligatoire
  • donebooleanobligatoire
RequêtecURL
curl -X POST "https://mosavo.fr/api/v1/admin/reports/<id>/resolve" \
  -H "Authorization: Bearer msk_admin_your_key" \
  -H "Idempotency-Key: <unique id>" \
  -H "Content-Type: application/json" \
  -d '{"decision":"RESOLVED","note":"Page unpublished."}'
Réponse200
{
  "data": {
    "id": "clrp0example",
    "done": true
  }
}

Détections de modération

GET/api/v1/admin/moderation/flags

Détections de la modération automatique. Les détections en attente arrivent par score décroissant.

AccèsClé d'administrationPortéeadmin

Paramètres

  • statusenumqueryfacultatif

    ValeursPENDINGCONFIRMEDDISMISSEDall

  • sourceenumqueryfacultatif

    ValeursallSAFE_BROWSINGBANNED_WORDBANNED_DOMAINMASS_SIGNUPREPORTS

  • limitintegerqueryfacultatif

    Nombre d'éléments par page, entre 1 et 100.

  • cursorstringqueryfacultatif

    Curseur opaque renvoyé dans meta.nextCursor par la page précédente.

Champs de la réponse

Chaque élément de data contient ces champs.

  • idstringobligatoire
  • sourcestringobligatoire
  • statusstringobligatoire
  • scorenumberobligatoire
  • summarystringobligatoire
  • autoActionstring | nullobligatoire
  • pageobject | nullobligatoire
  • userobject | nullobligatoire
  • createdAtdate-timeobligatoire
  • updatedAtdate-timeobligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/admin/moderation/flags" \
  -H "Authorization: Bearer msk_admin_your_key"
Réponse200
{
  "data": [
    {
      "id": "clmf0example",
      "source": "BANNED_DOMAIN",
      "status": "PENDING",
      "score": 80,
      "summary": "Link to a banned domain.",
      "autoAction": null,
      "page": null,
      "user": null,
      "createdAt": "2026-10-30T12:00:00.000Z",
      "updatedAt": "2026-10-30T12:00:00.000Z"
    }
  ],
  "meta": {
    "nextCursor": null,
    "limit": 20
  }
}

Une détection de modération

GET/api/v1/admin/moderation/flags/{id}

Une détection avec ses détails, les comptes concernés et les détections précédentes de la même page ou du même compte.

AccèsClé d'administrationPortéeadmin

Paramètres

  • idstringcheminobligatoire

Champs de la réponse

  • idstringobligatoire
  • sourcestringobligatoire
  • statusstringobligatoire
  • scorenumberobligatoire
  • summarystringobligatoire
  • autoActionstring | nullobligatoire
  • pageobject | nullobligatoire
  • userobject | nullobligatoire
  • createdAtdate-timeobligatoire
  • updatedAtdate-timeobligatoire
  • detailsobjectobligatoire
  • notestring | nullobligatoire
  • handledByobject | nullobligatoire
  • handledAtdate-time | nullobligatoire
  • ownerobject | nullobligatoire
  • accountsobject[]obligatoire
  • historyobject[]obligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/admin/moderation/flags/<id>" \
  -H "Authorization: Bearer msk_admin_your_key"
Réponse200
{
  "data": {
    "id": "clmf0example",
    "source": "BANNED_DOMAIN",
    "status": "PENDING",
    "score": 80,
    "summary": "Link to a banned domain.",
    "autoAction": null,
    "page": null,
    "user": null,
    "createdAt": "2026-10-30T12:00:00.000Z",
    "updatedAt": "2026-10-30T12:00:00.000Z",
    "details": {
      "domain": "example.com"
    },
    "note": null,
    "handledBy": null,
    "handledAt": null,
    "owner": null,
    "accounts": [],
    "history": []
  }
}

Confirmer une détection de modération

POST/api/v1/admin/moderation/flags/{id}/confirm

Confirme une détection et, au choix, dépublie ou bloque la page et bannit son propriétaire. Le bannissement d'adresses IP reste dans l'administration.

AccèsClé d'administrationPortéeadmin

Paramètres

  • idstringcheminobligatoire
  • Idempotency-Keystringen têtefacultatif

    Identifiant unique facultatif de la requête. Un nouvel essai avec la même clé et le même corps dans les 24 heures rejoue la première réponse au lieu d'agir deux fois.

  • notestringcorpsfacultatif
  • unpublishbooleancorpsfacultatif
  • banPagebooleancorpsfacultatif
  • banOwnerbooleancorpsfacultatif

Champs de la réponse

  • idstringobligatoire
  • actionsstring[]obligatoire
  • failedstring[]obligatoire
RequêtecURL
curl -X POST "https://mosavo.fr/api/v1/admin/moderation/flags/<id>/confirm" \
  -H "Authorization: Bearer msk_admin_your_key" \
  -H "Idempotency-Key: <unique id>" \
  -H "Content-Type: application/json" \
  -d '{"note":"Phishing page.","banPage":true,"banOwner":true}'
Réponse200
{
  "data": {
    "id": "clmf0example",
    "actions": [
      "banPage",
      "banOwner"
    ],
    "failed": []
  }
}

Écarter une détection de modération

POST/api/v1/admin/moderation/flags/{id}/dismiss

Classe une détection comme fausse alerte. Les exceptions aux règles de modération s'ajoutent depuis l'administration.

AccèsClé d'administrationPortéeadmin

Paramètres

  • idstringcheminobligatoire
  • Idempotency-Keystringen têtefacultatif

    Identifiant unique facultatif de la requête. Un nouvel essai avec la même clé et le même corps dans les 24 heures rejoue la première réponse au lieu d'agir deux fois.

  • notestringcorpsfacultatif

Champs de la réponse

  • idstringobligatoire
  • donebooleanobligatoire
RequêtecURL
curl -X POST "https://mosavo.fr/api/v1/admin/moderation/flags/<id>/dismiss" \
  -H "Authorization: Bearer msk_admin_your_key" \
  -H "Idempotency-Key: <unique id>" \
  -H "Content-Type: application/json" \
  -d '{"note":"Legitimate link."}'
Réponse200
{
  "data": {
    "id": "clmf0example",
    "done": true
  }
}

Boîte de réception du support

GET/api/v1/admin/tickets

Tickets de support, 25 par appel, filtrés et triés comme la boîte de réception de l'administration. Le filtre "mine" désigne les tickets attribués au créateur de la clé.

AccèsClé d'administrationPortéeadmin

Paramètres

  • filterenumqueryfacultatif

    Valeursopenpendingresolvedclosedmineunassignedall

  • sortenumqueryfacultatif

    Valeursrecentoldestpriority

  • qstringqueryfacultatif

    Texte recherché.

  • cursorstringqueryfacultatif

    Curseur opaque renvoyé dans meta.nextCursor par la page précédente.

Champs de la réponse

Chaque élément de data contient ces champs.

  • referencestringobligatoire
  • subjectstringobligatoire
  • categoryenumobligatoire

    Valeursaccounteditorbillingdomainbugabuseother

  • statusenumobligatoire

    ValeursOPENPENDINGRESOLVEDCLOSED

  • priorityenumobligatoire

    ValeursLOWNORMALHIGHURGENT

  • memberobject | nullobligatoire
  • assigneeobject | nullobligatoire
  • pageIdstring | nullobligatoire
  • lastAuthorstringobligatoire
  • lastMessageAtdate-timeobligatoire
  • resolvedAtdate-time | nullobligatoire
  • createdAtdate-timeobligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/admin/tickets" \
  -H "Authorization: Bearer msk_admin_your_key"
Réponse200
{
  "data": [
    {
      "reference": "MOS-4F2K9",
      "subject": "Custom domain not verified",
      "category": "domain",
      "status": "OPEN",
      "priority": "NORMAL",
      "member": {
        "id": "clx0example",
        "label": "@ada"
      },
      "assignee": null,
      "pageId": null,
      "lastAuthor": "USER",
      "lastMessageAt": "2026-10-30T12:00:00.000Z",
      "resolvedAt": null,
      "createdAt": "2026-10-30T12:00:00.000Z"
    }
  ],
  "meta": {
    "nextCursor": null,
    "limit": 20
  }
}

Un ticket de support

GET/api/v1/admin/tickets/{reference}

Un ticket avec toute sa conversation, notes internes de l'équipe comprises.

AccèsClé d'administrationPortéeadmin

Paramètres

  • referencestringcheminobligatoire

Champs de la réponse

  • referencestringobligatoire
  • subjectstringobligatoire
  • categoryenumobligatoire

    Valeursaccounteditorbillingdomainbugabuseother

  • statusenumobligatoire

    ValeursOPENPENDINGRESOLVEDCLOSED

  • priorityenumobligatoire

    ValeursLOWNORMALHIGHURGENT

  • memberobject | nullobligatoire
  • assigneeobject | nullobligatoire
  • pageIdstring | nullobligatoire
  • lastAuthorstringobligatoire
  • lastMessageAtdate-timeobligatoire
  • resolvedAtdate-time | nullobligatoire
  • createdAtdate-timeobligatoire
  • messagesobject[]obligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/admin/tickets/<reference>" \
  -H "Authorization: Bearer msk_admin_your_key"
Réponse200
{
  "data": {
    "reference": "MOS-4F2K9",
    "subject": "Custom domain not verified",
    "category": "domain",
    "status": "OPEN",
    "priority": "NORMAL",
    "member": {
      "id": "clx0example",
      "label": "@ada"
    },
    "assignee": null,
    "pageId": null,
    "lastAuthor": "USER",
    "lastMessageAt": "2026-10-30T12:00:00.000Z",
    "resolvedAt": null,
    "createdAt": "2026-10-30T12:00:00.000Z",
    "messages": [
      {
        "id": "clsm0example",
        "author": "USER",
        "authorUser": {
          "id": "clx0example",
          "label": "@ada"
        },
        "body": "My domain stays pending.",
        "internal": false,
        "createdAt": "2026-10-30T12:00:00.000Z"
      }
    ]
  }
}

Changer le statut d'un ticket

PATCH/api/v1/admin/tickets/{reference}

Change le statut d'un ticket. Le résoudre ou le fermer prévient le membre.

AccèsClé d'administrationPortéeadmin

Paramètres

  • referencestringcheminobligatoire
  • statusenumcorpsobligatoire

    ValeursOPENPENDINGRESOLVEDCLOSED

Champs de la réponse

  • referencestringobligatoire
  • statusenumobligatoire

    ValeursOPENPENDINGRESOLVEDCLOSED

  • changedbooleanobligatoire
RequêtecURL
curl -X PATCH "https://mosavo.fr/api/v1/admin/tickets/<reference>" \
  -H "Authorization: Bearer msk_admin_your_key" \
  -H "Content-Type: application/json" \
  -d '{"status":"CLOSED"}'
Réponse200
{
  "data": {
    "reference": "MOS-4F2K9",
    "status": "CLOSED",
    "changed": true
  }
}

Répondre à un ticket

POST/api/v1/admin/tickets/{reference}/messages

Répond à un ticket au nom du support, ou ajoute une note interne invisible pour le membre. Une réponse prévient le membre par email et par notification. Le statut passe à pending par défaut.

AccèsClé d'administrationPortéeadmin

Paramètres

  • referencestringcheminobligatoire
  • Idempotency-Keystringen têtefacultatif

    Identifiant unique facultatif de la requête. Un nouvel essai avec la même clé et le même corps dans les 24 heures rejoue la première réponse au lieu d'agir deux fois.

  • bodystringcorpsobligatoire
  • internalbooleancorpsfacultatif
  • statusenum | nullcorpsfacultatif

    ValeursOPENPENDINGRESOLVEDCLOSED

Champs de la réponse

  • referencestringobligatoire
  • statusenumobligatoire

    ValeursOPENPENDINGRESOLVEDCLOSED

RequêtecURL
curl -X POST "https://mosavo.fr/api/v1/admin/tickets/<reference>/messages" \
  -H "Authorization: Bearer msk_admin_your_key" \
  -H "Idempotency-Key: <unique id>" \
  -H "Content-Type: application/json" \
  -d '{"body":"Your domain is now verified.","status":"RESOLVED"}'
Réponse201
{
  "data": {
    "reference": "MOS-4F2K9",
    "status": "RESOLVED"
  }
}

Incidents

GET/api/v1/admin/incidents

Incidents en cours, maintenances prévues et les 30 derniers incidents résolus de la page de statut.

AccèsClé d'administrationPortéeadmin

Champs de la réponse

  • openobject[]obligatoire
  • maintenancesobject[]obligatoire
  • pastobject[]obligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/admin/incidents" \
  -H "Authorization: Bearer msk_admin_your_key"
Réponse200
{
  "data": {
    "open": [
      {
        "id": "cli0example",
        "titleFr": "Lenteurs de l'éditeur",
        "titleEn": "Editor slowdowns",
        "status": "MONITORING",
        "impact": "MINOR",
        "components": [
          "editor"
        ],
        "automatic": false,
        "scheduledFor": null,
        "startedAt": "2026-10-30T12:00:00.000Z",
        "resolvedAt": null
      }
    ],
    "maintenances": [],
    "past": []
  }
}

Un incident

GET/api/v1/admin/incidents/{id}

Un incident avec ses mises à jour, les plus récentes d'abord.

AccèsClé d'administrationPortéeadmin

Paramètres

  • idstringcheminobligatoire

Champs de la réponse

  • idstringobligatoire
  • titleFrstringobligatoire
  • titleEnstring | nullobligatoire
  • statusenumobligatoire

    ValeursINVESTIGATINGIDENTIFIEDMONITORINGRESOLVED

  • impactenumobligatoire

    ValeursMINORMAJORCRITICALMAINTENANCE

  • componentsstring[]obligatoire
  • automaticbooleanobligatoire
  • scheduledFordate-time | nullobligatoire
  • startedAtdate-timeobligatoire
  • resolvedAtdate-time | nullobligatoire
  • updatesobject[]obligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/admin/incidents/<id>" \
  -H "Authorization: Bearer msk_admin_your_key"
Réponse200
{
  "data": {
    "id": "cli0example",
    "titleFr": "Lenteurs de l'éditeur",
    "titleEn": "Editor slowdowns",
    "status": "MONITORING",
    "impact": "MINOR",
    "components": [
      "editor"
    ],
    "automatic": false,
    "scheduledFor": null,
    "startedAt": "2026-10-30T12:00:00.000Z",
    "resolvedAt": null,
    "updates": [
      {
        "id": "cliu0example",
        "status": "MONITORING",
        "messageFr": "Correctif déployé.",
        "messageEn": "Fix deployed.",
        "createdAt": "2026-10-30T12:00:00.000Z"
      }
    ]
  }
}

Journal d'audit

GET/api/v1/admin/audit-logs

Actions d'administration, les plus récentes d'abord. Les actions faites avec une clé d'administration portent via "api" et le nom de la clé dans metadata.

AccèsClé d'administrationPortéeadmin

Paramètres

  • categoryenumqueryfacultatif

    Valeursallusersportfoliosbusinesssettings

  • limitintegerqueryfacultatif

    Nombre d'éléments par page, entre 1 et 100.

  • cursorstringqueryfacultatif

    Curseur opaque renvoyé dans meta.nextCursor par la page précédente.

Champs de la réponse

Chaque élément de data contient ces champs.

  • idstringobligatoire
  • actionstringobligatoire
  • entityNamestring | nullobligatoire
  • metadataobject | nullobligatoire
  • actorobjectobligatoire
  • createdAtdate-timeobligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/admin/audit-logs" \
  -H "Authorization: Bearer msk_admin_your_key"
Réponse200
{
  "data": [
    {
      "id": "cla0example",
      "action": "USER_BANNED",
      "entityName": null,
      "metadata": {
        "targetUserId": "clx1example",
        "reason": "Spam",
        "via": "api",
        "actor": "clé admin Ops"
      },
      "actor": {
        "id": "clx0example",
        "name": "Ada Lovelace",
        "email": "[email protected]"
      },
      "createdAt": "2026-10-30T12:00:00.000Z"
    }
  ],
  "meta": {
    "nextCursor": null,
    "limit": 20
  }
}

Une entrée du journal d'audit

GET/api/v1/admin/audit-logs/{id}
AccèsClé d'administrationPortéeadmin

Paramètres

  • idstringcheminobligatoire

Champs de la réponse

  • idstringobligatoire
  • actionstringobligatoire
  • entityNamestring | nullobligatoire
  • metadataobject | nullobligatoire
  • actorobjectobligatoire
  • createdAtdate-timeobligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/admin/audit-logs/<id>" \
  -H "Authorization: Bearer msk_admin_your_key"
Réponse200
{
  "data": {
    "id": "cla0example",
    "action": "USER_BANNED",
    "entityName": null,
    "metadata": {
      "targetUserId": "clx1example",
      "reason": "Spam",
      "via": "api",
      "actor": "clé admin Ops"
    },
    "actor": {
      "id": "clx0example",
      "name": "Ada Lovelace",
      "email": "[email protected]"
    },
    "createdAt": "2026-10-30T12:00:00.000Z"
  }
}

Webhooks

GET/api/v1/admin/webhooks

Tous les webhooks des membres avec leur propriétaire, le domaine de leur adresse (l'adresse complète n'est pas renvoyée) et leur taux d'échec sur 7 jours. 200 lignes au plus.

AccèsClé d'administrationPortéeadmin

Paramètres

  • filterenumqueryfacultatif

    Valeursallenableddisabledfailing

  • qstringqueryfacultatif

    Recherche dans le domaine, le pseudo du propriétaire ou l'identifiant.

Champs de la réponse

Chaque élément de data contient ces champs.

  • idstringobligatoire
  • hoststringobligatoire
  • enabledbooleanobligatoire
  • disabledReasonenum | nullobligatoire

    Valeursfailuresowneradmin

  • disabledNotestring | nullobligatoire
  • failureCountintegerobligatoire
  • eventsintegerobligatoire
  • teamobject | nullobligatoire
  • ownerobjectobligatoire
  • lastDeliveryAtdate-time | nullobligatoire
  • lastStatusinteger | nullobligatoire
  • createdAtdate-timeobligatoire
  • weekobjectobligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/admin/webhooks" \
  -H "Authorization: Bearer msk_admin_your_key"
Réponse200
{
  "data": [
    {
      "id": "clw0example",
      "host": "hooks.example.com",
      "enabled": true,
      "disabledReason": null,
      "disabledNote": null,
      "failureCount": 0,
      "events": 2,
      "team": null,
      "owner": {
        "id": "clx0example",
        "pseudo": "ada",
        "name": "Ada Lovelace"
      },
      "lastDeliveryAt": "2026-11-01T12:00:00.000Z",
      "lastStatus": 200,
      "createdAt": "2026-11-01T12:00:00.000Z",
      "week": {
        "total": 40,
        "failed": 1,
        "failureRate": 2.5
      }
    }
  ]
}

Désactiver un webhook

POST/api/v1/admin/webhooks/{id}/disable

Désactive le webhook d'un membre avec un motif. Le propriétaire est prévenu et ne peut pas le réactiver. Inscrit au journal d'audit.

AccèsClé d'administrationPortéeadmin

Paramètres

  • idstringcheminobligatoire
  • Idempotency-Keystringen têtefacultatif

    Identifiant unique facultatif de la requête. Un nouvel essai avec la même clé et le même corps dans les 24 heures rejoue la première réponse au lieu d'agir deux fois.

  • reasonstringcorpsobligatoire

Champs de la réponse

  • idstringobligatoire
  • donebooleanobligatoire
RequêtecURL
curl -X POST "https://mosavo.fr/api/v1/admin/webhooks/<id>/disable" \
  -H "Authorization: Bearer msk_admin_your_key" \
  -H "Idempotency-Key: <unique id>" \
  -H "Content-Type: application/json" \
  -d '{"reason":"The endpoint answers with spam."}'
Réponse200
{
  "data": {
    "id": "clw0example",
    "done": true
  }
}

Profil d'un membre Discord

GET/api/v1/admin/discord/profiles/{discordId}

Profil Mosavo public du compte lié à un compte Discord, tel qu'affiché par la commande /profile du bot Discord. Les comptes bannis ou non liés répondent not_found.

AccèsClé d'administrationPortéeadmin

Paramètres

  • discordIdstringcheminobligatoire

    Identifiant de l'utilisateur Discord (snowflake).

Champs de la réponse

  • displayNamestringobligatoire
  • avatarUrlstring | nullobligatoire
  • planenumobligatoire

    ValeursFREEETUDIANTPREMIUM

  • portfoliosobject[]obligatoire
RequêtecURL
curl "https://mosavo.fr/api/v1/admin/discord/profiles/<discordId>" \
  -H "Authorization: Bearer msk_admin_your_key"
Réponse200
{
  "data": {
    "displayName": "ada",
    "avatarUrl": null,
    "plan": "FREE",
    "portfolios": [
      {
        "title": "Ada Lovelace",
        "slug": "ada",
        "bio": null,
        "tags": [],
        "blockCount": 8,
        "views30d": 320,
        "publicUrl": "https://mosavo.fr/ada",
        "isTeamPage": false
      }
    ]
  }
}

Ancienne API

Les routes /api/portfolio restent disponibles mais sont obsolètes : leurs réponses portent l'en tête Deprecation. Passe à /api/v1.