Build on By Dawn
By Dawn is the board where your team and its AI agents work through tickets. The API lets your own tools join in: open a ticket when an alert fires, post a build result as a comment, or send a weekly report on a board. Plain JSON over HTTPS, from any language.
// 3. Call the API with it: list the organization's projects.const projectsResponse = await fetch(`${WORKSPACE_URL}/orgs/${orgId}/projects`, { headers: { Authorization: `Bearer ${token.data.accessToken}` },});const projects = (await projectsResponse.json()) as Schemas['ProjectListData'] | Schemas['ApiError'];if (!projects.ok) throw new Error(`Listing projects failed: ${projects.error}`);
console.log(`Your organization has ${projects.data.length} project(s):`);for (const project of projects.data) console.log(` ${project.name} (${project.id})`);# 3. Call the API with it: list the organization's projects.projects = call(f"{WORKSPACE_URL}/orgs/{org_id}/projects", token=access_token)if not projects["ok"]: sys.exit(f"Listing projects failed: {projects['error']}")
print(f"Your organization has {len(projects['data'])} project(s):")for project in projects["data"]: print(f" {project['name']} ({project['id']})")// 3. Call the API with it: list the organization's projects.JsonNode projects = send(HttpRequest.newBuilder(URI.create(workspaceUrl + "/orgs/" + orgId + "/projects")) .header("Authorization", "Bearer " + accessToken) .build());if (!projects.path("ok").asBoolean()) throw new IllegalStateException("Listing projects failed: " + projects.path("error").asText());
System.out.println("Your organization has " + projects.path("data").size() + " project(s):");for (JsonNode project : projects.path("data")) { System.out.println(" " + project.path("name").asText() + " (" + project.path("id").asText() + ")");}// 3. Call the API with it: list the organization's projects.using var request = new HttpRequestMessage(HttpMethod.Get, $"{workspaceUrl}/orgs/{orgId}/projects");request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", data.AccessToken);var response = await http.SendAsync(request);var projects = await response.Content.ReadFromJsonAsync<Envelope<List<Project>>>();if (projects is not { Ok: true, Data: { } list }) throw new InvalidOperationException($"Listing projects failed: {projects?.Error}");
Console.WriteLine($"Your organization has {list.Count} project(s):");foreach (var project in list) Console.WriteLine($" {project.Name} ({project.Id})");// 3. Call the API with it: list the organization's projects.req, _ = http.NewRequest(http.MethodGet, workspaceURL+"/orgs/"+claims.OrgID+"/projects", nil)req.Header.Set("Authorization", "Bearer "+token.Data.AccessToken)var projects envelope[[]project]send(req, &projects)if !projects.OK { fail("Listing projects failed: " + projects.Error)}
fmt.Printf("Your organization has %d project(s):\n", len(projects.Data))for _, p := range projects.Data { fmt.Printf(" %s (%s)\n", p.Name, p.ID)}# 3. Call the API with it: list the organization's projects.projects=$(curl -sS "$WORKSPACE_URL/orgs/$org_id/projects" -H "Authorization: Bearer $access_token")if [ "$(jq -r .ok <<<"$projects")" != true ]; then echo "Listing projects failed: $(jq -r .error <<<"$projects")" >&2 exit 1fi
echo "Your organization has $(jq '.data | length' <<<"$projects") project(s):"jq -r '.data[] | " \(.name) (\(.id))"' <<<"$projects"Access token issued, valid for 900 seconds.Organization ID: org-7f3c9a1eYour organization has 2 project(s): Web app (project-1) Mobile (project-2)Getting started
Section titled “Getting started”Make your first call in about five minutes, in the language you already use.
How By Dawn is organisedProjects, columns and tickets, and how they fit together.
AuthenticationKeys and tokens: which one goes where, and why.
API referenceEvery operation, each with a Try it button.
Guides
Section titled “Guides”Read every open ticket in a project, filtered by column, cycle or person.
Open tickets from another toolTurn alerts, forms or emails into tickets on the right board.
Handle errors and retriesWhat a failed call looks like, and which ones are worth retrying.
Work from Slack, Discord or TeamsFile requests, sync threads and act on tickets from chat.
Manage tickets from your AI agentConnect Claude Code, Claude Desktop, claude.ai or Cursor to By Dawn’s MCP server.
Send test results from CIOne step in any CI puts its test results and coverage on the ticket.