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

# Troubleshooting

> Common problems and what actually causes them.

## Can't access a workspace

<AccordionGroup>
  <Accordion title="Signed in, but the portal is empty">
    Your Roblox role almost certainly does not have panel access. Panel access
    defaults to off for every role, so this is the usual cause rather than
    anything being broken. An owner can enable it under **Configuration →
    Roles & Permissions**.
  </Accordion>

  <Accordion title="Not recognised as staff at all">
    Confirm you are in the correct Roblox group with the rank you expect.
    Access is evaluated when the session is created, so if you were promoted
    while signed in, sign out and back in.
  </Accordion>
</AccordionGroup>

## Roblox sign-in fails or the redirect breaks

The redirect URI registered on the Roblox OAuth application has to match the
one Crovant sends, exactly. If the site has moved — a new domain, or a change
in where the API is served from — the registered URI can be left pointing at
the old address, and Roblox rejects the redirect before Crovant ever sees it.

<Note>
  Both `/api/roblox-oauth-callback` and the legacy
  `/.netlify/functions/roblox-oauth-callback` resolve to the same handler, so
  either can be registered — but the one registered at Roblox must be the one
  being sent.
</Note>

## Missing portal data

<AccordionGroup>
  <Accordion title="The portal loads but sections are empty">
    Refresh to reload workspace data, then confirm the content exists for
    *this* workspace — events and posts belong to one workspace and do not
    appear in another.
  </Accordion>

  <Accordion title="Discord posts never arrive">
    The Discord bot is currently disabled, so this is expected for now — posts
    publish in Crovant and go no further.

    When it is running, a post publishing in Crovant still does not mean Discord
    accepted it. Re-verify the integration; a bad webhook fails without
    surfacing an error.
  </Accordion>
</AccordionGroup>

## API errors

<AccordionGroup>
  <Accordion title="400 Missing workspaceId">
    Most endpoints are workspace-scoped. Pass `?workspaceId=...`.
  </Accordion>

  <Accordion title="401 Unauthorized">
    Check the API key from **Configuration → API**, and that it is sent as
    `Authorization: Bearer <key>` — not as a query parameter.
  </Accordion>

  <Accordion title="403 Forbidden">
    The `reason` in the response body says which check failed:

    | Reason                 | Meaning                                         |
    | ---------------------- | ----------------------------------------------- |
    | `no_session`           | No valid session — sign in, or send a valid key |
    | `not_owner`            | Owner-only operation                            |
    | `not_superuser`        | Superuser-only operation                        |
    | `owner_not_configured` | The deployment has no owner configured          |

    Also confirm the workspace is active and not archived, and that your plan
    covers the endpoint.
  </Accordion>

  <Accordion title="429 or unexpected usage charges">
    Usage is attributed to the workspace in the request, not the key's owner.
    A key used across workspaces bills each separately — check
    **Configuration → API** for the workspace in question.
  </Accordion>
</AccordionGroup>
