Relationship identifiers¶
Many writes reference objects by ULID or another server identifier. Discover those values through read endpoints before sending relationship payloads.
A safe ticket-creation sequence is:
var members = await client.Projects.ListMembersAsync(projectId);
var labels = await client.Projects.ListLabelsAsync(projectId);
var boards = await client.Projects.ListBoardsAsync(projectId);
var open = boards.First(x => x.Slug == "open");
var owner = members.First(x => x.Email == "[email protected]");
var ticket = await client.Projects.CreateTicketAsync(projectId,
new CreateTicketRequest
{
BoardId = open.Id,
Title = "Investigate latency regression",
AssigneeIds = [owner.Id],
LabelIds = labels.Where(x => x.Name == "production").Select(x => x.Id).ToArray()
});
Ticket creation also accepts BoardSlug. A stable board slug is useful for automation when the board name can change, but the slug remains project-local.
Do not cache relationship IDs indefinitely without a refresh strategy. Soft deletion, access changes, and project moves can make a previously valid identifier fail with 404 or 422.