Help
DevelopersReference

Tours

Product tours as documents, any status the workspace owns.

Base URL https://api.showpilot.com/v1. Every call needs Authorization: Bearer <api key>; see Authentication.

List tours, newest first

GET /tours

Scope: tours:read. Operation id: listTours.

Templates are excluded. status is published when a frozen revision is live, else the row's own status.

Parameters

NameInTypeMeaning
limitqueryintegerPage size, 1 to 200. Default 50.
cursorquerystringThe nextCursor from the previous page. Opaque; never build one.
statusquerydraft · published · archivedOnly tours in this state.

Example request

curl "https://api.showpilot.com/v1/tours?limit=50" \
  -H "Authorization: Bearer $SHOWPILOT_API_KEY"
Runs against your sandbox with a test key.

Response

One page of tours.

FieldTypeAlwaysMeaning
itemsarray of Touryes
nextCursorNextCursoryes

Tour

FieldTypeAlwaysMeaning
idstring (uuid)yes
publicIdstringyesThe id in share links and embeds.
namestringyes
descriptionstring or nullyes
statusdraft · published · archivedyespublished when a frozen revision is live.
isActivebooleanyesInactive tours are not served to visitors.
hubIdstring or null (uuid)yes
publishedAtstring or null (date-time)yes
createdAtstring (date-time)yes
updatedAtstring (date-time)yes

NextCursor

Pass as cursor for the next page; null on the last page.

Example response

{
  "items": [
    {
      "id": "c5879294-795a-5430-88b1-7fdbdfa910ce",
      "publicId": "t_9f3k2q",
      "name": "A First Walk Through the App",
      "description": null,
      "status": "published",
      "isActive": true,
      "hubId": null,
      "publishedAt": "2026-09-01T14:02:11.000Z",
      "createdAt": "2026-08-20T09:12:40.000Z",
      "updatedAt": "2026-09-01T14:02:11.000Z"
    }
  ],
  "nextCursor": "eyJhdCI6IjIwMjYtMDgtMjBUMDk6MTI6NDAuMDAwWiIsImlkIjoiYzU4NzkyOTQtLi4uIn0"
}

Errors

StatusWhen
400A parameter is malformed, such as a cursor this API did not issue, a limit under 1, or an unknown status. Code invalid-request.
401No key, or an unknown or revoked key. Code unauthorized.
403A valid key without the operation's scope (code insufficient-scope), or a plan without API access (code plan-api-off).
429The key's bucket is empty. Code rate-limited; wait the Retry-After seconds.

One tour with its document

GET /tours/{id}

Scope: tours:read. Operation id: getTour.

id is the tour's UUID or its public id. The document is the frozen published revision when there is one, else the live rows; pass view=live to read the live rows regardless (the builder's view). Media URLs are resolved on the way out. Without a bearer token this path is the anonymous player route and serves published tours only.

Parameters

NameInTypeMeaning
idpathstringThe tour's UUID or public id.
viewquerypublished · livelive reads the current rows even when a published revision exists.

Example request

curl "https://api.showpilot.com/v1/tours/t_9f3k2q" \
  -H "Authorization: Bearer $SHOWPILOT_API_KEY"
Runs against your sandbox with a test key.

Response

The tour summary plus its document.

Every field of Tour, plus:

FieldTypeAlwaysMeaning
documentTourDocumentyes

Tour

FieldTypeAlwaysMeaning
idstring (uuid)yes
publicIdstringyesThe id in share links and embeds.
namestringyes
descriptionstring or nullyes
statusdraft · published · archivedyespublished when a frozen revision is live.
isActivebooleanyesInactive tours are not served to visitors.
hubIdstring or null (uuid)yes
publishedAtstring or null (date-time)yes
createdAtstring (date-time)yes
updatedAtstring (date-time)yes

TourDocument

The same document the player renders from. Screens in order with resolved media URLs; guides with their step settings and narration URL. Storage geometry is not part of the contract and may change.

