Beta
Use Relivo as an API and an MCP server
The same events, photos, attendees and campaign stats you see in the Events tab are available to scripts and to assistants such as Grok, Claude, ChatGPT and Cursor. This surface is in beta. It was checked against the live server on 4 November 2026. The walkthrough is on the connect page.
This is a beta
The events app at events.relivo.app signs you in on a page titled Beta Login. The API and MCP server ship with that beta. Tool names, arguments, quotas and response shapes can change. Read get-mcp-usage before you leave a script running unattended.
- Server
relivo1.0.0. - Protocol 2025-03-26, JSON-RPC 2.0, streamable HTTP.
- A Free workspace reports a monthly allowance of 500 tool calls. Other plans return their own number.
Start from the Events tab
Sign in at events.relivo.app/login. The dashboard sidebar opens on Events, the list of photo galleries for the team. Open a gallery and the event has six tabs. The API follows those tabs.
- Eventslist-events and get-event. The id in each row is the eventId every other call needs.
- Photosget-event-images, search-images, upload-image, create-image-upload-url, download-image, and the tag tools.
- Attendeeslist-attendees and get-attendee, including how many photos matched each person.
- Campaignget-campaign-analytics reads delivery, opens, clicks and bounces. Sending a campaign stays in this tab.
- Analyticsget-event-metrics for images, matches, registrations and processing.
- Billing and SettingsStill edited in the dashboard. Event settings can be read at relivo://events/{eventId}/settings. There is no billing tool.
Create an API key
Keys live on the same dashboard, under Team settings, in the API Keys panel. Only a company admin can create them. The panel is the one that says it connects AI assistants and scripts to your galleries via MCP.
- Choose a name you will recognize later, such as “Cursor” or “Night Run photographer”.
- Choose access: the whole team, or a single event. An event key is the one to hand a photographer or a per-event script.
- Copy the key when it appears. It starts with
relivo_and is not shown again. - The table then shows a masked key, the scope, calls this month, and Active or Revoked. Revoke or delete stops anything using that key immediately.
A key inherits the company plan quota. Every tool call is metered against that shared monthly allowance, not against the key alone. Keep the key in an environment variable. Do not put it in a browser bundle or a public repository.
Connect an MCP client
Point the client at https://events.relivo.app/api/mcp and send the key as Authorization: Bearer. The server also accepts X-Api-Key. After it connects, ask it to call list-events first.
Cursor or Claude Desktop · mcp.json
{
"mcpServers": {
"relivo": {
"url": "https://events.relivo.app/api/mcp",
"headers": {
"Authorization": "Bearer ${env:RELIVO_API_KEY}"
}
}
}
}Cursor reads ~/.cursor/mcp.json for every project, or .cursor/mcp.json for one project. Set RELIVO_API_KEY in the environment before the app starts, so the file never contains the key. Claude Desktop uses the same JSON in its MCP config.
Claude Code
claude mcp add --transport http relivo https://events.relivo.app/api/mcp \
--header "Authorization: Bearer $RELIVO_API_KEY"What to ask
- “List my Relivo events and tell me which gallery has the most photos.”
- “Search the Night Run gallery for photos tagged finish line.”
- “How many attendees have at least one matched photo, and how many MCP calls do we have left this month?”
ChatGPT custom connectors can use this URL when the connector can attach a bearer token. A connector that only offers OAuth cannot sign in yet. Use Cursor, Claude, or the HTTP API below.
Call the HTTP API
There is one endpoint. MCP clients and scripts both POST JSON-RPC to it. GET returns 405. A missing key returns 401 with “pass your company API key as Authorization: Bearer”.
List events
curl https://events.relivo.app/api/mcp \
-H "Authorization: Bearer $RELIVO_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list-events",
"arguments": { "limit": 20 }
}
}'The response is server-sent events. Read the data: line. Tool results arrive as text whose contents are JSON:
data: result.content[0].text
{
"events": [
{
"id": "evt_example",
"name": "Night Run",
"status": "PUBLISHED",
"startDate": "2026-11-07T18:00:00.000Z",
"endDate": null,
"city": "Essen",
"country": "DE",
"eventPlan": "PREMIUM",
"createdAt": "2026-10-01T12:00:00.000Z",
"_count": { "images": 1200, "eventUsers": 480 }
}
],
"total": 1,
"limit": 20,
"offset": 0
}That object is the shape list-events returns. The names in the sample are illustrative. Discover tools with method tools/list and resources with resources/list. Call one with method tools/call and params.name plus params.arguments.
Tools
Nineteen tools. A key only sees its company, and an event-scoped key only sees that event. Unknown fields are rejected.
Events
Events
The Events tab lists every photo gallery in the team. These tools read that same list.
list-eventsList eventsList events for the company on the API key. Each row includes the name, status, dates, and image and attendee counts.
| Argument | Type | Description |
|---|---|---|
status | string | Filter by DRAFT, PUBLISHED, IN_PROGRESS, COMPLETED, CANCELLED or ARCHIVED. A list can also return other product statuses, including REGISTRATION_OPEN. |
limit | numberDefault 50 | Maximum results. 1 to 100. |
offset | numberDefault 0 | Number of results to skip. |
get-eventGet eventFull details for one event: location, settings and counts.
| Argument | Type | Description |
|---|---|---|
eventIdRequired | string | The event ID from list-events. |
get-event-metricsGet event metricsTotals for images, attendees, face matches, media sets, campaigns, pending registrations and task processing.
| Argument | Type | Description |
|---|---|---|
eventIdRequired | string | The event ID from list-events. |
Photos
Photos
The Photos tab is the event gallery. Search, page through, upload and tag those images.
get-event-imagesGet event imagesPaginated gallery images, optionally filtered by album or privacy.
| Argument | Type | Description |
|---|---|---|
eventIdRequired | string | The event ID from list-events. |
mediaSetId | string | Only images in this media set (album). |
isPrivate | boolean | Filter by whether the image is hidden from the public gallery. |
limit | numberDefault 50 | Maximum results. 1 to 100. |
offset | numberDefault 0 | Number of results to skip. |
search-imagesSearch imagesSearch one event gallery by tags and description text.
| Argument | Type | Description |
|---|---|---|
eventIdRequired | string | The event ID from list-events. |
queryRequired | string | Text matched against tags and descriptions. |
limit | numberDefault 20 | Maximum results. 1 to 100. |
upload-imageUpload gallery imageAdd a photo to an event gallery. Send the bytes as base64 or a public URL. Relivo stores the file, adds it to the gallery and queues face indexing.
| Argument | Type | Description |
|---|---|---|
eventIdRequired | string | Event to upload into. |
fileNameRequired | string | Original file name, for example photo.jpg. |
imageBase64 | string | Image bytes as a data URL (data:image/jpeg;base64,...) or raw base64. Required unless imageUrl is set. |
imageUrl | string (URI) | Public URL Relivo will fetch. Required unless imageBase64 is set. |
contentType | string | MIME type. Required when imageBase64 is raw base64 rather than a data URL. |
mediaSetId | string | Album to place the image in. |
tags | string[] | Tags or search terms to attach. |
description | string | Image description. |
isPrivate | booleanDefault false | Hide the image from the public gallery. |
create-image-upload-urlCreate gallery upload URLCreate a presigned S3 POST so a browser or script can upload a large file directly. The gallery record is created immediately. Upload the bytes to the returned URL with the returned form fields.
| Argument | Type | Description |
|---|---|---|
eventIdRequired | string | Event to upload into. |
fileNameRequired | string | Original file name, for example photo.jpg. |
fileTypeRequired | string | MIME type, for example image/jpeg. |
mediaSetId | string | Album to place the image in. |
tags | string[] | Tags or search terms to attach. |
description | string | Image description. |
isPrivate | booleanDefault false | Hide the image from the public gallery. |
download-imageDownload imageTime-limited presigned download URL plus metadata for a gallery or selfie-collection image. Set includeData to also return the bytes inline, up to 8 MB.
| Argument | Type | Description |
|---|---|---|
imageIdRequired | string | Image ID from a gallery or selfie search. |
expiresInSeconds | numberDefault 3600 | How long the download URL stays valid. 60 to 86400. |
includeData | booleanDefault false | Also return the bytes inline as an image block. |
Attendees
Attendees
The Attendees tab is the event guest list, including how many photos matched each person.
list-attendeesList attendeesAttendees for one event: name, email, label and photo match count.
| Argument | Type | Description |
|---|---|---|
eventIdRequired | string | The event ID from list-events. |
label | string | Filter by VIP, ATTENDEE, GUEST, GRADUATE or NONE. |
limit | numberDefault 50 | Maximum results. 1 to 100. |
offset | numberDefault 0 | Number of results to skip. |
get-attendeeGet attendeeOne attendee, optionally with the photos that matched them.
| Argument | Type | Description |
|---|---|---|
eventIdRequired | string | The event ID from list-events. |
attendeeIdRequired | string | Attendee ID from list-attendees. |
includePhotos | booleanDefault false | Include matched photo URLs. |
photoLimit | numberDefault 20 | How many matched photos to return when includePhotos is true. 1 to 50. |
Campaigns and analytics
Campaign and Analytics
Read what the Campaign and Analytics tabs already show. Sending a campaign stays in the dashboard. There is no tool that sends mail.
get-campaign-analyticsGet campaign analyticsEmail campaign analytics for an event: delivery, opens, clicks, bounces, and a per-campaign breakdown.
| Argument | Type | Description |
|---|---|---|
eventIdRequired | string | The event ID from list-events. |
campaignId | string | Limit the report to one campaign. |
Team
Team settings
The company behind the API key: plan, credits and who is on the team.
get-companyGet companyCompany profile: name, tier, credits and event count.
No arguments.
get-company-membersGet company membersTeam members, with role and email.
| Argument | Type | Description |
|---|---|---|
status | string | Filter by ADMIN, EDITOR, MEMBER, INVITED or DECLINED. |
Selfie collection
Separate from the event gallery
A private company library of reference selfies, tagged so you can find them again. These images are not published on an event gallery. Guest face matching in a gallery still goes through the attendee consent flow in the product.
upload-selfieUpload selfieUpload a selfie into the private collection and tag it so search-selfies can find it. Send base64 or a public URL.
| Argument | Type | Description |
|---|---|---|
fileNameRequired | string | Original file name, for example selfie.jpg. |
imageBase64 | string | Data URL or raw base64. Required unless imageUrl is set. |
imageUrl | string (URI) | Public URL to fetch. Required unless imageBase64 is set. |
contentType | string | MIME type. Required when imageBase64 is raw base64. |
tags | string[] | Tags to attach. |
searchTerm | string | A search term merged into the tags. |
description | string | Description. |
create-selfie-upload-urlCreate selfie upload URLPresigned S3 POST for a selfie-collection image. The record, including tags, is created immediately. Upload the bytes to the returned URL with the returned form fields.
| Argument | Type | Description |
|---|---|---|
fileNameRequired | string | Original file name, for example selfie.jpg. |
fileTypeRequired | string | MIME type, for example image/jpeg. |
tags | string[] | Tags to attach. |
searchTerm | string | A search term merged into the tags. |
description | string | Description. |
search-selfiesSearch selfiesSearch the private selfie collection by tag or description. Omit query to list the most recent selfies.
| Argument | Type | Description |
|---|---|---|
query | string | Tag or search term. Omit to list recent selfies. |
limit | numberDefault 20 | Maximum results. 1 to 100. |
offset | numberDefault 0 | Number of results to skip. |
Usage
API Keys
The API Keys table shows calls this month. This tool is the same counter, for the whole company.
get-mcp-usageGet MCP usageThis month's metered tool-call usage: plan tier, monthly allowance, calls used and remaining, and a per-tool breakdown. This tool still answers after the monthly quota is exhausted.
| Argument | Type | Description |
|---|---|---|
detailed | booleanDefault true | Include the per-tool breakdown. |
Resources
resources/list returns one summary and one settings resource per event the key can see, plus the company profile. The URIs follow this pattern:
relivo://company/infoCompany profile: name, tier, credits and configuration.
relivo://events/{eventId}/summaryKey metrics and configuration for one event.
relivo://events/{eventId}/settingsThe event settings JSON. This is a read. Changing settings stays in the event Settings tab.
Errors and quota
| Response | What it means |
|---|---|
| 401 · -32001 | No key, or a key the server does not recognize. Send Authorization: Bearer or X-Api-Key. |
| 405 · -32000 | The request was not a POST. The only method is POST. |
| -32601 | The JSON-RPC method is not on this server. Use initialize, tools/list, tools/call, resources/list and resources/read. |
| Quota | When get-mcp-usage reports exceeded, stop other calls. That one tool keeps working so you can see the allowance. A Free workspace reports 500 calls per month, counted from the first of the month, shared by every key on the company. |
Privacy
- A key cannot read another company’s events. An event-scoped key cannot read the rest of the team.
- Guest face matching stays opt-in. The API does not replace the consent step attendees see in the gallery. The selfie collection tools store private reference images for the company. They are not a way to identify people who did not take part.
- Attendee tools can return names and email addresses. Treat that payload as personal data, the same way the Events tab does. The privacy policy, DPA and GDPR notes are at /privacy, /dpa and /gdpr.
- Questions about the beta go to /contact.