Read and change a user's Owlect collections and items over HTTPS. Every request carries an OAuth access token the user granted to your app, and sees only that user's data.
Owlect is an OAuth 2.1 authorization server. Apps are public clients that prove themselves with PKCE; there is no client secret to leak.
1. Register a client
Redirect URIs must be https, or http on localhost. Registration is open and rate limited.
bash
curl -X POST https://owlect.app/api/oauth/register \
-H "Content-Type: application/json" \
-d '{"client_name": "My app", "redirect_uris": ["https://myapp.example/callback"]}'
2. Send the user to authorize
Use response_type=code, a PKCE S256 code_challenge, your redirect_uri, a state value and scope="read create update delete" (ask only for what you need). The user signs in with Google, sees a consent screen naming your redirect host, and ticks what to allow: read and create are pre-selected. The token response's scope says what was granted.
POST the code and your code_verifier to the token endpoint. You get an access token (1 hour) and a refresh token (30 days), which rotates on every use: always store the newest one.
Change collections and items. Off unless you tick it.
delete
Delete collections and items. Off unless you tick it.
There are no personal API keys yet: every token comes from a user approving your app, and the user can revoke it at any time in Settings -> Connected apps.
All endpoints take and return JSON. Ids are UUIDs.
Account
GET/api/v1/account(getAccount)
Plan and usage, the Free, Plus and Pro plan table (limits, features, price), this token's access, remaining daily write/delete budgets, batch sizes, the subscription (status, renewal or end date, manage URL) and links to the in-app pages. Call it first; reading it spends no budget.
No parameters.
Collections
GET/api/v1/collections(listCollections)
All of the user's collections, most recently updated first.
No parameters.
POST/api/v1/collections(createCollection)
Creates a collection. Built-in types get their standard fields unless fieldDefinitions is sent. The custom type needs Owlect Plus.
No token, or it is invalid, expired or revoked. Refresh it or send the user through authorization again.
403 insufficient_scope
The token only has the read scope.
403 plan_limit
The user's plan limit was reached. details has the limit and an upgradeUrl.
404 not_found
No such collection or item for this user.
409 confirmation_required
confirmName did not match the collection's name.
413 payload_too_large
The request body is over 1 MB. Send fewer items per request.
422 invalid_input
The input failed validation, or the body had a key the endpoint does not know (details.unknownKeys). details.validKeys lists a collection's field keys when a custom field was unknown.
429 rate_limited
Too many requests. Wait for the Retry-After header.
503 unavailable
A temporary problem on Owlect's side. Retry shortly.
500 internal
An unexpected error. Retry; if it keeps happening, contact support.
GET /collections/{collectionId}/items returns { items, nextCursor }. Pass nextCursor back as ?cursor= for the next page; it is null on the last page. Pages are stable while you write.
Limits apply per connected app (grant). The REST API and the MCP server share them.
120 requests per minute.
500 write requests per day, of which 20 may be deletes.
Per user, across all their connected apps: 1000 write requests and 40 deletes per day.
Up to 50 items per create request and 25 per delete request.
The user's plan limits for items and collections apply as in the app.
Every authenticated response carries RateLimit-Policy (the per-minute quota, e.g. "minute";q=120;w=60) and RateLimit (what is left and the seconds until it resets, e.g. "minute";r=57;t=18), following the IETF RateLimit header fields draft. A 429 also carries Retry-After. The daily budgets are in GET /account.
This is v1, and the version is part of the path. Adding endpoints, optional parameters or response fields is not a breaking change; anything that would break a client goes into a new version. Before an endpoint or a version is removed, it responds with a Deprecation header (RFC 9745) and a Sunset header (RFC 8594) with the removal date for at least 6 months, and the change is announced on the Updates page. Nothing is deprecated today.