Discover Events

Happening soon on Sayzio

Browse all events
REST API · v1

Build on Sayzio.

Bearer-token authenticated, JSON in / JSON out. Power mobile apps, integrations and automations on top of every link, biolink and creator post.

https://sayzio.app/api/v1 Get a token
Endpoints
ms
p50 latency
Uptime
Code editor showing the Sayzio REST API

Introduction

The Sayzio REST API gives you programmatic access to everything your account can do on the web: managing links and biolinks, browsing the creators feed, following creators, and managing subscribers.

  • All endpoints live under https://sayzio.app/api/v1.
  • All requests and responses use application/json.
  • Authentication is via a bearer token in the Authorization header.
  • Successful responses are wrapped in { "data": … }; errors in { "error": { … } }.

Authentication

Sign in or register to receive a personal access token, then send it on every protected request:

http
Authorization: Bearer YOUR_TOKEN
Accept: application/json

Tokens never expire on their own — log out (POST /auth/logout) to revoke the current one. Some public endpoints (biolinks, feed) accept an optional bearer token to reveal additional content based on follow/subscribe relationships.

Errors & error codes

All errors share the same envelope:

json
{
  "error": {
    "message": "Human-readable explanation",
    "code": "machine_readable_code",
    "details": { ... }
  }
}
StatusCodeWhen
401 unauthenticated Missing or invalid bearer token on a protected route.
401 auth_required Biolink visibility requires sign-in.
401 invalid_credentials Login failed.
403 follow_required Biolink visibility = followers, viewer is not following.
403 subscribe_required Biolink visibility = subscribers, viewer is not subscribed.
403 forbidden General authorization failure.
404 not_found Unknown route or resource.
405 method_not_allowed Wrong HTTP method.
422 validation_failed Body validation failed; details = {field: [messages]}.
429 rate_limited Too many requests.

Pagination

List endpoints accept page and per_page (max 100) query parameters and return:

json
{
  "data": {
    "items": [ /* … */ ],
    "meta":  { "current_page": 1, "per_page": 20, "total": 53, "last_page": 3 }
  }
}

Rate limits

The following endpoints are rate-limited per IP / token. Excess requests return 429 rate_limited.

  • POST /auth/register — 10 / minute
  • POST /auth/login — 10 / minute
  • POST /biolinks/{alias}/subscribe — 10 / minute

Visibility tiers

Biolinks and feed events carry one of four visibility levels:

public

Open to everyone.

registered

Any signed-in user can view.

followers

Only viewers following the creator.

subscribers

Only viewers actively subscribed to the creator (by email).

For non-public tiers the API responds with 401 auth_required, 403 follow_required, or 403 subscribe_required as appropriate. Owners always bypass.

Authentication

POST /auth/register Public

Create an account and receive an access token.

Parameters

FieldTypeDescription
name required string Full display name. Max 120 chars.
email required string Unique email address.
password required string Min 8 characters.
handle string Optional unique username (a–z, 0–9, _).

Request

bash
curl -X POST https://sayzio.app/api/v1/auth/register \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -d '{
    "name": "Jane Creator",
    "email": "jane@example.com",
    "password": "supersecret"
  }'

Response — 200 OK

json
{
  "data": {
    "user":  { "id": 42, "name": "Jane Creator", "email": "jane@example.com", "handle": null, ... },
    "token": "1|abcdef0123456789..."
  }
}
POST /auth/login Public

Exchange credentials for a bearer token.

Parameters

FieldTypeDescription
email required string
password required string
device string Optional label for the token (e.g. "iphone-pro").

Request

bash
curl -X POST https://sayzio.app/api/v1/auth/login \
  -H 'Content-Type: application/json' -H 'Accept: application/json' \
  -d '{"email":"jane@example.com","password":"supersecret"}'

Response — 200 OK

json
{
  "data": {
    "user":  { "id": 42, "name": "Jane Creator", ... },
    "token": "1|..."
  }
}
GET /auth/me Auth required

Return the currently authenticated user.

Request

bash
curl https://sayzio.app/api/v1/auth/me \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H 'Accept: application/json'

Response — 200 OK

json
{ "data": { /* … */ } }
POST /auth/logout Auth required

Revoke the bearer token used for this request.

Request

bash
curl https://sayzio.app/api/v1/auth/logout \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H 'Accept: application/json'

