Skip to content

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.