List Workspace Logs
Retrieve a paginated, trimmed list of render and API logs for your workspace
Published ·Updated
/v1/workspace/logscurl -X GET "https://api.orshot.com/v1/workspace/logs?limit=<LIMIT>&cursor=<CURSOR>&status=<STATUS>" \
-H "Authorization: Bearer <ORSHOT_API_KEY>"const res = await fetch("https://api.orshot.com/v1/workspace/logs?limit=<LIMIT>&cursor=<CURSOR>&status=<STATUS>", {
method: "GET",
headers: {
Authorization: "Bearer <ORSHOT_API_KEY>",
},
});
const data = await res.json();import requests
response = requests.get(
"https://api.orshot.com/v1/workspace/logs?limit=<LIMIT>&cursor=<CURSOR>&status=<STATUS>",
headers={"Authorization": "Bearer <ORSHOT_API_KEY>"},
)
data = response.json()$ch = curl_init("https://api.orshot.com/v1/workspace/logs?limit=<LIMIT>&cursor=<CURSOR>&status=<STATUS>");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer <ORSHOT_API_KEY>",
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);require "net/http"
require "json"
uri = URI("https://api.orshot.com/v1/workspace/logs?limit=<LIMIT>&cursor=<CURSOR>&status=<STATUS>")
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer <ORSHOT_API_KEY>"
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
data = JSON.parse(res.body)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#
https://api.orshot.com/v1/workspace/logsQuery 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#
await fetch("https://api.orshot.com/v1/workspace/logs?limit=50", {
method: "GET",
headers: {
Authorization: "Bearer <ORSHOT_API_KEY>",
},
});{
"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
}
}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.
// 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.
{
"error": "Invalid cursor",
"message": "cursor must be a log id"
}Forbidden (403)#
Returned when the API key is missing or invalid.
{
"error": "Access Forbidden"
}Rate Limits#
This endpoint is not individually rate limited.
Ready to automate?
Start rendering images, PDFs and videos from your templates in under 2 minutes. Free plan, no credit card.
Get your API key- Image, PDF and video generation via API
- Visual editor with AI and smart layouts
- Zapier, Make, MCP and 50+ integrations
- White-label embed for your own app
- 100 free credits a month, no credit card required