Developers

API documentation

Pull your meeting summaries, full transcripts, projects, tasks and assignments straight into your own systems. A read-only REST API, authenticated with a workspace key you can generate in one click.

Quickstart

  1. 1. Generate a key

    In the app, go to Settings → API and press Create key. Workspace admins only. The key is shown once — copy it then.

  2. 2. Make a request

    Send it as a bearer token on every request.

    curl https://res.xovera.io/api/v1/meetings \
      -H "Authorization: Bearer rsn_live_…"
  3. 3. Follow the links

    A task's sourceMeetingId points back at the meeting that produced it, and its assignee is resolved inline — so you can walk meeting → action items → tasks → owner without extra lookups.

Authentication

Every request needs an Authorization header. Keys are scoped to a whole workspace: a key can read every meeting and task in that workspace, regardless of who created them. Treat one like a password — anyone holding it has the same read access.

Authorization: Bearer rsn_live_…
  • • Only workspace admins can create or revoke keys.
  • • The full key is displayed once, at creation. We store only a hash and can't show it again.
  • • Revoking a key from Settings → API cuts off access immediately.

Conventions

Base URL
https://res.xovera.io/api/v1
Responses
JSON. Single records come back under data; lists add a pagination object with limit, offset and total.
Timestamps
Unix milliseconds (e.g. 1784460762702).
Rate limit
120 requests per minute per key. Over that returns 429.
Read-only
Every endpoint is GET. Nothing in this API changes your data.

Endpoints

Meetings

GET/meetings

List the workspace's meetings, newest first. Returns lightweight objects — no transcript body.

limit1–100, default 25
offsetdefault 0
statusfilter by meeting status
{
  "data": [
    {
      "id": "3f9c…",
      "title": "Acme kickoff",
      "createdAt": 1784460762702,
      "durationSec": 2410,
      "status": "ready",
      "source": "bot",
      "meetingUrl": "https://meet.google.com/abc-defg-hij",
      "projectId": "p_12ab",
      "hasSummary": true,
      "hasTranscript": true
    }
  ],
  "pagination": { "limit": 25, "offset": 0, "total": 128 }
}
GET/meetings/:id

A single meeting with its AI summary (tl;dr, key points, action items, topics, decisions), attendees, and any analyses.

{
  "data": {
    "id": "3f9c…",
    "title": "Acme kickoff",
    "createdAt": 1784460762702,
    "durationSec": 2410,
    "status": "ready",
    "source": "bot",
    "attendees": [{ "email": "sam@acme.com", "name": "Sam" }],
    "summary": {
      "tldr": "Kickoff for the Acme rollout…",
      "keyPoints": ["Phase 1 starts Monday"],
      "actionItems": [{ "text": "Send revised SOW", "owner": "Ryan", "status": "open" }],
      "topics": ["onboarding", "timeline"],
      "decisions": ["Ship phase 1 before EOM"]
    },
    "analyses": null
  }
}
GET/meetings/:id/transcript

The full transcript. Separate from the meeting object because it can be large. transcript is null until processing finishes.

{
  "data": {
    "transcript": {
      "language": "en",
      "segments": [
        { "start": 0.8, "end": 4.2, "speaker": "Ryan", "text": "Thanks for joining." }
      ]
    }
  }
}

Projects & tasks

GET/projects

Non-archived project boards with open/total task counts.

{
  "data": [
    {
      "id": "p_12ab",
      "name": "Acme Rollout",
      "description": "Phase 1 delivery",
      "kind": null,
      "archived": false,
      "createdAt": 1784460762702,
      "openTasks": 7,
      "totalTasks": 12
    }
  ]
}
GET/projects/:id

A single project board with its task counts.

{ "data": { "id": "p_12ab", "name": "Acme Rollout", "openTasks": 7, "totalTasks": 12 } }
GET/tasks

Tasks across the workspace. Each task embeds its resolved assignee and project, plus sourceMeetingId linking back to the meeting it came from.

projectIdonly tasks on this board
assigneeIdonly tasks assigned to this member
statustodo · in_progress · done
sourceMeetingIdtasks created from this meeting
limit / offsetpagination (limit 1–100, default 25)
{
  "data": [
    {
      "id": "t_88fe",
      "title": "Send revised SOW",
      "description": null,
      "status": "in_progress",
      "assignee": {
        "id": "u_4c1d",
        "name": "Ryan O'Connor",
        "email": "ryan@growthable.io",
        "role": "admin"
      },
      "project": { "id": "p_12ab", "name": "Acme Rollout" },
      "sourceMeetingId": "3f9c…",
      "source": "meeting",
      "dueAt": 1784550000000,
      "createdAt": 1784460762702,
      "updatedAt": 1784460762702,
      "completedAt": null
    }
  ],
  "pagination": { "limit": 25, "offset": 0, "total": 12 }
}
GET/tasks/:id

A single task with its resolved assignee and project.

{ "data": { "id": "t_88fe", "title": "Send revised SOW", "status": "in_progress" } }

Members

GET/members

Everyone in the workspace — use this to resolve task assignments to people.

{
  "data": [
    { "id": "u_4c1d", "name": "Ryan O'Connor", "email": "ryan@growthable.io", "role": "admin" }
  ]
}

Errors

Failures use a consistent envelope:

{ "error": { "code": "unauthorized", "message": "Invalid or missing API key." } }
StatusCodeMeaning
401unauthorizedMissing, malformed, unknown, or revoked API key.
403forbiddenKey management requires a workspace admin.
404not_foundNo such record in this workspace.
400bad_requestAn invalid query parameter, e.g. an unknown status.
429rate_limitedOver 120 requests in the last minute.
500server_errorSomething went wrong on our side.

Ready to build?

Generate a workspace key in one click and make your first request in under a minute.