# Public API and support

URL: https://docs.spacerun.co/docs/platform/guides/support-and-public-api

> Read published site/catalog data, join the waitlist, and open a user support conversation.

Public endpoints do not require a token; support is scoped to a signed-in user. URL examples are placeholders for your deployment. Use [apiRequest](https://docs.spacerun.co/docs/platform/guides/quickstart) for authenticated support calls and direct fetch for anonymous reads.

## Read published data

[getPublicSite](https://docs.spacerun.co/docs/platform/reference/public-site/getPublicSite) returns published settings, resolved flags, blocks, navigation and active announcements. Its optional `surface` is `landing` or `portal`. [listPublicProducts](https://docs.spacerun.co/docs/platform/reference/public-site/listPublicProducts) returns a bare array. [listPublicStoreGames](https://docs.spacerun.co/docs/platform/reference/public-store/listPublicStoreGames) returns `{ data: [...] }`; [getPublicStoreGame](https://docs.spacerun.co/docs/platform/reference/public-store/getPublicStoreGame) returns an individual published game. Do not assume one envelope across these operations.

```ts
const response = await fetch(`${apiBaseUrl}/v1/public/products`);
if (!response.ok) throw new Error(await response.text());
const products = await response.json();
console.log(products.map(product => product.name));
```

Public store reads cache for 60 seconds. Draft/hidden content is not accessible through an anonymous detail lookup; a staff response does not imply public visibility.

## Join the waitlist

[joinWaitlist](https://docs.spacerun.co/docs/platform/reference/public-site/joinWaitlist) is limited to 5 requests per minute per IP:

```ts
const response = await fetch(`${apiBaseUrl}/v1/public/waitlist`, {
  method: "POST", headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ email: "player@example.com", source: "docs" }),
});
if (!response.ok) throw new Error(await response.text());
console.log(response.status, await response.json());
```

A new entry is 201; repeating the email is 200 with `alreadyJoined: true`, preserving the existing position. Position can be null. Handle 429 and maintenance 503 without continuously resubmitting.

## Open support

[sendSupportMessage](https://docs.spacerun.co/docs/platform/reference/support/sendSupportMessage) requires a user JWT and configured helpdesk integration:

```ts
const support = await apiRequest("/v1/me/support", {
  method: "POST", body: JSON.stringify({ subject: "Session connection issue", message: "My session cannot connect. Request ID: example-request." }),
});
console.log(support.conversationId);
```

Success is 201 `{ "conversationId": 123 }`. The limit is 5 messages per hour per user. `503 support_unavailable` means the helpdesk is unconfigured; `502 support_unavailable` means it failed/rejected the call. Include your request ID and symptoms instead of tokens or credentials. A successful creation returns the conversation ID, not a guaranteed live agent response. See [Errors](https://docs.spacerun.co/docs/platform/guides/errors-pagination-limits) for validator and maintenance response shapes.
