> ## Documentation Index
> Fetch the complete documentation index at: https://docs.orbit.devotel.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Public help-center surfaces

> What visitors render and reconstruct before they log in — tenant help-theme branding and a token-gated ticket status portal.

## Public help-center surfaces

These reads back a tenant's customer-facing help center — pages any visitor loads before they sign in. For support-operations teams that publish a public portal, this pair is the read side of the CXaaS help surface: branding paints the tenant's white-label look, and the ticket-status endpoint lets the visitor check progress on their submission. The `org` query names the organization slug; no API key is required, and the surfaces are rate-limited per source IP.

`GET /api/v1/public/help/branding` returns the public-safe help-theme subset.

<ResponseExample>
  ```json 200 theme={null}
  {
    "data": {
      "branding": {
        "logo_url": "https://cdn.example.com/acme-help-logo.png",
        "primary_color": "#1E3A8A",
        "secondary_color": "#F9A825",
        "header_links": [
          { "label": "Status", "url": "https://status.acme.example" }
        ],
        "show_powered_by": false
      }
    },
    "meta": {
      "request_id": "req_brand_help",
      "timestamp": "2026-08-01T12:00:00.000Z"
    }
  }
  ```
</ResponseExample>

Unset fields fall back to the platform default theme, and "unset" `show_powered_by` defaults to `true` until the tenant opts out of the Orbit credit. Only the help-theme subset is exposed — never the broader dashboard branding, support email, or custom-domain config.

`GET /api/v1/public/help/tickets/{id}?org=&token=` returns the requester's view of one public-form ticket. The receipt token issued at submit is a bearer capability over that ticket id, and any miss (wrong org, wrong token, or an ID for an internal-only ticket) collapses into a generic 404 so the endpoint never enumerates existence.

<ResponseExample>
  ```json 200 theme={null}
  {
    "data": {
      "ticket": {
        "id": "tkt_9f2c4a1b8e7d",
        "reference": "ACME-1042",
        "subject": "Report renders empty for past-due invoices",
        "status": "pending",
        "created_at": "2026-07-30T08:11:00.000Z",
        "updated_at": "2026-08-01T16:44:00.000Z",
        "comments": [
          {
            "id": "cmt_01",
            "author_kind": "agent",
            "body": "We reproduced this — a fix is queued for the next deploy.",
            "created_at": "2026-08-01T16:44:00.000Z"
          }
        ]
      }
    },
    "meta": {
      "request_id": "req_ticket_status",
      "timestamp": "2026-08-01T12:00:00.000Z"
    }
  }
  ```
</ResponseExample>

`status` reads as one of `open`, `pending`, `resolved`, or `wont_fix`; `comments` exposes only public-visibility replies, never operator internal notes.
