TinyFish is web infrastructure for AI agents. Instead of maintaining a scraper per site, you give a TinyFish web agent a natural-language goal and a starting URL, and it drives a real browser — clicking, typing, paginating, logging in — until the goal is met, then returns what it found as structured JSON.
TinyFish exposes three surfaces through this block:
Agent — natural-language browser automation on live websites. Charged per step from a prepaid wallet.
Search — ranked web results with titles, snippets, and URLs. Free.
Fetch — up to 10 URLs at a time rendered and extracted as clean markdown, HTML, or a JSON document tree. Free.
With TinyFish in Sim, you can:
Automate any site, API or not: Log into vendor portals, legacy ERPs, and internal tools that never shipped an API, and pull the data out.
Get typed results, not scraped HTML: Supply a JSON Schema in Output Schema and TinyFish holds the agent to it, re-prompting on mismatch and reporting every field that did not match in schemaValidation.
Survive bot detection: Switch Browser Engine to stealth for anti-detection, and enable the Tetra proxy with a country when the page is geo-restricted.
Stay logged in between runs: Enable Use Browser Profile to start a run from a Browser Context Profile — saved browser state you log into once on TinyFish. List Browser Profiles returns the ids to choose from; leaving the id empty uses your default profile. Pair it with the vault so an expired session can be repaired.
Log in safely: Connect a password manager to TinyFish's vault, then enable Use Vault Credentials and scope a run to specific credential URIs. List Vault Items returns those URIs as display-safe metadata — labels, domains, field names — so credentials never travel through the workflow.
Run work that outlives a step: Start Agent Run queues an automation and returns a run ID immediately; Get Run, Cancel Run, and List Runs track it afterwards, and a webhook URL can notify you on completion.
Read the live web cheaply: Pair Search and Fetch URLs to gather current sources before an agent writes or answers.
The goal is handed to the agent's model verbatim, so it behaves like a prompt. Name the destination, the data, and the stopping condition — "open the pricing page and collect every plan name and monthly price" beats "get pricing". Start the run as close to the target page as you can: every navigation the URL saves is a step you are not billed for. Use Agent Modestrict when the run is a test that should fail loudly rather than improvise.
On Sim's hosted platform, Run Agent, Search, and Fetch URLs run on Sim's TinyFish key by default, metered to your workspace — Agent runs are billed per step, Search and Fetch are free. You can bring your own key in Settings → API Keys to bill TinyFish directly instead.
Start Agent Run, Get Run, Cancel Run, List Runs, and List Vault Items always require your own key. An async run accrues its charge after the request returns, so there is nothing for Sim to meter at call time.
A failed automation comes back as HTTP 200 with the failure inside the run's own error object, so read status rather than assuming success. The category tells you what to do: AGENT_FAILURE means the goal or the site needs attention, SYSTEM_FAILURE is worth retrying after retryAfter seconds, and BILLING_FAILURE means the TinyFish wallet is empty. All of that is on the block's error output, so a workflow can branch on it without parsing a message string.
Integrate TinyFish into the workflow. Give a web agent a natural-language goal and let it drive a real browser on any site, queue and track long-running automations, search the web, and fetch pages as clean markdown.
Steps taken, null while the run is still in progress
result
json
Structured data the agent extracted, null until the run succeeds
schemaValidation
object
Validation of the result against the requested output schema
↳ valid
boolean
Whether the result matched the requested output schema
↳ rePromptAttempts
number
Number of schema-repair re-prompts TinyFish performed
↳ errors
array
Fields that did not match the requested schema
↳ path
string
Path to the failing field
↳ expected
string
Expected type or constraint
↳ received
string
Type actually returned
↳ message
string
Validation error message
error
object
Failure details, null while the run is pending or succeeded
↳ code
string
Machine-readable error code
↳ message
string
Why the run failed
↳ category
string
SYSTEM_FAILURE (retry), AGENT_FAILURE (fix the goal), BILLING_FAILURE (add credits), or UNKNOWN
↳ retryAfter
number
Suggested retry delay in seconds, null when not retryable
↳ helpUrl
string
Troubleshooting documentation URL
↳ helpMessage
string
Human-readable guidance
streamingUrl
string
Live browser view URL, available while the run is executing
browserConfig
object
Proxy settings the run executed with
↳ proxyEnabled
boolean
Whether a proxy was used
↳ proxyCountryCode
string
Proxy country code
profileAttached
boolean
Whether the run actually started from a Browser Context Profile, null when the API omits it — treat null as unknown rather than as false
profileId
string
Browser Context Profile the run attached. Null covers both no profile and a payload that omitted the field, so read profileAttached alongside it rather than reading null as proof
profileHint
object
Present when TinyFish believes a Browser Context Profile would fix this failed run
↳ message
string
Why a Browser Context Profile would help this run
↳ setupUrl
string
Path on the TinyFish dashboard that sets up a profile for the blocked domain
↳ reason
string
auth_wall (the run hit a login) or bot_challenge (the site blocked automation)
videoUrl
string
Presigned recording URL, expires 15 minutes after it is issued
Runs matching the filters, newest first by default
↳ runId
string
Run identifier
↳ status
string
PENDING, RUNNING, COMPLETED, FAILED, or CANCELLED
↳ goal
string
Natural-language goal the run was given
↳ createdAt
string
ISO 8601 timestamp when the run was created
↳ startedAt
string
ISO 8601 timestamp when the run started executing
↳ finishedAt
string
ISO 8601 timestamp when the run finished
↳ numOfSteps
number
Steps taken, null while the run is still in progress
↳ result
json
Structured data the agent extracted, null until the run succeeds
↳ schemaValidation
object
Validation of the result against the requested output schema
↳ valid
boolean
Whether the result matched the requested output schema
↳ rePromptAttempts
number
Number of schema-repair re-prompts TinyFish performed
↳ errors
array
Fields that did not match the requested schema
↳ path
string
Path to the failing field
↳ expected
string
Expected type or constraint
↳ received
string
Type actually returned
↳ message
string
Validation error message
↳ error
object
Failure details, null while the run is pending or succeeded
↳ code
string
Machine-readable error code
↳ message
string
Why the run failed
↳ category
string
SYSTEM_FAILURE (retry), AGENT_FAILURE (fix the goal), BILLING_FAILURE (add credits), or UNKNOWN
↳ retryAfter
number
Suggested retry delay in seconds, null when not retryable
↳ helpUrl
string
Troubleshooting documentation URL
↳ helpMessage
string
Human-readable guidance
↳ streamingUrl
string
Live browser view URL, available while the run is executing
↳ browserConfig
object
Proxy settings the run executed with
↳ proxyEnabled
boolean
Whether a proxy was used
↳ proxyCountryCode
string
Proxy country code
↳ profileAttached
boolean
Whether the run actually started from a Browser Context Profile, null when the API omits it — treat null as unknown rather than as false
↳ profileId
string
Browser Context Profile the run attached. Null covers both no profile and a payload that omitted the field, so read profileAttached alongside it rather than reading null as proof
↳ profileHint
object
Present when TinyFish believes a Browser Context Profile would fix this failed run
↳ message
string
Why a Browser Context Profile would help this run
↳ setupUrl
string
Path on the TinyFish dashboard that sets up a profile for the blocked domain
↳ reason
string
auth_wall (the run hit a login) or bot_challenge (the site blocked automation)
total
number
Total runs matching the filters
nextCursor
string
Cursor for the next page, null when there are no more results