Review Teams
Create and manage review teams that Human Reviews route to: workspace-unique names, an optional notification webhook URL, and owner-managed team membership.
Review teams are the routing registry for Human Reviews: named groups of workspace users a review can be assigned to, either at raise time (team_id on POST /v1/apps/:id/reviews) or later via POST /v1/reviews/:reviewId/assign. The inbox filters make the rest work: a team's members triage GET /v1/reviews?status=open and pick up what is routed their way. Teams are plane-neutral by design — Apps consume them today, other review-routing surfaces adopt the same registry later.
The CRUD is deliberately small. GET /v1/review-teams lists teams (read tier, name-ordered). POST /v1/review-teams creates one from a name (max 200 chars, workspace-unique — a duplicate answers 409 naming the clash) and an optional webhook_url (max 2000 chars) for team notification integrations. PATCH /v1/review-teams/:teamId renames or swaps the webhook URL (pass webhook_url: null to clear it); DELETE /v1/review-teams/:teamId removes the team. All three writes are owner tier — a human workspace owner — while reads sit at the read tier like the rest of the surface.
Membership is managed per team: GET /v1/review-teams/:teamId/members lists members, POST /v1/review-teams/:teamId/members adds one by user_id (a duplicate add answers 409 User is already a member of this team), and DELETE /v1/review-teams/:teamId/members/:userId removes one, answering { "removed": true }. Members are workspace users — the same identities that appear as assignee_user_id on reviews and as resolvers in the ledger.
curl — create a team and add a member
curl -s -X POST https://api.talonic.com/v1/review-teams \
-H "Authorization: Bearer <session-token>" \
-H "Content-Type: application/json" \
-d '{ "name": "Finance Ops", "webhook_url": "https://hooks.example.com/finance-ops" }'
# → { "id": "3f2b9c44-…", "name": "Finance Ops",
# "webhook_url": "https://hooks.example.com/finance-ops", "created_at": "…" }
curl -s -X POST https://api.talonic.com/v1/review-teams/$TEAM_ID/members \
-H "Authorization: Bearer <session-token>" \
-H "Content-Type: application/json" \
-d '{ "user_id": "9a7e1c22-4f0b-4e0e-8a4b-6d2f0c9b1e77" }'curl — route a review to the team
curl -s -X POST https://api.talonic.com/v1/reviews/$REVIEW_ID/assign \
-H "Authorization: Bearer tlnc_your_api_key" \
-H "Content-Type: application/json" \
-d '{ "team_id": "3f2b9c44-1e0a-4b7c-9d21-5a8f0e6c3b12" }'A team's webhook_url is a notification hook: whenever a review is raised with that team as assignee (team_id on POST /v1/apps/:id/reviews), Talonic POSTs the same JSON envelope the workspace-level app.review.raised webhook carries (review_id, app_id, run_id, kind, question, team) to that URL, unsigned and with the standard retry ladder. Platform-raised reviews (threshold holds, decision-agent failures, SLA fallbacks) arrive as app.exception.raised instead. Use the team hook for the team's own channel and the workspace webhook for your integration. Resolution flows back through the normal resolve endpoint, so a team bot can read the inbox filtered to its assignments and resolve data_request reviews autonomously while leaving approval kinds to humans.