MultiverseAI Logo
    API reference

    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/v1

    Endpoint 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_KEY

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

    SwitchEndpoints
    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

    Coming soon

    @multiverseai/sdk is not published to npm yet. It can be built from the sdk/ folder of the MultiverseAI repository in the meantime.

    CLI

    Coming soon

    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 link

    Models

    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.

    GET
    /v1/models

    List 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

    FieldTypeRequiredDescription
    modalitystringNoFilter by "text", "image" or "video"
    curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/models?modality=text"
    GET
    /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"
    GET
    /v1/health

    Health check

    curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/health"
    GET
    /v1

    Endpoint 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.
    POST
    /v1/chat/completions

    Create a chat completion

    Request body

    FieldTypeRequiredDescription
    modelstringNoModel id from GET /v1/modelsDefault: openrouter/openai/gpt-6-luna
    messagesarray
    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 } }.
    streambooleanNoStream chat.completion.chunk events over SSEDefault: false
    stream_optionsobjectNo{ include_usage: true } adds a final usage chunk when streaming
    temperaturenumberNoSampling temperature, 0–2
    max_tokensintegerNoMaximum tokens to generate (max_completion_tokens is accepted too)
    top_pnumberNoNucleus sampling, 0–1
    frequency_penaltynumberNo-2 to 2
    presence_penaltynumberNo-2 to 2
    toolstrue | string[]Notrue 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_iterationsintegerNoCap 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
    }'
    POST
    /v1/chat/completions

    Streaming (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
      }
    }'
    POST
    /v1/chat/completions

    With 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
    }'
    POST
    /v1/chat/completions

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

    POST
    /v1/completions

    Create a text completion

    • When an image model is used the response has the Images shape: { created, model, data: [{ url }] }.

    Request body

    FieldTypeRequiredDescription
    promptstring
    Yes
    The prompt
    modelstringNoModel id from GET /v1/modelsDefault: openrouter/openai/gpt-6-luna
    modalitystringNo"image" generates images instead (with gpt-image-1.5 unless model is an image model). Passing an image model does the same.
    temperaturenumberNoSampling temperature, 0–2
    max_tokensintegerNoMaximum tokens to generate (max_completion_tokens is accepted too)
    top_pnumberNoNucleus sampling, 0–1
    frequency_penaltynumberNo-2 to 2
    presence_penaltynumberNo-2 to 2
    toolstrue | string[]Notrue 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_iterationsintegerNoCap 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.

    POST
    /v1/images/generations

    Generate 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

    FieldTypeRequiredDescription
    promptstring
    Yes
    Description of the image
    modelstringNoAn image model id; a non-image model returns 400 INVALID_MODEL_FOR_MODALITYDefault: gpt-image-1.5
    nintegerNoNumber of images, 1–4Default: 1
    imagestring | string[]NoReference 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.
    POST
    /v1/videos

    Start a video job

    Request body

    FieldTypeRequiredDescription
    promptstring
    Yes
    What the video should show
    modelstringNoA video model id (GET /v1/videos/models)Default: video/fal/fal-ai/veo3.1/fast
    durationintegerNoSeconds; snapped to the model's closest allowed duration
    aspect_ratiostringNoe.g. "16:9" or "9:16", if the model supports it
    image_urlstringNoOptional 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"
    }'
    GET
    /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"
    GET
    /v1/videos

    List your video jobs

    Query parameters

    FieldTypeRequiredDescription
    limitintegerNoUp to 100Default: 30
    curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/videos?limit=10" \
      -H "Authorization: Bearer $MULTIVERSE_API_KEY"
    GET
    /v1/videos/models

    List video models

    curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/videos/models" \
      -H "Authorization: Bearer $MULTIVERSE_API_KEY"
    DELETE
    /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).
    POST
    /v1/videos

    HeyGen avatar video (model heygen/avatar)

    Request body

    FieldTypeRequiredDescription
    modelstring
    Yes
    "heygen/avatar"
    avatar_idstring
    Yes
    An avatar look id from GET /v1/videos/avatars?provider=heygen
    scriptstringNoWhat the avatar says (up to 5,000 characters). Give this or audio_url.
    voice_idstringNoVoice id (GET /v1/videos/avatars?provider=heygen&kind=voices); default: the avatar's voice
    audio_urlstringNoPublic https audio to lip-sync instead of a script
    enginestringNoavatar_iv, avatar_v or avatar_iii (must be in the avatar's supported_engines)Default: avatar_iv
    aspect_ratiostringNo16:9, 9:16, 1:1, 4:5, 5:4 or autoDefault: 16:9
    resolutionstringNo720p or 1080pDefault: 720p
    backgroundstringNoA hex color (#0f172a) or an https image URL
    motion_promptstringNoBody motion and gestures (photo avatars, or engine avatar_v)
    languagestringNoVoice locale, e.g. en-US
    titlestringNoName 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"
    }'
    POST
    /v1/videos

    HeyGen video translation (model heygen/translate)

    Request body

    FieldTypeRequiredDescription
    modelstring
    Yes
    "heygen/translate"
    video_urlstring
    Yes
    Public https URL of the video to translate
    output_languagestring
    Yes
    Target language name, e.g. "Spanish (Spain)" (GET /v1/videos/avatars?provider=heygen&kind=languages)
    modestringNospeed, or precision for better lip-syncDefault: speed
    translate_audio_onlybooleanNoDub the audio only, without lip-sync (cheapest)Default: false
    input_languagestringNoSource language (detected when omitted)
    speaker_numintegerNoNumber of speakers (improves separation)
    titlestringNoName 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)"
    }'
    POST
    /v1/videos

    Tavus replica video (model tavus/replica)

    Request body

    FieldTypeRequiredDescription
    modelstring
    Yes
    "tavus/replica"
    replica_idstring
    Yes
    A replica id from GET /v1/videos/avatars?provider=tavus
    scriptstringNoWhat the replica says. Give this or audio_url.
    audio_urlstringNoPublic https .mp3 / .wav to lip-sync instead of a script
    video_namestringNoA name for the video
    background_urlstringNoA public website scrolled behind the replica
    background_source_urlstringNoA public https video to use as the background
    fastbooleanNoFaster 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"
    }'
    GET
    /v1/videos/avatars

    List avatars, voices, languages, replicas or personas (free)

    Query parameters

    FieldTypeRequiredDescription
    providerstringNoheygen or tavusDefault: heygen
    kindstringNoheygen: avatars (default), voices, languages. tavus: replicas (default), personas.
    avatar_typestringNoheygen avatars: studio_avatar, digital_twin or photo_avatar
    ownershipstringNoheygen avatars: public (stock) or private (yours)
    languagestringNoheygen voices: filter by language
    genderstringNoheygen voices: filter by gender
    limitintegerNoPage size (heygen avatars ≤ 50, voices ≤ 100)
    tokenstringNoheygen: next_token from the previous page
    pageintegerNotavus: 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"
    POST
    /v1/videos/conversations

    Start 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

    FieldTypeRequiredDescription
    replica_idstring
    Yes
    Replica id (optional when persona_id has a default replica)
    persona_idstringNoA persona (GET /v1/videos/avatars?provider=tavus&kind=personas): its LLM, prompt and tools
    conversational_contextstringNoWhat the call is about / instructions for the replica
    custom_greetingstringNoThe first thing the replica says
    conversation_namestringNoA name
    languagestringNoe.g. english or multilingual
    callback_urlstringNoTavus posts conversation events (transcript, shutdown) here
    max_minutesintegerNoHard 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
    }'
    GET
    /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"
    POST
    /v1/videos/conversations/{id}/end

    End 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"
    GET
    /v1/videos/conversations

    List your conversations

    Query parameters

    FieldTypeRequiredDescription
    limitintegerNoUp 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.
    POST
    /v1/audio/speech

    Text 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

    FieldTypeRequiredDescription
    inputstring
    Yes
    What to say: up to 10,000 characters (5,000 on eleven_v3)
    voicestringNoA voice_id from GET /v1/audio/voices, or alloy | echo | fable | onyx | nova | shimmerDefault: nova
    modelstringNoeleven_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_formatstringNomp3, or a bitrate: mp3_44100_128 | mp3_44100_192 | mp3_44100_64 | mp3_22050_32Default: mp3
    stabilitynumberNo0–1; lower is more expressive
    similarity_boostnumberNo0–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"
    }'
    POST
    /v1/audio/transcriptions

    Speech 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

    FieldTypeRequiredDescription
    audio_urlstring
    Yes
    Public https URL of the audio or video, up to 50 MB
    languagestringNoISO-639 code (e.g. en, spa) if known; detected otherwise
    diarizebooleanNoLabel 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
    }'
    GET
    /v1/audio/voices

    List 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"
    POST
    /v1/audio/sound-effects

    Generate a sound effect

    Key permission: tools

    • Charged per second of audio generated.

    Request body

    FieldTypeRequiredDescription
    promptstring
    Yes
    Describe the sound (up to 1,000 characters)
    duration_secondsnumberNo0.5–30; chosen by the model if omitted
    prompt_influencenumberNo0–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.
    POST
    /v1/meetings

    Send 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

    FieldTypeRequiredDescription
    meeting_urlstring
    Yes
    meet.google.com/…, zoom.us/j/…, teams.microsoft.com/l/meetup-join/…, teams.live.com/meet/…, or *.webex.com/…
    titlestringNoName for the meeting in your notes
    bot_namestringNoName the bot shows in the callDefault: MultiverseAI Notetaker
    join_atstringNoISO 8601 time to join (schedule, up to 60 days ahead). Omit to join now.
    project_idstringNoFile the meeting under a project (its id or your external_id)
    languagestringNoTranscription 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"
    }'
    GET
    /v1/meetings

    List your meetings (newest first, without transcripts)

    Query parameters

    FieldTypeRequiredDescription
    limitintegerNoUp to 100Default: 50
    offsetintegerNoDefault: 0
    statusstringNoOnly this status (e.g. done)
    project_idstringNoOnly meetings of this project
    searchstringNoSearch 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"
    GET
    /v1/meetings/{id}

    Get a meeting with its notes and transcript (refreshes the status while it is unfinished)

    Query parameters

    FieldTypeRequiredDescription
    include_transcriptbooleanNofalse 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"
    PATCH
    /v1/meetings/{id}

    Rename a meeting

    Request body

    FieldTypeRequiredDescription
    titlestring
    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"
    }'
    POST
    /v1/meetings/{id}/leave

    Make 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 '{}'
    POST
    /v1/meetings/{id}/resummarize

    Regenerate 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 '{}'
    DELETE
    /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).
    GET
    /v1/angelsend/actions

    The AngelSend action catalog

    Key permission: tools

    Query parameters

    FieldTypeRequiredDescription
    groupstringNocampaigns, recipients, senders, records, contacts, crm, compliance, webhooks, inbox, analytics, knowledge, chatbots, intelligence, quality, intent, booking, integrations, outreach, review, platform, issuer_funnel, core
    kindstringNoread | compute (AI / paid) | write | destructive
    qstringNoWords to match
    curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/angelsend/actions?group=recipients" \
      -H "Authorization: Bearer $MULTIVERSE_API_KEY"
    GET
    /v1/angelsend/actions/{action}

    One action's documentation and parameters

    Key permission: tools

    POST
    /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

    FieldTypeRequiredDescription
    …anyNoThe 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_runbooleanNoPreview a delete/removal without changing anything
    confirmedbooleanNoRequired to run destructive actions
    idempotency_keystringNocreate-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"
    }'
    POST
    /v1/angelsend/connect

    Send 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

    FieldTypeRequiredDescription
    project_idstringNoOnly this AngelSend project's events (including teammates' campaigns in it). Omit for account-wide.
    eventsstring[]NoDefault: reply_received, bounced, unsubscribed, booking, recipient_stopped. Any AngelSend event name (message.opened, campaign.paused, …) or "*" also works.
    replacebooleanNoRe-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 '{}'
    GET
    /v1/angelsend/connections

    Your AngelSend webhook connections

    Key permission: tools

    Query parameters

    FieldTypeRequiredDescription
    verifybooleanNoAlso check that AngelSend still has each webhook (one is removed when the AngelSend key that registered it is revoked)
    DELETE
    /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.

    GET
    /v1/tools

    List agent tools

    Key permission: tools

    curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/tools" \
      -H "Authorization: Bearer $MULTIVERSE_API_KEY"
    GET
    /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"
    POST
    /v1/tools/{name}

    Run a tool

    Key permission: tools

    • POST /v1/tools/{name}/run is an alias.

    Request body

    FieldTypeRequiredDescription
    argumentsobjectNoThe tool's arguments, matching its parameters schemaDefault: {}
    confirmbooleanNoRequired 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_idstringNoFor 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"
      }
    }'
    POST
    /v1/tools/facebook_ads

    Run 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

    FieldTypeRequiredDescription
    project_idstringNoProject 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.
    argumentsobject
    Yes
    action plus its fields (see below and GET /v1/tools/facebook_ads)
    confirmbooleanNoNeeded 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_scheduler
    confirm
    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_act
    confirm
    Act through a project's own connected channels (needs the user's approval).
    send_messagegmail_sendcalendar_createcalendar_deleteconnect_link
    twitter
    confirm
    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
    instagram
    confirm
    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_page
    confirm
    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_groups
    confirm
    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
    threads
    confirm
    Post and read on the user's own connected Threads account (connect it in Connections → Social).
    publish_postpublish_carouselreplylist_postsget_repliesget_insightsget_profiledelete_post
    linkedin
    confirm
    Post on the user's own connected LinkedIn profile (connect it in Settings → Social).
    publish_postcommentreactdelete_postget_profile
    tiktok
    confirm
    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
    messenger
    confirm
    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
    whatsapp
    confirm
    WhatsApp Business on the user's own connected number (Connections → Meta).
    send_messagesend_mediasend_templatelist_templatescreate_templatedelete_templateget_business_profilelist_numbersselect_number
    telegram
    confirm
    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_notetaker
    confirm
    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_ads
    confirm
    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_fundraiser
    confirm
    Create and manage Facebook Page fundraisers for charitable organizations.
    list_fundraisersget_fundraisercreate_fundraiserend_fundraiser
    meta_catalog
    confirm
    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_ads
    confirm
    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_ads
    confirm
    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
    stripe
    confirm
    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
    crm
    confirm
    Read and write CRM data (HubSpot or Salesforce).
    list_contactsget_contactcreate_contactupdate_contactlist_dealsget_dealcreate_dealupdate_deallist_pipelinessearchlist_activities

    Google, email & productivity

    email
    confirm
    Send email or save a draft from the user's own connected Gmail (Connections → Google Drive).
    draftsendread_inboxsearchget_thread
    send_email
    confirm
    Send a transactional email via Resend (different from gmail tool).
    resend
    confirm
    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_act
    confirm
    Change things in the user's AngelSend account (needs the user's approval).
    callconnectdisconnect
    google_docs
    confirm
    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_drive
    confirm
    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
    calendar
    confirm
    Manage calendar events.
    list_eventscreate_eventupdate_eventdelete_eventcheck_availabilityfind_free_time
    slack
    confirm
    Interact with Slack.
    send_messageread_channellist_channelssearch_messagesget_threadreactupload_file
    discord
    confirm
    Send and read Discord messages.
    send_messagesend_via_webhooklist_guildslist_channelsread_channeldelete_message
    github
    confirm
    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
    jira
    confirm
    Manage Jira issues.
    list_projectssearch_issuesget_issuecreate_issueupdate_issueadd_commentlist_transitionstransition
    linear
    confirm
    Interact with Linear.
    list_issuessearch_issuesget_issuecreate_issueupdate_issueadd_commentlist_teamslist_projectslist_states
    notion
    confirm
    Interact with Notion.
    searchget_pageget_page_contentcreate_pageupdate_pageappend_contentquery_databaseget_database
    webhook
    confirm
    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_store
    confirm
    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_code
    confirm
    Execute a JavaScript code snippet in an isolated sandbox (no network, files or secrets).
    code_execute
    confirm
    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.

    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.

    GET
    /v1/credits

    Get your credit balance

    Query parameters

    FieldTypeRequiredDescription
    freshbooleanNotrue 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"
    GET
    /v1/credits/transactions

    List your credit transactions, newest first

    • Returns 502 UPSTREAM_ERROR when the credit ledger is temporarily unreachable.

    Query parameters

    FieldTypeRequiredDescription
    limitintegerNoHow 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.

    GET
    /v1/workflows

    List workflows

    Key permission: workflows

    Query parameters

    FieldTypeRequiredDescription
    statusstringNoFilter by workflow status
    limitintegerNoPage size, up to 100Default: 50
    offsetintegerNoItems to skipDefault: 0
    curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/workflows?limit=10" \
      -H "Authorization: Bearer $MULTIVERSE_API_KEY"
    POST
    /v1/workflows

    Create 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

    FieldTypeRequiredDescription
    namestring
    Yes
    Name
    descriptionstringNoDescription
    nodesobject[]NoBuilder nodes: { id, type, data?, position? } (position defaults to a left-to-right layout)
    edgesobject[]NoBuilder edges: { source, target, sourceHandle?, id? } between node ids
    categorystringNoCategory
    tagsstring[]NoTags
    folder_iduuidNoFolder
    is_activebooleanNoActivate (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"
        }
      ]
    }'
    GET
    /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"
    PATCH
    /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

    FieldTypeRequiredDescription
    namestringNoName
    descriptionstringNoDescription
    nodesobject[]NoBuilder nodes: { id, type, data?, position? } (position defaults to a left-to-right layout)
    edgesobject[]NoBuilder edges: { source, target, sourceHandle?, id? } between node ids
    categorystringNoCategory
    tagsstring[]NoTags
    folder_iduuidNoFolder
    is_activebooleanNoActivate (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
    }'
    DELETE
    /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"
    POST
    /v1/workflows/{id}/run

    Run 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

    FieldTypeRequiredDescription
    inputsobjectNoValues passed to the workflow triggerDefault: {}
    waitbooleanNotrue 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"
      }
    }'
    GET
    /v1/workflows/{id}/executions

    List a workflow's runs

    Key permission: workflows

    Query parameters

    FieldTypeRequiredDescription
    limitintegerNoPage size, up to 100Default: 50
    offsetintegerNoItems 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.

    GET
    /v1/executions

    List runs

    Key permission: workflows

    Query parameters

    FieldTypeRequiredDescription
    workflow_iduuidNoOnly runs of this workflow
    statusstringNoFilter by run status
    limitintegerNoPage size, up to 100Default: 50
    offsetintegerNoItems 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"
    GET
    /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"
    POST
    /v1/executions/{id}/cancel

    Cancel 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.
    POST
    /v1/queue

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

    GET
    /v1/agents

    List agents

    Key permission: agents

    Query parameters

    FieldTypeRequiredDescription
    include_archivedbooleanNoInclude archived agentsDefault: false
    limitintegerNoPage size, up to 100Default: 50
    offsetintegerNoItems to skipDefault: 0
    curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/agents" \
      -H "Authorization: Bearer $MULTIVERSE_API_KEY"
    POST
    /v1/agents

    Create 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

    FieldTypeRequiredDescription
    namestring
    Yes
    Name
    descriptionstringNoDescription
    instructionsstringNoSystem instructions
    default_modelstringNoModel id (GET /v1/models)
    context_iduuidNoKnowledge context (GET /v1/contexts)
    personality_templatestringNoPersonality template name
    response_lengthstringNo"concise", "balanced" or "detailed"
    max_tokens_limitintegerNoToken cap per reply
    max_cost_limitnumberNoCost cap
    tagsstring[]NoTags
    image_urlstringNohttps:// avatar URL
    voice_idstringNoVoice for text-to-speech
    voice_settingsobjectNoVoice settings
    statusstringNo"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"
      ]
    }'
    GET
    /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"
    PATCH
    /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

    FieldTypeRequiredDescription
    namestringNoName
    descriptionstringNoDescription
    instructionsstringNoSystem instructions
    default_modelstringNoModel id (GET /v1/models)
    context_iduuidNoKnowledge context (GET /v1/contexts)
    personality_templatestringNoPersonality template name
    response_lengthstringNo"concise", "balanced" or "detailed"
    max_tokens_limitintegerNoToken cap per reply
    max_cost_limitnumberNoCost cap
    tagsstring[]NoTags
    image_urlstringNohttps:// avatar URL
    voice_idstringNoVoice for text-to-speech
    voice_settingsobjectNoVoice settings
    statusstringNo"draft", "published" or "archived"
    is_archivedbooleanNoArchive 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"
    }'
    DELETE
    /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"
    POST
    /v1/agents/{id}/chat

    Chat with an agent

    Key permission: agents

    Request body

    FieldTypeRequiredDescription
    messagestring
    Yes
    Your message
    conversation_iduuidNoContinue a saved conversation (its last 40 turns are used as context). Omit to start a new one; the response returns its id.
    conversation_historyarrayNoExplicit [{ role: "user" | "assistant", content }] history; used instead of the saved history
    streambooleanNoStream 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?"
    }'
    GET
    /v1/agents/{id}/chat

    Read an agent's saved messages

    Key permission: agents

    Query parameters

    FieldTypeRequiredDescription
    conversation_iduuidNoOnly this conversation
    limitintegerNoPage size, up to 200Default: 50
    offsetintegerNoItems 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.

    GET
    /v1/conversations

    List conversations

    Query parameters

    FieldTypeRequiredDescription
    archivedbooleanNotrue lists archived conversations insteadDefault: false
    qstringNoSearch titles
    limitintegerNoPage size, up to 100Default: 50
    offsetintegerNoItems to skipDefault: 0
    curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/conversations?q=launch" \
      -H "Authorization: Bearer $MULTIVERSE_API_KEY"
    POST
    /v1/conversations

    Create a conversation

    • Returns 201 with the conversation.

    Request body

    FieldTypeRequiredDescription
    titlestringNoTitleDefault: New Conversation
    modelstringNoDefault model for the conversationDefault: openrouter/openai/gpt-6-luna
    folder_iduuidNoFolder 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"
    }'
    GET
    /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"
    PATCH
    /v1/conversations/{id}

    Update a conversation

    Request body

    FieldTypeRequiredDescription
    titlestringNoTitle
    modelstringNoDefault model
    folder_iduuid | nullNoFolder (null removes it)
    is_archivedbooleanNoArchive 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
    }'
    DELETE
    /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"
    GET
    /v1/conversations/{id}/messages

    List messages (oldest first)

    Query parameters

    FieldTypeRequiredDescription
    limitintegerNoPage size, up to 200Default: 100
    offsetintegerNoItems 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"
    POST
    /v1/conversations/{id}/messages

    Send 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

    FieldTypeRequiredDescription
    contentstring
    Yes
    Your message
    modelstringNoModel for this reply (defaults to the conversation's model)
    system_promptstringNoSystem prompt for this reply
    streambooleanNoStream the exchange over SSEDefault: false
    temperaturenumberNoSampling temperature, 0–2
    max_tokensintegerNoMaximum tokens to generate (max_completion_tokens is accepted too)
    top_pnumberNoNucleus sampling, 0–1
    frequency_penaltynumberNo-2 to 2
    presence_penaltynumberNo-2 to 2
    toolstrue | string[]Notrue 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_iterationsintegerNoCap 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.

    GET
    /v1/contexts

    List contexts

    Query parameters

    FieldTypeRequiredDescription
    include_archivedbooleanNoInclude archived contextsDefault: false
    limitintegerNoPage size, up to 100Default: 50
    offsetintegerNoItems to skipDefault: 0
    curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/contexts" \
      -H "Authorization: Bearer $MULTIVERSE_API_KEY"
    POST
    /v1/contexts

    Create a context

    • Returns 201 with the context.

    Request body

    FieldTypeRequiredDescription
    namestring
    Yes
    Name
    descriptionstringNoDescription
    colorstringNoHex colorDefault: #6366f1
    tagsstring[]NoTags
    modelstringNoModel id
    temperaturenumberNoSampling temperature
    max_tokensintegerNoMax tokens
    system_promptstringNoSystem prompt
    metadataobjectNoFree-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"
      ]
    }'
    GET
    /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"
    PATCH
    /v1/contexts/{id}

    Update a context

    Request body

    FieldTypeRequiredDescription
    namestringNoName (required on create)
    descriptionstringNoDescription
    colorstringNoHex colorDefault: #6366f1
    tagsstring[]NoTags
    modelstringNoModel id
    temperaturenumberNoSampling temperature
    max_tokensintegerNoMax tokens
    system_promptstringNoSystem prompt
    metadataobjectNoFree-form JSON
    is_archivedbooleanNoArchive 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
    }'
    DELETE
    /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.

    GET
    /v1/boards

    List boards

    Key permission: tasks

    Query parameters

    FieldTypeRequiredDescription
    limitintegerNoPage size, up to 100Default: 50
    offsetintegerNoItems to skipDefault: 0
    curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/boards" \
      -H "Authorization: Bearer $MULTIVERSE_API_KEY"
    POST
    /v1/boards

    Create a board

    Key permission: tasks

    Request body

    FieldTypeRequiredDescription
    namestring
    Yes
    Name
    descriptionstringNoDescription
    colorstringNoColor
    team_iduuidNoCreate 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"
    }'
    GET
    /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"
    PATCH
    /v1/boards/{id}

    Update a board

    Key permission: tasks

    Request body

    FieldTypeRequiredDescription
    namestringNoName
    descriptionstringNoDescription
    colorstringNoColor
    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"
    }'
    DELETE
    /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"
    GET
    /v1/boards/{id}/tasks

    List a board's tasks (by position, archived tasks excluded)

    Key permission: tasks

    Query parameters

    FieldTypeRequiredDescription
    limitintegerNoPage size, up to 200Default: 100
    offsetintegerNoItems 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.

    GET
    /v1/tasks

    List tasks

    Key permission: tasks

    Query parameters

    FieldTypeRequiredDescription
    board_iduuidNoOnly this board
    statusstringNoFilter by status
    prioritystringNoFilter by priority
    assigneestringNoFilter by assignee
    include_archivedbooleanNoInclude archived tasksDefault: false
    limitintegerNoPage size, up to 100Default: 50
    offsetintegerNoItems to skipDefault: 0
    curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/tasks?status=todo&priority=high" \
      -H "Authorization: Bearer $MULTIVERSE_API_KEY"
    POST
    /v1/tasks

    Create a task

    Key permission: tasks

    • Returns 201 with the task. Invalid enum values return 400 INVALID_VALUE.

    Request body

    FieldTypeRequiredDescription
    titlestring
    Yes
    Title
    descriptionstringNoDescription
    statusstringNobacklog | todo | in-progress | review | doneDefault: todo
    prioritystringNolow | medium | high | urgentDefault: medium
    assigneestringNoAssignee
    tagsstring[]NoTags
    due_datestringNoISO 8601 date
    board_iduuidNoBoard (your default board if omitted on create)
    estimated_hoursnumberNoEstimate 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"
      ]
    }'
    GET
    /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"
    PATCH
    /v1/tasks/{id}

    Update a task

    Key permission: tasks

    Request body

    FieldTypeRequiredDescription
    titlestringNoTitle (required on create)
    descriptionstringNoDescription
    statusstringNobacklog | todo | in-progress | review | doneDefault: todo
    prioritystringNolow | medium | high | urgentDefault: medium
    assigneestringNoAssignee
    tagsstring[]NoTags
    due_datestringNoISO 8601 date
    board_iduuidNoBoard (your default board if omitted on create)
    estimated_hoursnumberNoEstimate in hours
    logged_hoursnumberNoHours logged
    positionnumberNoOrder 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
    }'
    DELETE
    /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).

    GET
    /v1/teams

    List your teams

    curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/teams" \
      -H "Authorization: Bearer $MULTIVERSE_API_KEY"
    GET
    /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.

    POST
    /v1/queue

    Add 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

    FieldTypeRequiredDescription
    promptstringNoThe prompt (required unless workflow_id is given)
    workflow_iduuidNoRun this saved workflow instead of a prompt
    modelstringNoModel idDefault: openrouter/openai/gpt-6-luna
    prioritystringNocritical | high | normal | lowDefault: normal
    destinationstringNoWhere the result should go
    scheduled_forstringNoISO 8601 time in the future; the item waits as "scheduled" and runs then
    runbooleanNofalse only enqueues it (status pending); start it later with POST /v1/queue/{id}/runDefault: true
    waitbooleanNoRun 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"
    }'
    GET
    /v1/queue

    List queue items

    Key permission: workflows

    Query parameters

    FieldTypeRequiredDescription
    statusstringNoComma-separated statuses, e.g. pending,running,scheduled
    limitintegerNoPage size, up to 100Default: 50
    offsetintegerNoItems to skipDefault: 0
    curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/queue?status=pending,running,scheduled" \
      -H "Authorization: Bearer $MULTIVERSE_API_KEY"
    GET
    /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"
    POST
    /v1/queue/{id}/run

    Run a waiting item now

    Key permission: workflows

    Request body

    FieldTypeRequiredDescription
    waitbooleanNoWait 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
    }'
    DELETE
    /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"

    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.

    GET
    /v1/platforms

    Which posting platforms are connected

    Key permission: posts

    • An Instagram, Threads or LinkedIn account whose access has lapsed shows connected: false with status: "expired" — reconnect Instagram and Threads in Settings → Meta, LinkedIn in Settings → Social (LinkedIn access lasts 60 days and cannot be refreshed).
    curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/platforms" \
      -H "Authorization: Bearer $MULTIVERSE_API_KEY"
    POST
    /v1/posts/create

    Publish now

    Key permission: posts

    • status is "published" when every platform succeeded, "partial" when some failed, "processing" (HTTP 202) when nothing failed but a platform is still processing the media, and "failed" (HTTP 502) when none succeeded.
    • Instagram and TikTok process video before it can go live. The call waits up to about a minute; after that the platform's result is "processing" (with its container_id or publish_id) and MultiverseAI publishes it as soon as processing finishes — follow it with GET /v1/posts/{id}/status or the post.published / post.failed webhooks. Instagram media is never published before Instagram reports it FINISHED.
    • Every create is recorded: the response id works with GET /v1/posts/{id}/status. Created posts don't appear in GET /v1/posts/scheduled.

    Request body

    FieldTypeRequiredDescription
    platformsstring[]
    Yes
    Any of "twitter", "tiktok", "instagram", "facebook", "threads", "linkedin", "youtube"
    contentstringNoPost text (content or media_urls is required)
    media_urlsstring[]Nohttps:// media URLs. Instagram and TikTok need media; X (Twitter) takes up to 4 images or 1 video; Threads takes 1, or 2–10 as a carousel (text is required unless it is a carousel); LinkedIn takes 1–20 images or one video (text up to 3,000 characters), or a link via platform_options.linkedin.link instead of media; YouTube takes exactly one video.
    platform_optionsobjectNoPer-platform options, e.g. { facebook: { page_id, link }, tiktok: { privacy_level, disable_comment }, threads: { account, alt_text }, linkedin: { link, link_title, visibility } }. linkedin.link shares a URL as an article post (no media alongside it), link_title overrides its title, and visibility is "PUBLIC" (default) or "CONNECTIONS". youtube: { title, privacy_status, tags, category_id, made_for_kids, publish_at, notify_subscribers, thumbnail_url } — title defaults to the first line of the text (100 characters max) and the text becomes the description; privacy_status is "private" (default), "unlisted" or "public" — until MultiverseAI's Google app passes YouTube's audit, uploads stay private whatever is asked; publish_at uploads it private and publishes it then. tiktok.privacy_level must be one the creator's account allows (default "SELF_ONLY"; unaudited TikTok apps can only post SELF_ONLY). <platform>.account (or account_id) picks one of several connected accounts by username or id.
    project_idstringNoPost as this project's accounts (see Projects). Also accepted as an X-Project-Id header.
    curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/posts/create" \
      -H "Authorization: Bearer $MULTIVERSE_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
      "platforms": [
        "twitter",
        "facebook"
      ],
      "content": "We just shipped a new feature!"
    }'
    POST
    /v1/posts/schedule

    Schedule a post

    Key permission: posts

    • Returns 201 { object: "scheduled_post", … }. Scheduled posts are published automatically at scheduled_at (within a minute); a platform still processing media leaves the post "processing" until it is live. Each platform's outcome also arrives as a post.published / post.failed webhook.

    Request body

    FieldTypeRequiredDescription
    platformsstring[]
    Yes
    Any of "twitter", "tiktok", "instagram", "facebook", "threads", "linkedin", "youtube"
    contentstringNoPost text (content or media_urls is required)
    media_urlsstring[]Nohttps:// media URLs. Instagram and TikTok need media; X (Twitter) takes up to 4 images or 1 video; Threads takes 1, or 2–10 as a carousel (text is required unless it is a carousel); LinkedIn takes 1–20 images or one video (text up to 3,000 characters), or a link via platform_options.linkedin.link instead of media; YouTube takes exactly one video.
    platform_optionsobjectNoPer-platform options, e.g. { facebook: { page_id, link }, tiktok: { privacy_level, disable_comment }, threads: { account, alt_text }, linkedin: { link, link_title, visibility } }. linkedin.link shares a URL as an article post (no media alongside it), link_title overrides its title, and visibility is "PUBLIC" (default) or "CONNECTIONS". youtube: { title, privacy_status, tags, category_id, made_for_kids, publish_at, notify_subscribers, thumbnail_url } — title defaults to the first line of the text (100 characters max) and the text becomes the description; privacy_status is "private" (default), "unlisted" or "public" — until MultiverseAI's Google app passes YouTube's audit, uploads stay private whatever is asked; publish_at uploads it private and publishes it then. tiktok.privacy_level must be one the creator's account allows (default "SELF_ONLY"; unaudited TikTok apps can only post SELF_ONLY). <platform>.account (or account_id) picks one of several connected accounts by username or id.
    project_idstringNoPost as this project's accounts (see Projects). Also accepted as an X-Project-Id header.
    scheduled_atstring
    Yes
    ISO 8601 time in the future
    curl -X POST "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/posts/schedule" \
      -H "Authorization: Bearer $MULTIVERSE_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
      "platforms": [
        "instagram"
      ],
      "content": "See you at the meetup tonight",
      "media_urls": [
        "https://example.com/banner.jpg"
      ],
      "scheduled_at": "2026-10-10T17:00:00Z"
    }'
    GET
    /v1/posts/scheduled

    List scheduled posts

    Key permission: posts

    Query parameters

    FieldTypeRequiredDescription
    statusstringNopending | publishing | processing | published | failed | cancelled
    limitintegerNoUp to 100Default: 50
    curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/posts/scheduled?status=pending" \
      -H "Authorization: Bearer $MULTIVERSE_API_KEY"
    GET
    /v1/posts/{id}/status

    Get a post (scheduled or created), including per-platform publish results

    Key permission: posts

    • source is "scheduled" or "immediate" (POST /v1/posts/create). status is pending → publishing → published | failed, with "processing" while a platform finishes processing media. publish_results holds each platform's status (success | failed | processing), url when known, and error.
    curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/posts/d4e5f6a7-b8c9-4d0e-a1f2-3b4c5d6e7f8a/status" \
      -H "Authorization: Bearer $MULTIVERSE_API_KEY"
    DELETE
    /v1/posts/scheduled/{id}

    Cancel a scheduled post

    Key permission: posts

    curl -X DELETE "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/posts/scheduled/d4e5f6a7-b8c9-4d0e-a1f2-3b4c5d6e7f8a" \
      -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.
    POST
    /v1/projects

    Create a project

    Key permission: posts

    Request body

    FieldTypeRequiredDescription
    namestring
    Yes
    Display name
    external_idstringNoYour own id for it (unique per account). Creating again with the same external_id returns the existing project (200).
    metadataobjectNoAnything 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"
    }'
    GET
    /v1/projects

    List projects

    Key permission: posts

    Query parameters

    FieldTypeRequiredDescription
    external_idstringNoOnly the project with this external_id
    curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/projects" \
      -H "Authorization: Bearer $MULTIVERSE_API_KEY"
    GET
    /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"
    PATCH
    /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"
    }'
    DELETE
    /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"
    POST
    /v1/projects/{id}/connect-session

    Create 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

    FieldTypeRequiredDescription
    platformsstring[]NoPlatforms 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_urlstringNohttps URL (http on localhost) the Done button sends the popup to, with ?mv_status=done&mv_project_id=…
    originstringNoOrigin the popup posts its events to (e.g. https://app.example.com). Default: return_url's origin
    themestringNolight | dark | auto (default)
    partner_namestringNoYour product name, shown in the portal (60 characters max)
    ttl_secondsnumberNo60–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"
    }'
    POST
    /v1/projects/{id}/connect

    Get 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

    FieldTypeRequiredDescription
    platformstring
    Yes
    twitter | tiktok | instagram | threads | facebook | linkedin | youtube | whatsapp | messenger | instagram_dm | slack | discord | google | telegram | meta_ads
    return_urlstringNoRequired except for telegram: https URL (http allowed on localhost) the person is sent back to
    bot_tokenstringNotelegram only: the bot token from @BotFather. The bot is connected immediately and its webhook pointed at MultiverseAI.
    google_servicesstring[]Nogoogle 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"
    }'
    POST
    /v1/projects/{id}/messages

    Send 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

    FieldTypeRequiredDescription
    platformstring
    Yes
    whatsapp | messenger | instagram_dm (or instagram) | telegram | slack | discord
    tostring
    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
    textstringNoUp to 4096 characters. Required unless media or template is sent.
    mediaobjectNo{ kind: "image" | "video" | "audio" | "document", url: "https://…", name? }
    templateobjectNoWhatsApp only: { name, language? (default en_US), components? } — needed to message someone outside the 24-hour window
    thread_tsstringNoSlack: reply in this thread
    accountstringNoWhen 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."
    }'
    GET
    /v1/projects/{id}/gmail/messages

    List emails in the project's Gmail

    Key permission: posts

    Query parameters

    FieldTypeRequiredDescription
    qstringNoGmail search, e.g. is:unread from:alice@example.com
    limitnumberNo1–50 (default 20)
    page_tokenstringNonext_page_token from the previous page
    accountstringNoWhich 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"
    GET
    /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"
    POST
    /v1/projects/{id}/gmail/messages

    Send an email from the project's Gmail

    Key permission: posts

    Request body

    FieldTypeRequiredDescription
    tostring | string[]
    Yes
    Recipient address(es)
    subjectstring
    Yes
    Subject line
    textstringNoPlain-text body (text or html is required)
    htmlstringNoHTML body (with text, both are sent as alternatives)
    ccstring | string[]No
    bccstring | string[]No
    thread_idstringNoReply inside this Gmail thread
    in_reply_tostringNoMessage-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…"
    }'
    GET
    /v1/projects/{id}/calendar/events

    List upcoming events in the project's Google Calendar

    Key permission: posts

    Query parameters

    FieldTypeRequiredDescription
    time_minstringNoISO 8601 (default now)
    time_maxstringNoISO 8601
    qstringNoFree-text search
    limitnumberNo1–250 (default 25)
    calendar_idstringNoDefault primary
    page_tokenstringNo
    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"
    POST
    /v1/projects/{id}/calendar/events

    Create an event in the project's Google Calendar

    Key permission: posts

    Request body

    FieldTypeRequiredDescription
    summarystring
    Yes
    Title
    startstring
    Yes
    RFC 3339 date-time, or YYYY-MM-DD for an all-day event
    endstring
    Yes
    RFC 3339 date-time, or YYYY-MM-DD (exclusive) for all-day
    time_zonestringNoIANA zone for start/end, e.g. America/Los_Angeles
    descriptionstringNo
    locationstringNo
    attendeesstring[]NoEmail addresses
    google_meetbooleanNoAdd a Google Meet link
    send_updatesstringNoall | externalOnly | none (default none: attendees are not emailed)
    calendar_idstringNoDefault 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
    }'
    DELETE
    /v1/projects/{id}/calendar/events/{event_id}

    Delete an event

    Key permission: posts

    Query parameters

    FieldTypeRequiredDescription
    calendar_idstringNoDefault 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"
    GET
    /v1/projects/{id}/drive/files

    List 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

    FieldTypeRequiredDescription
    qstringNoFull-text search, or Drive query syntax (e.g. mimeType = 'application/pdf')
    limitnumberNo1–100 (default 25)
    page_tokenstringNo
    curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/projects/acme-client-42/drive/files?q=invoice" \
      -H "Authorization: Bearer $MULTIVERSE_API_KEY"
    GET
    /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"
    GET
    /v1/projects/{id}/accounts

    List 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

    FieldTypeRequiredDescription
    platformstringNoOnly 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"
    GET
    /v1/projects/{id}/insights

    Live 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

    FieldTypeRequiredDescription
    platformstringNoinstagram | facebook | threads | tiktok | twitter | linkedin (default: every connected account)
    sincestringNoYYYY-MM-DD, inclusive (default: 29 days before until)
    untilstringNoYYYY-MM-DD, inclusive (default: today, UTC). At most 90 days in all.
    refreshbooleanNotrue 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"
    DELETE
    /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.

    GET
    /v1/messaging/accounts

    The connected messaging accounts

    • id is what Meta webhooks are keyed by: the phone_number_id, Page id or Instagram account id.

    Query parameters

    FieldTypeRequiredDescription
    project_idstringNoA 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"
    POST
    /v1/messaging/send

    Send 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

    FieldTypeRequiredDescription
    platformstring
    Yes
    "whatsapp", "messenger" or "instagram"
    tostring
    Yes
    Phone number (WhatsApp) or the page-scoped id of the person (Messenger / Instagram)
    textstringNoUp to 4096 characters. Required unless media is sent.
    mediaobjectNo{ kind: "image" | "video" | "audio" | "document", url: "https://…", name? }
    project_idstringNoSend 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!"
    }'
    POST
    /v1/messaging/disconnect

    Revoke 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.
    PUT
    /v1/webhooks

    Create 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

    FieldTypeRequiredDescription
    urlstring
    Yes
    Public https URL (no localhost or private addresses)
    eventsstring[]Nomessage.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"
      ]
    }'
    GET
    /v1/webhooks

    This 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"
    DELETE
    /v1/webhooks

    Remove 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"
    POST
    /v1/webhooks/rotate-secret

    Issue 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 '{}'
    POST
    /v1/webhooks/test

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

    GET
    /v1/me

    Who 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"
    GET
    /v1/keys

    List your developer keys (no secrets)

    curl "https://ralcxfiefghnpadaddzu.supabase.co/functions/v1/public-api/v1/keys" \
      -H "Authorization: Bearer $MULTIVERSE_API_KEY"
    GET
    /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"
    GET
    /v1/usage

    Request log for your keys, newest first

    Query parameters

    FieldTypeRequiredDescription
    key_iduuidNoOnly this key
    sincestringNoISO 8601; only requests at or after this time
    statusintegerNoOnly this HTTP status, e.g. 403
    limitintegerNoPage size, up to 500Default: 100
    offsetintegerNoItems 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.

    POST
    /web-scraping-api

    Unified web scraping API - intelligently routes to Firecrawl, Browserless, or ScrapingBee based on operation and configuration. Supports user-provided API keys.

    Request body

    FieldTypeRequiredDescription
    urlstring
    Yes
    The URL to scrape
    operationstringNoOperation: scrape, screenshot, pdf, search, map, crawlDefault: scrape
    providerstringNoProvider: auto, firecrawl, browserless, scrapingbeeDefault: auto
    apiKeysobjectNoUser API keys: { firecrawl?, browserless?, scrapingbee? }
    formatsarrayNoOutput formats (Firecrawl): markdown, html, links, screenshot
    selectorstringNoCSS selector (Browserless/ScrapingBee)
    executeJsbooleanNoExecute JavaScript on page
    jsScriptstringNoCustom JavaScript to execute
    useProxybooleanNoEnable proxy rotation (ScrapingBee)
    renderJsbooleanNoRender 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"
        }
      }'
    POST
    /browserless-scrape

    Browserless.io scraping - content extraction, screenshots, PDFs, and custom JavaScript execution

    Request body

    FieldTypeRequiredDescription
    urlstring
    Yes
    The URL to scrape
    apiKeystringNoYour Browserless API key (optional, uses system key if not provided)
    operationstringNoOperation: content, screenshot, pdf, functionDefault: content
    selectorstringNoCSS selector to target specific elements
    waitForSelectorstringNoWait for element to appear
    timeoutintegerNoTimeout in millisecondsDefault: 30000
    fullPagebooleanNoCapture full page screenshotDefault: false
    executeJsbooleanNoExecute custom JavaScriptDefault: false
    jsScriptstringNoJavaScript 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"
      }'
    POST
    /scrapingbee-scrape

    ScrapingBee scraping - proxy rotation, JavaScript rendering, and CSS extraction

    Request body

    FieldTypeRequiredDescription
    urlstring
    Yes
    The URL to scrape
    apiKeystringNoYour ScrapingBee API key (optional, uses system key if not provided)
    renderJsbooleanNoRender JavaScript (uses more credits)Default: false
    premiumProxybooleanNoUse premium proxy poolDefault: false
    countryCodestringNoProxy country code (e.g., "us", "uk")
    extractRulesobjectNoCSS extraction rules: { title: "h1", links: { selector: "a", type: "list" } }
    waitForstringNoCSS selector to wait for
    timeoutintegerNoTimeout in millisecondsDefault: 30000
    returnScreenshotbooleanNoReturn 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"
      }'
    POST
    /firecrawl-scrape

    Scrape a single URL and extract content in various formats (markdown, HTML, screenshot, etc.)

    Request body

    FieldTypeRequiredDescription
    urlstring
    Yes
    The URL to scrape
    formatsarrayNoOutput formats: markdown, html, rawHtml, links, screenshot, branding, summaryDefault: ["markdown"]
    onlyMainContentbooleanNoExclude headers, navs, footersDefault: true
    waitForintegerNoMilliseconds to wait for dynamic content
    locationobjectNoGeo-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
      }'
    POST
    /firecrawl-search

    Search the web and optionally scrape content from results

    Request body

    FieldTypeRequiredDescription
    querystring
    Yes
    Search query string
    limitintegerNoNumber of results (1-100)Default: 10
    langstringNoLanguage code (e.g., "en")
    countrystringNoCountry code (e.g., "US")
    tbsstringNoTime filter: qdr:h (hour), qdr:d (day), qdr:w (week), qdr:m (month), qdr:y (year)
    scrapeOptionsobjectNoIf 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"
      }'
    POST
    /firecrawl-map

    Quickly discover all URLs on a website (fast sitemap generation)

    Request body

    FieldTypeRequiredDescription
    urlstring
    Yes
    The base URL to map
    searchstringNoFilter URLs by keyword (ordered by relevance)
    limitintegerNoMaximum URLs to returnDefault: 5000
    includeSubdomainsbooleanNoInclude 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
      }'
    POST
    /firecrawl-crawl

    Recursively crawl and scrape all pages on a website

    Request body

    FieldTypeRequiredDescription
    urlstring
    Yes
    The starting URL to crawl
    limitintegerNoMaximum pages to crawlDefault: 100
    maxDepthintegerNoMaximum link depth to follow
    includePathsarrayNoURL patterns to include
    excludePathsarrayNoURL 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
      }'
    POST
    /webscraper

    Puppeteer-based web scraping with JavaScript execution support

    Request body

    FieldTypeRequiredDescription
    urlstring
    Yes
    The URL to scrape
    selectorstringNoCSS selector to target specific elements
    scrapeTypestringNoOutput type: text, html, or screenshotDefault: text
    waitForSelectorstringNoWait for specific element to appear
    timeoutintegerNoTimeout in millisecondsDefault: 30000
    executeJavaScriptbooleanNoExecute custom JavaScriptDefault: false
    jsScriptstringNoJavaScript 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"
      }'

    YouTube

    Access YouTube Data API for videos, channels, and playlists

    POST
    /youtube-api

    Proxy endpoint for YouTube Data API v3. Requires API key authentication.

    Key permission: read

    Request body

    FieldTypeRequiredDescription
    endpointstring
    Yes
    YouTube API endpoint path (e.g., /search, /videos, /channels)
    paramsobjectNoQuery 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

    POST
    /quicktube-api

    QuickTube AI API - transcribe, summarize, analyze, and extract insights from YouTube videos

    Request body

    FieldTypeRequiredDescription
    actionstring
    Yes
    Action: transcript, summarize, best-sections, characters, chat, quiz, speech, download-video, video-metadata, video-search, video-comments, batch-process
    urlstringNoYouTube video URL (for transcript, summarize, best-sections, characters, chat, quiz)
    video_idstringNoYouTube video ID (for metadata, comments, related)
    querystringNoSearch query (for video-search) or chat question (for chat)
    languagestringNoLanguage 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"
      }'
    POST
    /quicktube-api (transcript)

    Get a full transcript of a YouTube video with timestamps

    Request body

    FieldTypeRequiredDescription
    actionstring
    Yes
    Set to "transcript"
    urlstring
    Yes
    YouTube video URL
    languagestringNoLanguage 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"
      }'
    POST
    /quicktube-api (best-sections)

    AI-powered extraction of the most engaging video segments

    Request body

    FieldTypeRequiredDescription
    actionstring
    Yes
    Set to "best-sections"
    urlstring
    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

    POST
    /send-email

    Send emails via Resend API

    Request body

    FieldTypeRequiredDescription
    tostring | array
    Yes
    Recipient email(s)
    subjectstring
    Yes
    Email subject line
    bodystring
    Yes
    Email content (text or HTML)
    htmlbooleanNoSet to true if body contains HTMLDefault: false
    from_namestringNoSender display nameDefault: MultiverseAI
    reply_tostringNoReply-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
      }'
    POST
    /slack-webhook

    Send messages to Slack channels via webhook

    Request body

    FieldTypeRequiredDescription
    webhook_urlstring
    Yes
    Slack incoming webhook URL
    messagestringNoMessage text (required if no attachments)
    channelstringNoOverride default channel
    usernamestringNoOverride bot username
    icon_emojistringNoOverride bot icon (e.g., :robot_face:)
    attachmentsarrayNoRich 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

    POST
    /github-api

    GitHub App API - list installations, repositories, and perform actions

    Request body

    FieldTypeRequiredDescription
    actionstring
    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
    installationIdnumberNoGitHub App installation ID (required for most actions)
    ownerstringNoRepository owner (required for repo-specific actions)
    repostringNoRepository 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"
      }'
    POST
    /github-api (list-repos)

    List repositories accessible by a GitHub App installation

    Request body

    FieldTypeRequiredDescription
    actionstring
    Yes
    Set to "list-repos"
    installationIdnumber
    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
      }'
    POST
    /github-api (create-issue)

    Create a new issue in a GitHub repository

    Request body

    FieldTypeRequiredDescription
    actionstring
    Yes
    Set to "create-issue"
    installationIdnumber
    Yes
    GitHub App installation ID
    ownerstring
    Yes
    Repository owner
    repostring
    Yes
    Repository name
    titlestring
    Yes
    Issue title
    bodystringNoIssue body (markdown supported)
    labelsarrayNoArray of label names
    assigneesarrayNoArray 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"]
      }'
    POST
    /github-api (create-pr)

    Create a pull request with code changes

    Request body

    FieldTypeRequiredDescription
    actionstring
    Yes
    Set to "create-pr"
    installationIdnumber
    Yes
    GitHub App installation ID
    ownerstring
    Yes
    Repository owner
    repostring
    Yes
    Repository name
    titlestring
    Yes
    PR title
    bodystringNoPR description
    headstring
    Yes
    Branch with changes
    basestringNoTarget 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"
      }'
    POST
    /github-api (import-repo-context)

    Import repository code as AI context (useful for code analysis)

    Request body

    FieldTypeRequiredDescription
    actionstring
    Yes
    Set to "import-repo-context"
    installationIdnumber
    Yes
    GitHub App installation ID
    ownerstring
    Yes
    Repository owner
    repostring
    Yes
    Repository name
    pathstringNoSubdirectory 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

    POST
    /discord-api

    Discord API - send messages, manage webhooks, and interact with Discord servers

    Request body

    FieldTypeRequiredDescription
    actionstring
    Yes
    Action: get-config, list-guilds, get-guild, list-channels, send-message, send-embed, create-webhook, execute-webhook, register-commands, list-commands
    channelIdstringNoDiscord channel ID (for message/webhook actions)
    guildIdstringNoDiscord guild (server) ID
    contentstringNoMessage 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"
      }'
    POST
    /discord-api (send-message)

    Send a message to a Discord channel

    Request body

    FieldTypeRequiredDescription
    actionstring
    Yes
    Set to "send-message"
    channelIdstring
    Yes
    Discord channel ID
    contentstring
    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!"
      }'
    POST
    /discord-api (send-embed)

    Send a rich embed message to a Discord channel

    Request body

    FieldTypeRequiredDescription
    actionstring
    Yes
    Set to "send-embed"
    channelIdstring
    Yes
    Discord channel ID
    titlestring
    Yes
    Embed title
    descriptionstringNoEmbed description
    colornumberNoEmbed color (decimal, default: 5793266)
    fieldsarrayNoArray of field objects
    footerstringNoFooter 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"
      }'
    POST
    /discord-api (execute-webhook)

    Send a message via Discord webhook

    Request body

    FieldTypeRequiredDescription
    actionstring
    Yes
    Set to "execute-webhook"
    webhookIdstring
    Yes
    Discord webhook ID
    webhookTokenstring
    Yes
    Discord webhook token
    contentstringNoMessage content
    usernamestringNoOverride 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"
      }'
    POST
    /discord-webhook

    Webhook endpoint for Discord interactions (slash commands, buttons). Configure this URL in Discord Developer Portal.

    Request body

    FieldTypeRequiredDescription
    typenumberNoInteraction type (1=PING, 2=APPLICATION_COMMAND)
    dataobjectNoInteraction 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 Portal

    Gmail

    Send and read emails via Gmail API with OAuth2 authentication

    POST
    /gmail-api

    Gmail API - send emails, read inbox, manage labels. Requires Google OAuth connection.

    Key permission: integrations

    Request body

    FieldTypeRequiredDescription
    operationstring
    Yes
    Operation: send, list, get, search, labels, draft
    userIdstring
    Yes
    User ID (must have connected Google account)
    tostringNoRecipient email (for send operation)
    subjectstringNoEmail subject (for send operation)
    bodystringNoEmail body (for send operation)
    ccstringNoCC recipients (for send/draft)
    bccstringNoBCC recipients (for send/draft)
    isHtmlbooleanNoSet to true if body contains HTML (for send/draft)Default: false
    messageIdstringNoMessage ID (for get operation)
    querystringNoGmail search query (for search operation)
    maxResultsintegerNoMax messages to return (for list/search)Default: 20
    labelIdsarrayNoFilter by label IDs, e.g. ["INBOX", "UNREAD"] (for list)
    includeBodybooleanNoFetch full message bodies (for list/search)
    formatstringNoMessage 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."
      }'
    POST
    /gmail-api (list)

    List inbox messages with optional label and search filtering

    Key permission: integrations

    Request body

    FieldTypeRequiredDescription
    operationstring
    Yes
    Set to "list"
    userIdstring
    Yes
    User ID
    maxResultsintegerNoMaximum messages to returnDefault: 20
    labelIdsarrayNoFilter 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.

    POST
    /google-drive-api

    Google 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

    FieldTypeRequiredDescription
    operationstring
    Yes
    Operation: list, search, get, create, update, delete, download, upload, copy, move, create_folder, share
    userIdstring
    Yes
    User ID (must have connected Google account)
    fileIdstringNoFile ID (required for get, update, delete, download, copy, move, share)
    folderIdstringNoParent folder ID (for list, upload, create_folder)
    namestringNoFile/folder name (for create, upload, copy, create_folder)
    contentstringNoFile content (for create, upload, update)
    mimeTypestringNoMIME type (for create, upload)Default: application/octet-stream
    descriptionstringNoFile description (for create, update)
    querystringNoSearch query (for list, search)
    pageSizeintegerNoMax results per page (for list, search)Default: 10
    pageTokenstringNoPagination token for next page
    shareEmailstringNoEmail to share with (required for share)
    shareRolestringNoShare permission: reader, writer, commenterDefault: reader
    destinationFolderIdstringNoTarget folder ID (required for move)
    exportMimeTypestringNoExport 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
      }'
    POST
    /google-drive-api (upload)

    Upload a file to Google Drive with optional folder placement. Supports multipart uploads.

    Key permission: integrations

    Request body

    FieldTypeRequiredDescription
    operationstring
    Yes
    Set to "upload"
    userIdstring
    Yes
    User ID
    fileNamestring
    Yes
    File name
    contentstring
    Yes
    File content
    mimeTypestringNoMIME type
    folderIdstringNoParent 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"
      }'
    POST
    /google-drive-api (share)

    Share a file or folder with another user via email

    Key permission: integrations

    Request body

    FieldTypeRequiredDescription
    operationstring
    Yes
    Set to "share"
    userIdstring
    Yes
    User ID
    fileIdstring
    Yes
    File or folder ID to share
    shareEmailstring
    Yes
    Recipient email address
    shareRolestringNoPermission 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

    POST
    /google-docs-api

    Google Docs API - create, get, get_content, update, append, and export documents. Requires Google OAuth connection.

    Key permission: integrations

    Request body

    FieldTypeRequiredDescription
    operationstring
    Yes
    Operation: create, get, get_content, update, append, export
    userIdstring
    Yes
    User ID (must have connected Google account)
    documentIdstringNoDocument ID (required for get, get_content, update, append, export)
    titlestringNoDocument title (required for create)
    contentstringNoDocument content (required for create, update, append)
    folderIdstringNoGoogle Drive folder ID to place document in (for create)
    insertLocationstringNoWhere to insert content: start, end, or index (for update, default: end)
    exportFormatstringNoExport 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"
      }'
    POST
    /google-docs-api (get_content)

    Extract plain text from a Google Doc, including content from paragraphs and tables

    Key permission: integrations

    Request body

    FieldTypeRequiredDescription
    operationstring
    Yes
    Set to "get_content"
    userIdstring
    Yes
    User ID
    documentIdstring
    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"
      }'
    POST
    /google-docs-api (append)

    Append content to the end of a Google Doc with automatic newline separator

    Key permission: integrations

    Request body

    FieldTypeRequiredDescription
    operationstring
    Yes
    Set to "append"
    userIdstring
    Yes
    User ID
    documentIdstring
    Yes
    Google Docs document ID
    contentstring
    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"
      }'
    POST
    /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

    FieldTypeRequiredDescription
    operationstring
    Yes
    Set to "export"
    userIdstring
    Yes
    User ID
    documentIdstring
    Yes
    Google Docs document ID
    exportFormatstringNoFormat: 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"
      }'
    POST
    /google-docs-export

    Create a formatted Google Doc with styled headers and sections. Applies bold formatting and font sizing automatically.

    Key permission: integrations

    Request body

    FieldTypeRequiredDescription
    userIdstring
    Yes
    User ID
    titlestring
    Yes
    Document title
    contentstring
    Yes
    Document content (sections split by newlines, headers auto-detected)
    accessTokenstringNoOptional 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

    POST
    /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

    FieldTypeRequiredDescription
    servicestring
    Yes
    "sheets"
    operationstring
    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)
    paramsobject
    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>"}}'
    POST
    /google-workspace-api (slides)

    Google Slides: create, addSlide, replaceText, get. Runs as the Google account connected in Settings → Integrations.

    Key permission: integrations

    Request body

    FieldTypeRequiredDescription
    servicestring
    Yes
    "slides"
    operationstring
    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)
    paramsobject
    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": {}}'
    POST
    /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

    FieldTypeRequiredDescription
    servicestring
    Yes
    "calendar"
    operationstring
    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)
    paramsobject
    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>"}}'
    POST
    /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

    FieldTypeRequiredDescription
    servicestring
    Yes
    "forms"
    operationstring
    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)
    paramsobject
    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>"}}'
    POST
    /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

    FieldTypeRequiredDescription
    servicestring
    Yes
    "tasks"
    operationstring
    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)
    paramsobject
    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>"}}'
    POST
    /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

    FieldTypeRequiredDescription
    servicestring
    Yes
    "contacts"
    operationstring
    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)
    paramsobject
    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>"}}'
    POST
    /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

    FieldTypeRequiredDescription
    servicestring
    Yes
    "chat"
    operationstring
    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)
    paramsobject
    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>"}}'
    POST
    /google-workspace-api (meet)

    Google Meet: createSpace, getSpace, endConference. Runs as the Google account connected in Settings → Integrations.

    Key permission: integrations

    Request body

    FieldTypeRequiredDescription
    servicestring
    Yes
    "meet"
    operationstring
    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))
    paramsobject
    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

    POST
    /google-photos-api

    Google Photos API - list albums, get media items, and search photos. Requires Google OAuth connection.

    Key permission: integrations

    Request body

    FieldTypeRequiredDescription
    operationstring
    Yes
    Operation: listAlbums, getAlbum, listMediaItems, getMediaItem, searchMediaItems
    userIdstring
    Yes
    User ID (must have connected Google account with Photos scope)
    albumIdstringNoAlbum ID (for getAlbum, listMediaItems)
    mediaItemIdstringNoMedia item ID (for getMediaItem)
    pageSizeintegerNoNumber of items to returnDefault: 25
    pageTokenstringNoPagination token for next page
    filtersobjectNoSearch 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

    POST
    /jira-integration

    Jira API - list projects, create/update issues, add comments, and manage sprints.

    Key permission: integrations

    Request body

    FieldTypeRequiredDescription
    operationstring
    Yes
    Operation: list-projects, get-issue, create-issue, update-issue, search-issues, add-comment, get-transitions, transition-issue
    userIdstring
    Yes
    User ID
    projectKeystringNoJira project key (e.g., "PROJ")
    issueKeystringNoIssue key (e.g., "PROJ-123")
    summarystringNoIssue summary (for create)
    descriptionstringNoIssue description (for create)
    issueTypestringNoIssue type: Task, Bug, Story, EpicDefault: Task
    transitionIdstringNoTransition ID (for transition-issue)
    commentstringNoComment body (for add-comment)
    jqlstringNoJQL query string (for search-issues)
    maxResultsintegerNoMax results for search-issuesDefault: 50
    labelsarrayNoArray of label names (for create/update)
    assigneestringNoJira accountId of assignee
    customFieldsobjectNoCustom 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

    POST
    /facebook-ads-api

    Facebook Ads API - access ad accounts, campaigns, and performance metrics

    Request body

    FieldTypeRequiredDescription
    operationstring
    Yes
    Operation: get-ad-accounts, get-campaigns, get-adsets, get-ads, get-insights, get-account-insights, analyze-performance
    userIdstringNoOptional. Defaults to the owner of the API key; any other user is rejected (403).
    paramsobjectNoOperation-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"
      }'
    POST
    /facebook-ads-api (get-campaigns)

    Get all campaigns for an ad account

    Request body

    FieldTypeRequiredDescription
    operationstring
    Yes
    Set to "get-campaigns"
    userIdstringNoOptional. Defaults to the owner of the API key; any other user is rejected (403).
    paramsobject
    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
        }
      }'
    POST
    /facebook-ads-api (get-insights)

    Get performance metrics and insights for campaigns, ad sets, or ads

    Request body

    FieldTypeRequiredDescription
    operationstring
    Yes
    Set to "get-insights"
    userIdstringNoOptional. Defaults to the owner of the API key; any other user is rejected (403).
    paramsobject
    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"
        }
      }'
    POST
    /facebook-ads-api (analyze-performance)

    AI-powered analysis of ad performance with optimization recommendations

    Request body

    FieldTypeRequiredDescription
    operationstring
    Yes
    Set to "analyze-performance"
    userIdstringNoOptional. Defaults to the owner of the API key; any other user is rejected (403).
    paramsobject
    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.

    POST
    /facebook-fundraiser-api (get-fundraisers)

    Get all fundraisers for the authenticated user

    Request body

    FieldTypeRequiredDescription
    operationstring
    Yes
    Set to "get-fundraisers"
    userIdstringNoOptional. Defaults to the owner of the API key; any other user is rejected (403).
    paramsobjectNo{ 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 }
      }'
    POST
    /facebook-fundraiser-api (create-fundraiser)

    Create a new fundraiser for a registered charity

    Request body

    FieldTypeRequiredDescription
    operationstring
    Yes
    Set to "create-fundraiser"
    userIdstringNoOptional. Defaults to the owner of the API key; any other user is rejected (403).
    paramsobject
    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"
        }
      }'
    POST
    /facebook-fundraiser-api (get-donations)

    Get donations for a specific fundraiser

    Request body

    FieldTypeRequiredDescription
    operationstring
    Yes
    Set to "get-donations"
    userIdstringNoOptional. Defaults to the owner of the API key; any other user is rejected (403).
    paramsobject
    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
        }
      }'
    POST
    /facebook-fundraiser-api (sync-amount)

    Sync external fundraiser amount with Facebook fundraiser

    Request body

    FieldTypeRequiredDescription
    operationstring
    Yes
    Set to "sync-amount"
    userIdstringNoOptional. Defaults to the owner of the API key; any other user is rejected (403).
    paramsobject
    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
        }
      }'
    POST
    /facebook-fundraiser-api (analyze-fundraiser)

    AI-powered analysis of fundraiser performance with recommendations

    Request body

    FieldTypeRequiredDescription
    operationstring
    Yes
    Set to "analyze-fundraiser"
    userIdstringNoOptional. Defaults to the owner of the API key; any other user is rejected (403).
    paramsobject
    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.

    POST
    /meta-messaging-api (whatsapp-send-message)

    Send a message via WhatsApp Business API

    Request body

    FieldTypeRequiredDescription
    operationstring
    Yes
    Set to "whatsapp-send-message"
    userIdstringNoOptional. Defaults to the owner of the API key; any other user is rejected (403).
    platformstring
    Yes
    Set to "whatsapp"
    paramsobject
    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!"
        }
      }'
    POST
    /meta-messaging-api (whatsapp-send-template)

    Send a pre-approved WhatsApp message template

    Request body

    FieldTypeRequiredDescription
    operationstring
    Yes
    Set to "whatsapp-send-template"
    userIdstringNoOptional. Defaults to the owner of the API key; any other user is rejected (403).
    platformstring
    Yes
    Set to "whatsapp"
    paramsobject
    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"
        }
      }'
    POST
    /meta-messaging-api (messenger-send-message)

    Send a message via Facebook Messenger

    Request body

    FieldTypeRequiredDescription
    operationstring
    Yes
    Set to "messenger-send-message"
    userIdstringNoOptional. Defaults to the owner of the API key; any other user is rejected (403).
    platformstring
    Yes
    Set to "messenger"
    paramsobject
    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" }
          ]
        }
      }'
    POST
    /meta-messaging-api (messenger-get-conversations)

    Get conversations from Facebook Messenger inbox

    Request body

    FieldTypeRequiredDescription
    operationstring
    Yes
    Set to "messenger-get-conversations"
    userIdstringNoOptional. Defaults to the owner of the API key; any other user is rejected (403).
    platformstring
    Yes
    Set to "messenger"
    paramsobjectNo{ 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 }
      }'
    POST
    /meta-messaging-api (instagram-send-message)

    Send a direct message via Instagram

    Request body

    FieldTypeRequiredDescription
    operationstring
    Yes
    Set to "instagram-send-message"
    userIdstringNoOptional. Defaults to the owner of the API key; any other user is rejected (403).
    platformstring
    Yes
    Set to "instagram"
    paramsobject
    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!"
        }
      }'
    POST
    /meta-messaging-api (instagram-get-conversations)

    Get DM conversations from Instagram inbox

    Request body

    FieldTypeRequiredDescription
    operationstring
    Yes
    Set to "instagram-get-conversations"
    userIdstringNoOptional. Defaults to the owner of the API key; any other user is rejected (403).
    platformstring
    Yes
    Set to "instagram"
    paramsobjectNo{ 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

    POST
    /tiktok-api

    TikTok Business API - manage advertisers, campaigns, ad groups, and ads. Requires TikTok OAuth connection.

    Request body

    FieldTypeRequiredDescription
    operationstring
    Yes
    Operation: get-advertiser-info, get-campaigns, get-adgroups, get-ads, get-reporting, get-audiences, get-pixels
    userIdstringNoOptional. Defaults to the owner of the API key; any other user is rejected (403).
    advertiserIdstringNoTikTok Advertiser ID
    paramsobjectNoOperation-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"
      }'
    POST
    /tiktok-ads-api

    TikTok Ads Management - create, update, and manage ad campaigns and ad groups

    Request body

    FieldTypeRequiredDescription
    operationstring
    Yes
    Operation: create-campaign, update-campaign, create-adgroup, update-adgroup, create-ad, get-ad-insights
    userIdstringNoOptional. Defaults to the owner of the API key; any other user is rejected (403).
    advertiserIdstring
    Yes
    TikTok Advertiser ID
    paramsobject
    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"]
        }
      }'
    POST
    /tiktok-pixel-api

    TikTok Pixel Management - create, manage, and monitor pixels and conversion events

    Request body

    FieldTypeRequiredDescription
    operationstring
    Yes
    Operation: create-pixel, get-pixels, get-pixel-stats, manage-events
    userIdstringNoOptional. Defaults to the owner of the API key; any other user is rejected (403).
    advertiserIdstring
    Yes
    TikTok Advertiser ID
    paramsobjectNoPixel-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"
      }'
    POST
    /tiktok-automated-rules-api

    TikTok Automated Rules - create and manage automated optimization rules for ads

    Request body

    FieldTypeRequiredDescription
    operationstring
    Yes
    Operation: create-rule, get-rules, update-rule, delete-rule, get-rule-results
    userIdstringNoOptional. Defaults to the owner of the API key; any other user is rejected (403).
    advertiserIdstring
    Yes
    TikTok Advertiser ID
    paramsobjectNoRule-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"
      }'
    POST
    /tiktok-rf-api

    TikTok Reach & Frequency - plan and manage R&F campaigns with guaranteed delivery

    Request body

    FieldTypeRequiredDescription
    operationstring
    Yes
    Operation: estimate-inventory, create-order, get-orders
    userIdstringNoOptional. Defaults to the owner of the API key; any other user is rejected (403).
    advertiserIdstring
    Yes
    TikTok Advertiser ID
    paramsobjectNoR&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)

    POST
    /email-templates

    Generate and send styled HTML emails using pre-built templates

    Request body

    FieldTypeRequiredDescription
    templatestring
    Yes
    Template: welcome, password_reset, notification, team_invite, task_assigned
    tostring
    Yes
    Recipient email address
    dataobject
    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

    POST
    /task-notifications

    Trigger task notifications for due date reminders, assignment alerts, and comment mentions

    Key permission: tasks

    Request body

    FieldTypeRequiredDescription
    typestring
    Yes
    Notification type: due-reminder, assignment, mention
    taskIdstring
    Yes
    Task ID
    userIdstring
    Yes
    User ID triggering the notification
    targetUserIdstringNoTarget user to notify (for assignment/mention)
    messagestringNoOptional 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.

    POST
    /mcp-server

    MCP 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

    FieldTypeRequiredDescription
    jsonrpcstring
    Yes
    Must be "2.0"Default: 2.0
    idnumber
    Yes
    Request ID
    methodstring
    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"
      }'
    POST
    /mcp-server

    list_agents — List all AI agents. Filter by status (draft/published/archived) and pagination.

    Key permission: agents

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: list_agents
    params.arguments.statusstringNoFilter: draft, published, archived
    params.arguments.include_archivedbooleanNoInclude archived agents (default false)
    params.arguments.limitnumberNoMax results (default 50, max 200)
    {
      "jsonrpc": "2.0",
      "id": 2,
      "method": "tools/call",
      "params": {
        "name": "list_agents",
        "arguments": {
          "status": "published",
          "limit": 10
        }
      }
    }
    POST
    /mcp-server

    get_agent — Get detailed agent info including linked context, workflows, custom tools, and version history.

    Key permission: agents

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: get_agent
    params.arguments.agent_idstring
    Yes
    The agent UUID
    {
      "jsonrpc": "2.0",
      "id": 3,
      "method": "tools/call",
      "params": {
        "name": "get_agent",
        "arguments": {
          "agent_id": "abc-123"
        }
      }
    }
    POST
    /mcp-server

    create_agent — Create a new AI agent with name, instructions, model, personality, and optional context attachment.

    Key permission: agents

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: create_agent
    params.arguments.namestring
    Yes
    Agent name
    params.arguments.descriptionstringNoAgent description
    params.arguments.instructionsstringNoSystem instructions
    params.arguments.default_modelstringNoAI model (default: google/gemini-3-flash-preview)
    params.arguments.personality_templatestringNoprofessional | casual | technical | friendly | creative
    params.arguments.response_lengthstringNoconcise | balanced | detailed
    params.arguments.context_idstringNoUUID of a prompt context to attach
    params.arguments.statusstringNodraft | 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"
        }
      }
    }
    POST
    /mcp-server

    update_agent — Update an agent's name, instructions, model, personality, status, or linked context.

    Key permission: agents

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: update_agent
    params.arguments.agent_idstring
    Yes
    params.arguments.namestringNo
    params.arguments.instructionsstringNo
    params.arguments.default_modelstringNo
    params.arguments.personality_templatestringNo
    params.arguments.response_lengthstringNo
    params.arguments.context_idstringNo
    params.arguments.statusstringNodraft | published | archived
    {
      "jsonrpc": "2.0",
      "id": 5,
      "method": "tools/call",
      "params": {
        "name": "update_agent",
        "arguments": {
          "agent_id": "abc-123",
          "status": "published",
          "instructions": "Updated instructions..."
        }
      }
    }
    POST
    /mcp-server

    delete_agent — Permanently delete an AI agent. Irreversible.

    Key permission: agents

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: delete_agent
    params.arguments.agent_idstring
    Yes
    {
      "jsonrpc": "2.0",
      "id": 6,
      "method": "tools/call",
      "params": {
        "name": "delete_agent",
        "arguments": {
          "agent_id": "abc-123"
        }
      }
    }
    POST
    /mcp-server

    list_workflows — List all workflows. Filter by active status, with pagination.

    Key permission: workflows

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: list_workflows
    params.arguments.limitnumberNoMax results (default 50, max 200)
    params.arguments.is_activebooleanNoFilter by active status
    {
      "jsonrpc": "2.0",
      "id": 7,
      "method": "tools/call",
      "params": {
        "name": "list_workflows",
        "arguments": {
          "is_active": true,
          "limit": 10
        }
      }
    }
    POST
    /mcp-server

    get_workflow — Get full workflow details including all nodes and edges.

    Key permission: workflows

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: get_workflow
    params.arguments.workflow_idstring
    Yes
    {
      "jsonrpc": "2.0",
      "id": 8,
      "method": "tools/call",
      "params": {
        "name": "get_workflow",
        "arguments": {
          "workflow_id": "wf-123"
        }
      }
    }
    POST
    /mcp-server

    create_workflow — Create a new workflow with optional initial nodes, edges, category, and tags.

    Key permission: workflows

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: create_workflow
    params.arguments.namestring
    Yes
    params.arguments.descriptionstringNo
    params.arguments.nodesarrayNoInitial node definitions (JSON)
    params.arguments.edgesarrayNoInitial edge definitions (JSON)
    params.arguments.categorystringNo
    params.arguments.tagsarrayNo
    params.arguments.is_activebooleanNo
    {
      "jsonrpc": "2.0",
      "id": 9,
      "method": "tools/call",
      "params": {
        "name": "create_workflow",
        "arguments": {
          "name": "Email Digest",
          "description": "Daily summary workflow",
          "is_active": true
        }
      }
    }
    POST
    /mcp-server

    update_workflow — Update a workflow's name, description, nodes, edges, status, category, tags, or active status.

    Key permission: workflows

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: update_workflow
    params.arguments.workflow_idstring
    Yes
    params.arguments.namestringNo
    params.arguments.descriptionstringNo
    params.arguments.nodesarrayNo
    params.arguments.edgesarrayNo
    params.arguments.statusstringNo
    params.arguments.is_activebooleanNo
    {
      "jsonrpc": "2.0",
      "id": 10,
      "method": "tools/call",
      "params": {
        "name": "update_workflow",
        "arguments": {
          "workflow_id": "wf-123",
          "is_active": false
        }
      }
    }
    POST
    /mcp-server

    delete_workflow — Permanently delete a workflow.

    Key permission: workflows

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: delete_workflow
    params.arguments.workflow_idstring
    Yes
    {
      "jsonrpc": "2.0",
      "id": 11,
      "method": "tools/call",
      "params": {
        "name": "delete_workflow",
        "arguments": {
          "workflow_id": "wf-123"
        }
      }
    }
    POST
    /mcp-server

    list_workflow_executions — List recent execution history for a workflow. Filter by status (e.g. running/completed/failed).

    Key permission: workflows

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: list_workflow_executions
    params.arguments.workflow_idstring
    Yes
    params.arguments.limitnumberNoMax results (default 20)
    params.arguments.statusstringNoFilter, 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
        }
      }
    }
    POST
    /mcp-server

    list_contexts — List all prompt contexts (knowledge bases). Optionally include archived.

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: list_contexts
    params.arguments.limitnumberNo
    params.arguments.include_archivedbooleanNo
    {
      "jsonrpc": "2.0",
      "id": 13,
      "method": "tools/call",
      "params": {
        "name": "list_contexts",
        "arguments": {
          "limit": 20
        }
      }
    }
    POST
    /mcp-server

    get_context — Get a context with its conversation messages and knowledge entries (text, Q&A pairs, URL sources).

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: get_context
    params.arguments.context_idstring
    Yes
    params.arguments.include_messagesbooleanNoInclude conversation messages (default true)
    params.arguments.include_knowledgebooleanNoInclude 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
        }
      }
    }
    POST
    /mcp-server

    create_context — Create a new prompt context (knowledge base) with system prompt, model, and tags.

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: create_context
    params.arguments.namestring
    Yes
    params.arguments.descriptionstringNo
    params.arguments.system_promptstringNo
    params.arguments.modelstringNo
    params.arguments.temperaturenumberNo
    params.arguments.tagsarrayNoArray 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"
          ]
        }
      }
    }
    POST
    /mcp-server

    add_knowledge_entry — Add a text, Q&A pair, URL source, document chunk, or CSV row to a context's knowledge base.

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: add_knowledge_entry
    params.arguments.context_idstring
    Yes
    params.arguments.contentstring
    Yes
    params.arguments.entry_typestringNotext | qa_pair | url_source | document_chunk | csv_row (default text)
    params.arguments.titlestringNo
    params.arguments.answerstringNoAnswer for qa_pair entries
    params.arguments.source_urlstringNo
    params.arguments.tagsarrayNo
    params.arguments.prioritynumberNoHigher = 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
        }
      }
    }
    POST
    /mcp-server

    add_context_message — Add a message (user/assistant/system) to a context's conversation history.

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: add_context_message
    params.arguments.context_idstring
    Yes
    params.arguments.rolestring
    Yes
    user | assistant | system
    params.arguments.contentstring
    Yes
    params.arguments.modelstringNo
    {
      "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?"
        }
      }
    }
    POST
    /mcp-server

    list_prompts — List prompt queue items. Filter by status (pending/processing/completed/failed) or model.

    Key permission: workflows

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: list_prompts
    params.arguments.statusstringNoFilter: pending, processing, completed, failed
    params.arguments.modelstringNoFilter by model
    params.arguments.limitnumberNo
    params.arguments.offsetnumberNo
    {
      "jsonrpc": "2.0",
      "id": 18,
      "method": "tools/call",
      "params": {
        "name": "list_prompts",
        "arguments": {
          "status": "completed",
          "limit": 5
        }
      }
    }
    POST
    /mcp-server

    get_prompt — Get full prompt details including the AI response, tokens used, and execution metadata.

    Key permission: workflows

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: get_prompt
    params.arguments.prompt_idstring
    Yes
    {
      "jsonrpc": "2.0",
      "id": 19,
      "method": "tools/call",
      "params": {
        "name": "get_prompt",
        "arguments": {
          "prompt_id": "p-1"
        }
      }
    }
    POST
    /mcp-server

    submit_prompt — Add a prompt to the queue without running it (enqueue_prompt runs or schedules it).

    Key permission: workflows

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: submit_prompt
    params.arguments.promptstring
    Yes
    The prompt text
    params.arguments.modelstringNoModel id (see list_models)
    params.arguments.destinationstringNoOutput: file | chat | email
    params.arguments.prioritystringNocritical | high | normal | low
    {
      "jsonrpc": "2.0",
      "id": 20,
      "method": "tools/call",
      "params": {
        "name": "submit_prompt",
        "arguments": {
          "prompt": "Summarize today's tasks",
          "priority": "high"
        }
      }
    }
    POST
    /mcp-server

    list_conversations — List AI chat conversations with message counts. Optionally include archived.

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: list_conversations
    params.arguments.limitnumberNoMax results (default 30)
    params.arguments.include_archivedbooleanNo
    {
      "jsonrpc": "2.0",
      "id": 21,
      "method": "tools/call",
      "params": {
        "name": "list_conversations",
        "arguments": {
          "limit": 10
        }
      }
    }
    POST
    /mcp-server

    get_conversation_messages — Get all messages in a conversation (up to 200). Verifies conversation ownership.

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: get_conversation_messages
    params.arguments.conversation_idstring
    Yes
    params.arguments.limitnumberNoMax messages (default 200)
    {
      "jsonrpc": "2.0",
      "id": 22,
      "method": "tools/call",
      "params": {
        "name": "get_conversation_messages",
        "arguments": {
          "conversation_id": "conv-1",
          "limit": 50
        }
      }
    }
    POST
    /mcp-server

    get_usage_stats — Get AI usage statistics: total tokens, costs, request counts, success rate, avg response time, breakdown by provider.

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: get_usage_stats
    params.arguments.daysnumberNoLookback days (default 30, max 365)
    params.arguments.providerstringNoFilter by provider
    {
      "jsonrpc": "2.0",
      "id": 23,
      "method": "tools/call",
      "params": {
        "name": "get_usage_stats",
        "arguments": {
          "days": 7
        }
      }
    }
    POST
    /mcp-server

    get_agent_analytics — Get event-level analytics for a specific agent: event counts by type and recent activity.

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: get_agent_analytics
    params.arguments.agent_idstring
    Yes
    params.arguments.daysnumberNoLookback 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
        }
      }
    }
    POST
    /mcp-server

    list_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

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: list_tasks
    params.arguments.statusstringNoFilter: backlog, todo, in-progress, review, done
    params.arguments.prioritystringNoFilter: low, medium, high, urgent
    params.arguments.board_idstringNo
    params.arguments.limitnumberNo
    {
      "jsonrpc": "2.0",
      "id": 25,
      "method": "tools/call",
      "params": {
        "name": "list_tasks",
        "arguments": {
          "status": "in-progress",
          "priority": "high"
        }
      }
    }
    POST
    /mcp-server

    create_task — Create a new task with title, description, status, priority, tags, due date, and assignee.

    Key permission: tasks

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: create_task
    params.arguments.titlestring
    Yes
    params.arguments.descriptionstringNo
    params.arguments.statusstringNobacklog | todo | in-progress | review | done (default: todo)
    params.arguments.prioritystringNolow | medium | high | urgent (default: medium)
    params.arguments.board_idstringNoDefaults to your default board
    params.arguments.tagsarrayNo
    params.arguments.due_datestringNoISO date string
    params.arguments.assigneestringNo
    {
      "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"
        }
      }
    }
    POST
    /mcp-server

    update_task — Update a task's title, description, status, priority, tags, due date, or assignee.

    Key permission: tasks

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: update_task
    params.arguments.task_idstring
    Yes
    params.arguments.titlestringNo
    params.arguments.descriptionstringNo
    params.arguments.statusstringNo
    params.arguments.prioritystringNo
    params.arguments.tagsarrayNo
    params.arguments.due_datestringNo
    params.arguments.assigneestringNo
    {
      "jsonrpc": "2.0",
      "id": 27,
      "method": "tools/call",
      "params": {
        "name": "update_task",
        "arguments": {
          "task_id": "task-1",
          "status": "done"
        }
      }
    }
    POST
    /mcp-server

    list_notifications — List user notifications. Filter by read status or type (success/error/info).

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: list_notifications
    params.arguments.unread_onlybooleanNo
    params.arguments.typestringNoFilter: success, error, info
    params.arguments.limitnumberNoMax results (default 30)
    {
      "jsonrpc": "2.0",
      "id": 28,
      "method": "tools/call",
      "params": {
        "name": "list_notifications",
        "arguments": {
          "unread_only": true,
          "limit": 10
        }
      }
    }
    POST
    /mcp-server

    list_integrations — List all configured integrations (email, Slack, Google Drive, webhooks) with their enabled status.

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: list_integrations
    {
      "jsonrpc": "2.0",
      "id": 29,
      "method": "tools/call",
      "params": {
        "name": "list_integrations",
        "arguments": {}
      }
    }
    POST
    /mcp-server

    list_models — List the available AI models (id, provider, modality, tier, tool support, cost).

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: list_models
    params.arguments.modalitystringNotext | image | video
    {
      "jsonrpc": "2.0",
      "id": 100,
      "method": "tools/call",
      "params": {
        "name": "list_models",
        "arguments": {
          "modality": "text"
        }
      }
    }
    POST
    /mcp-server

    chat — One-shot chat completion with any model. Pass messages (OpenAI format) or prompt. Uses credits.

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: chat
    params.arguments.promptstringNoShortcut for a single user message
    params.arguments.systemstringNoSystem prompt (with prompt)
    params.arguments.messagesarrayNo[{ role, content }] — content may include image_url parts
    params.arguments.modelstringNoModel id (default openrouter/openai/gpt-6-luna)
    params.arguments.toolsboolean | string[]Notrue = all MultiverseAI agent tools, or tool names from list_agent_tools
    params.arguments.max_tool_iterationsnumberNo1–20
    params.arguments.temperaturenumberNo
    params.arguments.max_tokensnumberNo
    {
      "jsonrpc": "2.0",
      "id": 101,
      "method": "tools/call",
      "params": {
        "name": "chat",
        "arguments": {
          "prompt": "Summarize the latest news about AI agents",
          "tools": [
            "web_search"
          ]
        }
      }
    }
    POST
    /mcp-server

    generate_image — Generate images from a prompt, optionally working from reference images; returns image URLs. Uses credits.

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: generate_image
    params.arguments.promptstring
    Yes
    params.arguments.modelstringNoImage model id (default gpt-image-1.5)
    params.arguments.nnumberNo1–4
    params.arguments.imagestring[]NoReference 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"
        }
      }
    }
    POST
    /mcp-server

    create_video — Start a video generation job; poll get_video until completed. Uses credits.

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: create_video
    params.arguments.promptstring
    Yes
    params.arguments.modelstringNoVideo model id (list_models modality=video)
    params.arguments.durationnumberNo
    params.arguments.aspect_ratiostringNoe.g. 16:9, 9:16
    params.arguments.image_urlstringNoStart 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"
        }
      }
    }
    POST
    /mcp-server

    get_video — Get a video job: status (queued/running/saving/completed/failed/cancelled) and video_url.

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: get_video
    params.arguments.video_idstring
    Yes
    {
      "jsonrpc": "2.0",
      "id": 104,
      "method": "tools/call",
      "params": {
        "name": "get_video",
        "arguments": {
          "video_id": "VIDEO_ID"
        }
      }
    }
    POST
    /mcp-server

    list_agent_tools — List the MultiverseAI agent tools. Pass name for one tool with its parameter schema.

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: list_agent_tools
    params.arguments.namestringNo
    params.arguments.include_parametersbooleanNoInclude every parameter schema (large)
    {
      "jsonrpc": "2.0",
      "id": 105,
      "method": "tools/call",
      "params": {
        "name": "list_agent_tools",
        "arguments": {}
      }
    }
    POST
    /mcp-server

    run_agent_tool — Run one agent tool directly. Tools with requires_approval need confirm: true.

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: run_agent_tool
    params.arguments.namestring
    Yes
    params.arguments.argumentsobjectNo
    params.arguments.confirmbooleanNo
    {
      "jsonrpc": "2.0",
      "id": 106,
      "method": "tools/call",
      "params": {
        "name": "run_agent_tool",
        "arguments": {
          "name": "web_search",
          "arguments": {
            "query": "MultiverseAI"
          }
        }
      }
    }
    POST
    /mcp-server

    link_previews — Fetch title, description, image and site name for URLs.

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: link_previews
    params.arguments.urlsarray
    Yes
    {
      "jsonrpc": "2.0",
      "id": 107,
      "method": "tools/call",
      "params": {
        "name": "link_previews",
        "arguments": {
          "urls": [
            "https://multiverseai.com"
          ]
        }
      }
    }
    POST
    /mcp-server

    get_credits — Get your MultiverseAI credit balance.

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: get_credits
    params.arguments.freshbooleanNoSkip the 60-second cache
    {
      "jsonrpc": "2.0",
      "id": 108,
      "method": "tools/call",
      "params": {
        "name": "get_credits",
        "arguments": {}
      }
    }
    POST
    /mcp-server

    chat_with_agent — Send a message to one of your agents. Pass conversation_id from a reply to continue it.

    Key permission: agents

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: chat_with_agent
    params.arguments.agent_idstring
    Yes
    params.arguments.messagestring
    Yes
    params.arguments.conversation_idstringNo
    {
      "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?"
        }
      }
    }
    POST
    /mcp-server

    run_workflow — Run a workflow on the server. Returns the execution id, or the result with wait: true.

    Key permission: workflows

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: run_workflow
    params.arguments.workflow_idstring
    Yes
    params.arguments.inputsobjectNo
    params.arguments.waitbooleanNoDefault false
    {
      "jsonrpc": "2.0",
      "id": 110,
      "method": "tools/call",
      "params": {
        "name": "run_workflow",
        "arguments": {
          "workflow_id": "WORKFLOW_ID",
          "inputs": {
            "topic": "AI"
          }
        }
      }
    }
    POST
    /mcp-server

    get_execution — Get one workflow run: status, node outputs, execution data, error.

    Key permission: workflows

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: get_execution
    params.arguments.execution_idstring
    Yes
    {
      "jsonrpc": "2.0",
      "id": 111,
      "method": "tools/call",
      "params": {
        "name": "get_execution",
        "arguments": {
          "execution_id": "EXECUTION_ID"
        }
      }
    }
    POST
    /mcp-server

    create_conversation — Start a new chat conversation.

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: create_conversation
    params.arguments.titlestringNo
    params.arguments.modelstringNo
    params.arguments.folder_idstringNo
    {
      "jsonrpc": "2.0",
      "id": 112,
      "method": "tools/call",
      "params": {
        "name": "create_conversation",
        "arguments": {
          "title": "Research notes"
        }
      }
    }
    POST
    /mcp-server

    send_conversation_message — Send a message in a conversation and get the reply; both are saved. Uses credits.

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: send_conversation_message
    params.arguments.conversation_idstring
    Yes
    params.arguments.contentstring
    Yes
    params.arguments.modelstringNo
    params.arguments.toolsboolean | string[]Notrue = all MultiverseAI agent tools, or tool names from list_agent_tools
    params.arguments.system_promptstringNo
    params.arguments.temperaturenumberNo
    {
      "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"
        }
      }
    }
    POST
    /mcp-server

    list_queue — List prompt queue items, newest first.

    Key permission: workflows

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: list_queue
    params.arguments.statusstringNoComma-separated, e.g. pending,running
    params.arguments.limitnumberNo
    params.arguments.offsetnumberNo
    {
      "jsonrpc": "2.0",
      "id": 114,
      "method": "tools/call",
      "params": {
        "name": "list_queue",
        "arguments": {
          "status": "pending,running"
        }
      }
    }
    POST
    /mcp-server

    enqueue_prompt — Queue a prompt (or a workflow run) and run it now, or schedule it. Uses credits.

    Key permission: workflows

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: enqueue_prompt
    params.arguments.promptstringNoRequired unless workflow_id is given
    params.arguments.workflow_idstringNo
    params.arguments.modelstringNo
    params.arguments.prioritystringNocritical | high | normal | low
    params.arguments.destinationstringNo
    params.arguments.scheduled_forstringNoISO 8601, in the future
    params.arguments.runbooleanNoDefault true
    params.arguments.waitbooleanNo
    {
      "jsonrpc": "2.0",
      "id": 115,
      "method": "tools/call",
      "params": {
        "name": "enqueue_prompt",
        "arguments": {
          "prompt": "Draft a weekly status update",
          "priority": "high"
        }
      }
    }
    POST
    /mcp-server

    cancel_queue_item — Cancel a pending, scheduled or retrying queue item.

    Key permission: workflows

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: cancel_queue_item
    params.arguments.queue_idstring
    Yes
    {
      "jsonrpc": "2.0",
      "id": 116,
      "method": "tools/call",
      "params": {
        "name": "cancel_queue_item",
        "arguments": {
          "queue_id": "QUEUE_ID"
        }
      }
    }
    POST
    /mcp-server

    delete_task — Delete a task permanently.

    Key permission: tasks

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: delete_task
    params.arguments.task_idstring
    Yes
    {
      "jsonrpc": "2.0",
      "id": 117,
      "method": "tools/call",
      "params": {
        "name": "delete_task",
        "arguments": {
          "task_id": "TASK_ID"
        }
      }
    }
    POST
    /mcp-server

    list_boards — List your task boards.

    Key permission: tasks

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: list_boards
    params.arguments.limitnumberNo
    params.arguments.offsetnumberNo
    {
      "jsonrpc": "2.0",
      "id": 118,
      "method": "tools/call",
      "params": {
        "name": "list_boards",
        "arguments": {}
      }
    }
    POST
    /mcp-server

    list_teams — List your teams; pass team_id for one team with its members.

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: list_teams
    params.arguments.team_idstringNo
    {
      "jsonrpc": "2.0",
      "id": 119,
      "method": "tools/call",
      "params": {
        "name": "list_teams",
        "arguments": {}
      }
    }
    POST
    /mcp-server

    list_platforms — Show which posting platforms (twitter, tiktok, instagram, facebook) are connected.

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: list_platforms
    {
      "jsonrpc": "2.0",
      "id": 120,
      "method": "tools/call",
      "params": {
        "name": "list_platforms",
        "arguments": {}
      }
    }
    POST
    /mcp-server

    publish_post — Publish a post now as your connected accounts.

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: publish_post
    params.arguments.platformsarray
    Yes
    twitter | tiktok | instagram | facebook
    params.arguments.contentstringNoPost text
    params.arguments.media_urlsarrayNohttps:// media URLs (Instagram and TikTok need one)
    params.arguments.platform_optionsobjectNo{ 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"
        }
      }
    }
    POST
    /mcp-server

    schedule_post — Schedule a post for later.

    Request body

    FieldTypeRequiredDescription
    params.namestring
    Yes
    Default: schedule_post
    params.arguments.platformsarray
    Yes
    twitter | tiktok | instagram | facebook
    params.arguments.contentstringNoPost text
    params.arguments.media_urlsarrayNohttps:// media URLs (Instagram and TikTok need one)
    params.arguments.platform_optionsobjectNo{ facebook: { page_id, link }, tiktok: { privacy_level } }
    params.arguments.scheduled_atstring
    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

    200
    OKRequest succeeded
    201
    CreatedResource created (or a conversation message exchanged)
    202
    AcceptedStarted in the background (workflow runs)
    400
    Bad RequestInvalid body or parameters
    401
    UnauthorizedMissing, invalid, revoked or expired key or token
    402
    Payment RequiredNot enough MultiverseAI credits
    403
    ForbiddenThe key's permission switch for this endpoint is off
    404
    Not FoundUnknown endpoint, model, tool, or a resource you don't own
    405
    Method Not AllowedHTTP method not supported (allowed lists the ones that are)
    409
    ConflictA tool needs confirm: true
    413
    Payload Too LargeAn attachment is over the size limit (images: 20MB)
    429
    Too Many RequestsRate limit hit; wait retry_after_ms
    500
    Server ErrorUnexpected error
    502
    Bad GatewayThe model provider or an upstream service failed

    Error codes

    The most common values of error.code

    CodeDescription
    AUTH_REQUIREDNo Authorization: Bearer header
    INVALID_API_KEYDeveloper key is invalid, revoked or expired
    INVALID_TOKENUser access token is invalid or expired
    FORBIDDENThis key isn't allowed to use the endpoint (permission switch off)
    NOT_FOUNDUnknown endpoint, or the resource does not exist / is not yours
    MODEL_NOT_FOUNDUnknown model id — see GET /v1/models
    INVALID_REQUESTMissing or malformed field
    INVALID_VALUEA field has the wrong type or an unsupported value
    UNSUPPORTED_TOOLSOpenAI function definitions were passed; use tools: true or tool names
    METHOD_NOT_ALLOWEDHTTP method not supported for this endpoint
    RATE_LIMITEDToo many requests; includes retry_after_ms
    INSUFFICIENT_CREDITSNot enough credits for an AI call
    CONFIRMATION_REQUIREDThe tool changes data or sends messages; resend with confirm: true
    UNKNOWN_TOOLNo tool with that name — see GET /v1/tools
    PAYLOAD_TOO_LARGEAn attachment is over the size limit (images: 20MB)
    UPSTREAM_ERRORThe model provider or an internal service failed, or returned an empty reply
    INTERNAL_ERRORUnexpected server error
    Get started

    Ready to get started?

    Generate your API key and start building with MultiverseAI