# API overview

Every Syndai REST endpoint, generated from the OpenAPI spec at https://api.syndai.ai/openapi.json.

## Account

The API key you are calling with and the workspace it belongs to. Read the key's identity and scopes, revoke it, or page through a snapshot of the workspace's runs, projects and threads to seed a local mirror.

- [Get the calling API key](https://syndai.ai/docs/api/account/get-me.md): GET /api/v1/external/coding/me
- [Revoke the calling API key](https://syndai.ai/docs/api/account/revoke-me.md): DELETE /api/v1/external/coding/me
- [Read a page of sync snapshot rows](https://syndai.ai/docs/api/account/get-sync-snapshot.md): GET /api/v1/external/coding/sync/snapshot

## Runs

A run is one coding task Syndai carries from a prompt to a delivered change. Creating a run starts billable work; its `external_request_id` is the idempotency key, so a retry never starts a second run. Follow a run by streaming its events or polling `GET /runs/{id}`. Phases are open-ended: a run can pause to ask you something, so read `pending_hitl_requests` and answer through `/responses` rather than assuming a fixed order.

- [Open a validation artifact](https://syndai.ai/docs/api/runs/open-validation-artifact.md): GET /api/v1/external/coding/artifacts/{artifact_id}/open
- [List runs](https://syndai.ai/docs/api/runs/list-runs.md): GET /api/v1/external/coding/runs
- [Create a run](https://syndai.ai/docs/api/runs/create-run.md): POST /api/v1/external/coding/runs
- [Upload an executable for a run to learn from](https://syndai.ai/docs/api/runs/ingest-reference-artifact.md): POST /api/v1/external/coding/runs/artifact-ingest
- [Upload an image for a run](https://syndai.ai/docs/api/runs/ingest-run-image.md): POST /api/v1/external/coding/runs/image-ingest
- [Get a run](https://syndai.ai/docs/api/runs/get-run.md): GET /api/v1/external/coding/runs/{coding_run_id}
- [Cancel a run](https://syndai.ai/docs/api/runs/cancel-run.md): POST /api/v1/external/coding/runs/{coding_run_id}/cancel
- [Get a run's change state](https://syndai.ai/docs/api/runs/get-change-state.md): GET /api/v1/external/coding/runs/{coding_run_id}/change
- [Stream a run's events](https://syndai.ai/docs/api/runs/stream-run-events.md): GET /api/v1/external/coding/runs/{coding_run_id}/events
- [Get a run's live view](https://syndai.ai/docs/api/runs/get-run-live.md): GET /api/v1/external/coding/runs/{coding_run_id}/live
- [Get a run's delivered diff](https://syndai.ai/docs/api/runs/get-run-proposed-diff.md): GET /api/v1/external/coding/runs/{coding_run_id}/proposed-diff
- [Rename a run](https://syndai.ai/docs/api/runs/rename-run.md): POST /api/v1/external/coding/runs/{coding_run_id}/rename
- [Answer a run's question](https://syndai.ai/docs/api/runs/respond-to-run.md): POST /api/v1/external/coding/runs/{coding_run_id}/responses
- [Steer a run in progress](https://syndai.ai/docs/api/runs/steer-run.md): POST /api/v1/external/coding/runs/{coding_run_id}/steer
- [Stop a run and keep its work](https://syndai.ai/docs/api/runs/stop-run.md): POST /api/v1/external/coding/runs/{coding_run_id}/stop
- [Get a run's timeline](https://syndai.ai/docs/api/runs/get-run-timeline.md): GET /api/v1/external/coding/runs/{run_id}/timeline

## Run review

The review points a run can stop at before it builds: confirm or co-sign its acceptance criteria, edit one criterion, and request changes to, extend or skip its spec and plan review. Most need a signed-in person; a stale review round or a closed review returns 409.

- [Co-sign an auto-approved run's criteria](https://syndai.ai/docs/api/run-review/cosign-run-criteria.md): POST /api/v1/external/coding/runs/{coding_run_id}/criteria/cosign
- [Confirm a run's acceptance criteria](https://syndai.ai/docs/api/run-review/ratify-run-criteria.md): POST /api/v1/external/coding/runs/{coding_run_id}/criteria/ratify
- [Edit a drafted acceptance criterion](https://syndai.ai/docs/api/run-review/edit-criterion.md): POST /api/v1/external/coding/runs/{coding_run_id}/criteria/{criterion_key}/edit
- [Request changes to a run's plan](https://syndai.ai/docs/api/run-review/request-plan-changes.md): POST /api/v1/external/coding/runs/{coding_run_id}/plan/request-changes
- [Get the full text of a run's plan](https://syndai.ai/docs/api/run-review/get-run-plan-text.md): GET /api/v1/external/coding/runs/{coding_run_id}/plan/{plan_sha256}
- [Extend a run's spec review window](https://syndai.ai/docs/api/run-review/extend-spec-review.md): POST /api/v1/external/coding/runs/{coding_run_id}/spec/extend-review
- [Request changes to a run's drafted spec](https://syndai.ai/docs/api/run-review/request-spec-changes.md): POST /api/v1/external/coding/runs/{coding_run_id}/spec/request-changes
- [Start building without confirming the spec](https://syndai.ai/docs/api/run-review/skip-spec-review.md): POST /api/v1/external/coding/runs/{coding_run_id}/spec/skip-review

## Landing

Getting a finished run's change onto your default branch and live: retry or close a held landing, go live anyway past the checks that held it (a person's decision), read the diff a held landing would ship, or revert a landed change. These act on your real repository.

- [Close a held landing](https://syndai.ai/docs/api/landing/close-run-land.md): POST /api/v1/external/coding/runs/{coding_run_id}/land/close
- [Send a finished change live](https://syndai.ai/docs/api/landing/go-live-run.md): POST /api/v1/external/coding/runs/{coding_run_id}/land/go-live
- [Get the diff of a held change](https://syndai.ai/docs/api/landing/get-run-held-diff.md): GET /api/v1/external/coding/runs/{coding_run_id}/land/held-diff
- [Go live anyway with a held change](https://syndai.ai/docs/api/landing/merge-run-land-anyway.md): POST /api/v1/external/coding/runs/{coding_run_id}/land/merge-anyway
- [Retry a held landing](https://syndai.ai/docs/api/landing/retry-run-land.md): POST /api/v1/external/coding/runs/{coding_run_id}/land/retry
- [Revert a landed change](https://syndai.ai/docs/api/landing/revert-run.md): POST /api/v1/external/coding/runs/{coding_run_id}/revert

## Backlog

Work Syndai proposes for a repository: next-task offers and task groups you can add to the roadmap, edit, move to the top, start or dismiss. Viewing and dismissing is free; starting a task or group creates runs, which is billable work.

- [List next-task offers](https://syndai.ai/docs/api/backlog/list-backlog-offers.md): GET /api/v1/external/coding/backlog
- [List task groups](https://syndai.ai/docs/api/backlog/list-backlog-groups.md): GET /api/v1/external/coding/backlog/groups
- [Dismiss or skip a task group](https://syndai.ai/docs/api/backlog/dismiss-backlog-group.md): POST /api/v1/external/coding/backlog/groups/{group_id}/dismiss
- [Start a task group](https://syndai.ai/docs/api/backlog/start-backlog-group.md): POST /api/v1/external/coding/backlog/groups/{group_id}/start
- [Edit an offer's title or prompt](https://syndai.ai/docs/api/backlog/edit-backlog-task.md): PATCH /api/v1/external/coding/backlog/{backlog_task_id}
- [Add an offer to the roadmap](https://syndai.ai/docs/api/backlog/accept-backlog-task.md): POST /api/v1/external/coding/backlog/{backlog_task_id}/accept
- [Dismiss a next-task offer](https://syndai.ai/docs/api/backlog/dismiss-backlog-offer.md): POST /api/v1/external/coding/backlog/{backlog_task_id}/dismiss
- [Move an offer to the top of the roadmap](https://syndai.ai/docs/api/backlog/move-backlog-task-to-top.md): POST /api/v1/external/coding/backlog/{backlog_task_id}/top

## Schedules

Recurring runs on a cron trigger. Create, update, pause, resume, fire now or delete a schedule. Every fire is a normal run that spends credits, and a schedule that may merge or push re-checks its writer's consent at each fire.

- [List schedules](https://syndai.ai/docs/api/schedules/list-schedules.md): GET /api/v1/external/coding/schedules
- [Create a schedule](https://syndai.ai/docs/api/schedules/create-schedule.md): POST /api/v1/external/coding/schedules
- [Get a schedule](https://syndai.ai/docs/api/schedules/get-schedule.md): GET /api/v1/external/coding/schedules/{schedule_id}
- [Update a schedule](https://syndai.ai/docs/api/schedules/update-schedule.md): PATCH /api/v1/external/coding/schedules/{schedule_id}
- [Delete a schedule](https://syndai.ai/docs/api/schedules/delete-schedule.md): DELETE /api/v1/external/coding/schedules/{schedule_id}
- [Pause a schedule](https://syndai.ai/docs/api/schedules/pause-schedule.md): POST /api/v1/external/coding/schedules/{schedule_id}/pause
- [Resume a paused schedule](https://syndai.ai/docs/api/schedules/resume-schedule.md): POST /api/v1/external/coding/schedules/{schedule_id}/resume
- [Run a schedule now](https://syndai.ai/docs/api/schedules/run-schedule-now.md): POST /api/v1/external/coding/schedules/{schedule_id}/run-now

## Repositories

The repositories connected to your workspace. List them, change a repository's settings, and make or undo a direct text edit on a live site without starting a full run.

- [List repositories](https://syndai.ai/docs/api/repositories/list-repos.md): GET /api/v1/external/coding/repos
- [Update a repository's settings](https://syndai.ai/docs/api/repositories/update-repo.md): PATCH /api/v1/external/coding/repos/{coding_repository_id}
- [Edit text on a live site](https://syndai.ai/docs/api/repositories/create-text-edit.md): POST /api/v1/external/coding/repos/{coding_repository_id}/text-edits
- [Undo a text edit](https://syndai.ai/docs/api/repositories/undo-text-edit.md): POST /api/v1/external/coding/repos/{coding_repository_id}/text-edits/{commit_sha}/undo

## Secrets

Workspace secrets and environments that runs and deployed apps read. Listing returns metadata only, never values. Reading production values needs a short-lived step-up that a workspace owner or admin approves in the browser (the production-access flow).

- [Ask to read production values](https://syndai.ai/docs/api/secrets/start-production-access.md): POST /api/v1/external/coding/cli/production-access
- [Poll a production step-up](https://syndai.ai/docs/api/secrets/redeem-production-access.md): POST /api/v1/external/coding/cli/production-access/token
- [List environments](https://syndai.ai/docs/api/secrets/list-environments.md): GET /api/v1/external/coding/environments
- [List secrets](https://syndai.ai/docs/api/secrets/list-secrets.md): GET /api/v1/external/coding/secrets
- [Import secrets from a .env file](https://syndai.ai/docs/api/secrets/import-secrets.md): POST /api/v1/external/coding/secrets/import
- [Read an environment's secret values](https://syndai.ai/docs/api/secrets/resolve-secrets.md): POST /api/v1/external/coding/secrets/resolve
- [Delete a secret](https://syndai.ai/docs/api/secrets/delete-secret.md): DELETE /api/v1/external/coding/secrets/{key_name}
- [Set a secret](https://syndai.ai/docs/api/secrets/put-secret.md): PUT /api/v1/external/coding/secrets/{key_name}

## Tools

Custom tools your runs may call: skills and MCP servers, workspace-wide or for one project. Add, update, rescan or delete a tool. Each is safety-scanned, and runs skip a flagged tool until someone acknowledges the flag.

- [List custom tools](https://syndai.ai/docs/api/tools/list-tools.md): GET /api/v1/external/coding/tools
- [Add a custom tool](https://syndai.ai/docs/api/tools/create-tool.md): POST /api/v1/external/coding/tools
- [Update a custom tool](https://syndai.ai/docs/api/tools/update-tool.md): PATCH /api/v1/external/coding/tools/{tool_id}
- [Delete a custom tool](https://syndai.ai/docs/api/tools/delete-tool.md): DELETE /api/v1/external/coding/tools/{tool_id}
- [Rescan a custom tool](https://syndai.ai/docs/api/tools/rescan-tool.md): POST /api/v1/external/coding/tools/{tool_id}/rescan

## Webhooks

Signed HTTP callbacks for run events. Register endpoints, send a test event, rotate the signing secret, and list or redeliver past deliveries. Verify every delivery's signature and treat events as at-least-once.

- [List webhook deliveries](https://syndai.ai/docs/api/webhooks/list-webhook-deliveries.md): GET /api/v1/external/coding/webhook-deliveries
- [Redeliver a webhook delivery](https://syndai.ai/docs/api/webhooks/redeliver-webhook-delivery.md): POST /api/v1/external/coding/webhook-deliveries/{delivery_id}/redeliver
- [List webhook endpoints](https://syndai.ai/docs/api/webhooks/list-webhook-endpoints.md): GET /api/v1/external/coding/webhooks
- [Create a webhook endpoint](https://syndai.ai/docs/api/webhooks/create-webhook-endpoint.md): POST /api/v1/external/coding/webhooks
- [Disable a webhook endpoint](https://syndai.ai/docs/api/webhooks/disable-webhook-endpoint.md): DELETE /api/v1/external/coding/webhooks/{endpoint_id}
- [Rotate a webhook signing secret](https://syndai.ai/docs/api/webhooks/rotate-webhook-secret.md): POST /api/v1/external/coding/webhooks/{endpoint_id}/rotate-secret
- [Send a test webhook delivery](https://syndai.ai/docs/api/webhooks/test-webhook-endpoint.md): POST /api/v1/external/coding/webhooks/{endpoint_id}/test

## Members

The people in your workspace and their roles. Invite, accept, list, change a role, or revoke a member or a pending invite. Most writes need an owner or admin.

- [List members](https://syndai.ai/docs/api/members/list-members.md): GET /api/v1/external/coding/members
- [Accept an invite](https://syndai.ai/docs/api/members/accept-invite.md): POST /api/v1/external/coding/members/accept
- [Invite a member](https://syndai.ai/docs/api/members/invite-member.md): POST /api/v1/external/coding/members/invite
- [List pending invites](https://syndai.ai/docs/api/members/list-invites.md): GET /api/v1/external/coding/members/invites
- [Revoke an invite](https://syndai.ai/docs/api/members/revoke-invite.md): DELETE /api/v1/external/coding/members/invites/{invite_id}
- [Change a member's role](https://syndai.ai/docs/api/members/change-member-role.md): PATCH /api/v1/external/coding/members/{membership_id}
- [Remove a member](https://syndai.ai/docs/api/members/revoke-member.md): DELETE /api/v1/external/coding/members/{membership_id}

## Policy

Workspace-wide run defaults: validation, review gates, autonomy and budget. Read the JSON Schema a policy must match and the current defaults, list earlier versions, or replace them; a run's own `policy_config` overrides them for that run.

- [Get the default policy](https://syndai.ai/docs/api/policy/get-policy-defaults.md): GET /api/v1/external/coding/policy/defaults
- [Replace the default policy](https://syndai.ai/docs/api/policy/put-policy-defaults.md): PUT /api/v1/external/coding/policy/defaults
- [List default policy versions](https://syndai.ai/docs/api/policy/list-policy-defaults-history.md): GET /api/v1/external/coding/policy/defaults/history
- [Get the policy schema](https://syndai.ai/docs/api/policy/get-policy-schema.md): GET /api/v1/external/coding/policy/schema

## Findings

Bugs Syndai's scanner found in your repositories. List findings, read or change a repository's weekly scan setting, or start a scan now; each scan is capped by the per-scan limit.

- [List bug-scan findings](https://syndai.ai/docs/api/findings/list-bug-findings.md): GET /api/v1/external/coding/findings
- [Get a repository's weekly bug scan](https://syndai.ai/docs/api/findings/get-bug-scan.md): GET /api/v1/external/coding/repositories/{repository_id}/bug-scan
- [Turn a repository's weekly bug scan on or off](https://syndai.ai/docs/api/findings/set-bug-scan.md): PUT /api/v1/external/coding/repositories/{repository_id}/bug-scan
- [Run a bug scan now](https://syndai.ai/docs/api/findings/run-bug-scan-now.md): POST /api/v1/external/coding/repositories/{repository_id}/bug-scan/run

## Docs

API docs Syndai builds for your repository from its running code: read their status and freshness, and turn on keeping them up to date or publishing them on your site.

- [Get a repository's API docs status](https://syndai.ai/docs/api/docs/get-docs.md): GET /api/v1/external/coding/repos/{coding_repository_id}/docs
- [Change a repository's API docs settings](https://syndai.ai/docs/api/docs/set-docs.md): PUT /api/v1/external/coding/repos/{coding_repository_id}/docs

## Apps

Beta: may change without notice. Publishing a repository as a hosted app: publish, unpublish, read and update a publication, its deployments, custom domain, runtime and monthly AI limit, and export its data or waitlist.

- [List the workspace's apps](https://syndai.ai/docs/api/apps/list-apps.md): GET /api/v1/external/coding/customers/{customer_id}/apps
- [Set an app's monthly AI limit](https://syndai.ai/docs/api/apps/set-app-ai-cap.md): PUT /api/v1/external/coding/customers/{customer_id}/apps/{publication_id}/ai-cap
- [List an app's deployments](https://syndai.ai/docs/api/apps/list-app-deployments.md): GET /api/v1/external/coding/customers/{customer_id}/apps/{publication_id}/deployments
- [Read an app's custom domain](https://syndai.ai/docs/api/apps/get-app-domain.md): GET /api/v1/external/coding/customers/{customer_id}/apps/{publication_id}/domain
- [Add a custom domain to an app](https://syndai.ai/docs/api/apps/add-app-domain.md): POST /api/v1/external/coding/customers/{customer_id}/apps/{publication_id}/domain
- [Remove an app's custom domain](https://syndai.ai/docs/api/apps/remove-app-domain.md): DELETE /api/v1/external/coding/customers/{customer_id}/apps/{publication_id}/domain
- [Read an app's runtime](https://syndai.ai/docs/api/apps/get-app-runtime.md): GET /api/v1/external/coding/customers/{customer_id}/apps/{publication_id}/runtime
- [Get a repository's app publication](https://syndai.ai/docs/api/apps/get-app-publication.md): GET /api/v1/external/coding/customers/{customer_id}/repositories/{coding_repository_id}/publication
- [Update an app's publication settings](https://syndai.ai/docs/api/apps/update-app-publication.md): PATCH /api/v1/external/coding/customers/{customer_id}/repositories/{coding_repository_id}/publication
- [Unpublish an app](https://syndai.ai/docs/api/apps/unpublish-app.md): DELETE /api/v1/external/coding/customers/{customer_id}/repositories/{coding_repository_id}/publication
- [Export an app's data](https://syndai.ai/docs/api/apps/export-app-data.md): GET /api/v1/external/coding/customers/{customer_id}/repositories/{coding_repository_id}/publication/data.json
- [Redeploy an earlier version of a repository's app](https://syndai.ai/docs/api/apps/redeploy-app-version.md): POST /api/v1/external/coding/customers/{customer_id}/repositories/{coding_repository_id}/publication/redeploy
- [Resume a pinned app on its latest version](https://syndai.ai/docs/api/apps/resume-app-publication.md): POST /api/v1/external/coding/customers/{customer_id}/repositories/{coding_repository_id}/publication/resume
- [List an app's waitlist signups](https://syndai.ai/docs/api/apps/get-app-waitlist.md): GET /api/v1/external/coding/customers/{customer_id}/repositories/{coding_repository_id}/publication/waitlist
- [Download the published app's waitlist as CSV](https://syndai.ai/docs/api/apps/export-app-waitlist-csv.md): GET /api/v1/external/coding/customers/{customer_id}/repositories/{coding_repository_id}/publication/waitlist.csv
- [Publish a repository's app](https://syndai.ai/docs/api/apps/publish-app.md): POST /api/v1/external/coding/customers/{customer_id}/repositories/{coding_repository_id}/publish
- [Read a GitHub repository's production deploys and latest release](https://syndai.ai/docs/api/apps/get-github-deploys.md): GET /api/v1/external/coding/customers/{customer_id}/repositories/{repository_id}/github-deploys
- [Read a GitHub repository's package publishing](https://syndai.ai/docs/api/apps/get-package-publish.md): GET /api/v1/external/coding/customers/{customer_id}/repositories/{repository_id}/publish
- [Publish a GitHub repository's packages](https://syndai.ai/docs/api/apps/publish-packages.md): POST /api/v1/external/coding/customers/{customer_id}/repositories/{repository_id}/publish

## Store

Beta: may change without notice. Shipping an app to the App Store and Google Play: store connections, builds, releases and rollouts, the store listing in every language, screenshots, review logins and the release checklist.

- [Read a repository's App stores card](https://syndai.ai/docs/api/store/get-store.md): GET /api/v1/external/coding/customers/{customer_id}/repositories/{repository_id}/store
- [Change the app's store settings](https://syndai.ai/docs/api/store/update-store.md): PATCH /api/v1/external/coding/customers/{customer_id}/repositories/{repository_id}/store
- [Check whether the store has the app record](https://syndai.ai/docs/api/store/get-store-app-exists.md): GET /api/v1/external/coding/customers/{customer_id}/repositories/{repository_id}/store/app-exists
- [List the repository's branches](https://syndai.ai/docs/api/store/list-store-branches.md): GET /api/v1/external/coding/customers/{customer_id}/repositories/{repository_id}/store/branches
- [Build the release-branch head now](https://syndai.ai/docs/api/store/build-store-now.md): POST /api/v1/external/coding/customers/{customer_id}/repositories/{repository_id}/store/builds
- [Check the app's store connections now](https://syndai.ai/docs/api/store/check-store.md): POST /api/v1/external/coding/customers/{customer_id}/repositories/{repository_id}/store/check
- [Start Google Play's closed test](https://syndai.ai/docs/api/store/start-store-closed-test.md): POST /api/v1/external/coding/customers/{customer_id}/repositories/{repository_id}/store/closed-test
- [Export the app's build settings](https://syndai.ai/docs/api/store/export-store-config.md): GET /api/v1/external/coding/customers/{customer_id}/repositories/{repository_id}/store/export
- [Download the Android app's first build](https://syndai.ai/docs/api/store/get-store-first-build.md): GET /api/v1/external/coding/customers/{customer_id}/repositories/{repository_id}/store/first-build
- [Read the app's store listing kit](https://syndai.ai/docs/api/store/get-store-listing.md): GET /api/v1/external/coding/customers/{customer_id}/repositories/{repository_id}/store/listing
- [Edit one listing field's draft](https://syndai.ai/docs/api/store/update-store-listing-draft.md): PATCH /api/v1/external/coding/customers/{customer_id}/repositories/{repository_id}/store/listing
- [Design localized store screenshots](https://syndai.ai/docs/api/store/design-store-screens.md): POST /api/v1/external/coding/customers/{customer_id}/repositories/{repository_id}/store/listing/design
- [Generate and translate the store listing into drafts](https://syndai.ai/docs/api/store/generate-store-listing.md): POST /api/v1/external/coding/customers/{customer_id}/repositories/{repository_id}/store/listing/generate
- [List the app in another language](https://syndai.ai/docs/api/store/add-store-listing-locale.md): POST /api/v1/external/coding/customers/{customer_id}/repositories/{repository_id}/store/listing/locales
- [Push the ticked locales to the stores](https://syndai.ai/docs/api/store/push-store-listing.md): POST /api/v1/external/coding/customers/{customer_id}/repositories/{repository_id}/store/listing/push
- [Choose the screenshots a store locale shows](https://syndai.ai/docs/api/store/update-store-screens.md): PATCH /api/v1/external/coding/customers/{customer_id}/repositories/{repository_id}/store/listing/screens
- [Shoot the app's store screenshots](https://syndai.ai/docs/api/store/shoot-store-screens.md): POST /api/v1/external/coding/customers/{customer_id}/repositories/{repository_id}/store/listing/shoot
- [Tick (approve) one store locale](https://syndai.ai/docs/api/store/tick-store-listing.md): POST /api/v1/external/coding/customers/{customer_id}/repositories/{repository_id}/store/listing/ticks
- [Ask Syndai to translate the app](https://syndai.ai/docs/api/store/offer-store-app-translation.md): POST /api/v1/external/coding/customers/{customer_id}/repositories/{repository_id}/store/listing/translate-app
- [Tick the Ready to release checklist](https://syndai.ai/docs/api/store/update-store-readiness.md): PATCH /api/v1/external/coding/customers/{customer_id}/repositories/{repository_id}/store/readiness
- [Queue the tested version for release](https://syndai.ai/docs/api/store/release-store.md): POST /api/v1/external/coding/customers/{customer_id}/repositories/{repository_id}/store/releases
- [Halt the rollout on both stores](https://syndai.ai/docs/api/store/halt-store-release.md): POST /api/v1/external/coding/customers/{customer_id}/repositories/{repository_id}/store/releases/halt
- [Resume a halted rollout on both stores](https://syndai.ai/docs/api/store/resume-store-release.md): POST /api/v1/external/coding/customers/{customer_id}/repositories/{repository_id}/store/releases/resume
- [Set the demo login App Review signs in with](https://syndai.ai/docs/api/store/set-store-review-login.md): PUT /api/v1/external/coding/customers/{customer_id}/repositories/{repository_id}/store/review/login
- [Show the review account Syndai made for this app](https://syndai.ai/docs/api/store/get-store-seeded-login.md): GET /api/v1/external/coding/customers/{customer_id}/repositories/{repository_id}/store/review/login/seeded
- [Give this app's review account a new code](https://syndai.ai/docs/api/store/rotate-store-seeded-login.md): POST /api/v1/external/coding/customers/{customer_id}/repositories/{repository_id}/store/review/login/seeded/rotate
- [Read which store searches find the app](https://syndai.ai/docs/api/store/get-store-searches.md): GET /api/v1/external/coding/customers/{customer_id}/repositories/{repository_id}/store/searches
- [Check which store searches find the app now](https://syndai.ai/docs/api/store/check-store-searches.md): POST /api/v1/external/coding/customers/{customer_id}/repositories/{repository_id}/store/searches
- [Change the app's release settings](https://syndai.ai/docs/api/store/update-store-settings.md): PATCH /api/v1/external/coding/customers/{customer_id}/repositories/{repository_id}/store/settings
- [Put this web app on Google Play](https://syndai.ai/docs/api/store/connect-store-shell.md): POST /api/v1/external/coding/customers/{customer_id}/repositories/{repository_id}/store/shell
- [Download the Android upload key](https://syndai.ai/docs/api/store/get-store-upload-key.md): GET /api/v1/external/coding/customers/{customer_id}/repositories/{repository_id}/store/upload-key
- [Download the upload key's certificate](https://syndai.ai/docs/api/store/get-store-upload-key-certificate.md): GET /api/v1/external/coding/customers/{customer_id}/repositories/{repository_id}/store/upload-key-certificate

## Sites

Beta: may change without notice. Websites connected for search and AI visibility: connect a site, link it to Google Search Console, read its SEO tab, show or hide it on Google, and run a priced Ask AI check of how assistants answer about it.

- [Show a site on Google, or hide it](https://syndai.ai/docs/api/sites/set-site-visibility.md): POST /api/v1/external/coding/customers/{customer_id}/apps/{publication_id}/visibility
- [Guess a GitHub project's website address](https://syndai.ai/docs/api/sites/get-github-prefill.md): GET /api/v1/external/coding/customers/{customer_id}/repositories/{coding_repository_id}/github-prefill
- [Read one site's SEO tab](https://syndai.ai/docs/api/sites/get-seo.md): GET /api/v1/external/coding/customers/{customer_id}/seo
- [Record a press of the SEO receipt line](https://syndai.ai/docs/api/sites/record-seo-receipt-click.md): POST /api/v1/external/coding/customers/{customer_id}/seo/receipt-clicks
- [Check the Google Business Profile again](https://syndai.ai/docs/api/sites/check-site-google-listing.md): POST /api/v1/external/coding/customers/{customer_id}/seo/sites/{site_id}/listings/google_business/check
- [Mark a listing or set Google's review link](https://syndai.ai/docs/api/sites/mark-site-listing.md): PUT /api/v1/external/coding/customers/{customer_id}/seo/sites/{site_id}/listings/{key}
- [List the workspace's sites](https://syndai.ai/docs/api/sites/list-sites.md): GET /api/v1/external/coding/customers/{customer_id}/sites
- [Connect a site](https://syndai.ai/docs/api/sites/connect-site.md): POST /api/v1/external/coding/customers/{customer_id}/sites
- [Start an Ask AI check](https://syndai.ai/docs/api/sites/start-answer-check.md): POST /api/v1/external/coding/customers/{customer_id}/sites/{site_id}/answers
- [Price an Ask AI check](https://syndai.ai/docs/api/sites/estimate-answer-check.md): GET /api/v1/external/coding/customers/{customer_id}/sites/{site_id}/answers/estimate
- [Read the latest Ask AI check](https://syndai.ai/docs/api/sites/get-latest-answer-check.md): GET /api/v1/external/coding/customers/{customer_id}/sites/{site_id}/answers/latest
- [Read a site's Google connection](https://syndai.ai/docs/api/sites/get-site-google.md): GET /api/v1/external/coding/customers/{customer_id}/sites/{site_id}/google
- [Disconnect a site from Google](https://syndai.ai/docs/api/sites/disconnect-site-google.md): DELETE /api/v1/external/coding/customers/{customer_id}/sites/{site_id}/google
- [Ask Google again whether the site is connected](https://syndai.ai/docs/api/sites/check-site-google.md): POST /api/v1/external/coding/customers/{customer_id}/sites/{site_id}/google/check
- [Start Syndai verifying a site with Google](https://syndai.ai/docs/api/sites/start-site-verification.md): POST /api/v1/external/coding/customers/{customer_id}/sites/{site_id}/google/verify
- [Finish verifying a site with Google](https://syndai.ai/docs/api/sites/confirm-site-verification.md): POST /api/v1/external/coding/customers/{customer_id}/sites/{site_id}/google/verify/confirm

## Receipts

Public, unauthenticated reads of a shared run receipt: the receipt, its visual evidence, white-label branding, and an embeddable SVG badge. The token in the share link is the credential; revoking the share makes every route 404.

- [Read a shared receipt](https://syndai.ai/docs/api/receipts/get-public-receipt.md): GET /api/v1/public/receipts/{token}
- [Render a receipt's verification badge](https://syndai.ai/docs/api/receipts/get-public-receipt-badge.md): GET /api/v1/public/receipts/{token}/badge.svg
- [Read a shared receipt's branding](https://syndai.ai/docs/api/receipts/get-public-receipt-branding.md): GET /api/v1/public/receipts/{token}/branding
- [Download a receipt's branding logo](https://syndai.ai/docs/api/receipts/get-public-receipt-branding-logo.md): GET /api/v1/public/receipts/{token}/branding/logo
- [Read a shared receipt's visual evidence](https://syndai.ai/docs/api/receipts/get-public-receipt-evidence.md): GET /api/v1/public/receipts/{token}/evidence
- [Open a shared receipt's evidence image](https://syndai.ai/docs/api/receipts/get-public-receipt-media.md): GET /api/v1/public/receipts/{token}/media/{media_id}

## CLI auth

The device login the `syndai` CLI uses to get an API key: start a login, show the user code to a person to approve in the browser, then poll for the key. Unapproved polls answer with OAuth device-flow errors.

- [Start a CLI device login](https://syndai.ai/docs/api/cli-auth/start-cli-device.md): POST /api/v1/cli/device
- [Poll a CLI device login](https://syndai.ai/docs/api/cli-auth/redeem-cli-device.md): POST /api/v1/cli/device/token