FieldTypeAlwaysMeaning
tourIdstring (uuid)yes
publicIdstring or nullyes
namestringyes
descriptionstring or nullno
displaystring or nullno
transitionstring or nullno
screensarray of objectyes
guidesarray of objectyes

Errors

StatusWhen
401No key, or an unknown or revoked key. Code unauthorized.
403A valid key without the operation's scope (code insufficient-scope), or a plan without API access (code plan-api-off).
404No object with that id in this workspace. Code not-found.
429The key's bucket is empty. Code rate-limited; wait the Retry-After seconds.

The tour as an authoring document, with its version

GET /tours/{id}/spec

Scope: tours:read. Operation id: getTourSpec.

The narrow shape an author edits: tour fields, the screens (read-only, for reference) and the steps keyed by a stable ref. Storage geometry never appears; the server expands what you write and keeps every field you did not touch. version is what apply must name.

Parameters

NameInTypeMeaning
idpathstringThe tour's UUID or public id.

Example request

curl "https://api.showpilot.com/v1/tours/<id>/spec" \
  -H "Authorization: Bearer $SHOWPILOT_API_KEY"
Runs against your sandbox with a test key.

Response

The spec.

FieldTypeAlwaysMeaning
tourIdstring (uuid)yes
versionstringyes
specTourSpecyes

TourSpec

FieldTypeAlwaysMeaning
tourobjectyes
screensarray of TourSpecScreenyesRead-only; listed so steps can reference them.
stepsarray of TourSpecStepyes

TourSpecScreen

FieldTypeAlwaysMeaning
idstringyes
typestring or nullyes
namestring or nullyes
orderIndexintegeryes
durationSecsnumber or nullyes

TourSpecStep

FieldTypeAlwaysMeaning
refstringyesStable
screenstringyesA screen id from screens. A step never moves between screens.
atnumber or nullnoVideo screens only
anchorobjectyescenter (a lightbox), { element } (a selector, accepted but not verified yet), or { region: [x, y, w, h] } as 0–1 fractions.
titlestringyes
bodystringyesWhat the step says. Narration follows it unless a human wrote their own.
advanceauto · click · askyesask holds the frame for the agent; needs an agent-led tour.
advanceAfterSecsnumber or nullno
narratebooleanyes
openWhenarray of stringnoPhrases that should open this step from a conversation.

Errors

StatusWhen
401No key, or an unknown or revoked key. Code unauthorized.
403A valid key without the operation's scope (code insufficient-scope), or a plan without API access (code plan-api-off).
404No object with that id in this workspace. Code not-found.
429The key's bucket is empty. Code rate-limited; wait the Retry-After seconds.

Apply a spec against a base version

PUT /tours/{id}/spec

Scope: tours:write. Operation id: applyTourSpec.

Requires Idempotency-Key. Lints first (400 lint-failed with the problems), refuses if the tour changed since baseVersion (409 stale with currentVersion), then writes: existing refs are merged field by field, new refs are inserted, missing refs are deleted, steps are reordered per screen. Narration audio is never regenerated by an apply.

Parameters

NameInTypeMeaning
idpathstringThe tour's UUID or public id.

Example request

curl "https://api.showpilot.com/v1/tours/<id>/spec" \
  -H "Authorization: Bearer $SHOWPILOT_API_KEY"
Runs against your sandbox with a test key.

Response

The applied spec and its new version.

FieldTypeAlwaysMeaning
tourIdstring (uuid)yes
versionstringyes
specTourSpecyes
problemsarray of LintProblemyes

TourSpec

FieldTypeAlwaysMeaning
tourobjectyes
screensarray of TourSpecScreenyesRead-only; listed so steps can reference them.
stepsarray of TourSpecStepyes

TourSpecScreen

FieldTypeAlwaysMeaning
idstringyes
typestring or nullyes
namestring or nullyes
orderIndexintegeryes
durationSecsnumber or nullyes

