Claude Code
One command in your terminal, then /mcp to check that Velora is connected.
claude mcp add --transport http velora https://<domaine>/api/mcp \
--header "Authorization: Bearer vlr_live_…"Ask Claude for this week's revenue per creator, or send a shoot reminder from Make. You choose what each key can do.
"Who sold the most on MYM this month?" Claude reads the totals and answers in one sentence.
The AI writes posts for the feed. They land as drafts, your team reviews and publishes.
A shoot reminder, a time change: the message goes out in the app. No mass sending, 50 notifications a day at most.
Make, Zapier, n8n or your own script read sales and shoots through the REST API.
A key starts with vlr_live_ followed by 43 characters. After that, the console only shows its start, so you can spot it.
MCP is the standard that lets an AI use tools. The server address is the same for every client. In the examples, replace <domaine> with your console's address, and the key with yours.
https://<domaine>/api/mcpOne command in your terminal, then /mcp to check that Velora is connected.
claude mcp add --transport http velora https://<domaine>/api/mcp \
--header "Authorization: Bearer vlr_live_…"Open Settings, Developer, Edit Config. Paste this block into claude_desktop_config.json, then restart Claude. The mcp-remote relay adds your key to every call.
{
"mcpServers": {
"velora": {
"command": "npx",
"args": [
"-y", "mcp-remote", "https://<domaine>/api/mcp",
"--header", "Authorization:${VELORA_AUTH}"
],
"env": { "VELORA_AUTH": "Bearer vlr_live_…" }
}
}
}In ~/.cursor/mcp.json (or .cursor/mcp.json in a project). The tools show up in Settings, MCP.
{
"mcpServers": {
"velora": {
"url": "https://<domaine>/api/mcp",
"headers": { "Authorization": "Bearer vlr_live_…" }
}
}
}ChatGPT's MCP connectors can't send a key yet. Use a custom GPT. In Actions, import the schema from the address below. Then pick Authentication, API Key, type Bearer, and paste your key.
https://<domaine>/api/v1/openapi.jsonA key only sees the tools its rights allow. Read tools are marked read-only, so your AI can use them without asking you.
| MCP tool | Scope |
|---|---|
list_creatorsThe agency's creators, newest first. No e-mail or phone. | read:creators |
get_creatorOne creator, with her connected selling platforms. | read:creators |
list_salesOnlyFans (via Infloww), MYM and Reveal sales, newest first. Never the fans' names. | read:sales |
sales_summaryTotals for a period, per creator and per platform, manual corrections included. | read:stats |
send_notificationAn in-app notification, to one creator or all of them. Quiet hours and the per-creator limit apply. 50 a day at most for the agency. | write:notifications |
list_shootsShoots planned over a period, earliest first. Never internal notes. | read:shoots |
list_feedPosts of the agency feed, pinned first. | read:feed |
create_feed_draftCreates a feed draft. Creators see nothing until your team publishes it. | write:feed |
For your scripts and automations. Responses in JSON, amounts in cents.
Every call carries the Authorization: Bearer vlr_live_… header. Calls from a browser are refused: call from a server.
curl https://<domaine>/api/v1/stats/summary?from=2026-10-01&to=2026-10-31 \
-H "Authorization: Bearer vlr_live_…"A list returns 50 items at most and a nextCursor. Pass it as cursor for the next page. It's null at the end.
On error, the answer gives a code and a message. The codes: unauthorized (401), insufficient_scope and browser_not_allowed (403), not_found (404), invalid_request (400), rate_limited and notification_cap_reached (429).
{ "error": { "code": "insufficient_scope", "message": "This key lacks the read:sales scope." } }/api/v1/creatorsThe agency's creators, newest first. No e-mail or phone.
| Parameter | Type | Where |
|---|---|---|
statusOnly creators in this state. | INVITED | ACTIVE | PAUSED | query, optional |
tagOnly creators with this tag. | string | query, optional |
cursorThe nextCursor of the previous page. | string | query, optional |
limitPage size, 1 to 50 (default 25). | integer | query, optional |
/api/v1/creators/{id}One creator, with her connected selling platforms.
| Parameter | Type | Where |
|---|---|---|
idCreator id. | string | path, required |
/api/v1/salesOnlyFans (via Infloww), MYM and Reveal sales, newest first. Never the fans' names.
| Parameter | Type | Where |
|---|---|---|
creatorIdOnly this creator's sales. | string | query, optional |
platformOnly this platform. | ONLYFANS | MYM | REVEAL | query, optional |
fromSales from this instant (ISO 8601). | date-time | query, optional |
toSales before this instant (ISO 8601). | date-time | query, optional |
cursorThe nextCursor of the previous page. | string | query, optional |
limitPage size, 1 to 50 (default 25). | integer | query, optional |
/api/v1/stats/summaryTotals for a period, per creator and per platform, manual corrections included.
| Parameter | Type | Where |
|---|---|---|
fromFirst day, YYYY-MM-DD, in the agency's time zone (default 29 days ago). | string | query, optional |
toLast day included (default today). 366 days at most. | string | query, optional |
/api/v1/notificationsAn in-app notification, to one creator or all of them. Quiet hours and the per-creator limit apply. 50 a day at most for the agency.
| Parameter | Type | Where |
|---|---|---|
titleTitle, 60 characters at most. | string | JSON body, required |
bodyText, 240 characters at most. | string | JSON body, required |
creatorIdSend to this creator only. | string | JSON body, optional |
alltrue to send to every active creator. Give creatorId or all, not both. | boolean | JSON body, optional |
linkPathApp screen to open, for example /feed. | string | JSON body, optional |
/api/v1/shootsShoots planned over a period, earliest first. Never internal notes.
| Parameter | Type | Where |
|---|---|---|
fromShoots starting from this instant (default now). | date-time | query, optional |
toShoots starting before this instant (default 31 days later, 62 at most). | date-time | query, optional |
creatorIdOnly this creator's shoots. | string | query, optional |
statusOnly shoots in this state. | SCHEDULED | DONE | CANCELED | query, optional |
cursorThe nextCursor of the previous page. | string | query, optional |
limitPage size, 1 to 50 (default 25). | integer | query, optional |
/api/v1/feedPosts of the agency feed, pinned first.
| Parameter | Type | Where |
|---|---|---|
statusOnly posts in this state (default everything but ARCHIVED). | DRAFT | SCHEDULED | PUBLISHED | ARCHIVED | query, optional |
cursorThe nextCursor of the previous page. | string | query, optional |
limitPage size, 1 to 50 (default 25). | integer | query, optional |
/api/v1/feedCreates a feed draft. Creators see nothing until your team publishes it.
| Parameter | Type | Where |
|---|---|---|
typeANNOUNCEMENT by default. | ANNOUNCEMENT | POLL | WIN | TIP | EVENT | JSON body, optional |
titleTitle, 120 characters at most. | string | JSON body, required |
bodyText, 4,000 characters at most. | string | JSON body, optional |
emojiAn emoji shown with the post. | string | JSON body, optional |
audienceCreatorIdsCreators who will see it. Empty = everyone. | string[] | JSON body, optional |
pollOptionsRequired for a POLL: 2 to 6 answers. | string[] | JSON body, optional |
Your first key in two minutes, from the console.