board-github

POST /v1/board-github/links

Connect a GitHub Project to this organisation.

All board-github endpoints

All developer docs →

Authentication

Send an API key as a bearer token. The endpoint checks agency.board.manage; a key without it is refused with 403, not 404.

Where your organisation id goes

This endpoint takes org_id as a field in the JSON body.

Your organisation id is on the API keys screen in your dashboard, beside the key itself. It is the same id in every call you make.

Try it

Replace anything in angle brackets with your own values, and the key placeholder with a key from your dashboard.

curl -X POST https://api.zinndigital.com/v1/board-github/links \
  -H "Authorization: Bearer zdk_live_…" \
  -H "Content-Type: application/json" \
  -d '{ "project_node_id": <string>, "project_number": <integer>, "owner_login": <string> }'

Signed in? The API console in your dashboard fills in your real organisation id and your own key, and runs the request against the live API so you can see the actual response. Open this endpoint in the API console

Details

Two-way from the moment it is connected (owner ruling, 2026-09-03). The first sync runs inside this request, so the 201 already carries the project's fields — a connect that returned an empty board and left the customer waiting for the sweep would read as a broken connection. auth_kind: app stores only the installation id, which is public and appears in the customer's own install URL; nothing long-lived is at rest and an hour-long token is minted per use. auth_kind: pat writes the token straight to Vault and never echoes it.

Request body

NameTypeRequiredWhat it is
project_node_idstringYes—
project_numberintegerYes—
owner_loginstringYes—
owner_typestring<organization, user>No—
auth_kindGitHubAuthKindNoapp is the Zinn® GitHub App installation — per-repository scope the customer chooses on GitHub's own screen, revocable by them in one click, belonging to their organisation…
installation_idstringNo—
tokenstringNo—
board_idstringNoOptional. A project may be connected purely for the roll-up and never attached to client work.
titlestringNo—
org_idstringNo—

Response

NameTypeRequiredWhat it is
idstringNo—
board_idstringNo—
auth_kindGitHubAuthKindNoapp is the Zinn® GitHub App installation — per-repository scope the customer chooses on GitHub's own screen, revocable by them in one click, belonging to their organisation…
installation_idstringNoPublic — it appears in the customer's own install URL — and showing it is what lets them confirm on GitHub that they are looking at the right installation.
has_stored_tokenbooleanNoWhether a token is held in Vault for this connection. The token itself is never returned.
project_node_idstringNo—
project_numberintegerNo—
owner_loginstringNo—
owner_typestringNo—
titlestringNo—
short_descriptionstringNo—
closedbooleanNo—
publicbooleanNo—
directionGitHubSyncDirectionNoboth is the default (owner ruling, 2026-09-03: a new connection is read-write immediately). pull is the honest remedy when a push keeps being refused.
notice_deliveryGitHubNoticeDeliveryNoWhere a connection's overdue / gone-quiet / over-WIP notices are allowed to go. Both values raise the same notices and both render them on the board — the difference is delivery,…
viewsobject[]NoThe project's saved views on GitHub, replaced whole on every read so a view deleted there disappears here rather than lingering as a link GitHub answers with a 404. Rendered as…
urlstringNo—
webhook_stateGitHubWebhookStateNoWhether GitHub pushes changes at us, and if not, whose move it is. Three outcomes and not a boolean. automatic — we created the organisation webhook. manual — GitHub would…
last_synced_atstringNoWhen a sync last SUCCEEDED. What the staleness alarm fires off.
last_attempted_atstringNoWhen a sync was last ATTEMPTED, stamped for every connection the sweep reaches before the result is read. Two columns rather than one: a cursor only a successful pass advanced…
last_errorstringNo—
created_atstringNo—
fieldsGitHubProjectField[]NoThe project's fields, with their single-select options and any work-in-progress limits set on them. Returned with the connection rather than fetched separately, because a board…

Errors this endpoint can return

401 · 403 · 422