Send notifications to everyone, a team, or one person. GET /v1/boards/{boardId} returns the board only. People are GET /v1/boards/{boardId}/people. Notifications arrive in Notsku (inbox and push).
Authentication
Create an org-scoped key in Manage → API. Send it as Authorization: Bearer jb_live_YOUR_KEY. Keys never go in a user’s browser.
Base URL
https://api.notsku.com/functions/v1/public-api
How to send a notification
Look up ids first, then POST /notifications. For one person, audience.type is "people" and people_ids is an array with that membership id.
Send a notification to one person
GET /v1/boards — copy board id.
GET /v1/boards/{boardId}/people — copy that person’s id. This is a membership id, not their email and not their auth user id.
POST /v1/boards/{boardId}/notifications with audience.type "people" and people_ids: ["that-membership-id"]. One person is an array of one id.
cURL
curl -X POST https://api.notsku.com/functions/v1/public-api/v1/boards/{boardId}/notifications \
-H "Authorization: Bearer jb_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "Your shift starts at 16:00",
"body": "Please open Notsku and confirm.",
"urgency": "important",
"audience": {
"type": "people",
"people_ids": ["11111111-2222-3333-4444-555555555555"]
}
}'
Send a notification to one team
GET /v1/boards/{boardId}/teams — copy the team’s id.
POST /v1/boards/{boardId}/notifications with audience.type "team" and team_id.
POST /v1/boards/{boardId}/notifications with audience.type "all". No people_ids or team_id.
cURL
curl -X POST https://api.notsku.com/functions/v1/public-api/v1/boards/{boardId}/notifications \
-H "Authorization: Bearer jb_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "Office closed Friday",
"body": "The office is closed on Friday.",
"urgency": "normal",
"audience": { "type": "all" }
}'
Connect a user to a board
1. Your server creates a connect session with the API key.
2. Redirect the user to connect_url. They sign in on Notsku and confirm.
3. Notsku redirects back with a one-time code. Your server exchanges it for membership_id. Use that id later in people_ids.
MCP
One MCP server, two kinds of keys. Personal keys (Profile) read and reply to your inbox, manage where you are joined, and change notification settings. Organization keys (Manage → API) expose the same operations as this REST API.
MCP URL
MCP URL
https://api.notsku.com/functions/v1/mcp
Send the key as Authorization: Bearer jb_user_… or jb_live_…. On hosted Supabase, if the gateway requires the publishable key in Authorization, put the Notsku key in X-Joinboard-Key instead.
List people on a board. Each id is a membership id for send_notification people_ids. Optional state defaults to active; use all for invited or pending.
Send a notification to everyone, one team, or specific people. Recipients get it in the Notsku inbox and as a push notification. people_ids are membership ids from list_people.
Example
{
"board_id": "aaaaaaaa-bbbb-4ccc-8ddd-eeeeeeeeeeee",
"title": "Your shift starts at 16:00",
"body": "Please open Notsku and confirm.",
"urgency": "important",
"audience_type": "people",
"people_ids": ["11111111-2222-3333-4444-555555555555"]
}
create_connect_session
Start a member connect flow. return_url must be allowlisted on the API key.
Each row’s id is the membership id. Use that id in POST /notifications audience.people_ids. Do not send email or user_id. Default filter is ?state=active. Use ?state=all to include invited or pending people.
Send a notification. Recipients get it in the Notsku inbox and as a push notification.
audience.type must be all, team, or people. For one person, type is still "people" with a one-element people_ids array. people_ids values come from GET /people (membership id). Optional Idempotency-Key header retries the same send safely.
cURL
curl -X POST https://api.notsku.com/functions/v1/public-api/v1/boards/{boardId}/notifications \
-H "Authorization: Bearer jb_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "Your shift starts at 16:00",
"body": "Please open Notsku and confirm.",
"urgency": "important",
"audience": {
"type": "people",
"people_ids": ["11111111-2222-3333-4444-555555555555"]
}
}'
One person
{
"title": "Your shift starts at 16:00",
"body": "Please open Notsku and confirm.",
"urgency": "important",
"audience": {
"type": "people",
"people_ids": ["11111111-2222-3333-4444-555555555555"]
}
}