Skip to content

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 relivo 1.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.

  1. Eventslist-events and get-event. The id in each row is the eventId every other call needs.
  2. Photosget-event-images, search-images, upload-image, create-image-upload-url, download-image, and the tag tools.
  3. Attendeeslist-attendees and get-attendee, including how many photos matched each person.
  4. Campaignget-campaign-analytics reads delivery, opens, clicks and bounces. Sending a campaign stays in this tab.
  5. Analyticsget-event-metrics for images, matches, registrations and processing.
  6. 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.

  1. Choose a name you will recognize later, such as “Cursor” or “Night Run photographer”.
  2. Choose access: the whole team, or a single event. An event key is the one to hand a photographer or a per-event script.
  3. Copy the key when it appears. It starts with relivo_ and is not shown again.
  4. 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 events

List events for the company on the API key. Each row includes the name, status, dates, and image and attendee counts.

ArgumentTypeDescription
statusstringFilter by DRAFT, PUBLISHED, IN_PROGRESS, COMPLETED, CANCELLED or ARCHIVED. A list can also return other product statuses, including REGISTRATION_OPEN.
limitnumberDefault 50Maximum results. 1 to 100.
offsetnumberDefault 0Number of results to skip.
get-eventGet event

Full details for one event: location, settings and counts.

ArgumentTypeDescription
eventIdRequiredstringThe event ID from list-events.
get-event-metricsGet event metrics

Totals for images, attendees, face matches, media sets, campaigns, pending registrations and task processing.

ArgumentTypeDescription
eventIdRequiredstringThe 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 images

Paginated gallery images, optionally filtered by album or privacy.

ArgumentTypeDescription
eventIdRequiredstringThe event ID from list-events.
mediaSetIdstringOnly images in this media set (album).
isPrivatebooleanFilter by whether the image is hidden from the public gallery.
limitnumberDefault 50Maximum results. 1 to 100.
offsetnumberDefault 0Number of results to skip.
search-imagesSearch images

Search one event gallery by tags and description text.

ArgumentTypeDescription
eventIdRequiredstringThe event ID from list-events.
queryRequiredstringText matched against tags and descriptions.
limitnumberDefault 20Maximum results. 1 to 100.
upload-imageUpload gallery image

Add 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.

ArgumentTypeDescription
eventIdRequiredstringEvent to upload into.
fileNameRequiredstringOriginal file name, for example photo.jpg.
imageBase64stringImage bytes as a data URL (data:image/jpeg;base64,...) or raw base64. Required unless imageUrl is set.
imageUrlstring (URI)Public URL Relivo will fetch. Required unless imageBase64 is set.
contentTypestringMIME type. Required when imageBase64 is raw base64 rather than a data URL.
mediaSetIdstringAlbum to place the image in.
tagsstring[]Tags or search terms to attach.
descriptionstringImage description.
isPrivatebooleanDefault falseHide the image from the public gallery.
create-image-upload-urlCreate gallery upload URL

Create 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.

ArgumentTypeDescription
eventIdRequiredstringEvent to upload into.
fileNameRequiredstringOriginal file name, for example photo.jpg.
fileTypeRequiredstringMIME type, for example image/jpeg.
mediaSetIdstringAlbum to place the image in.
tagsstring[]Tags or search terms to attach.
descriptionstringImage description.
isPrivatebooleanDefault falseHide the image from the public gallery.
download-imageDownload image

Time-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.

ArgumentTypeDescription
imageIdRequiredstringImage ID from a gallery or selfie search.
expiresInSecondsnumberDefault 3600How long the download URL stays valid. 60 to 86400.
includeDatabooleanDefault falseAlso return the bytes inline as an image block.
add-image-tagsAdd tags

Add tags to one or more gallery or selfie images. Existing tags stay. New ones are merged in.

ArgumentTypeDescription
imageIdsRequiredstring[]Image IDs to tag. At least one.
tagsRequiredstring[]Tags to add. At least one.
remove-image-tagsRemove tags

Remove tags from one or more gallery or selfie images.

ArgumentTypeDescription
imageIdsRequiredstring[]Image IDs to update. At least one.
tagsRequiredstring[]Tags to remove. At least one.

Attendees

Attendees

The Attendees tab is the event guest list, including how many photos matched each person.

list-attendeesList attendees

Attendees for one event: name, email, label and photo match count.

ArgumentTypeDescription
eventIdRequiredstringThe event ID from list-events.
labelstringFilter by VIP, ATTENDEE, GUEST, GRADUATE or NONE.
limitnumberDefault 50Maximum results. 1 to 100.
offsetnumberDefault 0Number of results to skip.
get-attendeeGet attendee

One attendee, optionally with the photos that matched them.

ArgumentTypeDescription
eventIdRequiredstringThe event ID from list-events.
attendeeIdRequiredstringAttendee ID from list-attendees.
includePhotosbooleanDefault falseInclude matched photo URLs.
photoLimitnumberDefault 20How 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 analytics

Email campaign analytics for an event: delivery, opens, clicks, bounces, and a per-campaign breakdown.

ArgumentTypeDescription
eventIdRequiredstringThe event ID from list-events.
campaignIdstringLimit the report to one campaign.

Team

Team settings

The company behind the API key: plan, credits and who is on the team.

get-companyGet company

Company profile: name, tier, credits and event count.

No arguments.

get-company-membersGet company members

Team members, with role and email.

ArgumentTypeDescription
statusstringFilter 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 selfie

Upload a selfie into the private collection and tag it so search-selfies can find it. Send base64 or a public URL.

ArgumentTypeDescription
fileNameRequiredstringOriginal file name, for example selfie.jpg.
imageBase64stringData URL or raw base64. Required unless imageUrl is set.
imageUrlstring (URI)Public URL to fetch. Required unless imageBase64 is set.
contentTypestringMIME type. Required when imageBase64 is raw base64.
tagsstring[]Tags to attach.
searchTermstringA search term merged into the tags.
descriptionstringDescription.
create-selfie-upload-urlCreate selfie upload URL

Presigned 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.

ArgumentTypeDescription
fileNameRequiredstringOriginal file name, for example selfie.jpg.
fileTypeRequiredstringMIME type, for example image/jpeg.
tagsstring[]Tags to attach.
searchTermstringA search term merged into the tags.
descriptionstringDescription.
search-selfiesSearch selfies

Search the private selfie collection by tag or description. Omit query to list the most recent selfies.

ArgumentTypeDescription
querystringTag or search term. Omit to list recent selfies.
limitnumberDefault 20Maximum results. 1 to 100.
offsetnumberDefault 0Number 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 usage

This 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.

ArgumentTypeDescription
detailedbooleanDefault trueInclude 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/info

    Company profile: name, tier, credits and configuration.

  • relivo://events/{eventId}/summary

    Key metrics and configuration for one event.

  • relivo://events/{eventId}/settings

    The event settings JSON. This is a read. Changing settings stays in the event Settings tab.

Errors and quota

ResponseWhat it means
401 · -32001No key, or a key the server does not recognize. Send Authorization: Bearer or X-Api-Key.
405 · -32000The request was not a POST. The only method is POST.
-32601The JSON-RPC method is not on this server. Use initialize, tools/list, tools/call, resources/list and resources/read.
QuotaWhen 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.