# Request Logs

Inspect every authenticated API request your project made, with status, timing and errors.


The **Logs** page at [https://social-publish-kappa.vercel.app/dashboard/logs](https://social-publish-kappa.vercel.app/dashboard/logs) lists every API request made with your project's access keys. Use it to debug integrations, see which key is calling what, and find the error behind a failed call.

## What's logged

One entry is recorded for each authenticated request to `/v1/*`:

| Column | Description |
| --- | --- |
| Time | When the request was received. |
| Method and path | For example `POST /v1/posts`. |
| Type | The resource group: Posts, Accounts or Other. |
| Operation | The operation name, such as `createPost`, `getPost`, `listPosts`, `listAccounts` or `connectBluesky`. |
| Platform | For `createPost`, the platform of the first target. |
| Status | The HTTP status code. |
| Duration | How long the API took to respond, in milliseconds. |
| Access key | The name and prefix of the key that made the call. |
| Error | For non-2xx responses, the error `code` and `message`. |
| Request ID | The request's ID, also returned in the `X-Request-Id` response header. |

Only metadata is stored. Request and response bodies are **not** logged, and error text is scrubbed of anything that looks like a credential.

### What isn't logged

- Requests without a valid key (`401`). There's no project to attach them to.
- `GET /health` and `GET /ready`.
- Dashboard activity, such as posting from the Playground. Posts made there still appear on the **Posts** page.
- What happens after the request: publishing runs in the background, so a `201` on `createPost` means the post was accepted, not that it was published. Check per-platform results on the **Posts** page or with `GET /v1/posts/{id}`.

Rate-limited requests (`429`) are logged, which makes it easy to spot a client that's sending too much.

## Filters

| Filter | Options |
| --- | --- |
| Search | Matches the path, operation name or method. |
| Type | Posts, Accounts, Integrations, Media, Usage, Other |
| Status | Success (2xx), Client error (4xx), Server error (5xx) |
| Platform | Any supported platform |
| Time | Last hour, Last 24 hours, Last 7 days, Last 30 days, All time |

Filters are kept in the page URL, so you can bookmark or share a filtered view with a teammate. The list refreshes every 15 seconds, and **Load more** fetches older entries.

Click an entry to see its details, including the full error message and request ID.

## Retention

Logs are kept for **30 days**, then deleted automatically.

## Debug with request IDs

Every API response includes an `X-Request-Id` header. Log it in your application next to the error body:

```ts title="client.ts"
const res = await fetch("https://social-publish-api.onrender.com/v1/posts", { method: "POST", headers, body });
if (!res.ok) {
  const { error } = await res.json();
  console.error(`Relaycast ${res.status} ${error.code}: ${error.message}`, {
    requestId: res.headers.get("x-request-id"),
    details: error.details,
  });
}
```

Search for the request in the Logs page by its path or operation and match the request ID to find the exact call.

## Related

- [Errors](/docs/errors) for every error code
- [Rate Limits](/docs/limits)
- [Authentication](/docs/authentication) for managing keys
