Skip to main content

Getting Started

Team plan required

The Sylva API is available to Team plan accounts with the API add-on. Custom pricing — contact us to get started.

The Sylva API gives you full programmatic access to your data — conversations, tasks, notes, captures, entities, meetings, and more. Authenticate with OAuth 2.0, then make standard REST calls.

bash
curl https://app.mysylva.app/api/v1/tasks \
  -H "Authorization: Bearer sylva_oauth_<your_token>" \
  -H "Content-Type: application/json"

Quick start

1

Get a Team plan

Contact us for custom Team pricing with API access included.

Get in touch →
2

Register an OAuth app

In Settings → Developer, create an OAuth application to get your client credentials.

3

Complete the OAuth flow

Direct users to the authorization URL. Exchange the code for access and refresh tokens.

See auth docs →
4

Make your first API call

Pass the Bearer token in the Authorization header on every request.

Browse API →

Authentication

The Sylva API uses OAuth 2.0 Authorization Code flow with required PKCE (S256). Register an OAuth application in your Sylva settings to get a client ID and secret.

Authorization endpoints

Authorization URL
https://app.mysylva.app/api/oauth/authorize
Token URL
https://app.mysylva.app/api/oauth/token
Revoke URL
https://app.mysylva.app/api/oauth/revoke

OAuth flow

→1. Redirect user → Authorization URL with client_id, redirect_uri, scope, state, code_challenge, code_challenge_method=S256
→2. User sees consent screen → approves the requested scopes
→3. Sylva redirects back → ?code=xxx&state=yyy
→4. Server exchanges code → POST /api/oauth/token (with code_verifier and client_secret)
→5. Receive access_token (1h) + refresh_token (30d)

Token exchange example

javascript
const response = await fetch("https://app.mysylva.app/api/oauth/token", {
  method: "POST",
  headers: { "Content-Type": "application/x-www-form-urlencoded" },
  body: new URLSearchParams({
    grant_type: "authorization_code",
    code: "<authorization_code>",
    redirect_uri: "https://yourapp.com/callback",
    client_id: "<your_client_id>",
    client_secret: "<your_client_secret>",
    code_verifier: "<pkce_code_verifier>",
  }),
});

// Refreshing needs the same client_id and client_secret:
// grant_type=refresh_token, refresh_token, client_id, client_secret

const { access_token, refresh_token, expires_in } = await response.json();

Available scopes

Request only the scopes your app needs. Users will see exactly what permissions you're requesting on the consent screen.

ScopeDescription
conversationsconversations:readView conversations and threads
conversations:writeCreate, update, and delete conversations
messagesmessages:readView messages
messages:writeCreate and manage messages
taskstasks:readView tasks
tasks:writeCreate, update, and delete tasks
notesnotes:readView notes
notes:writeCreate, update, and delete notes
capturescaptures:readView captures
captures:writeCreate, update, and delete captures
entitiesentities:readView entities in your knowledge graph
entities:writeCreate and update entities
topicstopics:readView topics
topics:writeCreate and manage topics
voice_notesvoice_notes:readView voice notes and transcripts
voice_notes:writeCreate and manage voice notes
collectionscollections:readView collections and items
collections:writeCreate and manage collections
researchresearch:readView research items
research:writeCreate and manage research items
meetingsmeetings:readView meeting recordings and transcripts
meetings:writeCreate and manage meetings
webhookswebhooks:readView webhook endpoints and deliveries
webhooks:writeCreate and manage webhook endpoints
profileprofile:readView your profile and account information

REST API

All endpoints live under https://app.mysylva.app/api/v1/. Responses use a consistent { data, meta } envelope. List endpoints support limit, offset, sort, and order parameters.

Interactive API ReferenceDownload OpenAPI spec →

Webhooks

Sylva sends signed HTTP POST requests to your registered endpoints whenever data changes. Register endpoints in Settings → Webhooks or via the API.

Payload format

json
{
  "id": "evt_a3f9c12b8e4d",
  "type": "task.created",
  "created_at": "2026-05-05T12:00:00Z",
  "data": {
    "id": "uuid",
    "content": "Review Q2 metrics",
    "status": "pending",
    "created_at": "2026-05-05T12:00:00Z"
  },
  "previous_data": null
}

Verifying signatures

Every request includes X-Sylva-Signature and X-Sylva-Timestamp headers. Verify the signature to ensure the request came from Sylva.

javascript
import crypto from "crypto";

function verifyWebhook(body, headers, secret) {
  const timestamp = headers["x-sylva-timestamp"];
  const signature = headers["x-sylva-signature"];

  const expected = "sha256=" + crypto
    .createHmac("sha256", secret)
    .update(`${timestamp}.${body}`)
    .digest("hex");

  // Protect against timing attacks
  const sigBuffer = Buffer.from(signature);
  const expectedBuffer = Buffer.from(expected);
  return sigBuffer.length === expectedBuffer.length &&
    crypto.timingSafeEqual(sigBuffer, expectedBuffer);
}

Event types

conversation

conversation.created

conversation.updated

conversation.deleted

message

message.created

message.updated

message.deleted

task

task.created

task.updated

task.deleted

note

note.created

note.updated

note.deleted

capture

capture.created

capture.updated

capture.deleted

entity

entity.created

entity.updated

entity.deleted

topic

topic.created

topic.updated

topic.deleted

meeting

meeting.created

meeting.updated

meeting.deleted

collection

collection.created

collection.updated

collection.deleted

Rate Limits

Rate limits are applied per user per minute. When exceeded, the API returns HTTP 429 with a RATE_LIMITED error code.

Endpoint groupLimitWindow
All /api/v1/* endpoints1,000 requestsPer minute
Bulk import500 items per requestPer call
Bulk export10,000 items per requestPer call
Webhook testNo specific limitSubject to overall limit

Need higher limits?

Enterprise-scale rate limits are available on custom Team plans. Contact us to discuss your requirements.