Teams
Share webhook endpoints across your team. Invite members, assign roles, manage permissions, and inspect incoming requests together in a shared real-time dashboard.
Updated Oct 2026
Share webhook endpoints with teammates so everyone can see incoming requests and edit settings together.
For what teams use it for, pricing examples and how it compares, see Webhook testing for teams.
Plan and Pricing
Teams are billed per team, not per account: $12/seat/month, on a 30-day period that starts when the team subscribes.
- Any account can create a team — Free and Pro alike. Personal plans have no bearing on team access.
- A team does nothing until it has an active subscription. Until then it is suspended: invites, endpoint sharing, and member access to shared endpoints are blocked, though the team and its data are kept.
- Seats are the member cap. A team holds exactly as many members as it has purchased seats, and the owner occupies one of them.
- Seats are also the quota. Every seat adds 100,000 requests per 30-day period to one pool shared by the whole team.
- Adding seats charges right away, removing seats waits for the renewal. Added seats cost their share of the rest of the current period, shown to the cent before you confirm and charged to the card on file; if the card is declined, no seats are added. Removed seats stay until the period ends and the subscription renews at the lower count, with nothing charged or credited in between. Until then the team cannot take on more members than the lower count, and you can keep your current seats at any time from the team page. Prices include VAT where it applies.
The team owner manages all of this from the team page: subscribe, add or remove seats, cancel, and resubscribe. Canceling keeps the team active until the current period ends, then suspends it — nothing is deleted.
Creating a Team
- Open the Teams page from the avatar dropdown in the header
- Click New Team and enter a name
- You are the team owner — you can invite members, manage the team, and delete it
- Subscribe from the team page to activate it — pick the number of seats you need
Inviting Members
- Go to your team's manage page
- Enter a teammate's email in the Invite Member field
- Any email address works: they get an invite email, and if they don't have an account yet, the invite is waiting for them after they sign up with that address (email/password or GitHub/Google)
- They'll see the invite on their Teams page and can accept or decline
Each accepted invite claims a seat. When members equal seats, the team is full: add a seat before inviting anyone else. Removing a member (or a member leaving) frees their seat for reuse and unshares the endpoints they had shared with the team.
Sharing Endpoints
You can share any endpoint you own with one or more teams:
From endpoint settings:
- Open the endpoint's Settings tab in the dashboard
- In the Team sharing section, click Share next to a team
- Click again to unshare
In the dashboard:
- Your shared endpoints show as
slug (Shared with TeamName)in the endpoint switcher - Endpoints shared with you appear in a Shared with me section as
slug (TeamName)
Permissions
| Action | Owner | Member |
|---|---|---|
| View requests | Yes | Yes |
| Edit mock response | Yes | Yes |
| Rename endpoint | Yes | Yes |
| Delete endpoint | Yes | No |
| Share/unshare | Yes | No |
| Invite members | Yes | No |
| Remove members | Yes | No |
| Manage billing | Yes | No |
| Delete team | Yes | No |
Quota and Retention
Sharing an endpoint with an active team moves its billing to that team:
- Requests draw from the team pool — seats × 100,000 per 30-day period, tracked on the team, not on any member's account
- Retention is 31 days for team-billed requests, whatever plan the endpoint owner is on
- One team per request — if an endpoint is shared with several active teams, the oldest share is billed
- Suspended teams don't bill — while a team has no active subscription, requests on its shared endpoints fall back to the endpoint owner's personal quota and retention
- When the pool is exhausted the receiver returns
429 Too Many Requestswith aRetry-Afterpointing at the team's period reset
From the CLI, SDK, and MCP Server
An API key carries exactly the team access of the account it belongs to, so everything below works with a key from your account page or with whk auth login. Unclaimed agent keys have no team access until a human claims them.
Shared endpoints behave like your own. Any endpoint shared with you through a subscribed team can be listed, inspected, streamed, searched, and forwarded by slug. Each endpoint carries sharedWith (yours, shared with a team) or fromTeams (shared with you: every one of your teams it is shared with, with fromTeam naming the oldest share) so you can tell them apart. A team filter matches any of those; it takes a team id or a unique team name.
whk list --team Payments # endpoints tied to one team, by name or id
whk listen <shared-slug> # stream a teammate's endpoint
whk tunnel 3000 --endpoint <shared-slug>
whk requests search --q invoice # covers shared endpoints tooManage sharing and membership without the browser. whk teams mirrors the team page; the SDK exposes the same operations under client.teams; the MCP server exposes list_teams, list_team_members, share_endpoint, and unshare_endpoint.
whk teams list # seats, pooled usage, status
whk teams members Payments
whk teams share my-stripe --team Payments # owner only; needs an active team
whk teams unshare my-stripe --team Payments
whk teams invite Payments [email protected] # sends an email; acceptance claims a seat
whk teams invites # invites waiting for you
whk teams accept <invite-id>const teams = await client.teams.list();
await client.teams.share(teams[0].id, "my-stripe");
const shared = await client.endpoints.list({ team: teams[0].name });Invites are deliberately not exposed as MCP tools: accepting one claims a paid seat and inviting sends real email, so those stay with people. Creating, renaming, or deleting teams, removing members, and billing remain dashboard actions; billing routes reject API keys.
Quota. whk usage and the MCP get_usage tool show each subscribed team's pool under your personal plan. In the SDK, teams.list() returns requestsUsed, requestLimit, seats, and periodEnd per team.
How It Works
- Sharing is view and edit only: team members can see requests and change settings, but cannot delete endpoints or clear their requests
- Real-time updates work for shared endpoints — team members see new requests instantly via SSE
- A stream that is open when a team's subscription lapses keeps running until the 30-minute rotation; the reconnect is then refused
- Deleting a team cancels its subscription and releases every seat; the endpoints themselves are untouched and stay with their owners