TourSpecStep

FieldTypeAlwaysMeaning
refstringyesStable
screenstringyesA screen id from screens. A step never moves between screens.
atnumber or nullnoVideo screens only
anchorobjectyescenter (a lightbox), { element } (a selector, accepted but not verified yet), or { region: [x, y, w, h] } as 0–1 fractions.
titlestringyes
bodystringyesWhat the step says. Narration follows it unless a human wrote their own.
advanceauto · click · askyesask holds the frame for the agent; needs an agent-led tour.
advanceAfterSecsnumber or nullno
narratebooleanyes
openWhenarray of stringnoPhrases that should open this step from a conversation.

LintProblem

FieldTypeAlwaysMeaning
pathstringyesThe field the problem is in.
codestringyesempty, too-long, vocab-demo, vocab-project, vocab-folio, unknown-skill, tool-missing.
messagestringyes
severityerror · warningyes

Errors

StatusWhen
400The edit has lint errors. Code lint-failed; problems lists them.
401No key, or an unknown or revoked key. Code unauthorized.
403A valid key without the operation's scope (code insufficient-scope), or a plan without API access (code plan-api-off).
404No object with that id in this workspace. Code not-found.
409The document changed since the baseVersion you read. Code stale; currentVersion at the top level says what to re-read.
429The key's bucket is empty. Code rate-limited; wait the Retry-After seconds.

Diff and lint a spec, writing nothing

POST /tours/{id}/propose

Scope: tours:read. Operation id: proposeTourSpec.

The loop is propose → fix → propose → apply. applicable is false while any problem is an error.

Parameters

NameInTypeMeaning
idpathstringThe tour's UUID or public id.

Example request

curl "https://api.showpilot.com/v1/tours/<id>/propose" \
  -H "Authorization: Bearer $SHOWPILOT_API_KEY"
Runs against your sandbox with a test key.

Response

The proposal.

TourProposal

FieldTypeAlwaysMeaning
tourIdstring (uuid)yes
baseVersionstringyesPass to apply.
diffobjectyes
problemsarray of LintProblemyes
applicablebooleanyes

LintProblem

FieldTypeAlwaysMeaning
pathstringyesThe field the problem is in.
codestringyesempty, too-long, vocab-demo, vocab-project, vocab-folio, unknown-skill, tool-missing.
messagestringyes
severityerror · warningyes

Errors

StatusWhen
400A parameter is malformed, such as a cursor this API did not issue, a limit under 1, or an unknown status. Code invalid-request.
401No key, or an unknown or revoked key. Code unauthorized.
403A valid key without the operation's scope (code insufficient-scope), or a plan without API access (code plan-api-off).
404No object with that id in this workspace. Code not-found.
429The key's bucket is empty. Code rate-limited; wait the Retry-After seconds.

Freeze a revision and point visitors at it

POST /tours/{id}/publish

Scope: tours:write. Operation id: publishTour.

Requires Idempotency-Key. Lints the live rows first; a tour with lint errors does not publish.

Parameters

NameInTypeMeaning
idpathstringThe tour's UUID or public id.

Example request

curl "https://api.showpilot.com/v1/tours/<id>/publish" \
  -H "Authorization: Bearer $SHOWPILOT_API_KEY"
Runs against your sandbox with a test key.

Response

Status 201.

The new revision.

FieldTypeAlwaysMeaning
tourIdstring (uuid)yes
publicIdstring or nullyes
revisionIdstring (uuid)yes
publishedVersionintegeryes
publishedAtstring (date-time)yes

Errors

StatusWhen
400The edit has lint errors. Code lint-failed; problems lists them.
401No key, or an unknown or revoked key. Code unauthorized.
403A valid key without the operation's scope (code insufficient-scope), or a plan without API access (code plan-api-off).
404No object with that id in this workspace. Code not-found.
429The key's bucket is empty. Code rate-limited; wait the Retry-After seconds.

On this page