hosting
PUT /v1/sites/{siteId}/repo
Connect (or re-connect) a repository to a site.
Authentication
Send an API key as a bearer token. The key must carry the hosting.deploy.manage permission; a key without it is refused with 403, not 404.
This endpoint takes no organisation id. Your key already identifies the organisation it belongs to, and the response is scoped to it.
Try it
Replace anything in angle brackets with your own values, and the key placeholder with a key from your dashboard.
curl -X PUT https://api.zinndigital.com/v1/sites/{siteId}/repo \
-H "Authorization: Bearer zdk_live_…" \
-H "Content-Type: application/json" \
-d '{ "provider": <string>, "repo": <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
Confirms the repository exists on the connected account, stores the connection, and creates or updates the provider-side push webhook — and, when build_mode is ci, commits the Zinn® build workflow to the repository. The provider work happens before the row is reported as connected, so a hook that could not be created never leaves a row claiming it was. Requires hosting.deploy.manage.
Parameters
| Name | Type | Required | What it is |
|---|---|---|---|
siteId (path) | Uuid | Yes | Site ID (UUIDv7). |
Request body
| Name | Type | Required | What it is |
|---|---|---|---|
provider | string | Yes | — |
owner | string | No | — |
repo | string | Yes | — |
branch | string | No | — |
build_mode | BuildMode | No | How the published files are produced. publish serves the repository's own files — right for plain HTML and for a repo whose generator output is committed. ci runs the build… |
build_command | string | No | — |
output_dir | string | No | — |
publish_branch | string | No | — |
auto_deploy | boolean | No | — |
Response
| Name | Type | Required | What it is |
|---|---|---|---|
site_id | Uuid | Yes | UUIDv7 identifier — sortable by creation time (docs/02 §8). |
provider | string | Yes | The git provider — github or gitlab. A machine identifier. |
owner | string | Yes | The account or namespace the repository lives under. |
repo | string | Yes | — |
full_name | string | Yes | owner/repo, or just the repo when the account owns its namespace. |
branch | string | Yes | The branch a push deploys from. |
build_mode | BuildMode | Yes | How the published files are produced. publish serves the repository's own files — right for plain HTML and for a repo whose generator output is committed. ci runs the build… |
build_command | string | Yes | Blank in publish mode — a stored command nothing runs would read as a build. |
output_dir | string | Yes | Which directory is published. Blank means the repository root. |
publish_branch | string | Yes | Where CI commits the built output in ci mode. |
auto_deploy | boolean | Yes | Whether a push deploys automatically. Off still records every delivery, so a customer can watch pushes arriving before letting us act on them. |
webhook_url | string | Yes | The URL the provider was told to deliver to. Computed, never stored — a stored copy would keep naming the origin that was current when the row was written. Blank on an environment… |
webhook_registered | boolean | Yes | Whether a provider-side hook actually exists. False here with a connection present means pushes are NOT being watched. |
last_delivery_at | object | Yes | When the provider last delivered anything, or null for NEVER. Null is the single most useful diagnostic on this screen: "connected but never delivered" is what a mis-scoped token… |
last_delivery_note | string | Yes | What we did with the last delivery, including when we ignored it. Written for every delivery, because "never delivered" and "delivering, ignored" are different problems with… |
connected_account | string | Yes | The label of the credential connection this repository is read with. |
Errors this endpoint can return
401 · 403 · 404 · 422 · 429