List Workspace Logs

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


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/logs

Query Parameters#

ParameterTypeDescription
limitNumberNumber of logs to return. 150, defaults to 50.
cursorNumbernext_cursor from a previous response — fetches the next (older) page.
statusStringFilter by outcome: 200 for successful renders, error for failures.
sourceStringFilter by request source, e.g. api, signed-url, webhook.
template_idStringFilter by template — matches both library and studio template ids.
formatStringFilter by output format, e.g. png, jpg, pdf, mp4.
fromStringISO timestamp — only return logs created at or after this time.
toStringISO 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>",
  },
});

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#

FieldTypeDescription
dataArrayList of log entries, newest first.
data[].idNumberUnique log id. Also used as the pagination cursor.
data[].created_atStringISO timestamp of when the request was made.
data[].statusNumberHTTP status code of the render (200 on success).
data[].sourceStringWhere the request originated, e.g. api, signed-url.
data[].template_idString|NumberLibrary template slug or studio template id used.
data[].template_typeStringlibrary or studio.
data[].formatStringOutput format, e.g. png, jpg, pdf, mp4.
data[].typeStringResponse type, url or binary.
data[].response_time_msNumberTime taken to render, in milliseconds.
data[].responseObject|nullRender output — urls and metadata. null for failed renders.
data[].credits_usedNumberCredits consumed by the render (0 for failures).
data[].is_overageBooleanWhether the render was billed as overage.
data[].errorString|nullError message when the render failed, otherwise null.
pagination.limitNumberThe page size used for this response.
pagination.has_moreBooleanWhether more logs are available beyond this page.
pagination.next_cursorNumber|nullCursor 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#

  • 20 requests per minute per API key

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
  • 30 free credits — no credit card required