# List Workspace Logs

> Retrieve a paginated, trimmed list of render and API logs for your workspace

- **URL**: https://orshot.com/docs/api-reference/workspace-logs

---

Retrieve render and API logs for the workspace linked to your API key. Results are
returned newest-first and paginated with an opaque cursor. Each entry is a trimmed
summary of the request — the render `response` (output urls and metadata) is included,
while heavier fields (request body, previews, AI generation details) are omitted.

## Endpoint```markdown tab="Endpoint"
https://api.orshot.com/v1/workspace/logs
```## Query Parameters

| Parameter     | Type   | Description                                                                 |
| ------------- | ------ | --------------------------------------------------------------------------- |
| `limit`       | Number | Number of logs to return. `1`–`50`, defaults to `50`.                       |
| `cursor`      | Number | `next_cursor` from a previous response — fetches the next (older) page.     |
| `status`      | String | Filter by outcome: `200` for successful renders, `error` for failures.     |
| `source`      | String | Filter by request source, e.g. `api`, `signed-url`, `webhook`.             |
| `template_id` | String | Filter by template — matches both library and studio template ids.         |
| `format`      | String | Filter by output format, e.g. `png`, `jpg`, `pdf`, `mp4`.                   |
| `from`        | String | ISO timestamp — only return logs created at or after this time.            |
| `to`          | String | ISO timestamp — only return logs created at or before this time.           |

## Request```js
await fetch("https://api.orshot.com/v1/workspace/logs?limit=50", {
  method: "GET",
  headers: {
    Authorization: "Bearer <ORSHOT_API_KEY>",
  },
});
```</Tab>```json
{
  "data": [
    {
      "id": 15384,
      "created_at": "2026-06-29T07:14:02.118Z",
      "status": 200,
      "source": "api",
      "template_id": "tweet-image",
      "template_type": "library",
      "format": "jpg",
      "type": "url",
      "response_time_ms": 8082.03,
      "response": {
        "url": "https://cdn.orshot.com/renders/abc123.jpg",
        "totalPages": 1,
        "renderedPages": 1
      },
      "credits_used": 1,
      "is_overage": false,
      "error": null
    }
  ],
  "pagination": {
    "limit": 50,
    "has_more": true,
    "next_cursor": 15384
  }
}
```</Tab>
</Tabs>

## Pagination

Logs are paginated with an opaque cursor based on the log `id` (stable as new logs
arrive). To fetch the next page, pass the `next_cursor` from the previous response as
the `cursor` parameter. When `has_more` is `false`, `next_cursor` is `null` and there
are no more logs.```js
// Page 1
const page1 = await fetch(
  "https://api.orshot.com/v1/workspace/logs?limit=50",
  { headers: { Authorization: "Bearer <ORSHOT_API_KEY>" } },
).then((r) => r.json());

// Page 2 — pass the cursor from page 1
const page2 = await fetch(
  `https://api.orshot.com/v1/workspace/logs?limit=50&cursor=${page1.pagination.next_cursor}`,
  { headers: { Authorization: "Bearer <ORSHOT_API_KEY>" } },
).then((r) => r.json());
```## Response Fields

| Field                       | Type           | Description                                                       |
| --------------------------- | -------------- | ----------------------------------------------------------------- |
| `data`                      | Array          | List of log entries, newest first.                                |
| `data[].id`                 | Number         | Unique log id. Also used as the pagination cursor.                |
| `data[].created_at`         | String         | ISO timestamp of when the request was made.                       |
| `data[].status`             | Number         | HTTP status code of the render (`200` on success).                |
| `data[].source`             | String         | Where the request originated, e.g. `api`, `signed-url`.           |
| `data[].template_id`        | String\|Number | Library template slug or studio template id used.                 |
| `data[].template_type`      | String         | `library` or `studio`.                                            |
| `data[].format`             | String         | Output format, e.g. `png`, `jpg`, `pdf`, `mp4`.                   |
| `data[].type`               | String         | Response type, `url` or `binary`.                                 |
| `data[].response_time_ms`   | Number         | Time taken to render, in milliseconds.                            |
| `data[].response`           | Object\|null   | Render output — urls and metadata. `null` for failed renders.     |
| `data[].credits_used`       | Number         | Credits consumed by the render (`0` for failures).                |
| `data[].is_overage`         | Boolean        | Whether the render was billed as overage.                         |
| `data[].error`              | String\|null   | Error message when the render failed, otherwise `null`.           |
| `pagination.limit`          | Number         | The page size used for this response.                             |
| `pagination.has_more`       | Boolean        | Whether more logs are available beyond this page.                 |
| `pagination.next_cursor`    | Number\|null   | Cursor for the next page, or `null` when there are no more logs.  |

## Error Responses

### Bad Request (400)

Returned when `cursor` is not a valid log id.```json
{
  "error": "Invalid cursor",
  "message": "cursor must be a log id"
}
```### Forbidden (403)

Returned when the API key is missing or invalid.```json
{
  "error": "Access Forbidden"
}
```## Rate Limits

- 20 requests per minute per API key