{"openapi":"3.1.0","info":{"title":"Meetor API","version":"1.0.0","description":"The Meetor API. Session routes serve the Meetor app. Routes under /v1/public are read-only and use a Pro API token."},"servers":[{"url":"https://api.meetor.co"}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"A read-only API token (Pro), for example `mt_live_...`."},"session":{"type":"apiKey","in":"cookie","name":"meetor_session"}},"schemas":{},"parameters":{}},"paths":{"/health":{"get":{"operationId":"health","tags":["System"],"summary":"Liveness and build hash","responses":{"200":{"description":"The API is up.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"build":{"type":"string"},"environment":{"type":"string"},"time":{"type":"number"}},"required":["ok","build","environment","time"]}}}}}}},"/v1/auth/code":{"post":{"operationId":"sendSignInCode","tags":["Auth"],"summary":"Send a sign-in code","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string"}},"required":["email"],"additionalProperties":false}}}},"responses":{"200":{"description":"A code was sent if the address is valid.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]}},"required":["ok"]}}}},"400":{"description":"Invalid email.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}},"429":{"description":"Too many codes requested.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}}}}},"/v1/auth/verify":{"post":{"operationId":"verifySignInCode","tags":["Auth"],"summary":"Verify a code and start a session","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string"},"code":{"type":"string","pattern":"^\\d{6}$"},"timeZone":{"type":"string","maxLength":64},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}},"required":["email","code"],"additionalProperties":false}}}},"responses":{"200":{"description":"Signed in. Sets the session cookie.","content":{"application/json":{"schema":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"}},"required":["id","email"]},"isNew":{"type":"boolean"}},"required":["user","isNew"]}}}},"400":{"description":"Wrong or expired code.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}},"429":{"description":"Too many attempts.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}}}}},"/v1/auth/signout":{"post":{"operationId":"signOut","tags":["Auth"],"summary":"End the session","security":[{"session":[]}],"responses":{"200":{"description":"Signed out.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]}},"required":["ok"]}}}},"401":{"description":"Not signed in.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}}}}},"/v1/me":{"get":{"operationId":"getMe","tags":["Account"],"summary":"The signed-in user, plan, entitlements, usage this month, and workspaces","security":[{"session":[]}],"responses":{"200":{"description":"The current user.","content":{"application/json":{"schema":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"}},"required":["id","email"]},"plan":{"type":"string","enum":["free","pro"]},"entitlements":{"type":"object","properties":{"meetingsPerMonth":{"type":["number","null"]},"attendeesPerMeeting":{"type":["number","null"]},"rosterSize":{"type":["number","null"]},"workspaces":{"type":["number","null"]},"historyDays":{"type":["number","null"]},"insights":{"type":["number","null"]},"sync":{"type":"boolean"},"export":{"type":"boolean"},"templates":{"type":"boolean"},"digest":{"type":"boolean"},"apiTokens":{"type":"boolean"},"receiptBranding":{"type":"boolean"}},"required":["meetingsPerMonth","attendeesPerMeeting","rosterSize","workspaces","historyDays","insights","sync","export","templates","digest","apiTokens","receiptBranding"]},"usage":{"type":"object","properties":{"month":{"type":"string"},"used":{"type":"integer"},"limit":{"type":["number","null"]}},"required":["month","used","limit"]},"workspaces":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"timeZone":{"type":"string","minLength":1,"maxLength":64},"hoursPerYear":{"type":"integer","minimum":1000,"maximum":3000},"loadMultiplier":{"type":"number","minimum":1,"maximum":2.5},"overrunCapMinutes":{"type":"integer","minimum":30,"maximum":1440},"receiptAccent":{"type":["string","null"],"pattern":"^#[0-9a-fA-F]{6}$"},"receiptLogoUrl":{"type":["string","null"],"format":"uri"},"id":{"type":"string"},"digestOptIn":{"type":"boolean"},"createdAt":{"type":"integer","minimum":0},"updatedAt":{"type":"integer","minimum":0},"deletedAt":{"type":["integer","null"],"minimum":0}},"required":["name","currency","timeZone","hoursPerYear","loadMultiplier","overrunCapMinutes","receiptAccent","receiptLogoUrl","id","digestOptIn","createdAt","updatedAt","deletedAt"]}},"pricing":{"type":"object","properties":{"mode":{"type":"string","enum":["starter","list"]},"monthMinor":{"type":"integer"},"yearMinor":{"type":"integer"},"currency":{"type":"string","enum":["USD"]}},"required":["mode","monthMinor","yearMinor","currency"]},"subscription":{"type":["object","null"],"properties":{"status":{"type":"string"},"interval":{"type":["string","null"]},"isStarter":{"type":"boolean"},"currentPeriodEnd":{"type":["integer","null"],"minimum":0},"cancelAtPeriodEnd":{"type":"boolean"},"graceUntil":{"type":["integer","null"],"minimum":0}},"required":["status","interval","isStarter","currentPeriodEnd","cancelAtPeriodEnd","graceUntil"]},"readOnlyUntil":{"type":["integer","null"],"minimum":0}},"required":["user","plan","entitlements","usage","workspaces","pricing","subscription","readOnlyUntil"]}}}},"401":{"description":"Not signed in.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}}}},"delete":{"operationId":"deleteMe","tags":["Account"],"summary":"Delete the account and everything the server holds for it","security":[{"session":[]}],"responses":{"200":{"description":"Deleted.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]}},"required":["ok"]}}}},"401":{"description":"Not signed in.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}}}}},"/v1/meetings/start":{"post":{"operationId":"reportMeetingStart","tags":["Meetings"],"summary":"Report a meeting start (metering)","description":"Counts a meeting start toward the monthly limit, once per clientMeetingId. The meeting itself stays on the device. A running meeting is never blocked: `allowed: false` means the next start should be.","security":[{"session":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"workspaceId":{"type":"string","minLength":1,"maxLength":64},"clientMeetingId":{"type":"string","minLength":1,"maxLength":64},"startedAt":{"type":"integer","minimum":0}},"required":["workspaceId","clientMeetingId","startedAt"],"additionalProperties":false}}}},"responses":{"200":{"description":"Counted (or already counted).","content":{"application/json":{"schema":{"type":"object","properties":{"allowed":{"type":"boolean"},"used":{"type":"integer"},"limit":{"type":["number","null"]},"month":{"type":"string"}},"required":["allowed","used","limit","month"]}}}},"401":{"description":"Not signed in.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}},"404":{"description":"No such workspace.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}}}}},"/v1/workspaces":{"post":{"operationId":"createWorkspace","tags":["Workspaces"],"summary":"Create a workspace (Pro for more than one)","security":[{"session":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"timeZone":{"type":"string","minLength":1,"maxLength":64}},"required":["name"],"additionalProperties":false}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"timeZone":{"type":"string","minLength":1,"maxLength":64},"hoursPerYear":{"type":"integer","minimum":1000,"maximum":3000},"loadMultiplier":{"type":"number","minimum":1,"maximum":2.5},"overrunCapMinutes":{"type":"integer","minimum":30,"maximum":1440},"receiptAccent":{"type":["string","null"],"pattern":"^#[0-9a-fA-F]{6}$"},"receiptLogoUrl":{"type":["string","null"],"format":"uri"},"id":{"type":"string"},"digestOptIn":{"type":"boolean"},"createdAt":{"type":"integer","minimum":0},"updatedAt":{"type":"integer","minimum":0},"deletedAt":{"type":["integer","null"],"minimum":0}},"required":["name","currency","timeZone","hoursPerYear","loadMultiplier","overrunCapMinutes","receiptAccent","receiptLogoUrl","id","digestOptIn","createdAt","updatedAt","deletedAt"]}}}},"401":{"description":"Not signed in.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}},"402":{"description":"Free holds one workspace.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}}}}},"/v1/workspaces/{id}":{"patch":{"operationId":"updateWorkspace","tags":["Workspaces"],"summary":"Update workspace settings","security":[{"session":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":64},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"timeZone":{"type":"string","minLength":1,"maxLength":64},"hoursPerYear":{"type":"integer","minimum":1000,"maximum":3000},"loadMultiplier":{"type":"number","minimum":1,"maximum":2.5},"overrunCapMinutes":{"type":"integer","minimum":30,"maximum":1440},"receiptAccent":{"type":["string","null"],"pattern":"^#[0-9a-fA-F]{6}$"},"digestOptIn":{"type":"boolean"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"timeZone":{"type":"string","minLength":1,"maxLength":64},"hoursPerYear":{"type":"integer","minimum":1000,"maximum":3000},"loadMultiplier":{"type":"number","minimum":1,"maximum":2.5},"overrunCapMinutes":{"type":"integer","minimum":30,"maximum":1440},"receiptAccent":{"type":["string","null"],"pattern":"^#[0-9a-fA-F]{6}$"},"receiptLogoUrl":{"type":["string","null"],"format":"uri"},"id":{"type":"string"},"digestOptIn":{"type":"boolean"},"createdAt":{"type":"integer","minimum":0},"updatedAt":{"type":"integer","minimum":0},"deletedAt":{"type":["integer","null"],"minimum":0}},"required":["name","currency","timeZone","hoursPerYear","loadMultiplier","overrunCapMinutes","receiptAccent","receiptLogoUrl","id","digestOptIn","createdAt","updatedAt","deletedAt"]}}}},"401":{"description":"Not signed in.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}},"402":{"description":"Pro feature.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}},"404":{"description":"No such workspace.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}}}}},"/v1/receipts":{"post":{"operationId":"createReceipt","tags":["Receipts"],"summary":"Share a receipt (aggregates only)","description":"Creates a public receipt page. The body is strict: it has no fields for names, roles, or rates, and any unknown field is rejected with 400.","security":[{"session":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":["string","null"],"maxLength":120},"dateMs":{"type":"integer","minimum":0},"durationMs":{"type":"integer","minimum":0},"attendeeCount":{"type":"integer","minimum":0,"maximum":10000},"staffCount":{"type":["integer","null"],"minimum":0,"maximum":10000},"externalCount":{"type":["integer","null"],"minimum":0,"maximum":10000},"totalMinor":{"type":"integer","minimum":0},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"perMinuteMinor":{"type":"integer","minimum":0},"personMs":{"type":"integer","minimum":0},"overrunMs":{"type":["integer","null"],"minimum":0},"overrunMinor":{"type":["integer","null"],"minimum":0},"workspaceId":{"type":"string","minLength":1,"maxLength":64}},"required":["title","dateMs","durationMs","attendeeCount","staffCount","externalCount","totalMinor","currency","perMinuteMinor","personMs","overrunMs","overrunMinor","workspaceId"],"additionalProperties":false}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":["string","null"],"maxLength":120},"dateMs":{"type":"integer","minimum":0},"durationMs":{"type":"integer","minimum":0},"attendeeCount":{"type":"integer","minimum":0,"maximum":10000},"staffCount":{"type":["integer","null"],"minimum":0,"maximum":10000},"externalCount":{"type":["integer","null"],"minimum":0,"maximum":10000},"totalMinor":{"type":"integer","minimum":0},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"perMinuteMinor":{"type":"integer","minimum":0},"personMs":{"type":"integer","minimum":0},"overrunMs":{"type":["integer","null"],"minimum":0},"overrunMinor":{"type":["integer","null"],"minimum":0},"id":{"type":"string"},"url":{"type":"string"},"brandAccent":{"type":["string","null"]},"brandLogoUrl":{"type":["string","null"]},"showMeetorFreeLine":{"type":"boolean"},"createdAt":{"type":"integer","minimum":0},"views":{"type":"integer"}},"required":["title","dateMs","durationMs","attendeeCount","staffCount","externalCount","totalMinor","currency","perMinuteMinor","personMs","overrunMs","overrunMinor","id","url","brandAccent","brandLogoUrl","showMeetorFreeLine","createdAt","views"],"additionalProperties":false}}}},"400":{"description":"Invalid, or contains fields a receipt never carries.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}},"401":{"description":"Not signed in.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}},"404":{"description":"No such workspace.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}},"429":{"description":"Too many receipts this hour.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}}}},"get":{"operationId":"listReceipts","tags":["Receipts"],"summary":"My shared receipts","security":[{"session":[]}],"responses":{"200":{"description":"Receipts.","content":{"application/json":{"schema":{"type":"object","properties":{"receipts":{"type":"array","items":{"type":"object","properties":{"title":{"type":["string","null"],"maxLength":120},"dateMs":{"type":"integer","minimum":0},"durationMs":{"type":"integer","minimum":0},"attendeeCount":{"type":"integer","minimum":0,"maximum":10000},"staffCount":{"type":["integer","null"],"minimum":0,"maximum":10000},"externalCount":{"type":["integer","null"],"minimum":0,"maximum":10000},"totalMinor":{"type":"integer","minimum":0},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"perMinuteMinor":{"type":"integer","minimum":0},"personMs":{"type":"integer","minimum":0},"overrunMs":{"type":["integer","null"],"minimum":0},"overrunMinor":{"type":["integer","null"],"minimum":0},"id":{"type":"string"},"url":{"type":"string"},"brandAccent":{"type":["string","null"]},"brandLogoUrl":{"type":["string","null"]},"showMeetorFreeLine":{"type":"boolean"},"createdAt":{"type":"integer","minimum":0},"views":{"type":"integer"}},"required":["title","dateMs","durationMs","attendeeCount","staffCount","externalCount","totalMinor","currency","perMinuteMinor","personMs","overrunMs","overrunMinor","id","url","brandAccent","brandLogoUrl","showMeetorFreeLine","createdAt","views"],"additionalProperties":false}}},"required":["receipts"]}}}},"401":{"description":"Not signed in.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}}}}},"/v1/receipts/{id}":{"delete":{"operationId":"deleteReceipt","tags":["Receipts"],"summary":"Delete a shared receipt; the link stops working","security":[{"session":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":20},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Deleted.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]}},"required":["ok"]}}}},"401":{"description":"Not signed in.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}}}}},"/v1/billing/checkout":{"post":{"operationId":"createCheckout","tags":["Billing"],"summary":"Start Stripe Checkout for Pro","security":[{"session":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"interval":{"type":"string","enum":["month","year"]},"returnTo":{"anyOf":[{"type":"string","maxLength":500,"pattern":"^\\/[^/\\\\]"},{"type":"string","enum":["/"]}]}},"required":["interval","returnTo"],"additionalProperties":false}}}},"responses":{"200":{"description":"The Checkout URL.","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"}},"required":["url"]}}}},"401":{"description":"Not signed in.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}},"409":{"description":"Already on Pro.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}}}}},"/v1/billing/confirm":{"post":{"operationId":"confirmCheckout","tags":["Billing"],"summary":"Confirm a finished Checkout (the return page calls this; webhooks do the same)","security":[{"session":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sessionId":{"type":"string","minLength":1,"maxLength":200}},"required":["sessionId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Current plan.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"plan":{"type":"string","enum":["free","pro"]}},"required":["ok","plan"]}}}},"401":{"description":"Not signed in.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}},"403":{"description":"That checkout belongs to someone else.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}}}}},"/v1/billing/portal":{"post":{"operationId":"createPortal","tags":["Billing"],"summary":"Open the Stripe customer portal (manage or cancel)","security":[{"session":[]}],"responses":{"200":{"description":"The portal URL.","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"}},"required":["url"]}}}},"401":{"description":"Not signed in.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}},"404":{"description":"No billing yet.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}}}}},"/v1/sync/push":{"post":{"operationId":"syncPush","tags":["Sync"],"summary":"Push changed records (Pro)","security":[{"session":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"workspaceId":{"type":"string","minLength":1,"maxLength":64},"records":{"type":"array","items":{"type":"object","properties":{"table":{"type":"string","enum":["people","topics","meetings","attendees","segments","pauses","templates"]},"record":{"type":"object","additionalProperties":{}}},"required":["table","record"],"additionalProperties":false},"maxItems":500}},"required":["workspaceId","records"],"additionalProperties":false}}}},"responses":{"200":{"description":"Accepted and rejected records, and the new revision.","content":{"application/json":{"schema":{"type":"object","properties":{"accepted":{"type":"array","items":{"type":"object","properties":{"table":{"type":"string"},"id":{"type":"string"},"rev":{"type":"number"}},"required":["table","id","rev"]}},"rejected":{"type":"array","items":{"type":"object","properties":{"table":{"type":"string"},"id":{"type":"string"},"reason":{"type":"string"}},"required":["table","id","reason"]}},"rev":{"type":"number"}},"required":["accepted","rejected","rev"]}}}},"401":{"description":"Not signed in.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}},"402":{"description":"Sync is part of Pro.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}},"404":{"description":"No such workspace.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}}}}},"/v1/sync/pull":{"get":{"operationId":"syncPull","tags":["Sync"],"summary":"Pull records changed since a revision (Pro)","security":[{"session":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":64},"required":true,"name":"workspaceId","in":"query"},{"schema":{"type":["integer","null"],"minimum":0,"default":0},"required":false,"name":"since","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":1000,"default":1000},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Records in revision order.","content":{"application/json":{"schema":{"type":"object","properties":{"records":{"type":"array","items":{"type":"object","properties":{"table":{"type":"string"},"record":{"type":"object","additionalProperties":{}},"rev":{"type":"number"}},"required":["table","record","rev"]}},"nextRev":{"type":"number"},"hasMore":{"type":"boolean"}},"required":["records","nextRev","hasMore"]}}}},"401":{"description":"Not signed in.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}},"402":{"description":"Sync is part of Pro.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}},"404":{"description":"No such workspace.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}}}}},"/v1/workspaces/{id}/logo":{"post":{"operationId":"uploadReceiptLogo","tags":["Workspaces"],"summary":"Upload the receipt logo (Pro, PNG or SVG, up to 256 KB)","security":[{"session":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":64},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"image/png":{"schema":{"type":"string"}},"image/svg+xml":{"schema":{"type":"string"}}}},"responses":{"200":{"description":"Updated workspace.","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"timeZone":{"type":"string","minLength":1,"maxLength":64},"hoursPerYear":{"type":"integer","minimum":1000,"maximum":3000},"loadMultiplier":{"type":"number","minimum":1,"maximum":2.5},"overrunCapMinutes":{"type":"integer","minimum":30,"maximum":1440},"receiptAccent":{"type":["string","null"],"pattern":"^#[0-9a-fA-F]{6}$"},"receiptLogoUrl":{"type":["string","null"],"format":"uri"},"id":{"type":"string"},"digestOptIn":{"type":"boolean"},"createdAt":{"type":"integer","minimum":0},"updatedAt":{"type":"integer","minimum":0},"deletedAt":{"type":["integer","null"],"minimum":0}},"required":["name","currency","timeZone","hoursPerYear","loadMultiplier","overrunCapMinutes","receiptAccent","receiptLogoUrl","id","digestOptIn","createdAt","updatedAt","deletedAt"]}}}},"400":{"description":"Not a PNG or SVG, or too large.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}},"402":{"description":"Pro feature.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}}}}},"/v1/export":{"get":{"operationId":"exportWorkspace","tags":["Export"],"summary":"Export a workspace as JSON, or CSV tables in a zip (Pro)","security":[{"session":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":64},"required":true,"name":"workspaceId","in":"query"},{"schema":{"type":"string","enum":["json","csv"],"default":"json"},"required":false,"name":"format","in":"query"}],"responses":{"200":{"description":"The export file.","content":{"application/json":{"schema":{}},"application/zip":{"schema":{"type":"string"}}}},"402":{"description":"Pro feature.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}}}}},"/v1/tokens":{"post":{"operationId":"createApiToken","tags":["API tokens"],"summary":"Create a read-only API token for one workspace (Pro). The token is shown once.","security":[{"session":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"workspaceId":{"type":"string","minLength":1,"maxLength":64},"name":{"type":"string","minLength":1,"maxLength":60}},"required":["workspaceId","name"],"additionalProperties":false}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string"},"info":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"workspaceId":{"type":"string"},"prefix":{"type":"string"},"createdAt":{"type":"number"},"lastUsedAt":{"type":["number","null"]}},"required":["id","name","workspaceId","prefix","createdAt","lastUsedAt"]}},"required":["token","info"]}}}},"402":{"description":"Pro feature.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}}}},"get":{"operationId":"listApiTokens","tags":["API tokens"],"summary":"List API tokens","security":[{"session":[]}],"responses":{"200":{"description":"Tokens.","content":{"application/json":{"schema":{"type":"object","properties":{"tokens":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"workspaceId":{"type":"string"},"prefix":{"type":"string"},"createdAt":{"type":"number"},"lastUsedAt":{"type":["number","null"]}},"required":["id","name","workspaceId","prefix","createdAt","lastUsedAt"]}}},"required":["tokens"]}}}}}}},"/v1/tokens/{id}":{"delete":{"operationId":"revokeApiToken","tags":["API tokens"],"summary":"Revoke an API token","security":[{"session":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":64},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Revoked.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]}},"required":["ok"]}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}}}}},"/v1/public/meetings":{"get":{"operationId":"listMeetings","tags":["Public API"],"summary":"Meetings with totals. Never names or rates.","security":[{"bearer":[]}],"parameters":[{"schema":{"type":["integer","null"],"minimum":0,"description":"Start, epoch ms (inclusive). Default: 30 days ago."},"required":false,"description":"Start, epoch ms (inclusive). Default: 30 days ago.","name":"from","in":"query"},{"schema":{"type":["integer","null"],"minimum":0,"description":"End, epoch ms (exclusive). Default: now."},"required":false,"description":"End, epoch ms (exclusive). Default: now.","name":"to","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","maxLength":200,"description":"From the previous page."},"required":false,"description":"From the previous page.","name":"cursor","in":"query"}],"responses":{"200":{"description":"A page of meetings, newest first.","content":{"application/json":{"schema":{"type":"object","properties":{"meetings":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"topic":{"type":["string","null"]},"startedAt":{"type":"number"},"endedAt":{"type":"number"},"durationMs":{"type":"number"},"attendeeCount":{"type":"number"},"staffCount":{"type":"number"},"externalCount":{"type":"number"},"totalMinor":{"type":"number"},"currency":{"type":"string"},"personMs":{"type":"number"},"overrunMinor":{"type":"number"}},"required":["id","title","topic","startedAt","endedAt","durationMs","attendeeCount","staffCount","externalCount","totalMinor","currency","personMs","overrunMinor"]}},"nextCursor":{"type":["string","null"]}},"required":["meetings","nextCursor"]}}}},"401":{"description":"Missing or invalid token.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}},"402":{"description":"The account is no longer on Pro.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}}}}},"/v1/public/reports/summary":{"get":{"operationId":"getSummary","tags":["Public API"],"summary":"Totals for a period, by topic, role, and title. Never names or rates.","security":[{"bearer":[]}],"parameters":[{"schema":{"type":["integer","null"],"minimum":0,"description":"Start, epoch ms (inclusive). Default: 30 days ago."},"required":false,"description":"Start, epoch ms (inclusive). Default: 30 days ago.","name":"from","in":"query"},{"schema":{"type":["integer","null"],"minimum":0,"description":"End, epoch ms (exclusive). Default: now."},"required":false,"description":"End, epoch ms (exclusive). Default: now.","name":"to","in":"query"}],"responses":{"200":{"description":"Totals.","content":{"application/json":{"schema":{"type":"object","properties":{"from":{"type":"number"},"to":{"type":"number"},"currency":{"type":"string"},"totalMinor":{"type":"number"},"meetings":{"type":"number"},"personHours":{"type":"number"},"externalShare":{"type":"number"},"byTopic":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"totalMinor":{"type":"number"},"count":{"type":"number"},"personHours":{"type":"number"}},"required":["label","totalMinor","count","personHours"]}},"byRole":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"totalMinor":{"type":"number"},"count":{"type":"number"},"personHours":{"type":"number"}},"required":["label","totalMinor","count","personHours"]}},"byTitle":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"totalMinor":{"type":"number"},"count":{"type":"number"},"personHours":{"type":"number"}},"required":["label","totalMinor","count","personHours"]}}},"required":["from","to","currency","totalMinor","meetings","personHours","externalShare","byTopic","byRole","byTitle"]}}}},"401":{"description":"Missing or invalid token.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}},"402":{"description":"The account is no longer on Pro.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]}}}}}}}},"webhooks":{}}