Skip to content

Building a guide

Guides are interactive, step-by-step instructional content. Like courses, they're packaged and uploaded as a ZIP.

Flow

  1. Create the guide content item.
  2. Request an upload URL.
  3. Upload the package.
  4. Wait for processing.
  5. Publish.

1. Create the guide

curl -X POST https://acme.plusplus.app/public_api/v2/guides \
  -H "Authorization: Bearer pp_your_token_here" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Setting up your dev environment",
    "duration_minutes": 20,
    "is_hidden": true
  }'
{
  "data": {
    "public_id": "01HXYDBKW5V2H6F3M8R9N0Q2YP",
    "name": "Setting up your dev environment",
    "package": null,
    "is_hidden": true
  }
}

2. Request an upload URL

curl -X POST https://acme.plusplus.app/public_api/v2/guides/01HXYDBKW5V2H6F3M8R9N0Q2YP/uploads \
  -H "Authorization: Bearer pp_your_token_here"
{
  "data": {
    "upload_id": "upl_guide_abc",
    "upload_url": "https://uploads.plusplus.app/guides/...",
    "expires_at": "2026-04-29T13:00:00Z"
  }
}

3. Upload the package

curl -X PUT "$UPLOAD_URL" \
  -H "Content-Type: application/zip" \
  --data-binary @dev-env-setup.zip

4. Wait for processing

curl https://acme.plusplus.app/public_api/v2/guides/01HXYDBKW5V2H6F3M8R9N0Q2YP \
  -H "Authorization: Bearer pp_your_token_here"
{
  "data": {
    "public_id": "01HXYDBKW5V2H6F3M8R9N0Q2YP",
    "package": {
      "status": "ready",
      "section_count": 7
    }
  }
}

5. Publish

curl -X PATCH https://acme.plusplus.app/public_api/v2/guides/01HXYDBKW5V2H6F3M8R9N0Q2YP \
  -H "Authorization: Bearer pp_your_token_here" \
  -H "Content-Type: application/json" \
  -d '{ "is_hidden": false }'

Re-uploading

To replace the contents of an existing guide, request a fresh upload URL with POST /guides/{public_id}/uploads and upload again. Existing learner progress against the guide is preserved unless the section structure changes drastically — see the API reference for the exact preservation rules.