API reference menu
Getting started
OverviewAuthentication and rate limitExamplesSending
Send a notificationPriority and repeatLinks, images and buttonsSourcesScheduled sendsWebhook templatesReceipts and replies
Receipts and callbacksRepliesTeams
Teams, roles and endpointsChannels and escalationWebhooks and emailAlert email and timelineTeam formsPlans, audit log and transferCompany sign‑in and SCIMThe web consoleAccount
Identity and moving phonesDevices, keys and historyThe Upgrade PassCompatibility
ntfy's publish APIProwl's APIAppendix
Endpoint indexErrors and status codesLimitsPriorities and fieldsGlossaryTeams
A team is a set of accounts that agreed to be one. Nobody types an email address or sets a password: a person joins by redeeming an invite code with the account key they already have, and what their teammates see of them is a display name they chose for that team and nothing else. These endpoints take an account key (nla_…), like the rest of the account API. The app has screens for join, members, your display name and leave (Settings, then Teams); teams are created in the web console, and Settings, then Console, calls POST /v1/web/pairings; the rest is the web console and this API.
Roles, lowest to highest: member (receives), sender (may make channel keys), admin (people,
channels, invites), owner (everything; the only one who changes roles or deletes the team).
Creating a team or joining one needs
no Upgrade Pass; a team sends once it has a plan (see Plans and billing). A team you are not on answers 404, the same as one that does not exist, and a role
too low answers 403 forbidden.
| Endpoint | Role | Does |
|---|---|---|
POST /v1/teams {"name"} |
any account |
Create. You are the owner. 5 teams per owner |
GET /v1/teams |
any account |
The teams you are on, with your role |
POST / {"code"} |
any account |
Redeem an invite. 20 attempts an hour; every failure is one 404 invalid_code. A code carries its maker's authority, judged when it is redeemed: one made by someone since removed, gone, or demoted below the role that could issue it lets no one in. 409 sso_required or 409 provisioned when the team adds people through its company sign‑in or its identity provider |
GET / |
member |
The team and its members ( member_id, role, name, joined) |
PATCH / {"display_name"} |
member |
Your name on this team only |
DELETE / |
member |
Leave. An owner cannot: delete the team instead |
DELETE / |
admin |
Remove someone strictly below your role |
PATCH / {"role"} |
owner |
admin, sender or member. The owner's role never changes |
DELETE / |
owner |
Delete the team, its channels and keys, and every member's copies |
POST / {"role", |
admin |
Make a code (shown once; only its hash is kept). An admin can invite sender or member, an owner also admin. Nobody invites an owner. 60 s to 30 days; 1 to 100 uses |
GET /, DELETE …/ |
admin |
List live invites (never their codes), revoke |
POST / {"name", |
admin |
ack_policy is any or all; members is "all", a list of at most 25 member ids, or omitted for just you |
GET / |
member |
Your channels (an admin sees all) |
GET / |
member |
A channel and who is on it |
PATCH / {"everyone": true} |
admin |
Set the channel's everyone flag. On: every current team member is put on it, and each later joiner is too. Off: no one is removed. Answers {id,. everyone also shows in channel create, get and list. The same call takes unopened_after (see Destinations) |
DELETE / |
admin |
Delete it, its keys, and every member's copies |
PUT / DELETE / |
admin |
Put someone on, or take them off (their copies go too) |
POST / GET /, DELETE …/ |
admin |
Add, list or remove a destination |
POST …/, /enable, /resend |
admin |
Send a test event, switch a disabled one back on, resend an email's verification |
POST / GET /, PATCH / DELETE …/{slug} |
admin (list: member) |
Create, list, change or delete a team's form |
GET …/, …/ |
member on the form's channel |
The inbox, and one submission. ?tag=lead and ?assigned_to=acct_… narrow the inbox |
PATCH …/ |
member on the form's channel |
Set status, a private note, tags (the whole list) or assigned_to (a member_id, or null) |
POST …/ |
member on the form's channel |
Take it, so nobody else does |
DELETE …/, GET …/export |
admin |
Erase one, with everything it spread to; export CSV or JSON |
GET …/ |
member on the form's channel |
A submission's file |
GET …/; POST …/test, PATCH …/test/b, POST …/test/keep |
member; admin |
Two versions of a form: the numbers; start, change version B, keep a winner |
GET /; POST, PATCH, DELETE, PUT …/ |
member; admin |
Routing rules: read them; add, change, delete or reorder them |
PUT / GET / DELETE / |
admin |
Set, read or clear the channel's escalation policy |
POST / |
sender |
A key for this channel, shown once. A sender can make one only for a channel they are on |
GET / |
admin |
Its keys, and who made each |
DELETE / |
sender |
A sender revokes their own, an admin anyone's |
What taking someone off a team takes#
Removing a member, or their leaving, ends their place now: their channel memberships, the channel keys they made, and their copies of everything the team sent. Their own account, keys, devices and personal history are not touched. Deleting a team does the same for all members, and so does deleting the owner's account, because the team's data was the team's.