ticket.assignee or ticket.assignee_group_member, and who receives notifications addressed to the assignee role.
Set these before running the examples:
Authorization: Bearer $TOKEN and ORG-ID: $ORG_ID. Successful responses use the envelope {"ok": 1, "data": {...}}.
Assignment
User vs group
The two are mutually exclusive:
- Send exactly one of them. Sending both (or neither, on
/assign) returns400“exactly one of assigned_user_id or assigned_group_id is required”. - Assigning a user clears
assigned_group_id. Assigning a group clearsassigned_to.
Assign when you create a ticket
Addassigned_user_id or assigned_group_id to the create body. The ticket is created and assigned in one step.
Assign and unassign an existing ticket
Both return
{"ok": 1, "data": {"ok": true}}.
The Console has no assign or unassign control. Its Assign users option on the create form adds
user tags to the ticket; it does not set assigned_to. See Console.Group members claiming a ticket
There is no separate claim endpoint. A member claims a group ticket by assigning it to themselves:- Assign the ticket to a group (for example, a maintenance shift).
- A member of that group calls
/assignwith their own user ID asassigned_user_id. - The ticket moves from the group to that user:
assigned_tois set andassigned_group_idis cleared.
/assign, so the platform does not check that the claimer belongs to the group.
In Slack, Microsoft Teams, and Telegram, notification cards for Ticket Created, Ticket Transitioned, and Ticket Unassigned include an Assign to me button. It assigns the ticket to the Golain user linked to the chat identity who clicked, and requires that user to be a member of the Organization and Project.
How assignment affects permits
Transitions declare who may fire them withpermit. These permits read assignment:
A workflow where any member of the assigned group can start and finish work:
List tickets by assignee
FilterGET /projects/{project_id}/tickets with:
Combine with other filters such as
system_class or labels.
assigned_group_id. To find them, filter by assigned_to.
Notifications for tickets
Ticket notifications use notification subscriptions. A subscription selects events, a channel (email, Slack, Microsoft Teams, Telegram, Twilio SMS, or Twilio WhatsApp), and who receives each message.Ticket event types
Ticket deletion is not a notifiable event. Ticket Due Soon and Ticket Due fire only for tickets with a top-level
due_at on a workflow that defines due_policy. See Automation.
To list every notifiable event with its roles, call the registry:
data.events[] items include key, display_name, description, card_fields, default_actions, and recipient_roles.
What a notification includes
Where subscriptions live
Each scope supports
GET (list), POST (create), PATCH /{id}, DELETE /{id}, and POST /{id}/test. The delivery log and single-subscription GET are on the organization path: GET /organizations/notification-subscriptions/{id} and /{id}/deliveries. They work for subscriptions of any scope.
Subscription fields
On
PATCH, omitted fields stay unchanged. workflow_def_ids: [] clears the workflow filter, and recipient_roles: [] returns to a fixed-destination subscription.
Recipient roles
Rules enforced when you save:
- Every role you list must be declared by every subscribed event. For example,
assigneewith Ticket Unassigned returns400“role “assignee” is not declared by ticket.ticket.unassigned.v1”. recipient_rolesworks only withchannel_ref.kind: "email".- An email subscription with no
toand norecipient_rolesis rejected. $-placeholders into(such as$assignee_email) are no longer supported and are rejected.
to is not mailed twice.
Create a subscription for ticket events
1
Pick the workflow
Find the
workflow_def_id of the workflow you want, for example maintenance-request, from GET /projects/{project_id}/ticket-workflows.2
Create the subscription
This project subscription emails the assignee when a ticket is assigned or changes state, but not the person who made the change:The API returns
201 with the subscription in data:3
Add a fixed list for closures (optional)
A second subscription can email a fixed address whenever a ticket closes:
notify_actor, group_assignee_mode, and workflow_def_ids are API-only today.
Group assignments and claims
Pair Ticket Assigned with Ticket Transitioned on anassignee subscription:
- While the ticket is assigned to a group, each transition notifies every group member except the one who moved it (with
notify_actor: false). - When a member claims the ticket, Ticket Assigned names them as the assignee. They are also the actor, so they are not notified of their own claim.
- From then on,
assigneeresolves to that person only. The rest of the group stops receiving updates for the ticket.
group_assignee_mode: none, a group assignment notifies nobody and writes one suppressed row to the delivery log.
Delivery log and suppression
Each row has
event_key, event_id, status, attempt_count, error_detail, recipient_user_id, recipient_role, recipient_display, recipient_via_group_id, recipient_via_group_name, and timestamps. Fixed-destination rows have recipient_user_id: null. Email addresses are never returned: recipient_contact is null and addresses in error_detail are redacted.
status is pending, delivered, retrying, failed, or suppressed. A suppressed row is a normal outcome, not a failure. error_detail gives the reason, for example:
Only users with manage integrations on the subscription’s Organization or Project see delivery rows. Others get an empty list. In the Console, open a subscription’s Delivery log from the subscription list.
Test sends
POST …/notification-subscriptions/{id}/test sends a test message and waits up to 10 seconds for the result. Success returns {"ok": 1, "data": {"delivered": true}}.
A test needs a fixed destination. Role recipients resolve from a real ticket event, so testing a role-only email subscription returns
400 “test send needs a fixed channel_ref.to”. Add an address to channel_ref.to to test it. Disabled or suspended subscriptions also return 400.Next steps
- Workflows: permits, guards, and due policy
- Automation: due-date timers and transition actions
- API reference: every ticket route
- Troubleshooting: permit and notification errors