Claude Code
Une commande dans ton terminal, puis /mcp pour vérifier que Velora est connecté.
claude mcp add --transport http velora https://<domaine>/api/mcp \
--header "Authorization: Bearer vlr_live_…"Demande à Claude le CA de la semaine par modèle, ou envoie un rappel de tournage depuis Make. Tu choisis ce que chaque clé peut faire.
« Qui a le plus vendu sur MYM ce mois-ci ? » Claude lit les totaux et répond en une phrase.
L'IA écrit des posts pour le feed. Ils arrivent en brouillon, ton équipe relit et publie.
Un rappel de tournage, un horaire qui change : le message part dans l'app. Pas d'envoi en masse, 50 notifications par jour au plus.
Make, Zapier, n8n ou ton script lisent les ventes et les tournages par l'API REST.
Une clé commence par vlr_live_, suivi de 43 caractères. Ensuite, la console n'en montre que le début, pour la reconnaître.
MCP est le standard qui laisse une IA utiliser des outils. L'adresse du serveur est la même pour tous les clients. Dans les exemples, remplace <domaine> par l'adresse de ta console, et la clé par la tienne.
https://<domaine>/api/mcpUne commande dans ton terminal, puis /mcp pour vérifier que Velora est connecté.
claude mcp add --transport http velora https://<domaine>/api/mcp \
--header "Authorization: Bearer vlr_live_…"Ouvre Réglages, Développeur, Modifier la configuration. Colle ce bloc dans claude_desktop_config.json, puis redémarre Claude. Le relais mcp-remote ajoute ta clé à chaque appel.
{
"mcpServers": {
"velora": {
"command": "npx",
"args": [
"-y", "mcp-remote", "https://<domaine>/api/mcp",
"--header", "Authorization:${VELORA_AUTH}"
],
"env": { "VELORA_AUTH": "Bearer vlr_live_…" }
}
}
}Dans ~/.cursor/mcp.json (ou .cursor/mcp.json dans un projet). Les outils apparaissent dans Réglages, MCP.
{
"mcpServers": {
"velora": {
"url": "https://<domaine>/api/mcp",
"headers": { "Authorization": "Bearer vlr_live_…" }
}
}
}Les connecteurs MCP de ChatGPT ne savent pas encore envoyer de clé. Passe par un GPT personnalisé. Dans Actions, importe le schéma depuis l'adresse ci-dessous. Choisis ensuite Authentification, Clé API, type Bearer, et colle ta clé.
https://<domaine>/api/v1/openapi.jsonUne clé ne voit que les outils de ses droits. Ceux de lecture sont marqués en lecture seule : ton IA peut s'en servir sans te demander.
| Outil MCP | Droit |
|---|---|
list_creatorsLes modèles de l'agence, les plus récentes d'abord. Sans e-mail ni téléphone. | read:creators |
get_creatorUne modèle, avec ses plateformes de vente branchées. | read:creators |
list_salesLes ventes OnlyFans (via Infloww), MYM et Reveal, les plus récentes d'abord. Jamais le nom des fans. | read:sales |
sales_summaryLes totaux d'une période, par modèle et par plateforme, corrections manuelles comprises. | read:stats |
send_notificationUne notification dans l'app, pour une modèle ou pour toutes. Les heures calmes et la limite par modèle comptent. 50 par jour au plus pour l'agence. | write:notifications |
list_shootsLes tournages prévus sur une période, du plus proche au plus lointain. Jamais les notes internes. | read:shoots |
list_feedLes posts du feed de l'agence, épinglés d'abord. | read:feed |
create_feed_draftCrée un brouillon dans le feed. Les modèles ne voient rien tant que ton équipe ne l'a pas publié. | write:feed |
Pour tes scripts et tes automatisations. Réponses en JSON, montants en centimes.
Chaque appel porte l'en-tête Authorization: Bearer vlr_live_…. Les appels depuis un navigateur sont refusés : passe par un serveur.
curl https://<domaine>/api/v1/stats/summary?from=2026-10-01&to=2026-10-31 \
-H "Authorization: Bearer vlr_live_…"Une liste renvoie 50 éléments au plus et un nextCursor. Passe-le dans cursor pour la page suivante. Il vaut null à la fin.
En cas d'erreur, la réponse donne un code et un message. Les codes : unauthorized (401), insufficient_scope et browser_not_allowed (403), not_found (404), invalid_request (400), rate_limited et notification_cap_reached (429).
{ "error": { "code": "insufficient_scope", "message": "This key lacks the read:sales scope." } }/api/v1/creatorsLes modèles de l'agence, les plus récentes d'abord. Sans e-mail ni téléphone.
| Paramètre | Type | Où |
|---|---|---|
statusSeulement les modèles dans cet état. | INVITED | ACTIVE | PAUSED | URL, facultatif |
tagSeulement les modèles qui ont ce tag. | string | URL, facultatif |
cursorLe nextCursor de la page précédente. | string | URL, facultatif |
limitTaille de la page, de 1 à 50 (25 par défaut). | integer | URL, facultatif |
/api/v1/creators/{id}Une modèle, avec ses plateformes de vente branchées.
| Paramètre | Type | Où |
|---|---|---|
idIdentifiant de la modèle. | string | chemin, obligatoire |
/api/v1/salesLes ventes OnlyFans (via Infloww), MYM et Reveal, les plus récentes d'abord. Jamais le nom des fans.
| Paramètre | Type | Où |
|---|---|---|
creatorIdSeulement les ventes de cette modèle. | string | URL, facultatif |
platformSeulement cette plateforme. | ONLYFANS | MYM | REVEAL | URL, facultatif |
fromVentes à partir de cet instant (ISO 8601). | date-time | URL, facultatif |
toVentes avant cet instant (ISO 8601). | date-time | URL, facultatif |
cursorLe nextCursor de la page précédente. | string | URL, facultatif |
limitTaille de la page, de 1 à 50 (25 par défaut). | integer | URL, facultatif |
/api/v1/stats/summaryLes totaux d'une période, par modèle et par plateforme, corrections manuelles comprises.
| Paramètre | Type | Où |
|---|---|---|
fromPremier jour, AAAA-MM-JJ, à l'heure de l'agence (par défaut il y a 29 jours). | string | URL, facultatif |
toDernier jour inclus (par défaut aujourd'hui). 366 jours au plus. | string | URL, facultatif |
/api/v1/notificationsUne notification dans l'app, pour une modèle ou pour toutes. Les heures calmes et la limite par modèle comptent. 50 par jour au plus pour l'agence.
| Paramètre | Type | Où |
|---|---|---|
titleTitre, 60 caractères au plus. | string | corps JSON, obligatoire |
bodyTexte, 240 caractères au plus. | string | corps JSON, obligatoire |
creatorIdEnvoie à cette modèle seulement. | string | corps JSON, facultatif |
alltrue pour envoyer à toutes les modèles actives. Donne creatorId ou all, pas les deux. | boolean | corps JSON, facultatif |
linkPathÉcran de l'app à ouvrir, par exemple /feed. | string | corps JSON, facultatif |
/api/v1/shootsLes tournages prévus sur une période, du plus proche au plus lointain. Jamais les notes internes.
| Paramètre | Type | Où |
|---|---|---|
fromTournages qui commencent à partir de cet instant (par défaut maintenant). | date-time | URL, facultatif |
toTournages qui commencent avant cet instant (par défaut 31 jours plus tard, 62 au plus). | date-time | URL, facultatif |
creatorIdSeulement les tournages de cette modèle. | string | URL, facultatif |
statusSeulement les tournages dans cet état. | SCHEDULED | DONE | CANCELED | URL, facultatif |
cursorLe nextCursor de la page précédente. | string | URL, facultatif |
limitTaille de la page, de 1 à 50 (25 par défaut). | integer | URL, facultatif |
/api/v1/feedLes posts du feed de l'agence, épinglés d'abord.
| Paramètre | Type | Où |
|---|---|---|
statusSeulement les posts dans cet état (par défaut tout sauf ARCHIVED). | DRAFT | SCHEDULED | PUBLISHED | ARCHIVED | URL, facultatif |
cursorLe nextCursor de la page précédente. | string | URL, facultatif |
limitTaille de la page, de 1 à 50 (25 par défaut). | integer | URL, facultatif |
/api/v1/feedCrée un brouillon dans le feed. Les modèles ne voient rien tant que ton équipe ne l'a pas publié.
| Paramètre | Type | Où |
|---|---|---|
typeANNOUNCEMENT par défaut. | ANNOUNCEMENT | POLL | WIN | TIP | EVENT | corps JSON, facultatif |
titleTitre, 120 caractères au plus. | string | corps JSON, obligatoire |
bodyTexte, 4 000 caractères au plus. | string | corps JSON, facultatif |
emojiUn emoji affiché avec le post. | string | corps JSON, facultatif |
audienceCreatorIdsLes modèles qui le verront. Vide = toutes. | string[] | corps JSON, facultatif |
pollOptionsObligatoire pour un POLL : 2 à 6 réponses. | string[] | corps JSON, facultatif |
Ta première clé en deux minutes, depuis la console.