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.
curl https://app.mysylva.app/api/v1/tasks \
-H "Authorization: Bearer sylva_oauth_<your_token>" \
-H "Content-Type: application/json"Quick start
Register an OAuth app
In Settings → Developer, create an OAuth application to get your client credentials.
Complete the OAuth flow
Direct users to the authorization URL. Exchange the code for access and refresh tokens.
See auth docs →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
OAuth flow
Token exchange example
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.
| Scope | Description | |
|---|---|---|
| conversations | conversations:read | View conversations and threads |
| conversations:write | Create, update, and delete conversations | |
| messages | messages:read | View messages |
| messages:write | Create and manage messages | |
| tasks | tasks:read | View tasks |
| tasks:write | Create, update, and delete tasks | |
| notes | notes:read | View notes |
| notes:write | Create, update, and delete notes | |
| captures | captures:read | View captures |
| captures:write | Create, update, and delete captures | |
| entities | entities:read | View entities in your knowledge graph |
| entities:write | Create and update entities | |
| topics | topics:read | View topics |
| topics:write | Create and manage topics | |
| voice_notes | voice_notes:read | View voice notes and transcripts |
| voice_notes:write | Create and manage voice notes | |
| collections | collections:read | View collections and items |
| collections:write | Create and manage collections | |
| research | research:read | View research items |
| research:write | Create and manage research items | |
| meetings | meetings:read | View meeting recordings and transcripts |
| meetings:write | Create and manage meetings | |
| webhooks | webhooks:read | View webhook endpoints and deliveries |
| webhooks:write | Create and manage webhook endpoints | |
| profile | profile:read | View 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.
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
{
"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.
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 group | Limit | Window |
|---|---|---|
| All /api/v1/* endpoints | 1,000 requests | Per minute |
| Bulk import | 500 items per request | Per call |
| Bulk export | 10,000 items per request | Per call |
| Webhook test | No specific limit | Subject to overall limit |
Need higher limits?
Enterprise-scale rate limits are available on custom Team plans. Contact us to discuss your requirements.