API Documentation
One API for the models, agents, workflows, tasks and integrations in your MultiverseAI account. Requests run as the key's owner, with the same data and connected accounts you see in the app.
Base URL
https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1Endpoint paths below are written as /v1/…; append them to https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api. GET /v1 returns an index of every endpoint.
OpenAI-compatible
Use the official openai client: change the base URL and API key
Every model
The chat, image and video models from the MultiverseAI app, listed at /v1/models
Agent tools
tools: true gives a model the full MultiverseAI toolkit, run server-side as you
Streaming
Server-sent events for chat, agents and conversations
Per-key switches
Turn workflows, agents and tasks access on or off for each key
Credits
AI calls are paid from your MultiverseAI credits; check them at /v1/credits
Quick start
// npm install openai
import OpenAI from 'openai';
const client = new OpenAI({
apiKey: process.env.MULTIVERSE_API_KEY, // mverse_k_...
baseURL: 'https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1',
});
const completion = await client.chat.completions.create({
model: 'openrouter/openai/gpt-6-luna',
messages: [{ role: 'user', content: 'Hello!' }],
});
console.log(completion.choices[0].message.content);Authentication
Send a developer key in the Authorization header of every request. Keys start with mverse_k_ and are created in Settings → Developer. A signed-in user's Supabase access token is accepted too. Every request runs as the key's owner, so it can only see and change that account's data.
Header
Authorization: Bearer mverse_k_YOUR_API_KEYExample request
export MULTIVERSE_API_KEY=mverse_k_YOUR_API_KEY
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/credits" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"Key permissions
Each key has five switches. Turning one off blocks its endpoints with 403 FORBIDDEN; every other endpoint is open to any active key. Keys made before a switch existed keep access to its endpoints until you turn it off. Keys can't be created or revoked through the API.
| Switch | Endpoints |
|---|---|
workflows | /v1/workflows, /v1/executions, /v1/queue |
agents | /v1/agents |
tasks | /v1/tasks, /v1/boards |
posts | /v1/posts, /v1/platforms |
tools | /v1/tools |
Need an API key?
Create one in Developer Settings
Limits, Credits & Lists
Rate limits
120 requests per minute per IP address and 300 requests per minute per API key. Over the limit, requests fail with 429 RATE_LIMITED and a retry_after_ms field in the error.
Credits
Model calls (chat, completions, images, videos, tool runs, agent and conversation replies) are paid from the key owner's MultiverseAI credits, the same as in the app. When the balance runs out they fail with 402 INSUFFICIENT_CREDITS. Check the balance with GET /v1/credits.
Lists and pagination
List endpoints take ?limit (default 50, max 100 unless noted) and ?offset.
{
"object": "list",
"data": [ … ],
"total": 128,
"limit": 50,
"offset": 0
}Streaming
Chat completions, agent chat and conversation messages accept stream: true and answer with server-sent events (text/event-stream): one data: {…} line per event, ending with data: [DONE]. Chat completion chunks follow the OpenAI format, so OpenAI-compatible clients stream them unchanged.
SDK & CLI
Today, call the API over plain HTTP or with any OpenAI-compatible client (see the quick start). A dedicated TypeScript SDK and a command-line tool are in development.
TypeScript SDK
@multiverseai/sdk is not published to npm yet. It can be built from the sdk/ folder of the MultiverseAI repository in the meantime.
CLI
multiverse-cli is not published to npm yet. To try it, build it from the multiverse-cli/ folder of the repository:
cd multiverse-cli
npm install && npm run build && npm linkModels
Every chat, image and video model the MultiverseAI app offers. Use a model's id as the "model" field of any request. These endpoints need no authentication.
/v1/modelsList available models
- Text and image models: id, name, provider, modality, tier, description, context_length, tools (supports agent tools), cost_per_1k_tokens.
- Video models add durations, default_duration, aspect_ratios, audio and usd_per_second.
- The default model is marked "default": true (chat: openrouter/openai/gpt-6-luna).
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
modality | string | No | Filter by "text", "image" or "video" |
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/models?modality=text"/v1/models/{id}Get one model
- Model ids contain slashes; append the id as-is, e.g. /v1/models/openrouter/anthropic/claude-opus-5.5. Unknown ids return 404 MODEL_NOT_FOUND.
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/models/openrouter/anthropic/claude-opus-5.5"/v1/healthHealth check
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/health"/v1Endpoint index
- Returns the API name, version, documentation link and a map of every endpoint.
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1"Chat Completions
OpenAI-compatible chat completions across every MultiverseAI model. Point the official openai client (or any OpenAI-compatible library) at the /v1 base URL and use your mverse_k_ key as the API key. Calls are paid from your MultiverseAI credits.
- Roles: system (or developer), user and assistant. The last message must be from the user. Tool-role messages are not supported.
- Image models answer with markdown image(s); video models start a video job (see Videos). Both are surfaced in the multiverse field of the response.
- Image models use the whole conversation: a follow-up like "make it winter" revises the last image, and images in the last user message are used as references to work from (PNG, JPEG or WebP).
- finish_reason is "length" when the reply was cut off at max_tokens (some providers also append a short note to the text). An unsupported model or malformed request is a 400, an oversized image a 413, and an empty model reply a 502 UPSTREAM_ERROR — 4xx errors are not worth retrying unchanged.
/v1/chat/completionsCreate a chat completion
Request body
| Field | Type | Required | Description |
|---|---|---|---|
model | string | No | Model id from GET /v1/modelsDefault: openrouter/openai/gpt-6-luna |
messages | array | Yes | Objects with role and content. content is a string or an array of parts: { type: "text", text } and { type: "image_url", image_url: { url } }. |
stream | boolean | No | Stream chat.completion.chunk events over SSEDefault: false |
stream_options | object | No | { include_usage: true } adds a final usage chunk when streaming |
temperature | number | No | Sampling temperature, 0–2 |
max_tokens | integer | No | Maximum tokens to generate (max_completion_tokens is accepted too) |
top_p | number | No | Nucleus sampling, 0–1 |
frequency_penalty | number | No | -2 to 2 |
presence_penalty | number | No | -2 to 2 |
tools | true | string[] | No | true enables every MultiverseAI agent tool; an array enables only the named tools (names from GET /v1/tools). Tools run server-side as you. OpenAI-style function definitions are rejected with UNSUPPORTED_TOOLS. |
max_tool_iterations | integer | No | Cap on tool-call rounds when tools are enabled (1–20) |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/chat/completions" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "openrouter/anthropic/claude-opus-5.5",
"messages": [
{
"role": "system",
"content": "You are a concise assistant."
},
{
"role": "user",
"content": "Explain vector databases in two sentences."
}
],
"max_tokens": 300
}'/v1/chat/completionsStreaming (stream: true)
- The response is text/event-stream: "data: {chat.completion.chunk}" lines, ending with "data: [DONE]".
- With tools enabled, tool activity arrives as extra chunks with choices: [] and multiverse: { event, tool_call } (event is tool_call_start, tool_call_result or tool_call_error).
- A mid-stream failure arrives as a chunk with choices: [] and error: { message, code }.
curl -X POST -N "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/chat/completions" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"messages": [
{
"role": "user",
"content": "Write a haiku about the ocean."
}
],
"stream": true,
"stream_options": {
"include_usage": true
}
}'/v1/chat/completionsWith MultiverseAI agent tools (tools: true)
- tools: true gives the model every MultiverseAI agent tool (web search, scraping, workflows, tasks, integrations…); pass an array such as ["web_search"] to limit it.
- The tools run on the server as the key's owner, so they see your connected accounts and data. The final answer comes back as a normal completion, with each tool call listed under multiverse.tool_calls.
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/chat/completions" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"messages": [
{
"role": "user",
"content": "What are the top AI headlines today? Cite sources."
}
],
"tools": [
"web_search"
],
"max_tool_iterations": 4
}'/v1/chat/completionsWith image input
- Images are accepted only in the last user message (up to 10). Each url must be https:// or a data: URL; JPEG, PNG, GIF or WebP, 20 MB max.
- With an image model the images are references for the new image (up to 4 are used; GIF is not accepted there).
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/chat/completions" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "openrouter/anthropic/claude-opus-5.5",
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "What is in this picture?"
},
{
"type": "image_url",
"image_url": {
"url": "https://example.com/photo.jpg"
}
}
]
}
]
}'Completions
Legacy single-prompt completions: the prompt is sent as one user message. Prefer Chat Completions for new code.
/v1/completionsCreate a text completion
- When an image model is used the response has the Images shape: { created, model, data: [{ url }] }.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
prompt | string | Yes | The prompt |
model | string | No | Model id from GET /v1/modelsDefault: openrouter/openai/gpt-6-luna |
modality | string | No | "image" generates images instead (with gpt-image-1.5 unless model is an image model). Passing an image model does the same. |
temperature | number | No | Sampling temperature, 0–2 |
max_tokens | integer | No | Maximum tokens to generate (max_completion_tokens is accepted too) |
top_p | number | No | Nucleus sampling, 0–1 |
frequency_penalty | number | No | -2 to 2 |
presence_penalty | number | No | -2 to 2 |
tools | true | string[] | No | true enables every MultiverseAI agent tool; an array enables only the named tools (names from GET /v1/tools). Tools run server-side as you. OpenAI-style function definitions are rejected with UNSUPPORTED_TOOLS. |
max_tool_iterations | integer | No | Cap on tool-call rounds when tools are enabled (1–20) |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/completions" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"prompt": "Write a tagline for a hiking app.",
"max_tokens": 60,
"temperature": 0.8
}'Images
Generate images with any image model (GET /v1/models?modality=image). Images are stored in MultiverseAI and returned as URLs.
/v1/images/generationsGenerate images
- If some of several images fail, the ones that succeeded are returned with a warning field.
- With image, the model edits or builds on the reference ("the full landing page this hero belongs to", "same scene in winter"). GPT Image, Nano Banana, Seedream and FLUX.2 take references; DALL·E 3 and Ideogram return 400. GPT Image keeps the reference's aspect ratio.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
prompt | string | Yes | Description of the image |
model | string | No | An image model id; a non-image model returns 400 INVALID_MODEL_FOR_MODALITYDefault: gpt-image-1.5 |
n | integer | No | Number of images, 1–4Default: 1 |
image | string | string[] | No | Reference image(s) to work from: an https:// or data: URL, or an array of up to 4. PNG, JPEG or WebP, 20 MB max each. The prompt then says what to keep and what to change. |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/images/generations" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"prompt": "A watercolor lighthouse at dawn",
"n": 1
}'Videos
Asynchronous video generation. Submit a job, then poll it until status is completed (video_url is set) or failed. Cost depends on the model and duration and is charged from your credits.
- Job status: queued → running → saving → completed, or failed / cancelled.
/v1/videosStart a video job
Request body
| Field | Type | Required | Description |
|---|---|---|---|
prompt | string | Yes | What the video should show |
model | string | No | A video model id (GET /v1/videos/models)Default: video/fal/fal-ai/veo3.1/fast |
duration | integer | No | Seconds; snapped to the model's closest allowed duration |
aspect_ratio | string | No | e.g. "16:9" or "9:16", if the model supports it |
image_url | string | No | Optional first frame (image-to-video): an https:// or data:image/… URL |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/videos" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"prompt": "A drone shot over a misty pine forest at sunrise",
"duration": 6,
"aspect_ratio": "16:9"
}'/v1/videos/{id}Get a video job (refreshes its status from the provider)
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/videos/9b2f6c1e-4d7a-4e3b-a5c8-1f0e2d3c4b5a" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/videosList your video jobs
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
limit | integer | No | Up to 100Default: 30 |
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/videos?limit=10" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/videos/modelsList video models
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/videos/models" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/videos/{id}Cancel a video job
curl -X DELETE "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/videos/9b2f6c1e-4d7a-4e3b-a5c8-1f0e2d3c4b5a" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"Avatar Videos (HeyGen & Tavus)
AI avatars and replicas that speak your script, video translation, and live AI video calls. Avatar videos are jobs in the same queue as other videos: start one with POST /v1/videos and a heygen/… or tavus/… model, then poll GET /v1/videos/{id} until status is completed (video_url is set). They are charged in credits by the finished length — or free when you have saved your own HeyGen / Tavus API key in Settings → Integrations.
- Prices (USD per finished minute, converted to credits): HeyGen Avatar IV $4.83 ($2.31 for photo avatars), Avatar V $7.20, Avatar III $0.60–0.99; HeyGen translation $0.81 (precision $1.50, audio-only $0.57); Tavus replica video $1.00; Tavus live conversation $0.37 per minute the replica is in the call.
- Your balance must cover the estimate up front (about 2.5 spoken words per second; 60 seconds when you give an audio file or a video to translate). Failed and cancelled jobs are free.
- Renders usually take 2–10 minutes. Finished videos are copied to MultiverseAI storage (up to 50 MB; larger ones keep the provider link, which expires).
/v1/videosHeyGen avatar video (model heygen/avatar)
Request body
| Field | Type | Required | Description |
|---|---|---|---|
model | string | Yes | "heygen/avatar" |
avatar_id | string | Yes | An avatar look id from GET /v1/videos/avatars?provider=heygen |
script | string | No | What the avatar says (up to 5,000 characters). Give this or audio_url. |
voice_id | string | No | Voice id (GET /v1/videos/avatars?provider=heygen&kind=voices); default: the avatar's voice |
audio_url | string | No | Public https audio to lip-sync instead of a script |
engine | string | No | avatar_iv, avatar_v or avatar_iii (must be in the avatar's supported_engines)Default: avatar_iv |
aspect_ratio | string | No | 16:9, 9:16, 1:1, 4:5, 5:4 or autoDefault: 16:9 |
resolution | string | No | 720p or 1080pDefault: 720p |
background | string | No | A hex color (#0f172a) or an https image URL |
motion_prompt | string | No | Body motion and gestures (photo avatars, or engine avatar_v) |
language | string | No | Voice locale, e.g. en-US |
title | string | No | Name in your HeyGen dashboard |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/videos" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "heygen/avatar",
"avatar_id": "Abigail_expressive_2024112501",
"script": "Hi! Thanks for signing up — here is how to get started.",
"aspect_ratio": "9:16"
}'/v1/videosHeyGen video translation (model heygen/translate)
Request body
| Field | Type | Required | Description |
|---|---|---|---|
model | string | Yes | "heygen/translate" |
video_url | string | Yes | Public https URL of the video to translate |
output_language | string | Yes | Target language name, e.g. "Spanish (Spain)" (GET /v1/videos/avatars?provider=heygen&kind=languages) |
mode | string | No | speed, or precision for better lip-syncDefault: speed |
translate_audio_only | boolean | No | Dub the audio only, without lip-sync (cheapest)Default: false |
input_language | string | No | Source language (detected when omitted) |
speaker_num | integer | No | Number of speakers (improves separation) |
title | string | No | Name in your HeyGen dashboard |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/videos" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "heygen/translate",
"video_url": "https://example.com/launch.mp4",
"output_language": "Spanish (Spain)"
}'/v1/videosTavus replica video (model tavus/replica)
Request body
| Field | Type | Required | Description |
|---|---|---|---|
model | string | Yes | "tavus/replica" |
replica_id | string | Yes | A replica id from GET /v1/videos/avatars?provider=tavus |
script | string | No | What the replica says. Give this or audio_url. |
audio_url | string | No | Public https .mp3 / .wav to lip-sync instead of a script |
video_name | string | No | A name for the video |
background_url | string | No | A public website scrolled behind the replica |
background_source_url | string | No | A public https video to use as the background |
fast | boolean | No | Faster render without backgrounds or thumbnailsDefault: false |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/videos" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "tavus/replica",
"replica_id": "r9fa0878977a",
"script": "Hey Sam, I took a look at your site…",
"background_url": "https://example.com"
}'/v1/videos/avatarsList avatars, voices, languages, replicas or personas (free)
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
provider | string | No | heygen or tavusDefault: heygen |
kind | string | No | heygen: avatars (default), voices, languages. tavus: replicas (default), personas. |
avatar_type | string | No | heygen avatars: studio_avatar, digital_twin or photo_avatar |
ownership | string | No | heygen avatars: public (stock) or private (yours) |
language | string | No | heygen voices: filter by language |
gender | string | No | heygen voices: filter by gender |
limit | integer | No | Page size (heygen avatars ≤ 50, voices ≤ 100) |
token | string | No | heygen: next_token from the previous page |
page | integer | No | tavus: page number |
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/videos/avatars?provider=heygen&ownership=public&limit=2" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/videos/conversationsStart a live AI video call with a Tavus replica
- Open conversation_url in a browser to join. The call ends by itself at max_minutes, or shortly after everyone leaves.
- Charged $0.37 per minute the replica is in the call (in 6-second steps), when it ends. On credits, max_minutes is also limited to what your balance covers.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
replica_id | string | Yes | Replica id (optional when persona_id has a default replica) |
persona_id | string | No | A persona (GET /v1/videos/avatars?provider=tavus&kind=personas): its LLM, prompt and tools |
conversational_context | string | No | What the call is about / instructions for the replica |
custom_greeting | string | No | The first thing the replica says |
conversation_name | string | No | A name |
language | string | No | e.g. english or multilingual |
callback_url | string | No | Tavus posts conversation events (transcript, shutdown) here |
max_minutes | integer | No | Hard limit on the call, 1–30Default: 10 |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/videos/conversations" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"replica_id": "r9fa0878977a",
"conversational_context": "Help me practice a job interview for a product manager role.",
"max_minutes": 15
}'/v1/videos/conversations/{id}Get a conversation (status, billed seconds, charge)
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/videos/conversations/8f2a6c1d-3b4e-4f5a-8c7d-1e2f3a4b5c6d" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/videos/conversations/{id}/endEnd a conversation and settle its bill (also DELETE /v1/videos/conversations/{id})
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/videos/conversations/8f2a6c1d-3b4e-4f5a-8c7d-1e2f3a4b5c6d/end" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/videos/conversationsList your conversations
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
limit | integer | No | Up to 100Default: 20 |
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/videos/conversations?limit=10" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"Audio
Speech, transcription and sound effects by ElevenLabs. Generated audio is saved as an mp3 at a public, unguessable URL. Runs on your own ElevenLabs key if you saved one in Settings → Integrations (no MultiverseAI credits); otherwise it is charged from your credits at ElevenLabs' API prices. Listing voices is free.
- Errors: 402 INSUFFICIENT_CREDITS when you (or, with your own key, your ElevenLabs account) are out of credits; 401 when your saved ElevenLabs key is rejected; 429 when ElevenLabs is rate limiting.
/v1/audio/speechText to speech
Key permission: tools
- Send Accept: audio/mpeg to get the mp3 bytes back instead of JSON (the URL is in the X-Audio-Url header).
- Flash and Turbo models cost half as much per character as Multilingual v2, v3 and v4.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
input | string | Yes | What to say: up to 10,000 characters (5,000 on eleven_v3) |
voice | string | No | A voice_id from GET /v1/audio/voices, or alloy | echo | fable | onyx | nova | shimmerDefault: nova |
model | string | No | eleven_multilingual_v2 | eleven_v3 | eleven_v4 | eleven_v4_turbo | eleven_flash_v2_5 | eleven_turbo_v2_5. tts-1 and tts-1-hd are accepted as aliases.Default: eleven_multilingual_v2 |
response_format | string | No | mp3, or a bitrate: mp3_44100_128 | mp3_44100_192 | mp3_44100_64 | mp3_22050_32Default: mp3 |
stability | number | No | 0–1; lower is more expressive |
similarity_boost | number | No | 0–1; how closely to match the voice |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/audio/speech" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"input": "Welcome back! Your report is ready.",
"voice": "nova",
"model": "eleven_flash_v2_5"
}'/v1/audio/transcriptionsSpeech to text (ElevenLabs Scribe)
Key permission: tools
- Charged per second of audio. File uploads are not supported yet; host the file and send its URL.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
audio_url | string | Yes | Public https URL of the audio or video, up to 50 MB |
language | string | No | ISO-639 code (e.g. en, spa) if known; detected otherwise |
diarize | boolean | No | Label who is speakingDefault: false |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/audio/transcriptions" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"audio_url": "https://example.com/interview.mp3",
"diarize": true
}'/v1/audio/voicesList voices (free)
Key permission: tools
- With your own key, your cloned and library voices are included alongside the premade ones.
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/audio/voices" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/audio/sound-effectsGenerate a sound effect
Key permission: tools
- Charged per second of audio generated.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
prompt | string | Yes | Describe the sound (up to 1,000 characters) |
duration_seconds | number | No | 0.5–30; chosen by the model if omitted |
prompt_influence | number | No | 0–1; how literally to follow the promptDefault: 0.3 |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/audio/sound-effects" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"prompt": "Heavy wooden door creaking open in an empty hall",
"duration_seconds": 4
}'Meetings
AI meeting notetaker. Send a bot into a Google Meet, Zoom, Microsoft Teams or Webex call (now or scheduled); after the call you get a speaker-labelled transcript plus an AI summary, action items and decisions. Recordings are made with Recall.ai.
- Status: scheduled → joining → in_waiting_room → in_call → recording → processing → done, or failed / cancelled. Someone in the meeting may have to admit the bot from the waiting room.
- Notes are ready a few minutes after the call ends. Poll GET /v1/meetings/{id}, or start a workflow with a "Meeting ended" trigger.
- Billing: bot time is charged from your credits at Recall.ai cost (~$0.65/hour, prorated per second) plus the standard markup, once the meeting ends. If you saved your own Recall.ai key (Settings → Integrations), bot time is billed by Recall.ai and not in credits. The AI notes use credits either way.
- Limits: 3 bots in calls at once and 25 scheduled per account; a recording stops after 4 hours.
/v1/meetingsSend the notetaker into a meeting
- Returns 201 with the meeting (status joining or scheduled). 402 when out of credits, 409 TOO_MANY_BOTS at the limit, 400 INVALID_MEETING_URL for unsupported links.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
meeting_url | string | Yes | meet.google.com/…, zoom.us/j/…, teams.microsoft.com/l/meetup-join/…, teams.live.com/meet/…, or *.webex.com/… |
title | string | No | Name for the meeting in your notes |
bot_name | string | No | Name the bot shows in the callDefault: MultiverseAI Notetaker |
join_at | string | No | ISO 8601 time to join (schedule, up to 60 days ahead). Omit to join now. |
project_id | string | No | File the meeting under a project (its id or your external_id) |
language | string | No | Transcription language codeDefault: auto |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/meetings" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"meeting_url": "https://meet.google.com/abc-defg-hij",
"title": "Weekly product sync"
}'/v1/meetingsList your meetings (newest first, without transcripts)
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
limit | integer | No | Up to 100Default: 50 |
offset | integer | No | Default: 0 |
status | string | No | Only this status (e.g. done) |
project_id | string | No | Only meetings of this project |
search | string | No | Search titles, summaries and transcripts |
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/meetings?status=done&limit=10" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/meetings/{id}Get a meeting with its notes and transcript (refreshes the status while it is unfinished)
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
include_transcript | boolean | No | false leaves out transcript and transcript_textDefault: true |
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/meetings/3f1c2b4a-8d7e-4c6b-9a5f-2e1d0c9b8a7f" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/meetings/{id}Rename a meeting
Request body
| Field | Type | Required | Description |
|---|---|---|---|
title | string | Yes | New title (empty clears it) |
curl -X PATCH "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/meetings/3f1c2b4a-8d7e-4c6b-9a5f-2e1d0c9b8a7f" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "Q4 roadmap review"
}'/v1/meetings/{id}/leaveMake the notetaker leave the call now (notes follow); a scheduled notetaker is cancelled
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/meetings/3f1c2b4a-8d7e-4c6b-9a5f-2e1d0c9b8a7f/leave" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'/v1/meetings/{id}/resummarizeRegenerate the AI summary, action items and decisions from the transcript (uses credits)
- Only for meetings with status done and a transcript; 409 NOT_READY otherwise.
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/meetings/3f1c2b4a-8d7e-4c6b-9a5f-2e1d0c9b8a7f/resummarize" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'/v1/meetings/{id}Delete a meeting, its notes and its recording and transcript at Recall.ai
- 409 MEETING_IN_PROGRESS while the bot is in the call; leave first. Deleting a scheduled meeting cancels its bot.
curl -X DELETE "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/meetings/3f1c2b4a-8d7e-4c6b-9a5f-2e1d0c9b8a7f" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"AngelSend
AngelSend email outreach (campaigns, sequences, per-recipient controls, senders and warm-up, opt-outs, the send queue, inbox, CRM, webhooks) on your own AngelSend account. All 148 AngelSend gateway actions are available with the same fields AngelSend documents; MultiverseAI adds the action catalog and "AngelSend event" workflow triggers.
- Add your AngelSend API key (sk_…) in Settings → Integrations → AngelSend. Calls act as that AngelSend account; MultiverseAI credits are not used (AngelSend bills its own credits for AI actions).
- Errors keep AngelSend's HTTP status — 400 invalid input or confirmation_required, 401 bad AngelSend key, 402 out of AngelSend credits, 403 missing key scope, 404, 409, 429, 5xx — as { error: { message: "AngelSend 404: …", code, status, details } }. A missing key is 400 ANGELSEND_NOT_CONFIGURED.
- Destructive actions (delete-*, remove-*, stop-campaign-recipients, …) do nothing without "confirmed": true and return 400 CONFIRMATION_REQUIRED with a preview; "dry_run": true returns that preview with 200 (delete-campaign, delete-contact, delete-company, delete-deal, delete-chatbot, remove-contacts-from-campaign, remove-email-optout; plus the dry-run operations of manage-email-verification and manage-issuer-funnel). dry_run on any other action is refused with 400 rather than run for real.
- create-full-campaign is retry-safe with an Idempotency-Key header (or "idempotency_key"): a repeat returns the first campaign with replayed: true. Campaigns created through an AngelSend key pause themselves if that key is revoked (pause_on_key_revoke, default true).
- Developer keys need the Tools switch (Settings → Developer).
/v1/angelsend/actionsThe AngelSend action catalog
Key permission: tools
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
group | string | No | campaigns, recipients, senders, records, contacts, crm, compliance, webhooks, inbox, analytics, knowledge, chatbots, intelligence, quality, intent, booking, integrations, outreach, review, platform, issuer_funnel, core |
kind | string | No | read | compute (AI / paid) | write | destructive |
q | string | No | Words to match |
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/angelsend/actions?group=recipients" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/angelsend/actions/{action}One action's documentation and parameters
Key permission: tools
/v1/angelsend/{action}Run one AngelSend action — the body is the action's fields
Key permission: tools
- Per-recipient control: pause-campaign-recipients / resume-campaign-recipients / stop-campaign-recipients { campaign_id, contact_ids | emails, reason }, list-campaign-recipients, set-recipient-merge-vars, set-recipient-start-step { step_number }.
- Sequences and senders: update-campaign-step { campaign_id, step_number, operation: update | insert | delete, … }; get-sender-limits, update-sender-limits { sender_address_id, daily_limit ≤ 5000, warmup: { enabled, start_daily, daily_increment, restart } }.
- Queue and compliance: list-campaign-queue rows carry bcc, compliance_archive, compliance_record, bounce and unsubscribe details; list-optouts pages with limit ≤ 1000, offset, since/until, campaign_id and order: "asc"; manage-compliance-archive { mode: "get" } includes team projects (owned: false).
- Webhooks on your AngelSend account: register-outbound-webhook (with project_id), list-webhooks, update-webhook, delete-webhook, rotate-webhook-secret, test-webhook, list-webhook-deliveries, redeliver-webhook-delivery.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
… | any | No | The action's own fields (see GET /v1/angelsend/actions/{action}). Multiplexed actions (manage-tags, manage-block-list, configure-follow-up-rule, …) take their operation as "action"; manage-compliance-archive as "mode". |
dry_run | boolean | No | Preview a delete/removal without changing anything |
confirmed | boolean | No | Required to run destructive actions |
idempotency_key | string | No | create-full-campaign only (or the Idempotency-Key header) |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/angelsend/stop-campaign-recipients" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"campaign_id": "7c1f0a2e-5b3d-4e8f-9a6b-1d2c3e4f5a6b",
"emails": [
"sam@acme.com"
],
"reason": "Replied on LinkedIn"
}'/v1/angelsend/connectSend AngelSend events to your "AngelSend event" workflows
Key permission: tools
- Registers a signed webhook on your AngelSend account pointing at MultiverseAI; the signing secret stays on our side. Deliveries are verified (X-AngelSend-Signature HMAC, 5-minute window), deduped on the event id and start each Active workflow whose Trigger is "AngelSend event" with matching filters, as you.
- Trigger data: {{trigger.event}}, campaign_id, email, contact_id, message_id, subject, reply_content, bounce_type, reason, meeting_id, project_id, data.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
project_id | string | No | Only this AngelSend project's events (including teammates' campaigns in it). Omit for account-wide. |
events | string[] | No | Default: reply_received, bounced, unsubscribed, booking, recipient_stopped. Any AngelSend event name (message.opened, campaign.paused, …) or "*" also works. |
replace | boolean | No | Re-register even if already connected |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/angelsend/connect" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'/v1/angelsend/connectionsYour AngelSend webhook connections
Key permission: tools
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
verify | boolean | No | Also check that AngelSend still has each webhook (one is removed when the AngelSend key that registered it is revoked) |
/v1/angelsend/connections/{id}Disconnect (deletes the webhook at AngelSend)
Key permission: tools
Tools
The MultiverseAI agent toolkit: your workspace (tasks, teams, contexts, memories, projects, credits), prompts and workflows (the Prompt Runner, queue, builder, schedules, templates), saved agents, social and messaging (X, Instagram, Facebook Pages and Groups, Threads, LinkedIn, TikTok, WhatsApp, Messenger, Telegram), ads and commerce, Google, GitHub and productivity apps, web research, and image/video generation. List the tools and their JSON-schema parameters, or run one directly as yourself — integration tools act on the accounts you have connected. The same tools power tools: true in Chat Completions and the MCP server. The full catalog is below.
/v1/toolsList agent tools
Key permission: tools
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/tools" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/tools/{name}Get one tool
Key permission: tools
- Unknown names return 404 UNKNOWN_TOOL.
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/tools/web_search" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/tools/{name}Run a tool
Key permission: tools
- POST /v1/tools/{name}/run is an alias.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
arguments | object | No | The tool's arguments, matching its parameters schemaDefault: {} |
confirm | boolean | No | Required for tools with requires_approval: true (they change data or send messages), except the actions in their read_only_actions; without it the call returns 409 CONFIRMATION_REQUIRED |
project_id | string | No | For tools that take project_id (facebook_ads, social_post_scheduler): run on that project's connections. Same as arguments.project_id (which wins). Other tools return 400. |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/tools/web_search" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"arguments": {
"query": "MultiverseAI"
}
}'/v1/tools/facebook_adsRun Meta ads for a project (or your own Meta account)
Key permission: tools
- Read-only (no confirm): list_ad_accounts, list_pages, list_pixels (ad_account_id), list_campaigns (ad_account_id), get_campaign (campaign_id; includes its ad sets and ads), list_adsets, list_ads, list_creatives, list_audiences, get_insights.
- get_insights: the object is ad_id, adset_id, campaign_id or ad_account_id (first given); time_range { since, until } (YYYY-MM-DD) or date_preset (default last_7d); time_increment 1 for one row per day; level account|campaign|adset|ad; breakdowns; fields; limit / after.
- Writes (confirm: true): create_campaign (ad_account_id, name, objective, daily_budget | lifetime_budget, special_ad_categories), create_adset (ad_account_id, campaign_id, name, targeting | country, optimization_goal, billing_event, promoted_object, budgets, start_time, end_time), upload_image (ad_account_id, image_url → image_hash), create_ad_creative (ad_account_id, page_id, link_url, message, headline, description, image_hash | image_url | video_id, call_to_action, instagram_user_id), create_ad (ad_account_id, adset_id, creative_id, name), create_audience, update (campaign_id | adset_id | ad_id with status and/or daily_budget, lifetime_budget, name), pause, resume, delete (also needs arguments.confirm: true).
- Campaigns, ad sets and ads are created PAUSED unless status is ACTIVE. Budgets and bid amounts are integers in the ad account currency's minor units (5000 = $50.00). List results page with paging.cursors.after → after.
- data.connection says which token ran the call: { source: "project", project_id, account_id, meta_user_id } or { source: "user" }.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
project_id | string | No | Project id or external_id whose meta_ads connection to use (POST /v1/projects/{id}/connect with platform meta_ads). Without it: your own Meta connection. A project with no meta_ads connection is an error — it never falls back to your ad account. |
arguments | object | Yes | action plus its fields (see below and GET /v1/tools/facebook_ads) |
confirm | boolean | No | Needed for every action except the read-only ones |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/tools/facebook_ads" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"project_id": "acme-client-42",
"arguments": {
"action": "get_insights",
"ad_account_id": "act_123",
"level": "campaign",
"time_range": {
"since": "2026-10-01",
"until": "2026-10-07"
},
"time_increment": 1
}
}'Tool catalog
97 tools. Pass a tool's name to POST /v1/tools/{name}, and an action from its list in arguments. Tools marked confirm change data or send messages and need confirm: true. Integration tools act on the accounts you've connected in Settings → Connections.
Workspace
manage_tasks | Manage the user's task boards (the Tasks page): list/create/update/delete boards, create, update, move, archive and delete tasks, add comments, and set dependencies between tasks. list_boardscreate_boardupdate_boarddelete_boardboard_membersjoin_boardlist_tasksget_taskcreate_taskcreate_tasksupdate_taskmove_taskarchive_taskunarchive_taskdelete_taskadd_commentlist_commentsdelete_commentadd_dependencyremove_dependency |
manage_teams | Manage the user's teams: list/get/create/update/delete teams, list and remove members, invite people by email, list and revoke pending invitations, and turn the team invite code on or off. listgetcreateupdatedeletejoinlist_membersremove_memberleaveinvitelist_invitationsrevoke_invitationregenerate_invite_codetransfer_ownership |
manage_contexts | Manage the user's contexts (reusable workspaces with a system prompt, model and settings) and each context's knowledge base. listgetcreateupdatearchiveunarchivedeletelist_entriesadd_entryadd_entriesupdate_entrydelete_entry |
manage_memories | Read and manage what you remember about the user across conversations. listsearchrememberupdateforget |
manage_conversations | Organize the user's chat conversations: list, rename, archive/unarchive, delete, create folders and move conversations into them, and create or revoke a public share link. listget_messagesrenamearchiveunarchivedeleteshareunsharelist_folderscreate_folderdelete_foldermove_to_foldermove_to_project |
manage_projects | The user's AI Chat projects — named groups of conversations that share instructions (system prompt). listgetcreateupdatearchiveunarchivedeleteadd_conversationremove_conversationlist_conversations |
search_conversations | Search across all past conversations for relevant context. |
search_knowledge_base | Search the user's knowledge bases (the entries saved under their contexts, including chunks of long documents) and their saved memories. |
get_user_profile | Read the current user's profile, preferences, role, subscription tier, and conversation history summary. |
modify_settings | Adjust the AI's own settings mid-conversation: temperature, max_tokens, model, system prompt, or streaming preference. |
send_notification | The user's notifications. sendlistmark_readmark_all_read |
check_credits | The user's MultiverseAI credits. balancetransactionsbuy_linkreferral_code |
Prompts & workflows
prompt_runner | The Prompt Runner page, from chat. runhistoryget |
manage_queue | Manage the user's prompt queue (Queue / Advanced Queue pages). enqueuelistgetrunretrycancelset_prioritydeleteclear_finishedstats |
workflow_builder | Create and edit workflows: whole graphs at once, individual nodes/edges, workflow metadata, layout, validation, duplication and deletion. creategetreplace_graphadd_nodesadd_edgesupdate_noderemove_noderemove_edgeupdate_workflowauto_layoutvalidateduplicatedeletelist_folderscreate_folderdelete_foldermove_to_folderlist_sharesshareunsharelist_versionssave_versionrestore_version |
execute_workflow | Run a saved workflow end-to-end right now, as the user, and wait for the result (up to ~90s). |
execute_node | Execute a single workflow node directly — without building a full workflow. |
list_workflows | List the user's workflows with id, name, description, status, and node count. |
list_executions | List recent workflow execution runs. |
get_execution_status | Fetch the full state of a workflow execution by id — including per-node trace, outputs, and error details. |
list_node_types | List every node type the agent can execute (via execute_node or as part of a workflow). |
describe_node_type | Get the config schema for a node type: which keys belong on node.data, which are required, an example, and what the node outputs. |
schedule_action | Schedule a saved workflow to run automatically: on a recurring cron schedule in a time zone, or once at a specific date/time. createlistupdatepauseresumedelete |
use_template | Browse workflow templates (the user's own and the community gallery) and create a new workflow from one. listsearchgetinstantiatepublish |
list_integrations | List what the user has connected: social/messaging accounts (Facebook Page, Instagram, WhatsApp, Threads, LinkedIn, X, TikTok, Telegram bots), Google, GitHub, their own AI provider keys, and configured integrations (SMTP, Slack, webhooks). |
Agents
manage_agent | Create, inspect, update, archive or delete the user's custom AI agents, and attach tools to them. creategetlistupdatearchivedeleteattach_tooldetach_toollist_toolslink_workflowunlink_workflowschedule_tasklist_tasksupdate_taskdelete_taskrunlist_versionsrestore_versionadd_test_caselist_test_casesdelete_test_caserun_testslist_sharesshareunshare |
spawn_agent | Spawn a sub-agent to handle a specific subtask. |
handoff_agent | Hand off the current conversation to a specialized agent persona. |
Social & messaging
social_post_schedulerconfirm | Cross-platform social posting as the user's own connected accounts (X/Twitter, TikTok, Instagram, Facebook Page, Threads, LinkedIn). publish_nowschedule_postlist_postsget_postcancel_postupdate_postlist_platforms |
project_channels | Read a project's connected channels and Google workspace (read-only). list_channelsgmail_listgmail_getcalendar_listdrive_listdrive_get |
project_channels_actconfirm | Act through a project's own connected channels (needs the user's approval). send_messagegmail_sendcalendar_createcalendar_deleteconnect_link |
twitterconfirm | Act as the user's own connected X (Twitter) account: post tweets (with images/video via media_urls) and threads, reply, quote, retweet, like, bookmark, delete; follow/unfollow/mute/block; read timeline, mentions, followers, bookmarks, likes post_tweetpublish_threadreply_tweetquote_tweetretweetlike_tweetunlike_tweetbookmark_tweetdelete_tweetget_tweetget_analyticssearch_tweetsget_userget_timelineget_mentionsget_bookmarksget_liked_tweetsfollow_userunfollow_usermute_userblock_userget_followersget_followingsend_dmget_dmsupload_mediaget_listsget_list_tweetscreate_list |
instagramconfirm | Act as the user's own connected Instagram Business/Creator account: publish photos, reels, carousels (2–10 items) and stories; list media; reply to or delete comments; delete media; media and account insights; hashtag search; posts the acco get_profilelist_mediaget_media_insightsget_account_insightslist_commentsreply_commentdelete_commentcreate_postcreate_carouselcreate_storydelete_mediahashtag_searchget_mentionsbusiness_discoverylist_stories |
facebook_pageconfirm | Act on the user's own Facebook Pages: create text/link/photo/video posts, schedule posts and list scheduled ones, edit and delete posts, read posts, list and reply to comments, Page and per-post insights. list_pagesget_pagecreate_postcreate_video_postschedule_postlist_scheduledlist_postsget_postupdate_postdelete_postlist_commentsreply_commentget_insightsget_post_insights |
facebook_groupsconfirm | Facebook Groups on the user's own connected Facebook account (Connections → Meta): list their groups, read a group's details, feed and members, and publish a post (text and/or link) to a group. list_groupsget_groupget_feedget_memberspublish_post |
threadsconfirm | Post and read on the user's own connected Threads account (connect it in Connections → Social). publish_postpublish_carouselreplylist_postsget_repliesget_insightsget_profiledelete_post |
linkedinconfirm | Post on the user's own connected LinkedIn profile (connect it in Settings → Social). publish_postcommentreactdelete_postget_profile |
tiktokconfirm | Organic TikTok content on the user's own connected TikTok account (connect it in Connections → Social): publish a video or a photo post, check publish status, list and inspect videos, read and reply to comments, get hashtag suggestions. publish_videopublish_photopublish_statuslist_videosget_videolist_commentsreply_commenthashtag_suggestions |
messengerconfirm | Messenger (the user's Facebook Page inbox), Instagram DMs and WhatsApp on the user's own connected Meta account: read conversations and messages, look up a Messenger sender, and send text or media. send_messagesend_mediasend_templatelist_conversationsget_messagesget_user_profile |
whatsappconfirm | WhatsApp Business on the user's own connected number (Connections → Meta). send_messagesend_mediasend_templatelist_templatescreate_templatedelete_templateget_business_profilelist_numbersselect_number |
telegramconfirm | The user's own Telegram bots, paired in Connections → Telegram: list the paired bots and send a message from one to a chat. list_botssend_message |
meeting_notetakerconfirm | AI meeting notetaker (Recall.ai): send a bot named "MultiverseAI Notetaker" into the user's Google Meet, Zoom, Microsoft Teams or Webex call (now, or scheduled with join_at), and read the resulting notes — summary, action items, decisions a join_meetinglist_meetingsget_meetingleave_meeting |
youtube | Query the YouTube Data API: search videos/channels, fetch video metadata and stats, list a channel's videos, get playlist contents, and read top comments. search_videossearch_channelsget_videoget_channellist_channel_videosget_playlistget_comments |
youtube_transcript | Read what's inside a YouTube video via QuickTube: the full transcript, an AI summary, the best sections (chapter-style highlights with timestamps), the comment threads, or a download link. transcriptsummarizebest_sectionscommentsdownload_url |
producthunt | Query Product Hunt for trending products, search by topic, fetch a specific product by slug. trendingsearchget_productby_topic |
Ads & commerce
facebook_adsconfirm | Run Meta (Facebook/Instagram) ads as an ads manager through the Marketing API. list_ad_accountslist_pageslist_pixelslist_campaignsget_campaignlist_adsetslist_adslist_creativeslist_audiencesget_insightscreate_campaigncreate_adsetupload_imagecreate_ad_creativecreate_adcreate_audienceupdatepauseresumedelete |
facebook_fundraiserconfirm | Create and manage Facebook Page fundraisers for charitable organizations. list_fundraisersget_fundraisercreate_fundraiserend_fundraiser |
meta_catalogconfirm | Meta Commerce Manager catalogs (Facebook/Instagram Shops) on the user's own connected Meta account: list or create catalogs for a business, list/add/update/delete products, list or create product sets. list_catalogscreate_cataloglist_productsadd_productupdate_productdelete_productlist_product_setscreate_product_set |
tiktok_adsconfirm | Manage TikTok advertising campaigns. list_campaignsget_campaigncreate_campaignupdate_campaignlist_adgroupscreate_adgroupupdate_adgrouplist_adscreate_adupdate_adpauseresume |
tiktok_analytics | Pull TikTok advertising performance data including campaign metrics, ROAS, spend, impressions, clicks, and conversions. campaign_reportadgroup_reportad_reportaudience_insightsrealtime_stats |
google_adsconfirm | Manage Google Ads campaigns. list_campaignsget_campaigncreate_campaignupdate_campaignkeyword_researchget_performancelist_adgroupsadjust_bidpauseresume |
google_analytics | Pull Google Analytics data including traffic, conversions, audience demographics, page views, and custom reports. traffic_overviewpage_viewsconversionsaudiencerealtimecustom_report |
shopify | Query Shopify store data. list_productsget_productlist_ordersget_orderlist_customersget_inventorysearch_productsget_analytics |
stripeconfirm | Not available yet: connecting your own Stripe account is not supported, so every action returns an error. list_chargesget_chargelist_invoicescreate_invoiceget_balancelist_subscriptionslist_customersget_customerlist_payoutsrefund |
crmconfirm | Read and write CRM data (HubSpot or Salesforce). list_contactsget_contactcreate_contactupdate_contactlist_dealsget_dealcreate_dealupdate_deallist_pipelinessearchlist_activities |
Google, email & productivity
emailconfirm | Send email or save a draft from the user's own connected Gmail (Connections → Google Drive). draftsendread_inboxsearchget_thread |
send_emailconfirm | Send a transactional email via Resend (different from gmail tool). |
resendconfirm | Resend email platform using the user's connected Resend account (Integrations → Resend). sendsend_batchlist_emailsget_emailcancel_emaillist_domainsverify_domaincreate_contactlist_contactslist_segments |
angelsend | Read the user's AngelSend email-outreach account (read-only, no approval): campaigns and their stats, the send queue (per-row BCC, compliance-archive status, bounce and unsubscribe details), recipients with pause/stop state, merge variables search_actionsdescribe_actioncallconnections |
angelsend_actconfirm | Change things in the user's AngelSend account (needs the user's approval). callconnectdisconnect |
google_docsconfirm | Create Google Docs (optionally with content, in a folder) and add text to them, in the user's own Google account. createreadupdatesearchappendreplace_text |
google_sheets | Read and write Google Sheets data. readwriteappendcreatelist_sheetsclearbatch_update |
google_driveconfirm | Create, upload, update, copy, move, share and delete files and folders in the user's own Google Drive. createuploadupdatedeletecopymovesharecreate_foldersearchlistgetget_contentlist_shared |
google_photos | Search and browse Google Photos. list_albumsget_albumlist_mediaget_mediasearch_media |
calendarconfirm | Manage calendar events. list_eventscreate_eventupdate_eventdelete_eventcheck_availabilityfind_free_time |
slackconfirm | Interact with Slack. send_messageread_channellist_channelssearch_messagesget_threadreactupload_file |
discordconfirm | Send and read Discord messages. send_messagesend_via_webhooklist_guildslist_channelsread_channeldelete_message |
githubconfirm | Work in the user's GitHub repos through their MultiverseAI GitHub App installation: list repos, issues and PRs, read files, create issues, comments, branches, files and pull requests. list_installationslist_reposlist_issuescreate_issueadd_commentlist_prscreate_prget_fileget_contentscreate_branchwrite_fileimport_repo_contextget_repoget_issuesearch_codelist_commitsget_actions_status |
jiraconfirm | Manage Jira issues. list_projectssearch_issuesget_issuecreate_issueupdate_issueadd_commentlist_transitionstransition |
linearconfirm | Interact with Linear. list_issuessearch_issuesget_issuecreate_issueupdate_issueadd_commentlist_teamslist_projectslist_states |
notionconfirm | Interact with Notion. searchget_pageget_page_contentcreate_pageupdate_pageappend_contentquery_databaseget_database |
webhookconfirm | Trigger arbitrary webhooks to connect with external apps (Zapier, Make, n8n). |
Web & research
web_search | Search the web in real-time and return results with source citations. |
web_scrape | Fetch and extract content from a URL. |
web_capture | Render a public web page in a real browser and save it as a PNG screenshot or a PDF; returns a hosted URL (plus markdown to show a screenshot inline). screenshotpdf |
firecrawl | Advanced web scraping with Firecrawl. scrapecrawlmapsearch |
perplexity_search | AI-powered web search via Perplexity. |
semantic_search | Advanced semantic / vector search across your indexed knowledge. |
vector_storeconfirm | Write to and search the user's OWN vector database (Pinecone or Qdrant): index text documents (embedded with the user's own embedding key, OpenAI text-embedding-3-small by default), query by meaning, or delete records by id or metadata filt indexquerydelete |
Media, code & data
generate_image | Generate an image from a text description, or list the image models (action "list_models"). generatelist_models |
generate_video | Start generating a short video clip (text-to-video, or image-to-video from a start image URL). generatestatuslistcancel |
heygen | HeyGen AI avatar videos. list_avatarslist_voiceslist_languagescreate_videotranslate_videoget_video |
tavus | Tavus AI replicas: personalized talking-head videos and live AI video calls. list_replicaslist_personascreate_videoget_videocreate_conversationget_conversationend_conversation |
text_to_speech | Turn text into natural speech (ElevenLabs) and return a hosted mp3 URL plus a markdown player link to include in your reply. |
elevenlabs | ElevenLabs audio. list_voicestext_to_speechspeech_to_textsound_effect |
multi_model | Ask the same prompt to several AI providers (OpenAI, Anthropic, Google) and get every answer side by side — to compare, cross-check facts by consensus, pick the best of n, or fall back when one provider fails. |
generate_chart | Generate a chart from data. |
execute_codeconfirm | Execute a JavaScript code snippet in an isolated sandbox (no network, files or secrets). |
code_executeconfirm | Execute JavaScript code in a sandboxed environment and return the result. |
code_analyze | Analyze code for potential issues, complexity, and provide suggestions. |
calculator | Evaluate a mathematical expression. |
datetime | Get the current date and time, or convert between timezones. |
json_transform | Parse, format, filter, or transform JSON data. |
summarize | Generate a concise summary of provided text. |
parse_file | Parse and extract content from uploaded files (CSV, PDF, TXT, JSON, images). |
database_query | Read rows from the user's MultiverseAI data (read-only). |
query_analytics | Pull analytics data: ad performance, token usage, cost breakdowns, or conversation statistics. |
Link Previews
Title, description and image metadata for URLs.
/v1/link-previewsFetch link previews
- Each preview has url and, when the page declares them, title, description, image and siteName. URLs that cannot be previewed map to null.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
urls | string[] | Yes | URLs to preview |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/link-previews" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"urls": [
"https://example.com"
]
}'Credits
Your MultiverseAI credit balance. AI calls made with a key are paid from its owner's credits; when the balance runs out they fail with 402 INSUFFICIENT_CREDITS.
/v1/creditsGet your credit balance
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
fresh | boolean | No | true skips the 60-second balance cacheDefault: false |
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/credits?fresh=true" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/credits/transactionsList your credit transactions, newest first
- Returns 502 UPSTREAM_ERROR when the credit ledger is temporarily unreachable.
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
limit | integer | No | How many, up to 100Default: 50 |
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/credits/transactions?limit=2" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"Workflows
Your saved workflows. Runs use the same server-side engine as the app, as the key's owner.
/v1/workflowsList workflows
Key permission: workflows
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
status | string | No | Filter by workflow status |
limit | integer | No | Page size, up to 100Default: 50 |
offset | integer | No | Items to skipDefault: 0 |
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/workflows?limit=10" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/workflowsCreate a workflow
Key permission: workflows
- nodes and edges use the same JSON as the builder's export (see the Workflow JSON docs). Node ids must be unique and every edge must join two of them.
- New workflows are drafts unless is_active is true. The graph may be up to 2 MB and 1000 nodes.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Name |
description | string | No | Description |
nodes | object[] | No | Builder nodes: { id, type, data?, position? } (position defaults to a left-to-right layout) |
edges | object[] | No | Builder edges: { source, target, sourceHandle?, id? } between node ids |
category | string | No | Category |
tags | string[] | No | Tags |
folder_id | uuid | No | Folder |
is_active | boolean | No | Activate (also sets status to "active" / "draft"), like the builder's Active switch |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/workflows" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Daily digest",
"nodes": [
{
"id": "trigger",
"type": "trigger",
"data": {
"triggerType": "manual"
}
},
{
"id": "summarise",
"type": "aiPrompt",
"data": {
"prompt": "Summarise {{trigger.topic}} in 5 bullets"
}
}
],
"edges": [
{
"source": "trigger",
"target": "summarise"
}
]
}'/v1/workflows/{id}Get a workflow, including nodes and edges
Key permission: workflows
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/workflows/3f8a1c2d-5e6b-4a7c-8d9e-0f1a2b3c4d5e" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/workflows/{id}Update a workflow
Key permission: workflows
- Sending nodes or edges replaces that part of the graph (edges are checked against the saved nodes when only edges are sent) and bumps version.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | No | Name |
description | string | No | Description |
nodes | object[] | No | Builder nodes: { id, type, data?, position? } (position defaults to a left-to-right layout) |
edges | object[] | No | Builder edges: { source, target, sourceHandle?, id? } between node ids |
category | string | No | Category |
tags | string[] | No | Tags |
folder_id | uuid | No | Folder |
is_active | boolean | No | Activate (also sets status to "active" / "draft"), like the builder's Active switch |
curl -X PATCH "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/workflows/3f8a1c2d-5e6b-4a7c-8d9e-0f1a2b3c4d5e" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"is_active": true
}'/v1/workflows/{id}Delete a workflow
Key permission: workflows
curl -X DELETE "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/workflows/3f8a1c2d-5e6b-4a7c-8d9e-0f1a2b3c4d5e" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/workflows/{id}/runRun a workflow
Key permission: workflows
- By default the run starts in the background and the call returns 202 with an execution id; poll status_url (GET /v1/executions/{id}).
- POST /v1/workflows/{id}/execute is an alias.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
inputs | object | No | Values passed to the workflow triggerDefault: {} |
wait | boolean | No | true waits for the run to finish and returns its resultDefault: false |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/workflows/3f8a1c2d-5e6b-4a7c-8d9e-0f1a2b3c4d5e/run" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"inputs": {
"topic": "Q3 sales"
}
}'/v1/workflows/{id}/executionsList a workflow's runs
Key permission: workflows
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
limit | integer | No | Page size, up to 100Default: 50 |
offset | integer | No | Items to skipDefault: 0 |
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/workflows/3f8a1c2d-5e6b-4a7c-8d9e-0f1a2b3c4d5e/executions" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"Executions
Workflow runs across all of your workflows.
/v1/executionsList runs
Key permission: workflows
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
workflow_id | uuid | No | Only runs of this workflow |
status | string | No | Filter by run status |
limit | integer | No | Page size, up to 100Default: 50 |
offset | integer | No | Items to skipDefault: 0 |
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/executions?workflow_id=3f8a1c2d-5e6b-4a7c-8d9e-0f1a2b3c4d5e" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/executions/{id}Get a run, including execution_data, node_outputs and error_message
Key permission: workflows
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/executions/b7c8d9e0-1f2a-4b3c-9d4e-5f6a7b8c9d0e" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/executions/{id}/cancelCancel a running execution
Key permission: workflows
- The run stops before its next node; a node already in flight (e.g. an AI call) finishes first. Its status becomes "cancelled".
- A run that already finished returns 409 INVALID_STATE. Also available as POST /v1/workflows/{id}/executions/{execution_id}/cancel.
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/executions/b7c8d9e0-1f2a-4b3c-9d4e-5f6a7b8c9d0e/cancel" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"Scheduling Runs
Workflows with a schedule trigger are run automatically by MultiverseAI's internal scheduler; there is nothing to call. The scheduler function itself only accepts the platform's internal cron secret and cannot be called with an API key.
- To run a workflow on demand, use POST /v1/workflows/{id}/run.
- To run a workflow (or a prompt) at a specific time, add it to the queue with POST /v1/queue and a future scheduled_for — it waits as "scheduled" and runs then.
/v1/queueSchedule a workflow run for later
Key permission: workflows
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/queue" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"workflow_id": "3f8a1c2d-5e6b-4a7c-8d9e-0f1a2b3c4d5e",
"scheduled_for": "2026-10-08T09:00:00Z"
}'Agents
Your AI agents. Chat uses the agent's own instructions, model, knowledge context and workflow triggers, and every exchange is saved to the agent's history under a conversation_id.
/v1/agentsList agents
Key permission: agents
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
include_archived | boolean | No | Include archived agentsDefault: false |
limit | integer | No | Page size, up to 100Default: 50 |
offset | integer | No | Items to skipDefault: 0 |
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/agents" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/agentsCreate an agent
Key permission: agents
- Starts as a draft with response_length "balanced" and the app's default model unless you set them.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Name |
description | string | No | Description |
instructions | string | No | System instructions |
default_model | string | No | Model id (GET /v1/models) |
context_id | uuid | No | Knowledge context (GET /v1/contexts) |
personality_template | string | No | Personality template name |
response_length | string | No | "concise", "balanced" or "detailed" |
max_tokens_limit | integer | No | Token cap per reply |
max_cost_limit | number | No | Cost cap |
tags | string[] | No | Tags |
image_url | string | No | https:// avatar URL |
voice_id | string | No | Voice for text-to-speech |
voice_settings | object | No | Voice settings |
status | string | No | "draft", "published" or "archived" |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/agents" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Support Assistant",
"instructions": "Answer product questions briefly and link the docs.",
"response_length": "concise",
"tags": [
"support"
]
}'/v1/agents/{id}Get an agent, including its instructions and configuration
Key permission: agents
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/agents/5a6b7c8d-9e0f-4a1b-8c2d-3e4f5a6b7c8d" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/agents/{id}Update an agent
Key permission: agents
- Only the owner can change an agent; agents shared with you can be read and chatted with, and return 404 here.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | No | Name |
description | string | No | Description |
instructions | string | No | System instructions |
default_model | string | No | Model id (GET /v1/models) |
context_id | uuid | No | Knowledge context (GET /v1/contexts) |
personality_template | string | No | Personality template name |
response_length | string | No | "concise", "balanced" or "detailed" |
max_tokens_limit | integer | No | Token cap per reply |
max_cost_limit | number | No | Cost cap |
tags | string[] | No | Tags |
image_url | string | No | https:// avatar URL |
voice_id | string | No | Voice for text-to-speech |
voice_settings | object | No | Voice settings |
status | string | No | "draft", "published" or "archived" |
is_archived | boolean | No | Archive or unarchive |
curl -X PATCH "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/agents/5a6b7c8d-9e0f-4a1b-8c2d-3e4f5a6b7c8d" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"status": "published"
}'/v1/agents/{id}Delete an agent and its chat history
Key permission: agents
curl -X DELETE "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/agents/5a6b7c8d-9e0f-4a1b-8c2d-3e4f5a6b7c8d" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/agents/{id}/chatChat with an agent
Key permission: agents
Request body
| Field | Type | Required | Description |
|---|---|---|---|
message | string | Yes | Your message |
conversation_id | uuid | No | Continue a saved conversation (its last 40 turns are used as context). Omit to start a new one; the response returns its id. |
conversation_history | array | No | Explicit [{ role: "user" | "assistant", content }] history; used instead of the saved history |
stream | boolean | No | Stream chat.completion.chunk events (each carries conversation_id), ending with [DONE]Default: false |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/agents/5a6b7c8d-9e0f-4a1b-8c2d-3e4f5a6b7c8d/chat" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"message": "How do I reset my password?"
}'/v1/agents/{id}/chatRead an agent's saved messages
Key permission: agents
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
conversation_id | uuid | No | Only this conversation |
limit | integer | No | Page size, up to 200Default: 50 |
offset | integer | No | Items to skipDefault: 0 |
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/agents/5a6b7c8d-9e0f-4a1b-8c2d-3e4f5a6b7c8d/chat?conversation_id=c1d2e3f4-a5b6-4c7d-8e9f-0a1b2c3d4e5f" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"Conversations
Your chat history — the same conversations the MultiverseAI apps show. Sending a message works like the app: your message is saved, the model answers with the conversation (last 40 turns) as context, and the reply is saved too.
/v1/conversationsList conversations
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
archived | boolean | No | true lists archived conversations insteadDefault: false |
q | string | No | Search titles |
limit | integer | No | Page size, up to 100Default: 50 |
offset | integer | No | Items to skipDefault: 0 |
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/conversations?q=launch" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/conversationsCreate a conversation
- Returns 201 with the conversation.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
title | string | No | TitleDefault: New Conversation |
model | string | No | Default model for the conversationDefault: openrouter/openai/gpt-6-luna |
folder_id | uuid | No | Folder to put it in |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/conversations" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "Launch plan",
"model": "openrouter/anthropic/claude-opus-5.5"
}'/v1/conversations/{id}Get a conversation
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/conversations/2e3f4a5b-6c7d-4e8f-9a0b-1c2d3e4f5a6b" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/conversations/{id}Update a conversation
Request body
| Field | Type | Required | Description |
|---|---|---|---|
title | string | No | Title |
model | string | No | Default model |
folder_id | uuid | null | No | Folder (null removes it) |
is_archived | boolean | No | Archive or unarchive |
curl -X PATCH "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/conversations/2e3f4a5b-6c7d-4e8f-9a0b-1c2d3e4f5a6b" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"is_archived": true
}'/v1/conversations/{id}Delete a conversation
curl -X DELETE "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/conversations/2e3f4a5b-6c7d-4e8f-9a0b-1c2d3e4f5a6b" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/conversations/{id}/messagesList messages (oldest first)
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
limit | integer | No | Page size, up to 200Default: 100 |
offset | integer | No | Items to skipDefault: 0 |
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/conversations/2e3f4a5b-6c7d-4e8f-9a0b-1c2d3e4f5a6b/messages" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/conversations/{id}/messagesSend a message and get the reply
- Returns 201 { object: "conversation.exchange", conversation_id, user_message, message }.
- Streaming sends { object: "conversation.message" } (your saved message), then { object: "conversation.delta", delta } chunks and { object: "conversation.tool_event", event, tool_call } events, then the saved reply as another conversation.message, then data: [DONE].
Request body
| Field | Type | Required | Description |
|---|---|---|---|
content | string | Yes | Your message |
model | string | No | Model for this reply (defaults to the conversation's model) |
system_prompt | string | No | System prompt for this reply |
stream | boolean | No | Stream the exchange over SSEDefault: false |
temperature | number | No | Sampling temperature, 0–2 |
max_tokens | integer | No | Maximum tokens to generate (max_completion_tokens is accepted too) |
top_p | number | No | Nucleus sampling, 0–1 |
frequency_penalty | number | No | -2 to 2 |
presence_penalty | number | No | -2 to 2 |
tools | true | string[] | No | true enables every MultiverseAI agent tool; an array enables only the named tools (names from GET /v1/tools). Tools run server-side as you. OpenAI-style function definitions are rejected with UNSUPPORTED_TOOLS. |
max_tool_iterations | integer | No | Cap on tool-call rounds when tools are enabled (1–20) |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/conversations/2e3f4a5b-6c7d-4e8f-9a0b-1c2d3e4f5a6b/messages" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"content": "Draft three launch-day tweets.",
"tools": true
}'Contexts
Prompt contexts: reusable system prompts with model and sampling settings.
/v1/contextsList contexts
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
include_archived | boolean | No | Include archived contextsDefault: false |
limit | integer | No | Page size, up to 100Default: 50 |
offset | integer | No | Items to skipDefault: 0 |
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/contexts" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/contextsCreate a context
- Returns 201 with the context.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Name |
description | string | No | Description |
color | string | No | Hex colorDefault: #6366f1 |
tags | string[] | No | Tags |
model | string | No | Model id |
temperature | number | No | Sampling temperature |
max_tokens | integer | No | Max tokens |
system_prompt | string | No | System prompt |
metadata | object | No | Free-form JSON |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/contexts" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Brand voice",
"system_prompt": "Write in a friendly, plain-spoken tone.",
"model": "openrouter/openai/gpt-6-luna",
"temperature": 0.7,
"tags": [
"marketing"
]
}'/v1/contexts/{id}Get a context
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/contexts/7d8e9f0a-1b2c-4d3e-8f4a-5b6c7d8e9f0a" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/contexts/{id}Update a context
Request body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | No | Name (required on create) |
description | string | No | Description |
color | string | No | Hex colorDefault: #6366f1 |
tags | string[] | No | Tags |
model | string | No | Model id |
temperature | number | No | Sampling temperature |
max_tokens | integer | No | Max tokens |
system_prompt | string | No | System prompt |
metadata | object | No | Free-form JSON |
is_archived | boolean | No | Archive or unarchive |
curl -X PATCH "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/contexts/7d8e9f0a-1b2c-4d3e-8f4a-5b6c7d8e9f0a" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"temperature": 0.4
}'/v1/contexts/{id}Delete a context
curl -X DELETE "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/contexts/7d8e9f0a-1b2c-4d3e-8f4a-5b6c7d8e9f0a" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"Boards
Task boards you own or share through a team.
/v1/boardsList boards
Key permission: tasks
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
limit | integer | No | Page size, up to 100Default: 50 |
offset | integer | No | Items to skipDefault: 0 |
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/boards" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/boardsCreate a board
Key permission: tasks
Request body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Name |
description | string | No | Description |
color | string | No | Color |
team_id | uuid | No | Create it as a team board (create only) |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/boards" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Marketing"
}'/v1/boards/{id}Get a board
Key permission: tasks
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/boards/4c5d6e7f-8a9b-4c0d-9e1f-2a3b4c5d6e7f" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/boards/{id}Update a board
Key permission: tasks
Request body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | No | Name |
description | string | No | Description |
color | string | No | Color |
curl -X PATCH "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/boards/4c5d6e7f-8a9b-4c0d-9e1f-2a3b4c5d6e7f" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Product roadmap"
}'/v1/boards/{id}Delete a board
Key permission: tasks
curl -X DELETE "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/boards/4c5d6e7f-8a9b-4c0d-9e1f-2a3b4c5d6e7f" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/boards/{id}/tasksList a board's tasks (by position, archived tasks excluded)
Key permission: tasks
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
limit | integer | No | Page size, up to 200Default: 100 |
offset | integer | No | Items to skipDefault: 0 |
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/boards/4c5d6e7f-8a9b-4c0d-9e1f-2a3b4c5d6e7f/tasks" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"Tasks
Tasks on your boards.
/v1/tasksList tasks
Key permission: tasks
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
board_id | uuid | No | Only this board |
status | string | No | Filter by status |
priority | string | No | Filter by priority |
assignee | string | No | Filter by assignee |
include_archived | boolean | No | Include archived tasksDefault: false |
limit | integer | No | Page size, up to 100Default: 50 |
offset | integer | No | Items to skipDefault: 0 |
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/tasks?status=todo&priority=high" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/tasksCreate a task
Key permission: tasks
- Returns 201 with the task. Invalid enum values return 400 INVALID_VALUE.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
title | string | Yes | Title |
description | string | No | Description |
status | string | No | backlog | todo | in-progress | review | doneDefault: todo |
priority | string | No | low | medium | high | urgentDefault: medium |
assignee | string | No | Assignee |
tags | string[] | No | Tags |
due_date | string | No | ISO 8601 date |
board_id | uuid | No | Board (your default board if omitted on create) |
estimated_hours | number | No | Estimate in hours |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/tasks" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "Write launch blog post",
"priority": "high",
"due_date": "2026-10-15",
"tags": [
"launch"
]
}'/v1/tasks/{id}Get a task
Key permission: tasks
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/tasks/8e9f0a1b-2c3d-4e4f-a5b6-c7d8e9f0a1b2" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/tasks/{id}Update a task
Key permission: tasks
Request body
| Field | Type | Required | Description |
|---|---|---|---|
title | string | No | Title (required on create) |
description | string | No | Description |
status | string | No | backlog | todo | in-progress | review | doneDefault: todo |
priority | string | No | low | medium | high | urgentDefault: medium |
assignee | string | No | Assignee |
tags | string[] | No | Tags |
due_date | string | No | ISO 8601 date |
board_id | uuid | No | Board (your default board if omitted on create) |
estimated_hours | number | No | Estimate in hours |
logged_hours | number | No | Hours logged |
position | number | No | Order on the board |
curl -X PATCH "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/tasks/8e9f0a1b-2c3d-4e4f-a5b6-c7d8e9f0a1b2" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"status": "in-progress",
"logged_hours": 1.5
}'/v1/tasks/{id}Delete a task
Key permission: tasks
curl -X DELETE "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/tasks/8e9f0a1b-2c3d-4e4f-a5b6-c7d8e9f0a1b2" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"Teams
Teams you belong to (read-only).
/v1/teamsList your teams
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/teams" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/teams/{id}Get a team with its members
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/teams/0a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"Prompt Queue
The prompt queue: run a prompt (or a saved workflow) in the background now, or schedule it for later. Items and their responses appear in the app's queue history.
/v1/queueAdd an item to the queue
Key permission: workflows
- Returns 201 with the item. Unscheduled items start right away (status "running") unless run is false.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
prompt | string | No | The prompt (required unless workflow_id is given) |
workflow_id | uuid | No | Run this saved workflow instead of a prompt |
model | string | No | Model idDefault: openrouter/openai/gpt-6-luna |
priority | string | No | critical | high | normal | lowDefault: normal |
destination | string | No | Where the result should go |
scheduled_for | string | No | ISO 8601 time in the future; the item waits as "scheduled" and runs then |
run | boolean | No | false only enqueues it (status pending); start it later with POST /v1/queue/{id}/runDefault: true |
wait | boolean | No | Run now and wait for the resultDefault: false |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/queue" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"prompt": "Summarise this week in AI news.",
"priority": "high",
"scheduled_for": "2026-10-08T09:00:00Z"
}'/v1/queueList queue items
Key permission: workflows
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
status | string | No | Comma-separated statuses, e.g. pending,running,scheduled |
limit | integer | No | Page size, up to 100Default: 50 |
offset | integer | No | Items to skipDefault: 0 |
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/queue?status=pending,running,scheduled" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/queue/{id}Get a queue item (including its response once done)
Key permission: workflows
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/queue/6f7a8b9c-0d1e-4f2a-b3c4-d5e6f7a8b9c0" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/queue/{id}/runRun a waiting item now
Key permission: workflows
Request body
| Field | Type | Required | Description |
|---|---|---|---|
wait | boolean | No | Wait for the resultDefault: false |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/queue/6f7a8b9c-0d1e-4f2a-b3c4-d5e6f7a8b9c0/run" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"wait": true
}'/v1/queue/{id}Cancel a waiting item
Key permission: workflows
- Only pending, scheduled or retrying items can be cancelled (otherwise 400 INVALID_STATE). Returns the item with status "cancelled".
curl -X DELETE "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/queue/6f7a8b9c-0d1e-4f2a-b3c4-d5e6f7a8b9c0" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"Projects
Separate sets of accounts under one account — one per client, or per project in an app you build on this API. A project holds posting accounts (X, TikTok, Instagram, Threads, Facebook Pages, LinkedIn), messaging channels (WhatsApp Business, Messenger, Instagram DMs, Telegram, Slack, Discord), a Google account (Gmail, Calendar, Drive) and Meta ad accounts (meta_ads, run with the facebook_ads tool and project_id on POST /v1/tools/facebook_ads). Posts and messages that name a project (project_id, or an X-Project-Id header on /v1/posts and /v1/platforms) use only that project's accounts and never fall back to yours. Your end users connect accounts in the hosted Connect portal (POST /v1/projects/{id}/connect-session) without a MultiverseAI login; inbound messages are pushed to your webhook (see Webhooks). {id} is our project id or your own external_id. /v1/profiles is an alias.
- Connect portal popup: open the session url in a popup (e.g. window.open(url, "mv-connect", "width=520,height=720")). The portal lists the allowed platforms with Connect / Disconnect; provider sign-ins run in a child window and come back to the portal.
- The popup posts events to your page: window.opener.postMessage({ source: 'multiverseai-connect', type: 'ready' | 'connected' | 'disconnected' | 'closed', platform, project_id, account }, return_origin). Check event.origin is https://multiverseai.com and event.data.source === 'multiverseai-connect'. return_origin is the session's origin, or return_url's origin; with neither, nothing is posted.
- When the user clicks Done, a session with return_url sends the popup there with ?mv_status=done&mv_project_id=…; otherwise the popup posts closed and closes.
- Account changes also arrive on your webhook as account.connected / account.disconnected, so you don't depend on the popup staying open.
/v1/projectsCreate a project
Key permission: posts
Request body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Display name |
external_id | string | No | Your own id for it (unique per account). Creating again with the same external_id returns the existing project (200). |
metadata | object | No | Anything you want stored with it |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/projects" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Acme Co",
"external_id": "acme-client-42"
}'/v1/projectsList projects
Key permission: posts
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
external_id | string | No | Only the project with this external_id |
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/projects" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/projects/{id}Get a project with its posting platforms, messaging/workspace channels, ads connections and connected accounts
Key permission: posts
- ads lists the meta_ads connection(s): [{ name: "meta_ads", connected, account, accounts: [{ …account, status: "connected" | "expired", ad_accounts, pages }] }]. meta_ads is not a posting platform, so it is not under platforms or GET /v1/platforms.
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/projects/acme-client-42" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/projects/{id}Rename, or change external_id / metadata
Key permission: posts
curl -X PATCH "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/projects/acme-client-42" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Acme Corporation"
}'/v1/projects/{id}Delete a project and disconnect its accounts
Key permission: posts
- Its pending scheduled posts fail instead of posting as your account-level connections.
curl -X DELETE "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/projects/acme-client-42" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/projects/{id}/connect-sessionCreate a hosted Connect portal session (popup)
Key permission: posts
- The url carries a signed token scoped to this one project and these platforms; it expires at expires_at. Anyone holding it can connect or disconnect those platforms on this project until then — create one per user visit.
- platforms[].available is false when a platform can't be connected yet (unavailable_code NOT_CONFIGURED, or PENDING_META_APPROVAL for WhatsApp Embedded Signup); the portal shows it greyed out.
- Provider tokens never reach the portal page or your app.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
platforms | string[] | No | Platforms to offer, in any order (default all): whatsapp, messenger, instagram_dm, telegram, slack, discord, google, facebook, instagram, threads, twitter (or x), linkedin, tiktok, youtube |
return_url | string | No | https URL (http on localhost) the Done button sends the popup to, with ?mv_status=done&mv_project_id=… |
origin | string | No | Origin the popup posts its events to (e.g. https://app.example.com). Default: return_url's origin |
theme | string | No | light | dark | auto (default) |
partner_name | string | No | Your product name, shown in the portal (60 characters max) |
ttl_seconds | number | No | 60–7200 (default 1800) |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/projects/acme-client-42/connect-session" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"platforms": [
"whatsapp",
"messenger",
"instagram_dm",
"telegram",
"google"
],
"origin": "https://app.example.com",
"partner_name": "Acme",
"theme": "auto"
}'/v1/projects/{id}/connectGet a connect link for one platform (or connect a Telegram bot)
Key permission: posts
- Send the account owner to url; they don't need a MultiverseAI login. The link is good for 10 minutes — make one per attempt. For several platforms at once, prefer the Connect portal (connect-session).
- They come back to return_url with mv_status=connected|error, mv_platform, mv_project_id, mv_account, mv_account_id and mv_reason (and connected=<platform> on success).
- Connecting again adds another account; Facebook / Messenger add every Page the person grants, instagram_dm every Instagram account linked to those Pages, WhatsApp every number of the shared WhatsApp Business Accounts.
- WhatsApp uses Meta Embedded Signup. Until Meta approves it the call answers 503 PENDING_META_APPROVAL (or the person returns with mv_reason=whatsapp_pending_approval).
- A Telegram bot has one webhook: connecting it to a project takes it over from anywhere it was paired before.
- meta_ads connects the person's Meta ad accounts (Facebook Login for Business: ads_management, ads_read, business_management) for the facebook_ads tool; it is offered here only, not in the Connect portal. It keeps their long-lived user token (about 60 days; reconnect when the account shows status expired). On success the return URL also gets mv_ad_accounts=act_1,act_2…; mv_reason=ads_permission_declined when they declined ads access. Reconnecting the same Meta user updates the same account.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
platform | string | Yes | twitter | tiktok | instagram | threads | facebook | linkedin | youtube | whatsapp | messenger | instagram_dm | slack | discord | google | telegram | meta_ads |
return_url | string | No | Required except for telegram: https URL (http allowed on localhost) the person is sent back to |
bot_token | string | No | telegram only: the bot token from @BotFather. The bot is connected immediately and its webhook pointed at MultiverseAI. |
google_services | string[] | No | google only: gmail, calendar, drive (default all) |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/projects/acme-client-42/connect" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"platform": "instagram",
"return_url": "https://app.example.com/social/connected"
}'/v1/projects/{id}/messagesSend a message through one of the project's channels
Key permission: posts
- Uses only the project's own account for the platform — never yours.
- Errors: 409 NOT_CONNECTED, 422 WINDOW_EXPIRED (Meta 24-hour window), 403 FORBIDDEN (Discord channel outside the project's server), 422 NOT_IN_CHANNEL (invite the Slack app first), 429 RATE_LIMITED, 422 PROVIDER_REJECTED.
- Discord: messages go out as the MultiverseAI bot, only in the server connected to the project. Inbound Discord messages are not delivered (the bot has no gateway connection).
Request body
| Field | Type | Required | Description |
|---|---|---|---|
platform | string | Yes | whatsapp | messenger | instagram_dm (or instagram) | telegram | slack | discord |
to | string | Yes | WhatsApp phone number, Messenger PSID, Instagram IGSID, Telegram chat id, Slack channel id or Discord channel id — the chat_id of an inbound message.received event |
text | string | No | Up to 4096 characters. Required unless media or template is sent. |
media | object | No | { kind: "image" | "video" | "audio" | "document", url: "https://…", name? } |
template | object | No | WhatsApp only: { name, language? (default en_US), components? } — needed to message someone outside the 24-hour window |
thread_ts | string | No | Slack: reply in this thread |
account | string | No | When the project has several accounts on the platform: our account id, the platform's id, or the username |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/projects/acme-client-42/messages" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"platform": "whatsapp",
"to": "+15550100",
"text": "Thanks — your order ships today."
}'/v1/projects/{id}/gmail/messagesList emails in the project's Gmail
Key permission: posts
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
q | string | No | Gmail search, e.g. is:unread from:alice@example.com |
limit | number | No | 1–50 (default 20) |
page_token | string | No | next_page_token from the previous page |
account | string | No | Which Google account when the project has several |
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/projects/acme-client-42/gmail/messages?q=is:unread&limit=10" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/projects/{id}/gmail/messages/{message_id}Read one email (headers, text and HTML body)
Key permission: posts
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/projects/acme-client-42/gmail/messages/18c2a1b3c4d5e6f7" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/projects/{id}/gmail/messagesSend an email from the project's Gmail
Key permission: posts
Request body
| Field | Type | Required | Description |
|---|---|---|---|
to | string | string[] | Yes | Recipient address(es) |
subject | string | Yes | Subject line |
text | string | No | Plain-text body (text or html is required) |
html | string | No | HTML body (with text, both are sent as alternatives) |
cc | string | string[] | No | |
bcc | string | string[] | No | |
thread_id | string | No | Reply inside this Gmail thread |
in_reply_to | string | No | Message-ID header of the email being answered |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/projects/acme-client-42/gmail/messages" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": "alice@example.com",
"subject": "Your quote",
"text": "Hi Alice, attached is…"
}'/v1/projects/{id}/calendar/eventsList upcoming events in the project's Google Calendar
Key permission: posts
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
time_min | string | No | ISO 8601 (default now) |
time_max | string | No | ISO 8601 |
q | string | No | Free-text search |
limit | number | No | 1–250 (default 25) |
calendar_id | string | No | Default primary |
page_token | string | No |
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/projects/acme-client-42/calendar/events?time_max=2026-10-19T00:00:00Z" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/projects/{id}/calendar/eventsCreate an event in the project's Google Calendar
Key permission: posts
Request body
| Field | Type | Required | Description |
|---|---|---|---|
summary | string | Yes | Title |
start | string | Yes | RFC 3339 date-time, or YYYY-MM-DD for an all-day event |
end | string | Yes | RFC 3339 date-time, or YYYY-MM-DD (exclusive) for all-day |
time_zone | string | No | IANA zone for start/end, e.g. America/Los_Angeles |
description | string | No | |
location | string | No | |
attendees | string[] | No | Email addresses |
google_meet | boolean | No | Add a Google Meet link |
send_updates | string | No | all | externalOnly | none (default none: attendees are not emailed) |
calendar_id | string | No | Default primary |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/projects/acme-client-42/calendar/events" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"summary": "Kickoff",
"start": "2026-10-14T17:00:00Z",
"end": "2026-10-14T17:30:00Z",
"attendees": [
"alice@example.com"
],
"google_meet": true
}'/v1/projects/{id}/calendar/events/{event_id}Delete an event
Key permission: posts
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
calendar_id | string | No | Default primary |
curl -X DELETE "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/projects/acme-client-42/calendar/events/abc123def456" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/projects/{id}/drive/filesList or search files in the project's Google Drive
Key permission: posts
- Read-only (drive.readonly scope). Newest first; trashed files are excluded.
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
q | string | No | Full-text search, or Drive query syntax (e.g. mimeType = 'application/pdf') |
limit | number | No | 1–100 (default 25) |
page_token | string | No |
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/projects/acme-client-42/drive/files?q=invoice" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/projects/{id}/drive/files/{file_id}Metadata of one Drive file (name, type, size, link)
Key permission: posts
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/projects/acme-client-42/drive/files/1AbCdEf…" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/projects/{id}/accountsList a project's connected accounts (no tokens)
Key permission: posts
- meta_ads accounts also list ad_accounts (id, account_id, name, currency, timezone_name, account_status, pixels when readable) and pages (id, name, instagram_business_account), as saved at connect time.
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
platform | string | No | Only this platform |
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/projects/acme-client-42/accounts?platform=meta_ads" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/projects/{id}/insightsLive analytics for a project's connected accounts
Key permission: posts
- One entry per connected posting account (instagram, facebook, threads, tiktok, twitter, linkedin; messaging channels, Google and meta_ads are not included), read live with that account's own connection. Unknown values are null, never 0. A platform that fails or lacks a permission says why in error; the other entries are unaffected and the request still returns 200.
- daily has one row per day in the range. posts are the account's posts published in the range, newest first, up to 50. audience is null where the platform or connection gives none.
- Instagram: followers, following, posts_count, post likes/comments always; daily reach and new_followers, post impressions (views), reach, shares, saves and audience need instagram_business_manage_insights. Facebook Pages: daily impressions, reach, engagements, profile_views, followers (as Meta still reports them) and post impressions/reach/reactions/comments/shares. Threads: daily impressions (views), followers, post views/likes/replies/reposts+quotes, audience (100+ followers). TikTok: profile and per-video views, likes, comments, shares; followers only with user.info.stats. X: profile counts and own tweets' public_metrics (tweets need an X API tier that allows reading them). LinkedIn: account only (no analytics scope).
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
platform | string | No | instagram | facebook | threads | tiktok | twitter | linkedin (default: every connected account) |
since | string | No | YYYY-MM-DD, inclusive (default: 29 days before until) |
until | string | No | YYYY-MM-DD, inclusive (default: today, UTC). At most 90 days in all. |
refresh | boolean | No | true skips the 10-minute cacheDefault: false |
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/projects/acme-client-42/insights?platform=instagram&since=2026-10-01&until=2026-10-07" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/projects/{id}/accounts/{account_id}Disconnect one account
Key permission: posts
- Telegram bots get their webhook removed, Slack and Google tokens are revoked; your webhook receives account.disconnected.
curl -X DELETE "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/projects/acme-client-42/accounts/9b2f…" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"Messaging (connected apps)
Read which WhatsApp number, Facebook Page and Instagram account a user connected, and reply from them. Partner apps such as Kanvo get a key limited to these endpoints when the user approves them at multiverseai.com/authorize; new messages are pushed to the app, signed, rather than polled.
/v1/messaging/accountsThe connected messaging accounts
- id is what Meta webhooks are keyed by: the phone_number_id, Page id or Instagram account id.
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
project_id | string | No | A project's channels instead (project id or external_id). Not available to connected-app keys. |
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/messaging/accounts" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/messaging/sendSend a message from a connected account
- With media and text, WhatsApp sends the text as the caption (audio: as a second message); Messenger and Instagram send the file, then the text.
- Errors: 409 NOT_CONNECTED, 422 WINDOW_EXPIRED (the 24-hour reply window has closed), 422 PROVIDER_REJECTED.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
platform | string | Yes | "whatsapp", "messenger" or "instagram" |
to | string | Yes | Phone number (WhatsApp) or the page-scoped id of the person (Messenger / Instagram) |
text | string | No | Up to 4096 characters. Required unless media is sent. |
media | object | No | { kind: "image" | "video" | "audio" | "document", url: "https://…", name? } |
project_id | string | No | Send through a project's own channel instead (platform may then also be instagram_dm, telegram, slack or discord; template, thread_ts and account are accepted). Same as POST /v1/projects/{id}/messages. Not available to connected-app keys. |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/messaging/send" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"platform": "whatsapp",
"to": "+15550100",
"text": "Thanks — on its way!"
}'/v1/messaging/disconnectRevoke the calling connected-app key
- Stops event delivery to the app as well. The user can also disconnect from Settings → Developer.
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/messaging/disconnect" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'Webhooks
Where MultiverseAI pushes events about your projects: messages people send to a project's WhatsApp number, Facebook Page, Instagram account, Telegram bot or Slack workspace, delivery statuses, accounts connected or disconnected (for example in the Connect portal), and how each post went on each platform. One webhook per API key. Every delivery is signed with the webhook's secret.
- Delivery: POST <url> with Content-Type: application/json and headers X-Multiverse-Event (the event type), X-Multiverse-Delivery (the event id, the same on every retry — dedupe on it) and X-Multiverse-Signature: t=<unix seconds>,v1=<hex HMAC-SHA256 of "<t>.<raw body>" with your secret>. Reject a signature whose t is more than 5 minutes off.
- Body: { id: "evt_…", object: "event", type, created_at, project_id, project: { id, external_id, name }, data }.
- message.received data: { platform: whatsapp | messenger | instagram_dm | telegram | slack, account: { id, external_account_id, username }, message: { id, chat_id, from: { id, name, username? }, type, text, timestamp, attachments?, thread_ts? } }. Reply with POST /v1/projects/{id}/messages { platform, to: message.chat_id }.
- message.status data: the same shape for WhatsApp sent / delivered / read / failed statuses (message.status, message.recipientId). account.connected / account.disconnected data: { platform, account: { id, external_account_id, username, display_name? } }.
- post.published data: { post_id, platform, source: "immediate" | "scheduled", url, platform_post_id } — one per platform, when it is live (url is null when the platform gives no public link, e.g. a private TikTok). post.failed data: { post_id, platform, source, error }. They fire for created and scheduled posts, including Instagram/TikTok media that finished processing later; for a post without a project, project_id and project are null.
- Answer with a 2xx within 10 seconds. Timeouts, network errors, 408, 429 and 5xx are retried twice (after about 2 s and 10 s); other 4xx are not retried. After 50 failed deliveries in a row the webhook is switched off — PUT it again to resume. Order is not guaranteed.
- Discord messages and Gmail are not pushed: send to Discord with /v1/projects/{id}/messages and poll Gmail with /v1/projects/{id}/gmail/messages.
- Provider tokens never appear in an event.
/v1/webhooksCreate or replace this key's webhook
Key permission: posts
- The response includes secret (whsec_…) only when the webhook is created. Store it; replacing the URL keeps the same secret. POST is accepted as well as PUT.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
url | string | Yes | Public https URL (no localhost or private addresses) |
events | string[] | No | message.received, message.status, account.connected, account.disconnected, post.published, post.failed or "*" (default ["*"]) |
curl -X PUT "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/webhooks" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://app.example.com/multiverse/webhook",
"events": [
"message.received",
"account.connected",
"account.disconnected"
]
}'/v1/webhooksThis key's webhook and its last delivery status
Key permission: posts
- A user session (not a key) sees every webhook on the account. The secret is never returned here.
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/webhooks" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/webhooksRemove this key's webhook
Key permission: posts
- Deleting or revoking the API key stops delivery too.
curl -X DELETE "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/webhooks" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/webhooks/rotate-secretIssue a new signing secret
Key permission: posts
- Returned once. The old secret stops working immediately, so deploy the new one right away.
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/webhooks/rotate-secret" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'/v1/webhooks/testSend a ping event now
Key permission: posts
- No retries. status is your endpoint's HTTP status (0 = timeout or network error).
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/webhooks/test" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'Account & Usage
Who the caller is, your developer keys and their request log. Keys are read-only here: create and revoke them in Settings → Developer, so a leaked key can't mint new ones.
/v1/meWho you are, and which key you are calling with
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/me" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/keysList your developer keys (no secrets)
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/keys" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/keys/{id}Get one developer key
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/keys/2b3c4d5e-6f7a-4b8c-9d0e-1f2a3b4c5d6e" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"/v1/usageRequest log for your keys, newest first
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
key_id | uuid | No | Only this key |
since | string | No | ISO 8601; only requests at or after this time |
status | integer | No | Only this HTTP status, e.g. 403 |
limit | integer | No | Page size, up to 500Default: 100 |
offset | integer | No | Items to skipDefault: 0 |
curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/usage?key_id=2b3c4d5e-6f7a-4b8c-9d0e-1f2a3b4c5d6e&limit=2" \
-H "Authorization: Bearer $MULTIVERSE_API_KEY"Integration functions
The sections below document individual MultiverseAI functions that are called directly at https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/<function-name>, outside the versioned /v1 API. Their request and response formats are function-specific and do not follow the /v1 conventions above.
Web Scraping
Extract content from websites using Firecrawl, Browserless, or ScrapingBee. Supports user-provided API keys.
/web-scraping-apiUnified web scraping API - intelligently routes to Firecrawl, Browserless, or ScrapingBee based on operation and configuration. Supports user-provided API keys.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
url | string | Yes | The URL to scrape |
operation | string | No | Operation: scrape, screenshot, pdf, search, map, crawlDefault: scrape |
provider | string | No | Provider: auto, firecrawl, browserless, scrapingbeeDefault: auto |
apiKeys | object | No | User API keys: { firecrawl?, browserless?, scrapingbee? } |
formats | array | No | Output formats (Firecrawl): markdown, html, links, screenshot |
selector | string | No | CSS selector (Browserless/ScrapingBee) |
executeJs | boolean | No | Execute JavaScript on page |
jsScript | string | No | Custom JavaScript to execute |
useProxy | boolean | No | Enable proxy rotation (ScrapingBee) |
renderJs | boolean | No | Render JavaScript (ScrapingBee) |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/web-scraping-api" \
-H "Authorization: Bearer mverse_k_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com",
"operation": "scrape",
"provider": "auto",
"apiKeys": {
"firecrawl": "fc-your-key",
"browserless": "your-browserless-key"
}
}'/browserless-scrapeBrowserless.io scraping - content extraction, screenshots, PDFs, and custom JavaScript execution
Request body
| Field | Type | Required | Description |
|---|---|---|---|
url | string | Yes | The URL to scrape |
apiKey | string | No | Your Browserless API key (optional, uses system key if not provided) |
operation | string | No | Operation: content, screenshot, pdf, functionDefault: content |
selector | string | No | CSS selector to target specific elements |
waitForSelector | string | No | Wait for element to appear |
timeout | integer | No | Timeout in millisecondsDefault: 30000 |
fullPage | boolean | No | Capture full page screenshotDefault: false |
executeJs | boolean | No | Execute custom JavaScriptDefault: false |
jsScript | string | No | JavaScript code to execute on page |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/browserless-scrape" \
-H "Authorization: Bearer mverse_k_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com",
"operation": "screenshot",
"fullPage": true,
"apiKey": "your-browserless-api-key"
}'/scrapingbee-scrapeScrapingBee scraping - proxy rotation, JavaScript rendering, and CSS extraction
Request body
| Field | Type | Required | Description |
|---|---|---|---|
url | string | Yes | The URL to scrape |
apiKey | string | No | Your ScrapingBee API key (optional, uses system key if not provided) |
renderJs | boolean | No | Render JavaScript (uses more credits)Default: false |
premiumProxy | boolean | No | Use premium proxy poolDefault: false |
countryCode | string | No | Proxy country code (e.g., "us", "uk") |
extractRules | object | No | CSS extraction rules: { title: "h1", links: { selector: "a", type: "list" } } |
waitFor | string | No | CSS selector to wait for |
timeout | integer | No | Timeout in millisecondsDefault: 30000 |
returnScreenshot | boolean | No | Return page screenshotDefault: false |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/scrapingbee-scrape" \
-H "Authorization: Bearer mverse_k_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com",
"renderJs": true,
"extractRules": {
"title": "h1",
"paragraphs": { "selector": "p", "type": "list" }
},
"apiKey": "your-scrapingbee-api-key"
}'/firecrawl-scrapeScrape a single URL and extract content in various formats (markdown, HTML, screenshot, etc.)
Request body
| Field | Type | Required | Description |
|---|---|---|---|
url | string | Yes | The URL to scrape |
formats | array | No | Output formats: markdown, html, rawHtml, links, screenshot, branding, summaryDefault: ["markdown"] |
onlyMainContent | boolean | No | Exclude headers, navs, footersDefault: true |
waitFor | integer | No | Milliseconds to wait for dynamic content |
location | object | No | Geo-targeting: { country: "US", languages: ["en"] } |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/firecrawl-scrape" \
-H "Authorization: Bearer mverse_k_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com",
"formats": ["markdown", "links"],
"onlyMainContent": true
}'/firecrawl-searchSearch the web and optionally scrape content from results
Request body
| Field | Type | Required | Description |
|---|---|---|---|
query | string | Yes | Search query string |
limit | integer | No | Number of results (1-100)Default: 10 |
lang | string | No | Language code (e.g., "en") |
country | string | No | Country code (e.g., "US") |
tbs | string | No | Time filter: qdr:h (hour), qdr:d (day), qdr:w (week), qdr:m (month), qdr:y (year) |
scrapeOptions | object | No | If provided, returns full content from each result |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/firecrawl-search" \
-H "Authorization: Bearer mverse_k_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "latest AI news",
"limit": 5,
"tbs": "qdr:w"
}'/firecrawl-mapQuickly discover all URLs on a website (fast sitemap generation)
Request body
| Field | Type | Required | Description |
|---|---|---|---|
url | string | Yes | The base URL to map |
search | string | No | Filter URLs by keyword (ordered by relevance) |
limit | integer | No | Maximum URLs to returnDefault: 5000 |
includeSubdomains | boolean | No | Include subdomain URLsDefault: false |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/firecrawl-map" \
-H "Authorization: Bearer mverse_k_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com",
"limit": 100
}'/firecrawl-crawlRecursively crawl and scrape all pages on a website
Request body
| Field | Type | Required | Description |
|---|---|---|---|
url | string | Yes | The starting URL to crawl |
limit | integer | No | Maximum pages to crawlDefault: 100 |
maxDepth | integer | No | Maximum link depth to follow |
includePaths | array | No | URL patterns to include |
excludePaths | array | No | URL patterns to exclude |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/firecrawl-crawl" \
-H "Authorization: Bearer mverse_k_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com",
"limit": 50,
"maxDepth": 2
}'/webscraperPuppeteer-based web scraping with JavaScript execution support
Request body
| Field | Type | Required | Description |
|---|---|---|---|
url | string | Yes | The URL to scrape |
selector | string | No | CSS selector to target specific elements |
scrapeType | string | No | Output type: text, html, or screenshotDefault: text |
waitForSelector | string | No | Wait for specific element to appear |
timeout | integer | No | Timeout in millisecondsDefault: 30000 |
executeJavaScript | boolean | No | Execute custom JavaScriptDefault: false |
jsScript | string | No | JavaScript code to execute on page |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/webscraper" \
-H "Authorization: Bearer mverse_k_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com",
"scrapeType": "text",
"selector": "article"
}'Search
AI-powered web search with citations using Perplexity
/perplexity-searchPerform AI-powered web search with grounded responses and citations
Request body
| Field | Type | Required | Description |
|---|---|---|---|
query | string | Yes | The search query |
model | string | No | Model: sonar, sonar-pro, sonar-reasoning, sonar-reasoning-pro, sonar-deep-researchDefault: sonar |
systemPrompt | string | No | System prompt for the AIDefault: Be precise and concise. |
maxTokens | integer | No | Maximum response tokens |
temperature | number | No | Sampling temperature (0-2)Default: 0.2 |
searchDomainFilter | array | No | Domains to include/exclude (prefix with - to exclude) |
searchRecencyFilter | string | No | Time filter: day, week, month, year |
searchMode | string | No | Search mode: web (default), academic, sec |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/perplexity-search" \
-H "Authorization: Bearer mverse_k_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "What are the latest developments in quantum computing?",
"model": "sonar-pro",
"searchRecencyFilter": "week"
}'Semantic Search
AI-powered semantic search with multiple search modes and vector embeddings for content retrieval
/semantic-searchPerform semantic similarity, hybrid, fuzzy, keyword, or multimodal search over indexed content using vector embeddings
Key permission: read
Request body
| Field | Type | Required | Description |
|---|---|---|---|
query | string | Yes | Natural language search query |
searchType | string | No | Search mode: similarity, hybrid, fuzzy, keyword, multimodalDefault: similarity |
vectorProvider | string | No | Vector DB providerDefault: pinecone |
embeddingProvider | string | No | Embedding providerDefault: openai |
embeddingModel | string | No | Embedding model to useDefault: text-embedding-3-small |
topK | integer | No | Maximum results to returnDefault: 10 |
similarityThreshold | number | No | Minimum similarity score (0-1)Default: 0.7 |
dimensions | integer | No | Embedding dimensionsDefault: 1536 |
rerankProvider | string | No | Optional reranking providerDefault: none |
hybridWeights | object | No | Weights for hybrid search: { vector: 0.7, keyword: 0.3 } |
filters | array | No | Array of filter objects: [{ field, operator, value }] |
boosts | array | No | Array of boost objects: [{ field, value, weight }] |
includeMetadata | boolean | No | Include metadata in resultsDefault: true |
includeScore | boolean | No | Include similarity scoresDefault: true |
advancedOptions | object | No | { fuzzyThreshold, expandQuery, spellCheck, diversity } |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/semantic-search" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"query": "How to set up OAuth integration",
"searchType": "hybrid",
"topK": 5,
"similarityThreshold": 0.75,
"hybridWeights": { "vector": 0.7, "keyword": 0.3 }
}'/ai-embeddingsGenerate vector embeddings for text content. Supports OpenAI, Azure, Cohere, HuggingFace, Google, and custom providers.
Key permission: write
Request body
| Field | Type | Required | Description |
|---|---|---|---|
texts | array | Yes | Array of text strings to generate embeddings for |
provider | string | No | Embedding provider: openai, azure, cohere, huggingface, google, custom |
model | string | No | Model name (e.g., text-embedding-3-small) |
dimensions | integer | No | Output embedding dimensionsDefault: 1536 |
batchSize | integer | No | Batch size for processing multiple textsDefault: 100 |
maxLength | integer | No | Max text length before truncationDefault: 512 |
normalization | boolean | No | Normalize vectors to unit lengthDefault: true |
truncation | boolean | No | Truncate texts exceeding maxLengthDefault: true |
customEndpoint | string | No | Custom API endpoint URL (for azure or custom providers) |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/ai-embeddings" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"texts": ["Quantum computing uses quantum bits", "Machine learning models learn from data"],
"provider": "openai",
"model": "text-embedding-3-small",
"dimensions": 1536
}'YouTube
Access YouTube Data API for videos, channels, and playlists
/youtube-apiProxy endpoint for YouTube Data API v3. Requires API key authentication.
Key permission: read
Request body
| Field | Type | Required | Description |
|---|---|---|---|
endpoint | string | Yes | YouTube API endpoint path (e.g., /search, /videos, /channels) |
params | object | No | Query parameters for the YouTube API |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/youtube-api" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"endpoint": "/search",
"params": {
"part": "snippet",
"q": "programming tutorials",
"type": "video",
"maxResults": 10
}
}'QuickTube
YouTube video analysis powered by QuickTube AI - transcripts, summaries, best sections, and more
/quicktube-apiQuickTube AI API - transcribe, summarize, analyze, and extract insights from YouTube videos
Request body
| Field | Type | Required | Description |
|---|---|---|---|
action | string | Yes | Action: transcript, summarize, best-sections, characters, chat, quiz, speech, download-video, video-metadata, video-search, video-comments, batch-process |
url | string | No | YouTube video URL (for transcript, summarize, best-sections, characters, chat, quiz) |
video_id | string | No | YouTube video ID (for metadata, comments, related) |
query | string | No | Search query (for video-search) or chat question (for chat) |
language | string | No | Language code for transcriptsDefault: en |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/quicktube-api" \
-H "Authorization: Bearer mverse_k_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"action": "summarize",
"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
}'/quicktube-api (transcript)Get a full transcript of a YouTube video with timestamps
Request body
| Field | Type | Required | Description |
|---|---|---|---|
action | string | Yes | Set to "transcript" |
url | string | Yes | YouTube video URL |
language | string | No | Language codeDefault: en |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/quicktube-api" \
-H "Authorization: Bearer mverse_k_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"action": "transcript",
"url": "https://www.youtube.com/watch?v=VIDEO_ID"
}'/quicktube-api (best-sections)AI-powered extraction of the most engaging video segments
Request body
| Field | Type | Required | Description |
|---|---|---|---|
action | string | Yes | Set to "best-sections" |
url | string | Yes | YouTube video URL |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/quicktube-api" \
-H "Authorization: Bearer mverse_k_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"action": "best-sections",
"url": "https://www.youtube.com/watch?v=VIDEO_ID"
}'Integrations
Send emails and Slack messages through our integration endpoints
/send-emailSend emails via Resend API
Request body
| Field | Type | Required | Description |
|---|---|---|---|
to | string | array | Yes | Recipient email(s) |
subject | string | Yes | Email subject line |
body | string | Yes | Email content (text or HTML) |
html | boolean | No | Set to true if body contains HTMLDefault: false |
from_name | string | No | Sender display nameDefault: MultiverseAI |
reply_to | string | No | Reply-to email address |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/send-email" \
-H "Content-Type: application/json" \
-d '{
"to": "user@example.com",
"subject": "Welcome to MultiverseAI",
"body": "<h1>Welcome!</h1><p>Thanks for signing up.</p>",
"html": true
}'/slack-webhookSend messages to Slack channels via webhook
Request body
| Field | Type | Required | Description |
|---|---|---|---|
webhook_url | string | Yes | Slack incoming webhook URL |
message | string | No | Message text (required if no attachments) |
channel | string | No | Override default channel |
username | string | No | Override bot username |
icon_emoji | string | No | Override bot icon (e.g., :robot_face:) |
attachments | array | No | Rich message attachments with colors, fields, etc. |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/slack-webhook" \
-H "Content-Type: application/json" \
-d '{
"webhook_url": "https://hooks.slack.com/services/T.../B.../xxx",
"message": "New deployment completed! :rocket:",
"username": "Deploy Bot",
"icon_emoji": ":ship:",
"attachments": [{
"color": "#36a64f",
"title": "Production Deploy",
"fields": [
{ "title": "Version", "value": "v2.1.0", "short": true },
{ "title": "Status", "value": "Success", "short": true }
]
}]
}'GitHub
GitHub App integration for repository access, issues, and pull requests
/github-apiGitHub App API - list installations, repositories, and perform actions
Request body
| Field | Type | Required | Description |
|---|---|---|---|
action | string | Yes | Action: list-installations, list-repos, get-contents, get-file, get-issues, create-issue, create-branch, create-file, create-pr, add-comment, import-repo-context |
installationId | number | No | GitHub App installation ID (required for most actions) |
owner | string | No | Repository owner (required for repo-specific actions) |
repo | string | No | Repository name (required for repo-specific actions) |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/github-api" \
-H "Content-Type: application/json" \
-d '{
"action": "list-installations"
}'/github-api (list-repos)List repositories accessible by a GitHub App installation
Request body
| Field | Type | Required | Description |
|---|---|---|---|
action | string | Yes | Set to "list-repos" |
installationId | number | Yes | GitHub App installation ID |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/github-api" \
-H "Content-Type: application/json" \
-d '{
"action": "list-repos",
"installationId": 12345678
}'/github-api (create-issue)Create a new issue in a GitHub repository
Request body
| Field | Type | Required | Description |
|---|---|---|---|
action | string | Yes | Set to "create-issue" |
installationId | number | Yes | GitHub App installation ID |
owner | string | Yes | Repository owner |
repo | string | Yes | Repository name |
title | string | Yes | Issue title |
body | string | No | Issue body (markdown supported) |
labels | array | No | Array of label names |
assignees | array | No | Array of GitHub usernames to assign |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/github-api" \
-H "Content-Type: application/json" \
-d '{
"action": "create-issue",
"installationId": 12345678,
"owner": "your-org",
"repo": "my-project",
"title": "Bug: Login not working",
"body": "Users are unable to login...",
"labels": ["bug", "high-priority"]
}'/github-api (create-pr)Create a pull request with code changes
Request body
| Field | Type | Required | Description |
|---|---|---|---|
action | string | Yes | Set to "create-pr" |
installationId | number | Yes | GitHub App installation ID |
owner | string | Yes | Repository owner |
repo | string | Yes | Repository name |
title | string | Yes | PR title |
body | string | No | PR description |
head | string | Yes | Branch with changes |
base | string | No | Target branchDefault: main |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/github-api" \
-H "Content-Type: application/json" \
-d '{
"action": "create-pr",
"installationId": 12345678,
"owner": "your-org",
"repo": "my-project",
"title": "Add new feature",
"body": "This PR adds...",
"head": "feature/new-feature",
"base": "main"
}'/github-api (import-repo-context)Import repository code as AI context (useful for code analysis)
Request body
| Field | Type | Required | Description |
|---|---|---|---|
action | string | Yes | Set to "import-repo-context" |
installationId | number | Yes | GitHub App installation ID |
owner | string | Yes | Repository owner |
repo | string | Yes | Repository name |
path | string | No | Subdirectory to import (optional) |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/github-api" \
-H "Content-Type: application/json" \
-d '{
"action": "import-repo-context",
"installationId": 12345678,
"owner": "your-org",
"repo": "my-project",
"path": "src"
}'Discord
Discord bot integration for sending messages, managing webhooks, and slash commands
/discord-apiDiscord API - send messages, manage webhooks, and interact with Discord servers
Request body
| Field | Type | Required | Description |
|---|---|---|---|
action | string | Yes | Action: get-config, list-guilds, get-guild, list-channels, send-message, send-embed, create-webhook, execute-webhook, register-commands, list-commands |
channelId | string | No | Discord channel ID (for message/webhook actions) |
guildId | string | No | Discord guild (server) ID |
content | string | No | Message content |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/discord-api" \
-H "Authorization: Bearer mverse_k_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"action": "get-config"
}'/discord-api (send-message)Send a message to a Discord channel
Request body
| Field | Type | Required | Description |
|---|---|---|---|
action | string | Yes | Set to "send-message" |
channelId | string | Yes | Discord channel ID |
content | string | Yes | Message content |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/discord-api" \
-H "Authorization: Bearer mverse_k_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"action": "send-message",
"channelId": "1234567890123456789",
"content": "Hello from MultiverseAI!"
}'/discord-api (send-embed)Send a rich embed message to a Discord channel
Request body
| Field | Type | Required | Description |
|---|---|---|---|
action | string | Yes | Set to "send-embed" |
channelId | string | Yes | Discord channel ID |
title | string | Yes | Embed title |
description | string | No | Embed description |
color | number | No | Embed color (decimal, default: 5793266) |
fields | array | No | Array of field objects |
footer | string | No | Footer text |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/discord-api" \
-H "Authorization: Bearer mverse_k_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"action": "send-embed",
"channelId": "1234567890123456789",
"title": "Workflow Completed",
"description": "Your AI workflow has finished",
"color": 3066993,
"footer": "MultiverseAI"
}'/discord-api (execute-webhook)Send a message via Discord webhook
Request body
| Field | Type | Required | Description |
|---|---|---|---|
action | string | Yes | Set to "execute-webhook" |
webhookId | string | Yes | Discord webhook ID |
webhookToken | string | Yes | Discord webhook token |
content | string | No | Message content |
username | string | No | Override webhook username |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/discord-api" \
-H "Authorization: Bearer mverse_k_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"action": "execute-webhook",
"webhookId": "1234567890123456789",
"webhookToken": "abc123...",
"content": "New event triggered!",
"username": "Event Bot"
}'/discord-webhookWebhook endpoint for Discord interactions (slash commands, buttons). Configure this URL in Discord Developer Portal.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
type | number | No | Interaction type (1=PING, 2=APPLICATION_COMMAND) |
data | object | No | Interaction data from Discord |
# Discord sends interactions to this endpoint:
https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/discord-webhook
# Set this as your Interactions Endpoint URL in Discord Developer PortalGmail
Send and read emails via Gmail API with OAuth2 authentication
/gmail-apiGmail API - send emails, read inbox, manage labels. Requires Google OAuth connection.
Key permission: integrations
Request body
| Field | Type | Required | Description |
|---|---|---|---|
operation | string | Yes | Operation: send, list, get, search, labels, draft |
userId | string | Yes | User ID (must have connected Google account) |
to | string | No | Recipient email (for send operation) |
subject | string | No | Email subject (for send operation) |
body | string | No | Email body (for send operation) |
cc | string | No | CC recipients (for send/draft) |
bcc | string | No | BCC recipients (for send/draft) |
isHtml | boolean | No | Set to true if body contains HTML (for send/draft)Default: false |
messageId | string | No | Message ID (for get operation) |
query | string | No | Gmail search query (for search operation) |
maxResults | integer | No | Max messages to return (for list/search)Default: 20 |
labelIds | array | No | Filter by label IDs, e.g. ["INBOX", "UNREAD"] (for list) |
includeBody | boolean | No | Fetch full message bodies (for list/search) |
format | string | No | Message format: full or minimal (for get)Default: full |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/gmail-api" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"operation": "send",
"userId": "user_abc123",
"to": "recipient@example.com",
"subject": "Hello from MultiverseAI",
"body": "This email was sent via the Gmail integration."
}'/gmail-api (list)List inbox messages with optional label and search filtering
Key permission: integrations
Request body
| Field | Type | Required | Description |
|---|---|---|---|
operation | string | Yes | Set to "list" |
userId | string | Yes | User ID |
maxResults | integer | No | Maximum messages to returnDefault: 20 |
labelIds | array | No | Filter by label IDs (e.g., ["INBOX", "UNREAD"]) |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/gmail-api" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"operation": "list",
"userId": "user_abc123",
"maxResults": 10
}'Google Drive
Upload, download, and manage files in Google Drive via OAuth2. Supports 12 operations including search, copy, move, and sharing.
/google-drive-apiGoogle Drive API - list, search, get, create, update, delete, download, upload, copy, move, create_folder, and share files. Requires Google OAuth.
Key permission: integrations
Request body
| Field | Type | Required | Description |
|---|---|---|---|
operation | string | Yes | Operation: list, search, get, create, update, delete, download, upload, copy, move, create_folder, share |
userId | string | Yes | User ID (must have connected Google account) |
fileId | string | No | File ID (required for get, update, delete, download, copy, move, share) |
folderId | string | No | Parent folder ID (for list, upload, create_folder) |
name | string | No | File/folder name (for create, upload, copy, create_folder) |
content | string | No | File content (for create, upload, update) |
mimeType | string | No | MIME type (for create, upload)Default: application/octet-stream |
description | string | No | File description (for create, update) |
query | string | No | Search query (for list, search) |
pageSize | integer | No | Max results per page (for list, search)Default: 10 |
pageToken | string | No | Pagination token for next page |
shareEmail | string | No | Email to share with (required for share) |
shareRole | string | No | Share permission: reader, writer, commenterDefault: reader |
destinationFolderId | string | No | Target folder ID (required for move) |
exportMimeType | string | No | Export format for Google Docs files (for download) |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/google-drive-api" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"operation": "list",
"userId": "user_abc123",
"folderId": "root",
"pageSize": 20
}'/google-drive-api (upload)Upload a file to Google Drive with optional folder placement. Supports multipart uploads.
Key permission: integrations
Request body
| Field | Type | Required | Description |
|---|---|---|---|
operation | string | Yes | Set to "upload" |
userId | string | Yes | User ID |
fileName | string | Yes | File name |
content | string | Yes | File content |
mimeType | string | No | MIME type |
folderId | string | No | Parent folder ID |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/google-drive-api" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"operation": "upload",
"userId": "user_abc123",
"fileName": "report.txt",
"content": "Report content here...",
"mimeType": "text/plain",
"folderId": "folder_123"
}'/google-drive-api (share)Share a file or folder with another user via email
Key permission: integrations
Request body
| Field | Type | Required | Description |
|---|---|---|---|
operation | string | Yes | Set to "share" |
userId | string | Yes | User ID |
fileId | string | Yes | File or folder ID to share |
shareEmail | string | Yes | Recipient email address |
shareRole | string | No | Permission level: reader, writer, commenterDefault: reader |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/google-drive-api" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"operation": "share",
"userId": "user_abc123",
"fileId": "file_abc123",
"shareEmail": "colleague@example.com",
"shareRole": "writer"
}'Google Docs
Create, read, update, and export Google Docs via OAuth2
/google-docs-apiGoogle Docs API - create, get, get_content, update, append, and export documents. Requires Google OAuth connection.
Key permission: integrations
Request body
| Field | Type | Required | Description |
|---|---|---|---|
operation | string | Yes | Operation: create, get, get_content, update, append, export |
userId | string | Yes | User ID (must have connected Google account) |
documentId | string | No | Document ID (required for get, get_content, update, append, export) |
title | string | No | Document title (required for create) |
content | string | No | Document content (required for create, update, append) |
folderId | string | No | Google Drive folder ID to place document in (for create) |
insertLocation | string | No | Where to insert content: start, end, or index (for update, default: end) |
exportFormat | string | No | Export format: pdf, docx, txt, html, odt, rtf (for export, default: pdf) |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/google-docs-api" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"operation": "create",
"userId": "user_abc123",
"title": "Meeting Notes",
"content": "# Meeting Notes\n\n- Item 1\n- Item 2",
"folderId": "folder_optional_123"
}'/google-docs-api (get_content)Extract plain text from a Google Doc, including content from paragraphs and tables
Key permission: integrations
Request body
| Field | Type | Required | Description |
|---|---|---|---|
operation | string | Yes | Set to "get_content" |
userId | string | Yes | User ID |
documentId | string | Yes | Google Docs document ID |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/google-docs-api" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"operation": "get_content",
"userId": "user_abc123",
"documentId": "1BxiMVs0XRA5nFMdKvBdBZjgmUii7Op3Lr32456"
}'/google-docs-api (append)Append content to the end of a Google Doc with automatic newline separator
Key permission: integrations
Request body
| Field | Type | Required | Description |
|---|---|---|---|
operation | string | Yes | Set to "append" |
userId | string | Yes | User ID |
documentId | string | Yes | Google Docs document ID |
content | string | Yes | Content to append |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/google-docs-api" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"operation": "append",
"userId": "user_abc123",
"documentId": "1BxiMVs0XRA5nFMdKvBdBZjgmUii7Op3Lr32456",
"content": "\nNew section added via API"
}'/google-docs-api (export)Export a Google Doc to PDF, DOCX, TXT, HTML, ODT, or RTF. Binary formats are returned as base64.
Key permission: integrations
Request body
| Field | Type | Required | Description |
|---|---|---|---|
operation | string | Yes | Set to "export" |
userId | string | Yes | User ID |
documentId | string | Yes | Google Docs document ID |
exportFormat | string | No | Format: pdf, docx, txt, html, odt, rtfDefault: pdf |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/google-docs-api" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"operation": "export",
"userId": "user_abc123",
"documentId": "1BxiMVs0XRA5nFMdKvBdBZjgmUii7Op3Lr32456",
"exportFormat": "pdf"
}'/google-docs-exportCreate a formatted Google Doc with styled headers and sections. Applies bold formatting and font sizing automatically.
Key permission: integrations
Request body
| Field | Type | Required | Description |
|---|---|---|---|
userId | string | Yes | User ID |
title | string | Yes | Document title |
content | string | Yes | Document content (sections split by newlines, headers auto-detected) |
accessToken | string | No | Optional Google access token (fetched from DB if not provided) |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/google-docs-export" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"userId": "user_abc123",
"title": "Quarterly Report",
"content": "Revenue Summary\n---\nQ1 revenue grew 15% YoY..."
}'Google Workspace
Sheets, Slides, Calendar, Forms, Tasks, Contacts, Chat and Meet as the caller's connected Google account
/google-workspace-api (sheets)Google Sheets: read, append, write, findRows, clear, create, addSheet, get. Runs as the Google account connected in Settings → Integrations.
Key permission: integrations
Request body
| Field | Type | Required | Description |
|---|---|---|---|
service | string | Yes | "sheets" |
operation | string | Yes | read (Values in a range, plus rows keyed by the header row); append (Adds rows after the last row of a table); write (Overwrites the cells of a range); findRows (Rows whose column (by header name) equals a value); clear (Clears values (keeps formatting)); create (A new spreadsheet, optionally with tabs and a header row); addSheet (Adds a sheet (tab) to a spreadsheet); get (Title, URL and tabs) |
params | object | Yes | read: spreadsheetId*, range, headerRow · append: spreadsheetId*, range, values*, valueInputOption · write: spreadsheetId*, range*, values*, valueInputOption · findRows: spreadsheetId*, range, column*, value, maxResults · clear: spreadsheetId*, range* · create: title, sheetTitles, headers · addSheet: spreadsheetId*, title* · get: spreadsheetId* |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/google-workspace-api" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"service": "sheets", "operation": "read", "params": {"spreadsheetId":"<spreadsheet>"}}'/google-workspace-api (slides)Google Slides: create, addSlide, replaceText, get. Runs as the Google account connected in Settings → Integrations.
Key permission: integrations
Request body
| Field | Type | Required | Description |
|---|---|---|---|
service | string | Yes | "slides" |
operation | string | Yes | create (A new, empty deck); addSlide (A slide with a title and body text); replaceText (Fills a template deck: every match in every slide); get (Title, URL and each slide's text) |
params | object | Yes | create: title · addSlide: presentationId*, title, body, layout, insertionIndex · replaceText: presentationId*, replacements, find, replace, matchCase · get: presentationId* |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/google-workspace-api" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"service": "slides", "operation": "create", "params": {}}'/google-workspace-api (calendar)Google Calendar: createEvent, listEvents, getEvent, updateEvent, deleteEvent, quickAdd, freeBusy, listCalendars. Runs as the Google account connected in Settings → Integrations.
Key permission: integrations
Request body
| Field | Type | Required | Description |
|---|---|---|---|
service | string | Yes | "calendar" |
operation | string | Yes | createEvent (Invites guests; can add a Meet link); listEvents (Upcoming events (from now unless set)); getEvent (One event by ID); updateEvent (Changes only the fields you fill in); deleteEvent (Cancels the event); quickAdd (An event from a sentence); freeBusy (Busy blocks per calendar); listCalendars (Calendars you can see, with their IDs) |
params | object | Yes | createEvent: calendarId, summary*, start*, end, durationMinutes, timeZone, attendees, location, description, addMeet, sendUpdates · listEvents: calendarId, timeMin, timeMax, query, maxResults · getEvent: calendarId, eventId* · updateEvent: eventId*, calendarId, summary, start, end, durationMinutes, timeZone, attendees, location, description, addMeet, sendUpdates · deleteEvent: calendarId, eventId*, sendUpdates · quickAdd: calendarId, text* · freeBusy: calendars, timeMin, timeMax, timeZone · listCalendars: none |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/google-workspace-api" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"service": "calendar", "operation": "createEvent", "params": {"summary":"<title>","start":"<start>"}}'/google-workspace-api (forms)Google Forms: listResponses, getResponse, create, addQuestion, get. Runs as the Google account connected in Settings → Integrations.
Key permission: integrations
Request body
| Field | Type | Required | Description |
|---|---|---|---|
service | string | Yes | "forms" |
operation | string | Yes | listResponses (Answers keyed by question title); getResponse (One response by ID); create (A new form; add questions with Add question); addQuestion (Appends a question); get (Title, links and questions) |
params | object | Yes | listResponses: formId*, since, maxResults · getResponse: formId*, responseId* · create: title*, description · addQuestion: formId*, title*, questionType, options, required · get: formId* |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/google-workspace-api" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"service": "forms", "operation": "listResponses", "params": {"formId":"<form>"}}'/google-workspace-api (tasks)Google Tasks: createTask, listTasks, completeTask, updateTask, deleteTask, listTaskLists. Runs as the Google account connected in Settings → Integrations.
Key permission: integrations
Request body
| Field | Type | Required | Description |
|---|---|---|---|
service | string | Yes | "tasks" |
operation | string | Yes | createTask (Adds a task to a list); listTasks (Open tasks (and completed ones if asked)); completeTask (Marks a task done); updateTask (Changes only the fields you fill in); deleteTask (Removes a task); listTaskLists (Your lists, with their IDs) |
params | object | Yes | createTask: taskListId, title*, notes, due · listTasks: taskListId, showCompleted, dueMax, maxResults · completeTask: taskListId, taskId* · updateTask: taskListId, taskId*, title, notes, due · deleteTask: taskListId, taskId* · listTaskLists: none |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/google-workspace-api" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"service": "tasks", "operation": "createTask", "params": {"title":"<title>"}}'/google-workspace-api (contacts)Google Contacts: search, create, update, get, list, delete. Runs as the Google account connected in Settings → Integrations.
Key permission: integrations
Request body
| Field | Type | Required | Description |
|---|---|---|---|
service | string | Yes | "contacts" |
operation | string | Yes | search (By name, email or phone); create (Adds a contact); update (Replaces the fields you fill in); get (One contact); list (Most recently changed first); delete (Removes a contact) |
params | object | Yes | search: query*, maxResults · create: givenName, familyName, email, phone, organization, title, notes · update: resourceName*, givenName, familyName, email, phone, organization, title, notes · get: resourceName* · list: maxResults · delete: resourceName* |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/google-workspace-api" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"service": "contacts", "operation": "search", "params": {"query":"<search>"}}'/google-workspace-api (chat)Google Chat: sendMessage, listSpaces, listMessages, updateMessage, deleteMessage. Runs as the Google account connected in Settings → Integrations.
Key permission: integrations
Request body
| Field | Type | Required | Description |
|---|---|---|---|
service | string | Yes | "chat" |
operation | string | Yes | sendMessage (Posts to a space as you); listSpaces (Spaces and DMs you're in, with their names); listMessages (Latest messages in a space); updateMessage (Replaces the text of your message); deleteMessage (Deletes your message) |
params | object | Yes | sendMessage: space*, text*, threadKey · listSpaces: maxResults · listMessages: space*, maxResults · updateMessage: messageName*, text* · deleteMessage: messageName* |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/google-workspace-api" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"service": "chat", "operation": "sendMessage", "params": {"space":"<space>","text":"<message>"}}'/google-workspace-api (meet)Google Meet: createSpace, getSpace, endConference. Runs as the Google account connected in Settings → Integrations.
Key permission: integrations
Request body
| Field | Type | Required | Description |
|---|---|---|---|
service | string | Yes | "meet" |
operation | string | Yes | createSpace (A new Meet link you can share or put in an event); getSpace (Link, code and whether a call is in progress); endConference (Ends the call in progress (meetings this app created)) |
params | object | Yes | createSpace: accessType · getSpace: space* · endConference: space* |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/google-workspace-api" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"service": "meet", "operation": "createSpace", "params": {}}'Google Photos
Access Google Photos albums and media items via OAuth2
/google-photos-apiGoogle Photos API - list albums, get media items, and search photos. Requires Google OAuth connection.
Key permission: integrations
Request body
| Field | Type | Required | Description |
|---|---|---|---|
operation | string | Yes | Operation: listAlbums, getAlbum, listMediaItems, getMediaItem, searchMediaItems |
userId | string | Yes | User ID (must have connected Google account with Photos scope) |
albumId | string | No | Album ID (for getAlbum, listMediaItems) |
mediaItemId | string | No | Media item ID (for getMediaItem) |
pageSize | integer | No | Number of items to returnDefault: 25 |
pageToken | string | No | Pagination token for next page |
filters | object | No | Search filters (for search-media): { dateFilter, contentFilter, mediaTypeFilter } |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/google-photos-api" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"operation": "list-albums",
"userId": "user_abc123",
"pageSize": 20
}'Jira
Jira integration for project management, issue tracking, and sprint planning
/jira-integrationJira API - list projects, create/update issues, add comments, and manage sprints.
Key permission: integrations
Request body
| Field | Type | Required | Description |
|---|---|---|---|
operation | string | Yes | Operation: list-projects, get-issue, create-issue, update-issue, search-issues, add-comment, get-transitions, transition-issue |
userId | string | Yes | User ID |
projectKey | string | No | Jira project key (e.g., "PROJ") |
issueKey | string | No | Issue key (e.g., "PROJ-123") |
summary | string | No | Issue summary (for create) |
description | string | No | Issue description (for create) |
issueType | string | No | Issue type: Task, Bug, Story, EpicDefault: Task |
transitionId | string | No | Transition ID (for transition-issue) |
comment | string | No | Comment body (for add-comment) |
jql | string | No | JQL query string (for search-issues) |
maxResults | integer | No | Max results for search-issuesDefault: 50 |
labels | array | No | Array of label names (for create/update) |
assignee | string | No | Jira accountId of assignee |
customFields | object | No | Custom field key-value pairs (pass-through) |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/jira-integration" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"operation": "create-issue",
"userId": "user_abc123",
"projectKey": "PROJ",
"summary": "Implement OAuth refresh",
"description": "Add automatic token refresh for Google OAuth",
"issueType": "Task"
}'Facebook Ads
Facebook/Meta Ads API for campaign management, performance insights, and AI-powered optimization
/facebook-ads-apiFacebook Ads API - access ad accounts, campaigns, and performance metrics
Request body
| Field | Type | Required | Description |
|---|---|---|---|
operation | string | Yes | Operation: get-ad-accounts, get-campaigns, get-adsets, get-ads, get-insights, get-account-insights, analyze-performance |
userId | string | No | Optional. Defaults to the owner of the API key; any other user is rejected (403). |
params | object | No | Operation-specific parameters |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/facebook-ads-api" \
-H "Authorization: Bearer mverse_k_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"operation": "get-ad-accounts",
"userId": "user_abc123"
}'/facebook-ads-api (get-campaigns)Get all campaigns for an ad account
Request body
| Field | Type | Required | Description |
|---|---|---|---|
operation | string | Yes | Set to "get-campaigns" |
userId | string | No | Optional. Defaults to the owner of the API key; any other user is rejected (403). |
params | object | Yes | { adAccountId: "act_123...", limit: 50 } |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/facebook-ads-api" \
-H "Authorization: Bearer mverse_k_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"operation": "get-campaigns",
"userId": "user_abc123",
"params": {
"adAccountId": "act_123456789",
"limit": 20
}
}'/facebook-ads-api (get-insights)Get performance metrics and insights for campaigns, ad sets, or ads
Request body
| Field | Type | Required | Description |
|---|---|---|---|
operation | string | Yes | Set to "get-insights" |
userId | string | No | Optional. Defaults to the owner of the API key; any other user is rejected (403). |
params | object | Yes | { objectId, datePreset, level, breakdown } |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/facebook-ads-api" \
-H "Authorization: Bearer mverse_k_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"operation": "get-insights",
"userId": "user_abc123",
"params": {
"objectId": "act_123456789",
"datePreset": "last_30d",
"level": "campaign"
}
}'/facebook-ads-api (analyze-performance)AI-powered analysis of ad performance with optimization recommendations
Request body
| Field | Type | Required | Description |
|---|---|---|---|
operation | string | Yes | Set to "analyze-performance" |
userId | string | No | Optional. Defaults to the owner of the API key; any other user is rejected (403). |
params | object | Yes | { adAccountId, datePreset } |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/facebook-ads-api" \
-H "Authorization: Bearer mverse_k_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"operation": "analyze-performance",
"userId": "user_abc123",
"params": {
"adAccountId": "act_123456789",
"datePreset": "last_30d"
}
}'Facebook Fundraisers
Create and manage Facebook fundraisers for nonprofits. Requires manage_fundraisers permission.
/facebook-fundraiser-api (get-fundraisers)Get all fundraisers for the authenticated user
Request body
| Field | Type | Required | Description |
|---|---|---|---|
operation | string | Yes | Set to "get-fundraisers" |
userId | string | No | Optional. Defaults to the owner of the API key; any other user is rejected (403). |
params | object | No | { limit } |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/facebook-fundraiser-api" \
-H "Authorization: Bearer mverse_k_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"operation": "get-fundraisers",
"userId": "user_abc123",
"params": { "limit": 50 }
}'/facebook-fundraiser-api (create-fundraiser)Create a new fundraiser for a registered charity
Request body
| Field | Type | Required | Description |
|---|---|---|---|
operation | string | Yes | Set to "create-fundraiser" |
userId | string | No | Optional. Defaults to the owner of the API key; any other user is rejected (403). |
params | object | Yes | { charityId, name, description, goalAmount, currency, endTime } |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/facebook-fundraiser-api" \
-H "Authorization: Bearer mverse_k_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"operation": "create-fundraiser",
"userId": "user_abc123",
"params": {
"charityId": "charity_123",
"name": "Marathon for Clean Water",
"description": "Running to raise funds for clean water projects",
"goalAmount": 5000,
"currency": "USD"
}
}'/facebook-fundraiser-api (get-donations)Get donations for a specific fundraiser
Request body
| Field | Type | Required | Description |
|---|---|---|---|
operation | string | Yes | Set to "get-donations" |
userId | string | No | Optional. Defaults to the owner of the API key; any other user is rejected (403). |
params | object | Yes | { fundraiserId, limit } |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/facebook-fundraiser-api" \
-H "Authorization: Bearer mverse_k_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"operation": "get-donations",
"userId": "user_abc123",
"params": {
"fundraiserId": "123456789",
"limit": 100
}
}'/facebook-fundraiser-api (sync-amount)Sync external fundraiser amount with Facebook fundraiser
Request body
| Field | Type | Required | Description |
|---|---|---|---|
operation | string | Yes | Set to "sync-amount" |
userId | string | No | Optional. Defaults to the owner of the API key; any other user is rejected (403). |
params | object | Yes | { fundraiserId, externalAmountRaised } |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/facebook-fundraiser-api" \
-H "Authorization: Bearer mverse_k_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"operation": "sync-amount",
"userId": "user_abc123",
"params": {
"fundraiserId": "123456789",
"externalAmountRaised": 7500
}
}'/facebook-fundraiser-api (analyze-fundraiser)AI-powered analysis of fundraiser performance with recommendations
Request body
| Field | Type | Required | Description |
|---|---|---|---|
operation | string | Yes | Set to "analyze-fundraiser" |
userId | string | No | Optional. Defaults to the owner of the API key; any other user is rejected (403). |
params | object | Yes | { fundraiserId } |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/facebook-fundraiser-api" \
-H "Authorization: Bearer mverse_k_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"operation": "analyze-fundraiser",
"userId": "user_abc123",
"params": {
"fundraiserId": "123456789"
}
}'Meta Messaging
Send and receive messages via WhatsApp, Messenger, and Instagram. Requires appropriate Meta permissions.
/meta-messaging-api (whatsapp-send-message)Send a message via WhatsApp Business API
Request body
| Field | Type | Required | Description |
|---|---|---|---|
operation | string | Yes | Set to "whatsapp-send-message" |
userId | string | No | Optional. Defaults to the owner of the API key; any other user is rejected (403). |
platform | string | Yes | Set to "whatsapp" |
params | object | Yes | { recipientPhone, text, messageType?, mediaUrl? } |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/meta-messaging-api" \
-H "Authorization: Bearer mverse_k_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"operation": "whatsapp-send-message",
"userId": "user_abc123",
"platform": "whatsapp",
"params": {
"recipientPhone": "+1234567890",
"text": "Hello from MultiverseAI!"
}
}'/meta-messaging-api (whatsapp-send-template)Send a pre-approved WhatsApp message template
Request body
| Field | Type | Required | Description |
|---|---|---|---|
operation | string | Yes | Set to "whatsapp-send-template" |
userId | string | No | Optional. Defaults to the owner of the API key; any other user is rejected (403). |
platform | string | Yes | Set to "whatsapp" |
params | object | Yes | { recipientPhone, templateName, languageCode? } |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/meta-messaging-api" \
-H "Authorization: Bearer mverse_k_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"operation": "whatsapp-send-template",
"userId": "user_abc123",
"platform": "whatsapp",
"params": {
"recipientPhone": "+1234567890",
"templateName": "order_confirmation",
"languageCode": "en"
}
}'/meta-messaging-api (messenger-send-message)Send a message via Facebook Messenger
Request body
| Field | Type | Required | Description |
|---|---|---|---|
operation | string | Yes | Set to "messenger-send-message" |
userId | string | No | Optional. Defaults to the owner of the API key; any other user is rejected (403). |
platform | string | Yes | Set to "messenger" |
params | object | Yes | { recipientId, text, quickReplies? } |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/meta-messaging-api" \
-H "Authorization: Bearer mverse_k_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"operation": "messenger-send-message",
"userId": "user_abc123",
"platform": "messenger",
"params": {
"recipientId": "psid_123456",
"text": "Thanks for contacting us!",
"quickReplies": [
{ "title": "View Order", "payload": "view_order" },
{ "title": "Contact Support", "payload": "support" }
]
}
}'/meta-messaging-api (messenger-get-conversations)Get conversations from Facebook Messenger inbox
Request body
| Field | Type | Required | Description |
|---|---|---|---|
operation | string | Yes | Set to "messenger-get-conversations" |
userId | string | No | Optional. Defaults to the owner of the API key; any other user is rejected (403). |
platform | string | Yes | Set to "messenger" |
params | object | No | { limit? } |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/meta-messaging-api" \
-H "Authorization: Bearer mverse_k_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"operation": "messenger-get-conversations",
"userId": "user_abc123",
"platform": "messenger",
"params": { "limit": 25 }
}'/meta-messaging-api (instagram-send-message)Send a direct message via Instagram
Request body
| Field | Type | Required | Description |
|---|---|---|---|
operation | string | Yes | Set to "instagram-send-message" |
userId | string | No | Optional. Defaults to the owner of the API key; any other user is rejected (403). |
platform | string | Yes | Set to "instagram" |
params | object | Yes | { recipientId, text, mediaUrl? } |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/meta-messaging-api" \
-H "Authorization: Bearer mverse_k_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"operation": "instagram-send-message",
"userId": "user_abc123",
"platform": "instagram",
"params": {
"recipientId": "igsid_123456",
"text": "Thanks for your message!"
}
}'/meta-messaging-api (instagram-get-conversations)Get DM conversations from Instagram inbox
Request body
| Field | Type | Required | Description |
|---|---|---|---|
operation | string | Yes | Set to "instagram-get-conversations" |
userId | string | No | Optional. Defaults to the owner of the API key; any other user is rejected (403). |
platform | string | Yes | Set to "instagram" |
params | object | No | { limit? } |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/meta-messaging-api" \
-H "Authorization: Bearer mverse_k_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"operation": "instagram-get-conversations",
"userId": "user_abc123",
"platform": "instagram",
"params": { "limit": 25 }
}'TikTok Ads
TikTok Business API for ad management, campaigns, audiences, pixels, and automated rules
/tiktok-apiTikTok Business API - manage advertisers, campaigns, ad groups, and ads. Requires TikTok OAuth connection.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
operation | string | Yes | Operation: get-advertiser-info, get-campaigns, get-adgroups, get-ads, get-reporting, get-audiences, get-pixels |
userId | string | No | Optional. Defaults to the owner of the API key; any other user is rejected (403). |
advertiserId | string | No | TikTok Advertiser ID |
params | object | No | Operation-specific parameters |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/tiktok-api" \
-H "Authorization: Bearer mverse_k_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"operation": "get-advertiser-info",
"userId": "user_abc123"
}'/tiktok-ads-apiTikTok Ads Management - create, update, and manage ad campaigns and ad groups
Request body
| Field | Type | Required | Description |
|---|---|---|---|
operation | string | Yes | Operation: create-campaign, update-campaign, create-adgroup, update-adgroup, create-ad, get-ad-insights |
userId | string | No | Optional. Defaults to the owner of the API key; any other user is rejected (403). |
advertiserId | string | Yes | TikTok Advertiser ID |
params | object | Yes | Campaign/ad group/ad parameters |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/tiktok-ads-api" \
-H "Authorization: Bearer mverse_k_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"operation": "get-ad-insights",
"userId": "user_abc123",
"advertiserId": "12345678",
"params": {
"dateRange": "last_7_days",
"metrics": ["impressions", "clicks", "spend", "conversions"]
}
}'/tiktok-pixel-apiTikTok Pixel Management - create, manage, and monitor pixels and conversion events
Request body
| Field | Type | Required | Description |
|---|---|---|---|
operation | string | Yes | Operation: create-pixel, get-pixels, get-pixel-stats, manage-events |
userId | string | No | Optional. Defaults to the owner of the API key; any other user is rejected (403). |
advertiserId | string | Yes | TikTok Advertiser ID |
params | object | No | Pixel-specific parameters |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/tiktok-pixel-api" \
-H "Authorization: Bearer mverse_k_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"operation": "get-pixels",
"userId": "user_abc123",
"advertiserId": "12345678"
}'/tiktok-automated-rules-apiTikTok Automated Rules - create and manage automated optimization rules for ads
Request body
| Field | Type | Required | Description |
|---|---|---|---|
operation | string | Yes | Operation: create-rule, get-rules, update-rule, delete-rule, get-rule-results |
userId | string | No | Optional. Defaults to the owner of the API key; any other user is rejected (403). |
advertiserId | string | Yes | TikTok Advertiser ID |
params | object | No | Rule-specific parameters |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/tiktok-automated-rules-api" \
-H "Authorization: Bearer mverse_k_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"operation": "get-rules",
"userId": "user_abc123",
"advertiserId": "12345678"
}'/tiktok-rf-apiTikTok Reach & Frequency - plan and manage R&F campaigns with guaranteed delivery
Request body
| Field | Type | Required | Description |
|---|---|---|---|
operation | string | Yes | Operation: estimate-inventory, create-order, get-orders |
userId | string | No | Optional. Defaults to the owner of the API key; any other user is rejected (403). |
advertiserId | string | Yes | TikTok Advertiser ID |
params | object | No | R&F campaign parameters |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/tiktok-rf-api" \
-H "Authorization: Bearer mverse_k_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"operation": "estimate-inventory",
"userId": "user_abc123",
"advertiserId": "12345678",
"params": {
"targeting": { "location": ["US"], "age": ["18-24", "25-34"] },
"budget": 5000
}
}'Email Templates
Styled email templates for transactional emails (welcome, password reset, notifications)
/email-templatesGenerate and send styled HTML emails using pre-built templates
Request body
| Field | Type | Required | Description |
|---|---|---|---|
template | string | Yes | Template: welcome, password_reset, notification, team_invite, task_assigned |
to | string | Yes | Recipient email address |
data | object | Yes | Template-specific data (e.g., { userName, teamName, inviteLink }) |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/email-templates" \
-H "Authorization: Bearer mverse_k_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"template": "welcome",
"to": "newuser@example.com",
"data": {
"userName": "Jane Doe",
"loginUrl": "https://multiverse-ai.lovable.app/auth"
}
}'Task Notifications
Send task-related notifications for due dates, assignments, and @mentions
/task-notificationsTrigger task notifications for due date reminders, assignment alerts, and comment mentions
Key permission: tasks
Request body
| Field | Type | Required | Description |
|---|---|---|---|
type | string | Yes | Notification type: due-reminder, assignment, mention |
taskId | string | Yes | Task ID |
userId | string | Yes | User ID triggering the notification |
targetUserId | string | No | Target user to notify (for assignment/mention) |
message | string | No | Optional custom message |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/task-notifications" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"type": "assignment",
"taskId": "task_abc123",
"userId": "user_sender",
"targetUserId": "user_recipient",
"message": "You have been assigned to: Fix login bug"
}'MCP Server
Model Context Protocol (MCP) server for AI agent integrations. Allows external AI agents like Claude, Cursor, Windsurf, or custom agents to use MultiverseAI programmatically via the Streamable HTTP transport (JSON-RPC over POST): agents, workflows, contexts, the prompt queue, chat, images, video, agent tools, tasks, teams and social posting. Tools that call AI models use your credits; developer-key switches (tasks, workflows, agents) apply as in the REST API.
/mcp-serverMCP Streamable HTTP endpoint. Authenticate with your API key and call tools/list to discover all 51 available tools. Tool errors (including MultiverseAI API errors such as INSUFFICIENT_CREDITS) come back as results with isError: true and the error message. Compatible with any MCP client (Claude Desktop, Cursor, Windsurf, custom agents).
Request body
| Field | Type | Required | Description |
|---|---|---|---|
jsonrpc | string | Yes | Must be "2.0"Default: 2.0 |
id | number | Yes | Request ID |
method | string | Yes | MCP method: tools/list or tools/call |
curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/mcp-server" \
-H "Authorization: Bearer mverse_k_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list"
}'/mcp-serverlist_agents — List all AI agents. Filter by status (draft/published/archived) and pagination.
Key permission: agents
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: list_agents |
params.arguments.status | string | No | Filter: draft, published, archived |
params.arguments.include_archived | boolean | No | Include archived agents (default false) |
params.arguments.limit | number | No | Max results (default 50, max 200) |
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "list_agents",
"arguments": {
"status": "published",
"limit": 10
}
}
}/mcp-serverget_agent — Get detailed agent info including linked context, workflows, custom tools, and version history.
Key permission: agents
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: get_agent |
params.arguments.agent_id | string | Yes | The agent UUID |
{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "get_agent",
"arguments": {
"agent_id": "abc-123"
}
}
}/mcp-servercreate_agent — Create a new AI agent with name, instructions, model, personality, and optional context attachment.
Key permission: agents
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: create_agent |
params.arguments.name | string | Yes | Agent name |
params.arguments.description | string | No | Agent description |
params.arguments.instructions | string | No | System instructions |
params.arguments.default_model | string | No | AI model (default: google/gemini-3-flash-preview) |
params.arguments.personality_template | string | No | professional | casual | technical | friendly | creative |
params.arguments.response_length | string | No | concise | balanced | detailed |
params.arguments.context_id | string | No | UUID of a prompt context to attach |
params.arguments.status | string | No | draft | published (default: draft) |
{
"jsonrpc": "2.0",
"id": 4,
"method": "tools/call",
"params": {
"name": "create_agent",
"arguments": {
"name": "Sales Assistant",
"description": "Helps qualify leads and answer product questions",
"instructions": "You are a knowledgeable sales assistant for MultiverseAI...",
"default_model": "google/gemini-3-flash-preview",
"personality_template": "professional",
"response_length": "balanced",
"status": "draft"
}
}
}/mcp-serverupdate_agent — Update an agent's name, instructions, model, personality, status, or linked context.
Key permission: agents
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: update_agent |
params.arguments.agent_id | string | Yes | |
params.arguments.name | string | No | |
params.arguments.instructions | string | No | |
params.arguments.default_model | string | No | |
params.arguments.personality_template | string | No | |
params.arguments.response_length | string | No | |
params.arguments.context_id | string | No | |
params.arguments.status | string | No | draft | published | archived |
{
"jsonrpc": "2.0",
"id": 5,
"method": "tools/call",
"params": {
"name": "update_agent",
"arguments": {
"agent_id": "abc-123",
"status": "published",
"instructions": "Updated instructions..."
}
}
}/mcp-serverdelete_agent — Permanently delete an AI agent. Irreversible.
Key permission: agents
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: delete_agent |
params.arguments.agent_id | string | Yes |
{
"jsonrpc": "2.0",
"id": 6,
"method": "tools/call",
"params": {
"name": "delete_agent",
"arguments": {
"agent_id": "abc-123"
}
}
}/mcp-serverlist_workflows — List all workflows. Filter by active status, with pagination.
Key permission: workflows
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: list_workflows |
params.arguments.limit | number | No | Max results (default 50, max 200) |
params.arguments.is_active | boolean | No | Filter by active status |
{
"jsonrpc": "2.0",
"id": 7,
"method": "tools/call",
"params": {
"name": "list_workflows",
"arguments": {
"is_active": true,
"limit": 10
}
}
}/mcp-serverget_workflow — Get full workflow details including all nodes and edges.
Key permission: workflows
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: get_workflow |
params.arguments.workflow_id | string | Yes |
{
"jsonrpc": "2.0",
"id": 8,
"method": "tools/call",
"params": {
"name": "get_workflow",
"arguments": {
"workflow_id": "wf-123"
}
}
}/mcp-servercreate_workflow — Create a new workflow with optional initial nodes, edges, category, and tags.
Key permission: workflows
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: create_workflow |
params.arguments.name | string | Yes | |
params.arguments.description | string | No | |
params.arguments.nodes | array | No | Initial node definitions (JSON) |
params.arguments.edges | array | No | Initial edge definitions (JSON) |
params.arguments.category | string | No | |
params.arguments.tags | array | No | |
params.arguments.is_active | boolean | No |
{
"jsonrpc": "2.0",
"id": 9,
"method": "tools/call",
"params": {
"name": "create_workflow",
"arguments": {
"name": "Email Digest",
"description": "Daily summary workflow",
"is_active": true
}
}
}/mcp-serverupdate_workflow — Update a workflow's name, description, nodes, edges, status, category, tags, or active status.
Key permission: workflows
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: update_workflow |
params.arguments.workflow_id | string | Yes | |
params.arguments.name | string | No | |
params.arguments.description | string | No | |
params.arguments.nodes | array | No | |
params.arguments.edges | array | No | |
params.arguments.status | string | No | |
params.arguments.is_active | boolean | No |
{
"jsonrpc": "2.0",
"id": 10,
"method": "tools/call",
"params": {
"name": "update_workflow",
"arguments": {
"workflow_id": "wf-123",
"is_active": false
}
}
}/mcp-serverdelete_workflow — Permanently delete a workflow.
Key permission: workflows
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: delete_workflow |
params.arguments.workflow_id | string | Yes |
{
"jsonrpc": "2.0",
"id": 11,
"method": "tools/call",
"params": {
"name": "delete_workflow",
"arguments": {
"workflow_id": "wf-123"
}
}
}/mcp-serverlist_workflow_executions — List recent execution history for a workflow. Filter by status (e.g. running/completed/failed).
Key permission: workflows
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: list_workflow_executions |
params.arguments.workflow_id | string | Yes | |
params.arguments.limit | number | No | Max results (default 20) |
params.arguments.status | string | No | Filter, e.g. running, completed, failed |
{
"jsonrpc": "2.0",
"id": 12,
"method": "tools/call",
"params": {
"name": "list_workflow_executions",
"arguments": {
"workflow_id": "wf-123",
"status": "completed",
"limit": 5
}
}
}/mcp-serverlist_contexts — List all prompt contexts (knowledge bases). Optionally include archived.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: list_contexts |
params.arguments.limit | number | No | |
params.arguments.include_archived | boolean | No |
{
"jsonrpc": "2.0",
"id": 13,
"method": "tools/call",
"params": {
"name": "list_contexts",
"arguments": {
"limit": 20
}
}
}/mcp-serverget_context — Get a context with its conversation messages and knowledge entries (text, Q&A pairs, URL sources).
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: get_context |
params.arguments.context_id | string | Yes | |
params.arguments.include_messages | boolean | No | Include conversation messages (default true) |
params.arguments.include_knowledge | boolean | No | Include knowledge entries (default true) |
{
"jsonrpc": "2.0",
"id": 14,
"method": "tools/call",
"params": {
"name": "get_context",
"arguments": {
"context_id": "ctx-456",
"include_knowledge": true,
"include_messages": false
}
}
}/mcp-servercreate_context — Create a new prompt context (knowledge base) with system prompt, model, and tags.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: create_context |
params.arguments.name | string | Yes | |
params.arguments.description | string | No | |
params.arguments.system_prompt | string | No | |
params.arguments.model | string | No | |
params.arguments.temperature | number | No | |
params.arguments.tags | array | No | Array of tag strings |
{
"jsonrpc": "2.0",
"id": 15,
"method": "tools/call",
"params": {
"name": "create_context",
"arguments": {
"name": "API Docs KB",
"description": "Knowledge base for API documentation",
"system_prompt": "You are a documentation expert.",
"tags": [
"docs",
"api"
]
}
}
}/mcp-serveradd_knowledge_entry — Add a text, Q&A pair, URL source, document chunk, or CSV row to a context's knowledge base.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: add_knowledge_entry |
params.arguments.context_id | string | Yes | |
params.arguments.content | string | Yes | |
params.arguments.entry_type | string | No | text | qa_pair | url_source | document_chunk | csv_row (default text) |
params.arguments.title | string | No | |
params.arguments.answer | string | No | Answer for qa_pair entries |
params.arguments.source_url | string | No | |
params.arguments.tags | array | No | |
params.arguments.priority | number | No | Higher = more important |
{
"jsonrpc": "2.0",
"id": 16,
"method": "tools/call",
"params": {
"name": "add_knowledge_entry",
"arguments": {
"context_id": "ctx-456",
"title": "Return Policy",
"content": "What is your return policy?",
"entry_type": "qa_pair",
"answer": "We offer 30-day returns on all products.",
"priority": 5
}
}
}/mcp-serveradd_context_message — Add a message (user/assistant/system) to a context's conversation history.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: add_context_message |
params.arguments.context_id | string | Yes | |
params.arguments.role | string | Yes | user | assistant | system |
params.arguments.content | string | Yes | |
params.arguments.model | string | No |
{
"jsonrpc": "2.0",
"id": 17,
"method": "tools/call",
"params": {
"name": "add_context_message",
"arguments": {
"context_id": "ctx-456",
"role": "user",
"content": "What models do you support?"
}
}
}/mcp-serverlist_prompts — List prompt queue items. Filter by status (pending/processing/completed/failed) or model.
Key permission: workflows
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: list_prompts |
params.arguments.status | string | No | Filter: pending, processing, completed, failed |
params.arguments.model | string | No | Filter by model |
params.arguments.limit | number | No | |
params.arguments.offset | number | No |
{
"jsonrpc": "2.0",
"id": 18,
"method": "tools/call",
"params": {
"name": "list_prompts",
"arguments": {
"status": "completed",
"limit": 5
}
}
}/mcp-serverget_prompt — Get full prompt details including the AI response, tokens used, and execution metadata.
Key permission: workflows
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: get_prompt |
params.arguments.prompt_id | string | Yes |
{
"jsonrpc": "2.0",
"id": 19,
"method": "tools/call",
"params": {
"name": "get_prompt",
"arguments": {
"prompt_id": "p-1"
}
}
}/mcp-serversubmit_prompt — Add a prompt to the queue without running it (enqueue_prompt runs or schedules it).
Key permission: workflows
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: submit_prompt |
params.arguments.prompt | string | Yes | The prompt text |
params.arguments.model | string | No | Model id (see list_models) |
params.arguments.destination | string | No | Output: file | chat | email |
params.arguments.priority | string | No | critical | high | normal | low |
{
"jsonrpc": "2.0",
"id": 20,
"method": "tools/call",
"params": {
"name": "submit_prompt",
"arguments": {
"prompt": "Summarize today's tasks",
"priority": "high"
}
}
}/mcp-serverlist_conversations — List AI chat conversations with message counts. Optionally include archived.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: list_conversations |
params.arguments.limit | number | No | Max results (default 30) |
params.arguments.include_archived | boolean | No |
{
"jsonrpc": "2.0",
"id": 21,
"method": "tools/call",
"params": {
"name": "list_conversations",
"arguments": {
"limit": 10
}
}
}/mcp-serverget_conversation_messages — Get all messages in a conversation (up to 200). Verifies conversation ownership.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: get_conversation_messages |
params.arguments.conversation_id | string | Yes | |
params.arguments.limit | number | No | Max messages (default 200) |
{
"jsonrpc": "2.0",
"id": 22,
"method": "tools/call",
"params": {
"name": "get_conversation_messages",
"arguments": {
"conversation_id": "conv-1",
"limit": 50
}
}
}/mcp-serverget_usage_stats — Get AI usage statistics: total tokens, costs, request counts, success rate, avg response time, breakdown by provider.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: get_usage_stats |
params.arguments.days | number | No | Lookback days (default 30, max 365) |
params.arguments.provider | string | No | Filter by provider |
{
"jsonrpc": "2.0",
"id": 23,
"method": "tools/call",
"params": {
"name": "get_usage_stats",
"arguments": {
"days": 7
}
}
}/mcp-serverget_agent_analytics — Get event-level analytics for a specific agent: event counts by type and recent activity.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: get_agent_analytics |
params.arguments.agent_id | string | Yes | |
params.arguments.days | number | No | Lookback days (default 30, max 365) |
{
"jsonrpc": "2.0",
"id": 24,
"method": "tools/call",
"params": {
"name": "get_agent_analytics",
"arguments": {
"agent_id": "abc-123",
"days": 14
}
}
}/mcp-serverlist_tasks — List tasks from task boards. Filter by status (backlog/todo/in-progress/review/done), priority (low/medium/high/urgent), board, or assignee.
Key permission: tasks
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: list_tasks |
params.arguments.status | string | No | Filter: backlog, todo, in-progress, review, done |
params.arguments.priority | string | No | Filter: low, medium, high, urgent |
params.arguments.board_id | string | No | |
params.arguments.limit | number | No |
{
"jsonrpc": "2.0",
"id": 25,
"method": "tools/call",
"params": {
"name": "list_tasks",
"arguments": {
"status": "in-progress",
"priority": "high"
}
}
}/mcp-servercreate_task — Create a new task with title, description, status, priority, tags, due date, and assignee.
Key permission: tasks
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: create_task |
params.arguments.title | string | Yes | |
params.arguments.description | string | No | |
params.arguments.status | string | No | backlog | todo | in-progress | review | done (default: todo) |
params.arguments.priority | string | No | low | medium | high | urgent (default: medium) |
params.arguments.board_id | string | No | Defaults to your default board |
params.arguments.tags | array | No | |
params.arguments.due_date | string | No | ISO date string |
params.arguments.assignee | string | No |
{
"jsonrpc": "2.0",
"id": 26,
"method": "tools/call",
"params": {
"name": "create_task",
"arguments": {
"title": "Add OAuth refresh",
"description": "Implement automatic token refresh for Google OAuth",
"status": "todo",
"priority": "high",
"tags": [
"feature",
"auth"
],
"due_date": "2026-04-25"
}
}
}/mcp-serverupdate_task — Update a task's title, description, status, priority, tags, due date, or assignee.
Key permission: tasks
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: update_task |
params.arguments.task_id | string | Yes | |
params.arguments.title | string | No | |
params.arguments.description | string | No | |
params.arguments.status | string | No | |
params.arguments.priority | string | No | |
params.arguments.tags | array | No | |
params.arguments.due_date | string | No | |
params.arguments.assignee | string | No |
{
"jsonrpc": "2.0",
"id": 27,
"method": "tools/call",
"params": {
"name": "update_task",
"arguments": {
"task_id": "task-1",
"status": "done"
}
}
}/mcp-serverlist_notifications — List user notifications. Filter by read status or type (success/error/info).
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: list_notifications |
params.arguments.unread_only | boolean | No | |
params.arguments.type | string | No | Filter: success, error, info |
params.arguments.limit | number | No | Max results (default 30) |
{
"jsonrpc": "2.0",
"id": 28,
"method": "tools/call",
"params": {
"name": "list_notifications",
"arguments": {
"unread_only": true,
"limit": 10
}
}
}/mcp-serverlist_integrations — List all configured integrations (email, Slack, Google Drive, webhooks) with their enabled status.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: list_integrations |
{
"jsonrpc": "2.0",
"id": 29,
"method": "tools/call",
"params": {
"name": "list_integrations",
"arguments": {}
}
}/mcp-serverlist_models — List the available AI models (id, provider, modality, tier, tool support, cost).
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: list_models |
params.arguments.modality | string | No | text | image | video |
{
"jsonrpc": "2.0",
"id": 100,
"method": "tools/call",
"params": {
"name": "list_models",
"arguments": {
"modality": "text"
}
}
}/mcp-serverchat — One-shot chat completion with any model. Pass messages (OpenAI format) or prompt. Uses credits.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: chat |
params.arguments.prompt | string | No | Shortcut for a single user message |
params.arguments.system | string | No | System prompt (with prompt) |
params.arguments.messages | array | No | [{ role, content }] — content may include image_url parts |
params.arguments.model | string | No | Model id (default openrouter/openai/gpt-6-luna) |
params.arguments.tools | boolean | string[] | No | true = all MultiverseAI agent tools, or tool names from list_agent_tools |
params.arguments.max_tool_iterations | number | No | 1–20 |
params.arguments.temperature | number | No | |
params.arguments.max_tokens | number | No |
{
"jsonrpc": "2.0",
"id": 101,
"method": "tools/call",
"params": {
"name": "chat",
"arguments": {
"prompt": "Summarize the latest news about AI agents",
"tools": [
"web_search"
]
}
}
}/mcp-servergenerate_image — Generate images from a prompt, optionally working from reference images; returns image URLs. Uses credits.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: generate_image |
params.arguments.prompt | string | Yes | |
params.arguments.model | string | No | Image model id (default gpt-image-1.5) |
params.arguments.n | number | No | 1–4 |
params.arguments.image | string[] | No | Reference images (https or data: URLs, PNG/JPEG/WebP, up to 4) |
{
"jsonrpc": "2.0",
"id": 102,
"method": "tools/call",
"params": {
"name": "generate_image",
"arguments": {
"prompt": "A watercolor fox in a misty forest"
}
}
}/mcp-servercreate_video — Start a video generation job; poll get_video until completed. Uses credits.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: create_video |
params.arguments.prompt | string | Yes | |
params.arguments.model | string | No | Video model id (list_models modality=video) |
params.arguments.duration | number | No | |
params.arguments.aspect_ratio | string | No | e.g. 16:9, 9:16 |
params.arguments.image_url | string | No | Start image (https:// or data:image/…) |
{
"jsonrpc": "2.0",
"id": 103,
"method": "tools/call",
"params": {
"name": "create_video",
"arguments": {
"prompt": "Drone shot over a coastline at sunrise",
"aspect_ratio": "16:9"
}
}
}/mcp-serverget_video — Get a video job: status (queued/running/saving/completed/failed/cancelled) and video_url.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: get_video |
params.arguments.video_id | string | Yes |
{
"jsonrpc": "2.0",
"id": 104,
"method": "tools/call",
"params": {
"name": "get_video",
"arguments": {
"video_id": "VIDEO_ID"
}
}
}/mcp-serverlist_agent_tools — List the MultiverseAI agent tools. Pass name for one tool with its parameter schema.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: list_agent_tools |
params.arguments.name | string | No | |
params.arguments.include_parameters | boolean | No | Include every parameter schema (large) |
{
"jsonrpc": "2.0",
"id": 105,
"method": "tools/call",
"params": {
"name": "list_agent_tools",
"arguments": {}
}
}/mcp-serverrun_agent_tool — Run one agent tool directly. Tools with requires_approval need confirm: true.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: run_agent_tool |
params.arguments.name | string | Yes | |
params.arguments.arguments | object | No | |
params.arguments.confirm | boolean | No |
{
"jsonrpc": "2.0",
"id": 106,
"method": "tools/call",
"params": {
"name": "run_agent_tool",
"arguments": {
"name": "web_search",
"arguments": {
"query": "MultiverseAI"
}
}
}
}/mcp-serverlink_previews — Fetch title, description, image and site name for URLs.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: link_previews |
params.arguments.urls | array | Yes |
{
"jsonrpc": "2.0",
"id": 107,
"method": "tools/call",
"params": {
"name": "link_previews",
"arguments": {
"urls": [
"https://multiverseai.com"
]
}
}
}/mcp-serverget_credits — Get your MultiverseAI credit balance.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: get_credits |
params.arguments.fresh | boolean | No | Skip the 60-second cache |
{
"jsonrpc": "2.0",
"id": 108,
"method": "tools/call",
"params": {
"name": "get_credits",
"arguments": {}
}
}/mcp-serverchat_with_agent — Send a message to one of your agents. Pass conversation_id from a reply to continue it.
Key permission: agents
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: chat_with_agent |
params.arguments.agent_id | string | Yes | |
params.arguments.message | string | Yes | |
params.arguments.conversation_id | string | No |
{
"jsonrpc": "2.0",
"id": 109,
"method": "tools/call",
"params": {
"name": "chat_with_agent",
"arguments": {
"agent_id": "AGENT_ID",
"message": "What can you help me with?"
}
}
}/mcp-serverrun_workflow — Run a workflow on the server. Returns the execution id, or the result with wait: true.
Key permission: workflows
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: run_workflow |
params.arguments.workflow_id | string | Yes | |
params.arguments.inputs | object | No | |
params.arguments.wait | boolean | No | Default false |
{
"jsonrpc": "2.0",
"id": 110,
"method": "tools/call",
"params": {
"name": "run_workflow",
"arguments": {
"workflow_id": "WORKFLOW_ID",
"inputs": {
"topic": "AI"
}
}
}
}/mcp-serverget_execution — Get one workflow run: status, node outputs, execution data, error.
Key permission: workflows
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: get_execution |
params.arguments.execution_id | string | Yes |
{
"jsonrpc": "2.0",
"id": 111,
"method": "tools/call",
"params": {
"name": "get_execution",
"arguments": {
"execution_id": "EXECUTION_ID"
}
}
}/mcp-servercreate_conversation — Start a new chat conversation.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: create_conversation |
params.arguments.title | string | No | |
params.arguments.model | string | No | |
params.arguments.folder_id | string | No |
{
"jsonrpc": "2.0",
"id": 112,
"method": "tools/call",
"params": {
"name": "create_conversation",
"arguments": {
"title": "Research notes"
}
}
}/mcp-serversend_conversation_message — Send a message in a conversation and get the reply; both are saved. Uses credits.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: send_conversation_message |
params.arguments.conversation_id | string | Yes | |
params.arguments.content | string | Yes | |
params.arguments.model | string | No | |
params.arguments.tools | boolean | string[] | No | true = all MultiverseAI agent tools, or tool names from list_agent_tools |
params.arguments.system_prompt | string | No | |
params.arguments.temperature | number | No |
{
"jsonrpc": "2.0",
"id": 113,
"method": "tools/call",
"params": {
"name": "send_conversation_message",
"arguments": {
"conversation_id": "CONVERSATION_ID",
"content": "Continue from where we left off"
}
}
}/mcp-serverlist_queue — List prompt queue items, newest first.
Key permission: workflows
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: list_queue |
params.arguments.status | string | No | Comma-separated, e.g. pending,running |
params.arguments.limit | number | No | |
params.arguments.offset | number | No |
{
"jsonrpc": "2.0",
"id": 114,
"method": "tools/call",
"params": {
"name": "list_queue",
"arguments": {
"status": "pending,running"
}
}
}/mcp-serverenqueue_prompt — Queue a prompt (or a workflow run) and run it now, or schedule it. Uses credits.
Key permission: workflows
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: enqueue_prompt |
params.arguments.prompt | string | No | Required unless workflow_id is given |
params.arguments.workflow_id | string | No | |
params.arguments.model | string | No | |
params.arguments.priority | string | No | critical | high | normal | low |
params.arguments.destination | string | No | |
params.arguments.scheduled_for | string | No | ISO 8601, in the future |
params.arguments.run | boolean | No | Default true |
params.arguments.wait | boolean | No |
{
"jsonrpc": "2.0",
"id": 115,
"method": "tools/call",
"params": {
"name": "enqueue_prompt",
"arguments": {
"prompt": "Draft a weekly status update",
"priority": "high"
}
}
}/mcp-servercancel_queue_item — Cancel a pending, scheduled or retrying queue item.
Key permission: workflows
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: cancel_queue_item |
params.arguments.queue_id | string | Yes |
{
"jsonrpc": "2.0",
"id": 116,
"method": "tools/call",
"params": {
"name": "cancel_queue_item",
"arguments": {
"queue_id": "QUEUE_ID"
}
}
}/mcp-serverdelete_task — Delete a task permanently.
Key permission: tasks
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: delete_task |
params.arguments.task_id | string | Yes |
{
"jsonrpc": "2.0",
"id": 117,
"method": "tools/call",
"params": {
"name": "delete_task",
"arguments": {
"task_id": "TASK_ID"
}
}
}/mcp-serverlist_boards — List your task boards.
Key permission: tasks
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: list_boards |
params.arguments.limit | number | No | |
params.arguments.offset | number | No |
{
"jsonrpc": "2.0",
"id": 118,
"method": "tools/call",
"params": {
"name": "list_boards",
"arguments": {}
}
}/mcp-serverlist_teams — List your teams; pass team_id for one team with its members.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: list_teams |
params.arguments.team_id | string | No |
{
"jsonrpc": "2.0",
"id": 119,
"method": "tools/call",
"params": {
"name": "list_teams",
"arguments": {}
}
}/mcp-serverlist_platforms — Show which posting platforms (twitter, tiktok, instagram, facebook) are connected.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: list_platforms |
{
"jsonrpc": "2.0",
"id": 120,
"method": "tools/call",
"params": {
"name": "list_platforms",
"arguments": {}
}
}/mcp-serverpublish_post — Publish a post now as your connected accounts.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: publish_post |
params.arguments.platforms | array | Yes | twitter | tiktok | instagram | facebook |
params.arguments.content | string | No | Post text |
params.arguments.media_urls | array | No | https:// media URLs (Instagram and TikTok need one) |
params.arguments.platform_options | object | No | { facebook: { page_id, link }, tiktok: { privacy_level } } |
{
"jsonrpc": "2.0",
"id": 121,
"method": "tools/call",
"params": {
"name": "publish_post",
"arguments": {
"platforms": [
"twitter"
],
"content": "Shipping something new today"
}
}
}/mcp-serverschedule_post — Schedule a post for later.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
params.name | string | Yes | Default: schedule_post |
params.arguments.platforms | array | Yes | twitter | tiktok | instagram | facebook |
params.arguments.content | string | No | Post text |
params.arguments.media_urls | array | No | https:// media URLs (Instagram and TikTok need one) |
params.arguments.platform_options | object | No | { facebook: { page_id, link }, tiktok: { privacy_level } } |
params.arguments.scheduled_at | string | Yes | ISO 8601, in the future |
{
"jsonrpc": "2.0",
"id": 122,
"method": "tools/call",
"params": {
"name": "schedule_post",
"arguments": {
"platforms": [
"facebook"
],
"content": "See you at the launch!",
"scheduled_at": "2026-12-01T15:00:00Z"
}
}
}Error Handling
Every /v1 error has the same shape: an error object with a message, a machine-readable code and the HTTP status. Some errors add fields such as retry_after_ms or allowed.
Error response format
{
"error": {
"message": "Too many requests for this API key",
"code": "RATE_LIMITED",
"status": 429,
"retry_after_ms": 41250
}
}HTTP status codes
Error codes
The most common values of error.code
| Code | Description |
|---|---|
AUTH_REQUIRED | No Authorization: Bearer header |
INVALID_API_KEY | Developer key is invalid, revoked or expired |
INVALID_TOKEN | User access token is invalid or expired |
FORBIDDEN | This key isn't allowed to use the endpoint (permission switch off) |
NOT_FOUND | Unknown endpoint, or the resource does not exist / is not yours |
MODEL_NOT_FOUND | Unknown model id — see GET /v1/models |
INVALID_REQUEST | Missing or malformed field |
INVALID_VALUE | A field has the wrong type or an unsupported value |
UNSUPPORTED_TOOLS | OpenAI function definitions were passed; use tools: true or tool names |
METHOD_NOT_ALLOWED | HTTP method not supported for this endpoint |
RATE_LIMITED | Too many requests; includes retry_after_ms |
INSUFFICIENT_CREDITS | Not enough credits for an AI call |
CONFIRMATION_REQUIRED | The tool changes data or sends messages; resend with confirm: true |
UNKNOWN_TOOL | No tool with that name — see GET /v1/tools |
PAYLOAD_TOO_LARGE | An attachment is over the size limit (images: 20MB) |
UPSTREAM_ERROR | The model provider or an internal service failed, or returned an empty reply |
INTERNAL_ERROR | Unexpected server error |
Ready to get started?
Generate your API key and start building with MultiverseAI

Social Posts
Publish or schedule posts as your own connected accounts (connect them in Settings first), or as a project's accounts with project_id / X-Project-Id (see Projects). Calling these endpoints is the go-ahead to post.
/v1/platformsWhich posting platforms are connected
Key permission:
posts/v1/posts/createPublish now
Key permission:
postsRequest body
platformsstring[]contentstringmedia_urlsstring[]platform_optionsobjectproject_idstring/v1/posts/scheduleSchedule a post
Key permission:
postsRequest body
platformsstring[]contentstringmedia_urlsstring[]platform_optionsobjectproject_idstringscheduled_atstring/v1/posts/scheduledList scheduled posts
Key permission:
postsQuery parameters
statusstringlimitinteger50/v1/posts/{id}/statusGet a post (scheduled or created), including per-platform publish results
Key permission:
posts/v1/posts/scheduled/{id}Cancel a scheduled post
Key permission:
posts