Skip to main content
When a Skyvern run fails or produces unexpected results, artifacts are your debugging toolkit. Every run automatically captures what happened—recordings of the browser session, screenshots at each step, the AI’s reasoning, and network traffic. This page covers how to retrieve artifacts and what each type tells you.
Looking for a specific artifact type? Jump to the artifact types reference to see all available types, then come back here to learn how to retrieve them.

Before you start

You need a run_id to retrieve artifacts. You get this when you run a task or workflow.

Retrieve artifacts

Use get_run_artifacts with the run_id from your task or workflow run:
import os
from skyvern import Skyvern

client = Skyvern(api_key=os.getenv("SKYVERN_API_KEY"))

artifacts = await client.get_run_artifacts(run_id)

for artifact in artifacts:
    print(f"{artifact.artifact_type}: {artifact.signed_url}")
Signed URLs expire after 24 hours. If a URL has expired, call get_run_artifacts again to get fresh URLs. When running Skyvern locally, signed_url will be null—access artifacts directly from your local file system instead.

Filter by artifact type

To get only specific artifact types, pass artifact_type:
# Get only recordings and final screenshots
artifacts = await client.get_run_artifacts(
    run_id,
    artifact_type=["recording", "screenshot_final"]
)

Artifact types reference

Visual artifacts

These show you what the browser looked like at various points.
TypeWhat it containsUse this to
recordingFull video of the browser session (WebM)Watch the entire run, see exactly what happened
screenshotBase screenshot captureGeneral page state capture
screenshot_finalScreenshot when the run endedCheck the final state—did it end on the right page?
screenshot_actionScreenshot taken after each actionSee the page state after each click, type, or navigation
screenshot_llmScreenshot sent to the LLM for decision-makingUnderstand what the AI “saw” when it made each decision
Debugging tip: If the run failed, start with screenshot_final to see where it stopped, then watch the recording to see how it got there.

AI reasoning artifacts

These show you why the AI made each decision.
TypeWhat it containsUse this to
llm_promptThe prompt sent to the LLMSee exactly what instructions the AI received
llm_requestFull request including contextCheck if the right context was included
llm_responseRaw LLM responseSee the AI’s unprocessed output
llm_response_parsedParsed response (extracted actions)Understand what actions the AI decided to take
llm_response_renderedParsed response with real URLsDebug URL targeting issues (see below)
Debugging tip: If the AI did something unexpected, check llm_prompt to see if your prompt was interpreted correctly, then llm_response_parsed to see what action it extracted. About llm_response_rendered: Skyvern hashes URLs before sending them to the LLM to reduce token usage and avoid confusing the model with long query strings. The llm_response_parsed artifact contains these hashed placeholders (like {{_a1b2c3}}), while llm_response_rendered shows the same response with actual URLs substituted back in. Use this when you need to verify which exact URL the AI targeted.

Page structure artifacts

These show how Skyvern interpreted the page.
TypeWhat it containsUse this to
visible_elements_treeDOM tree of visible elements (JSON)See which elements Skyvern detected
visible_elements_tree_trimmedTrimmed tree (sent to LLM)See what the AI could “see”
visible_elements_tree_in_promptElement tree as plain textRead exactly what was embedded in the prompt
visible_elements_id_css_mapCSS selectors for each elementDebug element targeting issues
visible_elements_id_frame_mapElement-to-iframe mappingDebug elements inside iframes
visible_elements_id_xpath_mapXPath selectors for each elementAlternative element targeting debug
hashed_href_mapMapping of hashed URLs to original URLsDecode URL placeholders in LLM responses
htmlGeneric HTML captureInspect page HTML
html_scrapeFull HTML captured during scrapingInspect the raw page structure
html_actionHTML captured after an actionSee how the page changed after each action
Debugging tip: If the AI couldn’t find an element, check visible_elements_tree to see if it was detected. If not, the element might be in an iframe, dynamically loaded, or outside the viewport. About the element tree variants: The visible_elements_tree is a JSON structure, while visible_elements_tree_in_prompt is the plain-text representation that gets embedded directly into the LLM prompt. The latter is often easier to read when debugging prompt issues. If you’re debugging iframe-related problems, visible_elements_id_frame_map shows which frame contains each element ID.

Log artifacts

These contain structured execution data.
TypeWhat it containsUse this to
skyvern_logFormatted execution logsRead through the run step-by-step
skyvern_log_rawRaw JSON logsParse programmatically for automation
browser_console_logBrowser console outputDebug JavaScript errors on the page
Debugging tip: skyvern_log is human-readable and shows the flow of execution. Start here for an overview before diving into specific artifacts.

Network artifacts

TypeWhat it containsUse this to
harHTTP Archive (network requests/responses)Debug API calls, check for failed requests, see response data
tracePlaywright trace fileReplay the session in Playwright Trace Viewer
Debugging tip: The HAR file captures every network request. If a form submission failed, check the HAR to see if the request was sent and what the server responded.

File artifacts

TypeWhat it containsUse this to
script_fileGenerated Playwright scriptsSee the code Skyvern would use to repeat this task

Artifact response fields

FieldTypeDescription
artifact_idstringUnique identifier
artifact_typestringType (see tables above)
uristringInternal storage path
signed_urlstring | nullPre-signed URL for downloading
task_idstring | nullAssociated task ID
step_idstring | nullAssociated step ID
run_idstring | nullRun ID (e.g., tsk_v2_..., wr_...)
workflow_run_idstring | nullWorkflow run ID
workflow_run_block_idstring | nullWorkflow block ID
organization_idstringYour organization
created_atdatetimeWhen created
modified_atdatetimeWhen modified

Next steps

Troubleshooting Guide

Common issues and how to fix them

Error Handling

Map errors to custom codes for programmatic handling