Response — 204 No Content

No response body.

Profile

GET /profile Auth required

Same payload as GET /auth/me.

Request

bash
curl https://sayzio.app/api/v1/profile \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H 'Accept: application/json'

Response — 200 OK

json
{ "data": { /* … */ } }
PATCH /profile Auth required

Update profile fields. Send only what you want to change.

Parameters

FieldTypeDescription
name string
bio string Up to 500 chars.
handle string Unique. a–z, 0–9, _.
avatar string Public URL.
phone string
timezone string e.g. America/New_York.
language string 2-letter code.
discoverable boolean
allow_followers boolean

Request

bash
curl -X PATCH https://sayzio.app/api/v1/profile \
  -H 'Authorization: Bearer YOUR_TOKEN' \
  -H 'Content-Type: application/json' -H 'Accept: application/json' \
  -d '{"bio":"Building cool stuff","handle":"jane"}'

Response — 200 OK

json
{ "data": { /* … */ } }

Feed

GET /feed Optional auth

Global creators feed. Anonymous viewers see only public events; signed-in viewers also see registered events plus followers/subscribers events from creators they follow or subscribe to.

Parameters

FieldTypeDescription
page integer
per_page integer Default 20, max 100.

Request

bash
curl https://sayzio.app/api/v1/feed \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H 'Accept: application/json'

Response — 200 OK

json
{ "data": { /* … */ } }
GET /creators/{handle}/feed Optional auth

Same as /feed but scoped to a single creator.

Request

bash
curl https://sayzio.app/api/v1/creators/{handle}/feed \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H 'Accept: application/json'

Response — 200 OK

json
{ "data": { /* … */ } }

Follows

POST /follows/{userId} Auth required

Follow a creator. Returns 422 self_follow if you target yourself.

Request

bash
curl https://sayzio.app/api/v1/follows/{userId} \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H 'Accept: application/json'

Response — 201 Created

json
{ "data": { /* … */ } }
DELETE /follows/{userId} Auth required

Unfollow a creator.

Request

bash
curl https://sayzio.app/api/v1/follows/{userId} \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H 'Accept: application/json'

Response — 200 OK

json
{ "data": { /* … */ } }
GET /follows/following Auth required

Paginated creators you follow.

Request

bash
curl https://sayzio.app/api/v1/follows/following \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H 'Accept: application/json'

Response — 200 OK

json
{ "data": { /* … */ } }
GET /follows/followers Auth required

Paginated users following you.

Request

bash
curl https://sayzio.app/api/v1/follows/followers \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H 'Accept: application/json'

Response — 200 OK

json
{ "data": { /* … */ } }

Subscribers (creator-side)

GET /subscribers Auth required

List of YOUR subscribers.

Parameters

FieldTypeDescription
status string Filter (e.g. active, unsubscribed).
q string Search email or name.
page integer
per_page integer

Request

bash
curl https://sayzio.app/api/v1/subscribers \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H 'Accept: application/json'

Response — 200 OK

json
{ "data": { /* … */ } }
DELETE /subscribers/{id} Auth required

Soft-unsubscribe a subscriber (marks status=unsubscribed).

Request

bash
curl https://sayzio.app/api/v1/subscribers/{id} \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H 'Accept: application/json'

Response — 200 OK

json
{ "data": { /* … */ } }

Discovery (public)

GET /discovery/creators Public

Paginated discoverable creators sorted by followers count.

Parameters

FieldTypeDescription
q string Search name, handle, or bio.
per_page integer Default 20, max 50.

Request

bash
curl https://sayzio.app/api/v1/discovery/creators \
  -H 'Accept: application/json'

Response — 200 OK

json
{ "data": { /* … */ } }
GET /discovery/creators/{handle} Public

Public profile by handle.

Request

bash
curl https://sayzio.app/api/v1/discovery/creators/{handle} \
  -H 'Accept: application/json'

Response — 200 OK

json
{ "data": { /* … */ } }

Health

GET /health Public

Liveness probe. Always returns 200 when the API is up.

Request

bash
curl https://sayzio.app/api/v1/health \
  -H 'Accept: application/json'

Response — 200 OK

json
{ "data": { "status": "ok", "time": "2026-04-21T06:33:08+00:00" } }
Found a problem with this page? Let us know.
⌘I