Writ Cloud
Server Details
Read, crawl and act on websites, signed in as the user, and turn any site into an API.
The last two health checks of this connector failed. If this server requires authentication, missing or expired test credentials may be the cause. A test profile lets Glama authenticate for health checks and discover tools; it is separate from your personal connections.
If you are the author, claim ownership, then add or update a test profile under Admin → Test Profile.
- Status
- Unhealthy
- Uptime
- 18.3% over 20 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP
- URL
- Repository
- usewrit/writ-mcp
- GitHub Stars
- 1
- Server Listing
- writ-mcp
TDQS
Scored across 40 tools
The set includes many browser and workflow tools, but descriptions use explicit 'NOT FOR' sections and cross-references to delineate boundaries. However, with 40 tools, some pairs like writ_browser_act vs writ_browser_compose or writ_run_workflow vs writ_run_saved_crawl can still be confused without careful reading.
All names use lowercase snake_case with a uniform writ_ prefix, which is good. But verb/noun ordering is inconsistent: most tools are writ_<verb>_<noun> (e.g., writ_create_automation) while browser tools are writ_browser_<verb> (noun-first). This mixed convention is readable but not fully predictable.
40 tools is far beyond the typical 3-15 range for a well-scoped server. Even given the broad domain (browser automation, scraping, crawling, workflows, payments, monitors), the count is excessive and likely to overwhelm tool selection.
The surface covers many lifecycle operations (create, read, update, run, schedule, export, expose), but notable gaps exist: no delete operations for workflows, crawls, monitors, or automations, and no dedicated list for monitors or automations. These are workable around but represent missing lifecycle steps.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
39 tool updates
- Changed
writ_browser_act3 fields changed- removed
Input schema / properties / inputs / descriptionRemoved value: -"Values held server-side for {{placeholder}} substitution, e.g. {\"city\":\"Paris\"}. Secrets here or on a fill's data_key stay out of the recorded steps." - changed
Input schema / properties / max_chars / descriptionPrevious value: -"Clip of the returned page_dom / page_text (default 40000, ≤200000). A get_dom probe on a real app is 500KB; evaluate_js / inspect / read_text return just the target."New value: +"Clip of the returned page (default 40000)." - removed
Input schema / properties / session_id / descriptionRemoved value: -"Session id from the start tool."
- Changed
writ_browser_ask_user3 fields changed- changed
Input schema / properties / kind / descriptionPrevious value: -"captcha: the user completes a check in the live browser. question: the user answers in text. twofa: the user supplies the one-time code the page is asking for; Writ types it server-side and returns `entered`, never the code."New value: +"captcha | twofa | question." - changed
Input schema / properties / question / descriptionPrevious value: -"The question, in one short sentence (required for kind 'question')."New value: +"kind='question': one short sentence." - changed
Input schema / properties / wait_seconds / descriptionPrevious value: -"Hold up to this long (1-60, default 60)."New value: +"Hold up to this long (1-60)."
- Changed
writ_browser_cancel1 field changed- changed
Input schema / properties / discard / descriptionPrevious value: -"true = the session's unsaved steps and functions are thrown away instead of auto-saved. Default false."New value: +"Throw away unsaved steps instead of auto-saving."
- Changed
writ_browser_compose3 fields changed- added
Input schema / properties / operation / descriptionAdded value: +"list | define_function | compile_function | test_function | remove_function | add_steps | remove_step | set_inputs." - changed
Input schema / properties / payload / descriptionPrevious value: -"The operation's arguments. define_function: {name, fn_type?, description?, surface?, from_index?, request?{method,url,headers,body_template}, flow?{version,steps}, script?, selector?, input_variables?, output_fields?, response_extractions?, is_auth?, order?, sample_inputs?, test?}. compile_function {name, from_index, sibling_index?, input_variables?, response_extractions?, page_url?}: the deterministic (no-LLM) way to turn a captured authenticated request (a GraphQL/RPC POST, a form submit) into a callable function. Writ decodes the body, keeps the static parameters, traces each session-minted token (csrf/xsrf/dtsg/lsd/etc.) to where a fresh session re-reads it and emits an is_auth bootstrap that publishes it as {{extracted:}}/{{cookie:}}, replaces per-call client values (idempotence token, session id, timestamp) with runtime generators ({{uuid()}}, {{uuid(session)}}, {{timestamp_ms()}}, {{counter()}}), templates the caller inputs, and classifies a write (create/post/send/delete): the build never sends it, a real run does (mutation_mode='dry_run' previews it). It suits any authenticated mutation or token-bound endpoint better than a hand-built api function. A second capture of the same request (sibling_index, else the nearest one Writ finds) tells the pagination inputs and per-call values from stable ids: a UUID unchanged between the two is kept as captured. test_function: {name, sample_inputs?}. remove_function: {name}. add_steps: {steps:[{type, config|flat fields, description?}], at?}. remove_step: {id}. set_inputs: {inputs:{name:{default?, description?, required?, example?}}}."New value: +"The operation's arguments." - removed
Input schema / properties / session_id / descriptionRemoved value: -"Session id from the start tool."
- Changed
writ_browser_context3 fields changed- removed
Input schema / properties / max_charsRemoved value: -{ - "description": "Characters per page (1000–10000, default 8000).", - "type": "integer" -} - removed
Input schema / properties / offsetRemoved value: -{ - "description": "Paging offset for the policy sections.", - "minimum": 0, - "type": "integer" -} - changed
Input schema / properties / section / descriptionPrevious value: -"page (default) | lists | map | explorer | concierge_api"New value: +"page (default) | lists | map | explorer | concierge_api."
- Changed
writ_browser_network6 fields changed- changed
Input schema / properties / index / descriptionPrevious value: -"Which call to read, for operation=detail."New value: +"detail: which call." - removed
Input schema / properties / max_charsRemoved value: -{ - "description": "Window size, 1000-10000 (default 8000; larger values are clamped); offset pages it.", - "type": "integer" -} - changed
Input schema / properties / method / descriptionPrevious value: -"Filter by HTTP method."New value: +"HTTP method filter." - removed
Input schema / properties / offsetRemoved value: -{ - "minimum": 0, - "type": "integer" -} - changed
Input schema / properties / operation / descriptionPrevious value: -"search (default) | detail. list/get are aliases."New value: +"search (default) | detail." - changed
Input schema / properties / query / descriptionPrevious value: -"Substring filter across method, url, status, and bodies."New value: +"Substring filter."
- Changed
writ_browser_save3 fields changed- changed
Input schema / properties / allow_no_data / descriptionPrevious value: -"Saves a workflow that yields no data (navigation/actions only) on purpose. Off by default: a save with no data step and no defined function is refused for an API build (no define_function or extract yet) and warned for a task recording: such a workflow runs green and returns nothing."New value: +"Save a workflow that returns no data, on purpose." - removed
Input schema / properties / keep_openRemoved value: -{ - "description": "Leaves the browser open after saving (default false: saving closes it).", - "type": "boolean" -} - removed
Input schema / properties / name / descriptionRemoved value: -"Short workflow name (defaults to the goal)."
- Changed
writ_browser_sessions2 fields changed- removed
Input schema / properties / include_closedRemoved value: -{ - "description": "Also lists recently closed sessions (not resumable) for reference. Default false: only open, resumable sessions.", - "type": "boolean" -} - removed
Input schema / properties / limit / descriptionRemoved value: -"Max sessions to return (default 20)."
- Changed
writ_browser_use9 fields changed- removed
Input schema / properties / auth_modeRemoved value: -{ - "description": "reuse verifies unknown saved authentication before adopting it; fresh_login starts without old cookies/storage while preserving the persona's device and network identity, the mode for recording a new login.", - "enum": [ - "reuse", - "fresh_login" - ], - "type": "string" -} - changed
Input schema / properties / execution_target / descriptionPrevious value: -"Where the session runs: 'cloud' (managed cloud fleet), 'auto' (the user's own linked Writ desktop app when it is online, else cloud), or 'local' (only their own desktop app). On the user's own machine the session keeps their computer and IP and exposes nothing local to the cloud. No value means the account's default set in the Writ app. A 'local' run reports local_agent_offline when their app is closed; execution_target='cloud' re-runs it in the cloud, off the user's machine."New value: +"cloud | auto | local (the user's own desktop app)." - removed
Input schema / properties / fresh_exitRemoved value: -{ - "description": "Residential only: skips the persona's usual exit for this site and draws a new address, for after the site refused it (an IP rate limit, a sign-in rejected with correct credentials). Ignored on server-IP egress.", - "type": "boolean" -} - removed
Input schema / properties / goal / descriptionRemoved value: -"Optional label describing the task, for the run log. A label only: the tool performs no step from it, and every step is a writ_browser_act batch." - removed
Input schema / properties / human_layerRemoved value: -{ - "description": "Native keyboard input, distance-adaptive mouse paths and pre-click dwell for this session. Fresh login defaults to enabled; explicit false disables it. Native actionability checks remain active.", - "type": "boolean" -} - removed
Input schema / properties / persona_id / descriptionRemoved value: -"Saved identity to sign in with (writ_personas lists them). Required for sites behind a login with 2FA. A desktop persona ('device:…') opens the browser on its own desktop, which fills {{secret:username}} / {{secret:password}} / 2FA itself; its values never reach the caller." - removed
Input schema / properties / residential_countryRemoved value: -{ - "description": "Two-letter ISO country the residential exit should be in (e.g. 'us', 'fr'), for a site that serves a different page per country or throttles foreign traffic. No value means an automatic exit. Ignored unless the session egresses residential.", - "type": "string" -} - removed
Input schema / properties / url / descriptionRemoved value: -"Starting URL to open (required)." - changed
Input schema / properties / use_residential / descriptionPrevious value: -"Opens on the platform residential network (premium), for a site that blocks datacenter IPs or shows a bot wall / captcha. Default off (free)."New value: +"Open on the residential network (bot walls, CAPTCHAs)."
- Changed
writ_crawl_files4 fields changed- removed
Input schema / properties / crawl / descriptionRemoved value: -"Saved crawl slug, name, or id (alternative to crawl_id)." - removed
Input schema / properties / crawl_id / descriptionRemoved value: -"Crawl id from writ_crawl_site." - removed
Input schema / properties / limitRemoved value: -{ - "description": "Max files to return (default 100, cap 200).", - "type": "integer" -} - removed
Input schema / properties / runsRemoved value: -{ - "description": "With `crawl`: how many recent completed runs to aggregate (default 1 — the current version of every document).", - "type": "integer" -}
- Changed
writ_crawl_site35 fields changed- removed
Input schema / properties / allow_subdomainsRemoved value: -{ - "type": "boolean" -} - removed
Input schema / properties / content_specRemoved value: -{ - "description": "Which elements of each page to keep: {preset: 'full'|'main', include_comments: bool, exclude_selectors: [css], include_selectors: [css], keep: {images: bool}}. 'main' = article body only; 'full' = the whole page including comment and discussion threads. Comments, replies and discussion survive only with 'full' plus include_comments; otherwise they are stripped out.", - "type": "object" -} - removed
Input schema / properties / delay_msRemoved value: -{ - "description": "Politeness delay between fetches per host (default 250).", - "type": "integer" -} - removed
Input schema / properties / deviceRemoved value: -{ - "description": "A linked Writ desktop's agent_id (writ_devices) to act on. Omitted: the desktop this connection chose with writ_devices action='use', if any.", - "type": "string" -} - removed
Input schema / properties / exclude_pathsRemoved value: -{ - "items": { - "type": "string" - }, - "type": "array" -} - changed
Input schema / properties / executor / descriptionPrevious value: -"regular (default) = deterministic crawl, no AI. ai = a fleet of AI agents reads every page against `extract_prompt` and returns structured records, for data with no clean CSS selector. Bills at 5x the page rate."New value: +"regular (default, no AI) | ai (5x the page rate)." - changed
Input schema / properties / extract_mode / descriptionPrevious value: -"markdown (default) | schema (uniform records via extract_schema) | html (each page's raw HTML, for selectors or embedded JSON)"New value: +"markdown (default) | schema | html." - changed
Input schema / properties / extract_prompt / descriptionPrevious value: -"Required with executor=ai: what each agent extracts from each page, in plain language (e.g. 'the product name, price and SKU')."New value: +"With executor=ai: what to extract from each page." - removed
Input schema / properties / extract_schemaRemoved value: -{ - "type": "object" -} - removed
Input schema / properties / include_pathsRemoved value: -{ - "items": { - "type": "string" - }, - "type": "array" -} - changed
Input schema / properties / intent / descriptionPrevious value: -"Plain-English goal. The server derives include/exclude paths and a depth from it against a sample of the site's real URLs, and ranks the frontier by relevance, so on an unfamiliar site it scopes better than guessed path regexes."New value: +"The section wanted, in plain words; the server derives paths and depth." - removed
Input schema / properties / limitRemoved value: -{ - "description": "Rows of collected data to return when wait=true (default 50).", - "type": "integer" -} - removed
Input schema / properties / max_ageRemoved value: -{ - "description": "Only meaningful with `save_as`: if that saved crawl already completed within this many seconds, return its collected data instead of crawling again. 0 always crawls.", - "minimum": 0, - "type": "integer" -} - removed
Input schema / properties / max_concurrent_shardsRemoved value: -{ - "description": "Explicit parallel-shard cap; overrides the `speed` allocation.", - "type": "integer" -} - removed
Input schema / properties / max_depthRemoved value: -{ - "type": "integer" -} - removed
Input schema / properties / nameRemoved value: -{ - "type": "string" -} - removed
Input schema / properties / ocr_modeRemoved value: -{ - "description": "auto (default) | off | force", - "type": "string" -} - removed
Input schema / properties / outputRemoved value: -{ - "description": "Response shape, for an answer a program or an API consumes rather than a reader. {shape: 'envelope' (default: Writ's full answer, projected) | 'table' ({columns, rows, total}) | 'records' (bare list of records) | 'record' (the newest record alone: one entity, a usage meter, a dashboard), fields: ['used', 'percent_used as pct', 'items.0.price as first_price'] (ordered pick, renames, dotted paths; a missing path is null, so keys are stable), exclude: ['depth'], include_meta: false (page metadata content_kind/depth/thumbnails is stripped unless true), key: 'usage' (wrap)}. On writ_crawl_site with save_as it is saved as the API's default shape.", - "properties": { - "exclude": { - "items": { - "type": "string" - }, - "type": "array" - }, - "fields": { - "items": { - "type": "string" - }, - "type": "array" - }, - "include_meta": { - "type": "boolean" - }, - "key": { - "type": "string" - }, - "shape": { - "enum": [ - "envelope", - "table", - "records", - "record" - ], - "type": "string" - } - }, - "type": "object" -} - added
Input schema / properties / page_budget / descriptionAdded value: +"Cap on pages fetched." - removed
Input schema / properties / persona_id / descriptionRemoved value: -"Saved identity to crawl as (writ_personas lists them), for pages behind a login. Every shard shares the persona's signed-in session and one sticky exit IP. 2FA is minted server-side. A desktop persona ('device:…') crawls on its own desktop, from that machine." - removed
Input schema / properties / preview_charsRemoved value: -{ - "description": "Cut each inline page's text cells to this many characters (default 12000; 0 = full pages). Cut rows list the fields under `_truncated`; a full page comes from writ_workflow_data(workflow_id=<data_workflow_id>, refs=['<run_id>:<record_index>']).", - "type": "integer" -} - changed
Input schema / properties / rank_cap / descriptionPrevious value: -"Top N items of a listing (a front page, search results, a category). The server reads the seed page's link order (which is the ranking), seeds exactly those N item pages, and pins the crawl to them, one page per agent, in parallel. Without it the same request is a breadth crawl that mostly collects nav and pagination and does not answer a top-N ask. include_paths, when given, is the item-link shape."New value: +"Top N items of a listing (one page per agent, in parallel)." - removed
Input schema / properties / relevance_thresholdRemoved value: -{ - "description": "0-1. Every discovered page is scored against `intent` and skipped below the bar, so a broad crawl collects only what the goal needs (≈0.3 for 'the pricing and docs pages'). Unset for a whole-site sweep.", - "maximum": 1, - "minimum": 0, - "type": "number" -} - removed
Input schema / properties / render_modeRemoved value: -{ - "description": "How each page is fetched, independent of `executor`, which decides who reads it. auto (default) = plain HTTP first, warm browser only for JS-challenge or near-empty pages; http = never opens a browser (fastest, static HTML); browser = warm-render every page (JS/SPA sites). executor=ai works on either lane.", - "type": "string" -} - removed
Input schema / properties / residential_countryRemoved value: -{ - "description": "Two-letter ISO country the residential exit should be in (e.g. 'us', 'fr'): pins the exit pool's geo for every shard. Omitted = an automatic exit. Ignored unless the session egresses residential.", - "type": "string" -} - removed
Input schema / properties / respect_robotsRemoved value: -{ - "description": "Honor robots.txt (default true).", - "type": "boolean" -} - removed
Input schema / properties / same_domainRemoved value: -{ - "type": "boolean" -} - removed
Input schema / properties / save_as / descriptionRemoved value: -"Saves these settings as a named, callable crawl, for one that is re-run later (a recurring pull, an API the user asked for). Saved crawls are listed to every future session as 'already collected', so a saved one-off reads as reusable data to later sessions. Reusing the same name updates that saved crawl instead of creating a duplicate." - changed
Input schema / properties / seed_urls / descriptionPrevious value: -"Exact known pages to start from: the crawl collects these instead of discovering its own. The cheapest way to scrape a known set."New value: +"Exact pages to collect (no discovery)." - removed
Input schema / properties / shard_sizeRemoved value: -{ - "description": "URLs fetched per shard batch (default 20).", - "type": "integer" -} - removed
Input schema / properties / speedRemoved value: -{ - "description": "Throughput tier: slow | normal (default) | fast: the share of the parallel-agent allowance the crawl uses. slow ≈ ¼ at a discounted page rate, normal ≈ ½ at standard rate, fast = all of it at a premium.", - "type": "string" -} - removed
Input schema / properties / timeout_secondsRemoved value: -{ - "description": "Max seconds to hold when wait=true (≤75).", - "type": "integer" -} - removed
Input schema / properties / url / descriptionRemoved value: -"Seed URL (required)." - removed
Input schema / properties / use_residentialRemoved value: -{ - "description": "Route every shard through the platform residential network (premium), for sites that block datacenter IPs / show a bot wall; a persona crawl forces it on automatically. Costs residential bandwidth; default off.", - "type": "boolean" -} - changed
Input schema / properties / wait / descriptionPrevious value: -"Hold until the crawl converges and return the collected pages in this call (`data.rows`). Default true for a bounded crawl (rank_cap or seed_urls: a few pages, seconds) and false for an open site crawl (returns a crawl id for writ_crawl_status). Past the 75s ceiling the answer is a 504 that still carries the crawl id."New value: +"Hold until done and return the rows (default true when bounded)."
- Changed
writ_crawl_status6 fields changed- removed
Input schema / properties / crawl_id / descriptionRemoved value: -"Crawl id from writ_crawl_site." - removed
Input schema / properties / limit / descriptionRemoved value: -"Rows to inline when it converged (default 50)." - removed
Input schema / properties / outputRemoved value: -{ - "description": "Response shape, for an answer a program or an API consumes rather than a reader. {shape: 'envelope' (default: Writ's full answer, projected) | 'table' ({columns, rows, total}) | 'records' (bare list of records) | 'record' (the newest record alone: one entity, a usage meter, a dashboard), fields: ['used', 'percent_used as pct', 'items.0.price as first_price'] (ordered pick, renames, dotted paths; a missing path is null, so keys are stable), exclude: ['depth'], include_meta: false (page metadata content_kind/depth/thumbnails is stripped unless true), key: 'usage' (wrap)}. On writ_crawl_site with save_as it is saved as the API's default shape.", - "properties": { - "exclude": { - "items": { - "type": "string" - }, - "type": "array" - }, - "fields": { - "items": { - "type": "string" - }, - "type": "array" - }, - "include_meta": { - "type": "boolean" - }, - "key": { - "type": "string" - }, - "shape": { - "enum": [ - "envelope", - "table", - "records", - "record" - ], - "type": "string" - } - }, - "type": "object" -} - removed
Input schema / properties / preview_charsRemoved value: -{ - "description": "Cut inline text cells to this many chars (default 12000; 0 = full).", - "type": "integer" -} - removed
Input schema / properties / timeout_secondsRemoved value: -{ - "description": "Ceiling for wait=true (≤75).", - "type": "integer" -} - changed
Input schema / properties / wait / descriptionPrevious value: -"Hold until the crawl is terminal and inline its rows (default false)."New value: +"Hold until done and inline the rows."
- Changed
writ_create_automation26 fields changed- removed
Input schema / properties / ai_entry_urlRemoved value: -{ - "description": "Page the woken agent starts on. Defaults to the event's page (the monitored URL on change_detected); required in practice for workflow_*/webhook events.", - "type": "string" -} - changed
Input schema / properties / ai_prompt / descriptionPrevious value: -"Wake an AI agent with this task when the event fires. The agent gets the event context (page URL, diff, extracted values) and works the task in a cloud browser. Supports {{placeholders}}."New value: +"Wake an AI agent with this task." - removed
Input schema / properties / ai_session_idRemoved value: -{ - "description": "With when='ai_session_completed' / 'ai_session_started': only this AI session.", - "type": "integer" -} - removed
Input schema / properties / blocksRemoved value: -{ - "description": "Raw flow tree instead of the action arguments (max 50): each {id, type: event|condition|action, blockType, config, parentId}. The first block is the root event (its blockType is the event: one of `when`; scheduled config {mode, interval_ms | time, days, tz}); every other block names an earlier block as parentId. Actions: workflow {workflow_id, function_name | function_names, input_mapping}; notification {template, title, channels, recipients}; ai_session {goal, entry_url}; scrape {urls:[<=5, templates ok], format: markdown|html|both, on_error} -> {{scraped.content}} {{scraped.pages}}; extract {source:'{{scraped.content}}', fields:[{key, from: html_css|json|regex|embedded_json|body, selector, attribute, all, path, pattern, group, number, required}]} -> {{extracted.<key>}}; crawl {seed_url, intent, include_paths, exclude_paths, page_budget, max_depth, extract_mode: markdown|schema, extract_schema, render_mode: auto|http|browser, persona_id} starts a fresh crawl (its rows arrive with crawl_completed, not in this chain); condition {field, operator, value}. Awaiting a run: an event block workflow_completed {linked_to_block:<workflow block id>}. Every string setting takes {{placeholders}}.", - "items": { - "type": "object" - }, - "type": "array" -} - changed
Input schema / properties / channels / descriptionPrevious value: -"Notification channels for `notify`, e.g. [\"pushover\",\"email\"] (required for delivery)."New value: +"Notification channels." - removed
Input schema / properties / cooldown_minutesRemoved value: -{ - "description": "Minimum minutes between AI wakes for `ai_prompt` (default 10; 0 disables).", - "type": "integer" -} - removed
Input schema / properties / descriptionRemoved value: -{ - "type": "string" -} - removed
Input schema / properties / enabledRemoved value: -{ - "type": "boolean" -} - removed
Input schema / properties / inputsRemoved value: -{ - "description": "With run_workflow: its inputs {input_name: value}, each a literal or a {{template}} over the event (e.g. {{extracted.price}}, or {{payload.order.id}} from a webhook body); saved values fill the rest. Stored as plain JSON.", - "type": "object" -} - removed
Input schema / properties / name / descriptionRemoved value: -"Name for the automation (required)." - changed
Input schema / properties / notify / descriptionPrevious value: -"Send a notification with this message — a template over the event's data (see the tool description: {{result.extracted_data.0.title}} after a workflow, {{rows.0.title}} / {{row_count}} after a crawl, {{extracted.price}} on a change)."New value: +"Message template, e.g. {{result.extracted_data.0.title}}." - changed
Input schema / properties / on_workflow / descriptionPrevious value: -"Source workflow name whose event fires this (required for workflow_* events)."New value: +"Source workflow for workflow_* events." - removed
Input schema / properties / on_workflow_idRemoved value: -{ - "type": "integer" -} - removed
Input schema / properties / priorityRemoved value: -{ - "type": "integer" -} - removed
Input schema / properties / recipientsRemoved value: -{ - "description": "Notification recipients, e.g. [\"email:3\"]. Omitted = every enabled recipient on the channel; the answer names who the alert actually reaches, and warns when nobody is configured.", - "items": { - "type": "string" - }, - "type": "array" -} - removed
Input schema / properties / run_functionRemoved value: -{ - "description": "One function name (alias of run_functions).", - "type": "string" -} - removed
Input schema / properties / run_functionsRemoved value: -{ - "description": "With run_workflow: call these functions of a multi-function workflow instead of the whole workflow — one run of the selection plus what it needs (sign-in, a token, the search whose ids another reads). Unset = the whole workflow.", - "items": { - "type": "string" - }, - "type": "array" -} - changed
Input schema / properties / run_workflow / descriptionPrevious value: -"Workflow to run when the event fires (by name)."New value: +"Workflow to run." - removed
Input schema / properties / run_workflow_idRemoved value: -{ - "type": "integer" -} - changed
Input schema / properties / schedule / descriptionPrevious value: -"With when='scheduled': {kind:'interval', interval_minutes:N} or {kind:'daily', time:'HH:MM', tz:'<IANA zone>'} or {kind:'weekly', time, days:[1..7] (1=Mon .. 7=Sun), tz}."New value: +"when='scheduled': {kind, interval_minutes | time, days, tz}." - removed
Input schema / properties / schedule / propertiesRemoved value: -{ - "days": { - "items": { - "type": "integer" - }, - "type": "array" - }, - "interval_minutes": { - "type": "integer" - }, - "kind": { - "enum": [ - "interval", - "daily", - "weekly" - ], - "type": "string" - }, - "time": { - "type": "string" - }, - "tz": { - "type": "string" - } -} - changed
Input schema / properties / target_id / descriptionPrevious value: -"With when='change_detected' (required there): the monitor whose changes fire this, i.e. the monitor_id writ_create_monitor returned."New value: +"change_detected: the monitor_id." - removed
Input schema / properties / target_selector_idRemoved value: -{ - "description": "With target_id: only changes of this one selector of that monitor.", - "type": "integer" -} - removed
Input schema / properties / titleRemoved value: -{ - "description": "Notification title (with `notify`).", - "type": "string" -} - removed
Input schema / properties / webhook_trigger_idRemoved value: -{ - "description": "With when='webhook_received': fire on this existing inbound webhook (its id from writ_list_webhooks) instead of minting a new URL. Its senders keep signing with its secret; one that has no secret yet gets one, shown once in the answer.", - "type": "integer" -} - changed
Input schema / properties / when / descriptionPrevious value: -"Event: workflow_completed | workflow_started | crawl_completed | crawl_failed | ai_session_completed | ai_session_started | change_detected (with `target_id`) | webhook_received (mints a signed URL; `webhook_trigger_id` reuses one) | scheduled (a clock, with `schedule`)."New value: +"workflow_completed | crawl_completed | change_detected | webhook_received | scheduled | ..."
- Changed
writ_create_http_extraction8 fields changed- changed
Input schema / properties / apply / descriptionPrevious value: -"false (default) returns a reviewable draft; true writes a valid draft to the workflow."New value: +"false (default) drafts; true writes." - removed
Input schema / properties / desired_inputsRemoved value: -{ - "description": "Caller parameters such as query, min_price, max_price, limit and cursor.", - "items": { - "type": "string" - }, - "type": "array" -} - removed
Input schema / properties / goal / descriptionRemoved value: -"Exact inputs, output fields, filters, ordering and pagination behavior wanted." - removed
Input schema / properties / request_samplesRemoved value: -{ - "description": "Relevant calls returned by writ_browser_network/capture_network, including representative response bodies when available.", - "items": { - "type": "object" - }, - "type": "array" -} - removed
Input schema / properties / requirementsRemoved value: -{ - "description": "Extra mapping, dedupe, filtering or cursor requirements.", - "type": "string" -} - removed
Input schema / properties / response_sampleRemoved value: -{ - "description": "Optional representative JSON/HTML response when it is not in request_samples.", - "type": "string" -} - removed
Input schema / properties / step_indexRemoved value: -{ - "description": "api_call step to replace; defaults to the first, or appends one.", - "type": "integer" -} - removed
Input schema / properties / workflowRemoved value: -{ - "description": "Existing workflow name (or workflow_id).", - "type": "string" -}
- Changed
writ_create_monitor17 fields changed- removed
Input schema / properties / deviceRemoved value: -{ - "description": "A linked Writ desktop's agent_id (writ_devices) to act on. Omitted: the desktop this connection chose with writ_devices action='use', if any.", - "type": "string" -} - removed
Input schema / properties / enabledRemoved value: -{ - "description": "Start the monitor enabled (default true).", - "type": "boolean" -} - changed
Input schema / properties / extract / descriptionPrevious value: -"Browserless alternative to `selector`: a response-extraction spec the check applies to a plain HTTP response: {\"from\":\"json\",\"path\":\"data.price\"} (a JSON/XHR endpoint, with request_url), {\"from\":\"html_css\",\"selector\":\".a-offscreen\"} (the page markup), {\"from\":\"regex\",\"pattern\":\"...\"} (a value in a script/JSON blob). For a value readable without JavaScript (most prices and stock lines), no check opens a browser, so each is cheaper and harder to wall than a `selector`/requires_browser check. Structured data (an endpoint, JSON-LD, a JSON blob) survives a redesign best. Same grammar as api_call response_extractions."New value: +"Browserless read instead of a selector, e.g. {\"from\":\"html_css\",\"selector\":\".price\"}." - changed
Input schema / properties / interval / descriptionPrevious value: -"How often to check: an option id from the needs_input answer ('5m', '15m', '1h', '6h', '24h') or a number of seconds (3600). Without it the answer is needs_input: this account's options (checks a day, how long the check allowance lasts, allowed or which plan) and a tell_user asking the user to pick; nothing is created. An interval the plan refuses is refused with the allowed ones; one that runs the allowance out before it renews is created with a `warning`."New value: +"How often: an option id from needs_input ('5m', '1h', '24h') or seconds." - removed
Input schema / properties / interval_minutesRemoved value: -{ - "description": "Legacy: minutes between checks; `interval` replaces it.", - "type": "integer" -} - removed
Input schema / properties / modeRemoved value: -{ - "description": "'visual' watches the on-screen zone of `selector`'s element (or of `zone_text`) and diffs its pixels, for charts, images, badges, or a value no selector can read.", - "enum": [ - "selector", - "visual" - ], - "type": "string" -} - removed
Input schema / properties / persona_id / descriptionRemoved value: -"Every check carries this persona's live session (kept fresh by the persona's own sign-in), so a login or a bot wall it passed stays passed (writ_personas). Only for a page behind a sign-in: a public page is watched without one, and the answer says when one is needed." - removed
Input schema / properties / request_urlRemoved value: -{ - "description": "With `extract`: the endpoint the value comes from (an XHR the page calls), when it is not `url` itself.", - "type": "string" -} - removed
Input schema / properties / requires_browserRemoved value: -{ - "description": "Render with a real browser (JS) instead of plain HTTP, for JS-rendered/SPA pages and framed pages (framesets/iframes): the check matches the rendered, frame-flattened DOM, and selector validation is deferred to the first browser render instead of a raw-HTML fetch. Omitted, a page the access check could only read in a browser is checked in one.", - "type": "boolean" -} - removed
Input schema / properties / residential_countryRemoved value: -{ - "description": "ISO-2 exit country for use_residential (e.g. 'ca'); implies use_residential.", - "type": "string" -} - changed
Input schema / properties / selector / descriptionPrevious value: -"CSS selector for content-change monitoring; unset = uptime/status monitoring."New value: +"CSS selector whose text is watched (unset = whole page / uptime)." - removed
Input schema / properties / session_id / descriptionRemoved value: -"An open writ_browser_use session on this page. The selector is proved there before saving (pinned / switched to a zone); required for mode='visual' or zone_text." - removed
Input schema / properties / try_anywayRemoved value: -{ - "description": "After a bot-check answer: create it on Writ's servers anyway (a check that meets the bot check reads nothing).", - "type": "boolean" -} - removed
Input schema / properties / url / descriptionRemoved value: -"URL to monitor (required)." - changed
Input schema / properties / use_residential / descriptionPrevious value: -"Check through a residential exit — for sites that wall datacentre traffic (Amazon, marketplaces). A bot check found on the page is answered with this offer, or with the alternatives when the plan cannot pay for one."New value: +"Check through a residential exit (bot walls)." - changed
Input schema / properties / watch / descriptionPrevious value: -"'price' also rejects a selector whose text holds no number (it becomes a zone). Default 'content'."New value: +"content (default) | price (the value must hold a number)." - removed
Input schema / properties / zone_textRemoved value: -{ - "description": "The text the page prints where the value is (e.g. '51,77 EUR', 'Currently unavailable'). Locates the zone when no selector exists.", - "type": "string" -}
- Changed
writ_devices3 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"list (default) | use | clear | monitors (that desktop's monitors) | datasets (what its exposed workflows collected)."New value: +"list (default) | use | clear | monitors | datasets." - changed
Input schema / properties / device / descriptionPrevious value: -"use: the desktop's agent_id (or its exact name) from list."New value: +"use: the desktop's agent_id or name." - removed
Input schema / requiredRemoved value: -[]
- Changed
writ_diagnose_http_workflow2 fields changed- removed
Input schema / properties / task_id / descriptionRemoved value: -"Optional run to verify actual HTTP execution and output." - removed
Input schema / properties / workflowRemoved value: -{ - "type": "string" -}
- Changed
writ_discovery_status3 fields changed- removed
Input schema / properties / build_id / descriptionRemoved value: -"The build id from writ_website_to_api." - changed
Input schema / properties / timeout_seconds / descriptionPrevious value: -"Ceiling for wait=true (≤75)."New value: +"Ceiling for wait=true (up to 75)." - changed
Input schema / properties / wait / descriptionPrevious value: -"One held call (≤75s) that follows escalations to the newest rung and returns when that build is terminal or parked as needs_guidance. Still building at the ceiling, it answers with the build_id to repeat it with."New value: +"One held call until done or parked."
- Changed
writ_export_data4 fields changed- changed
Input schema / properties / format / descriptionPrevious value: -"csv (default) or json"New value: +"csv (default) | json." - removed
Input schema / properties / qRemoved value: -{ - "type": "string" -} - removed
Input schema / properties / viewRemoved value: -{ - "type": "string" -} - removed
Input schema / properties / workflowRemoved value: -{ - "type": "string" -}
- Changed
writ_expose_workflow_api4 fields changed- removed
Input schema / properties / label / descriptionRemoved value: -"Optional name for the endpoint." - removed
Input schema / properties / timeout_secondsRemoved value: -{ - "description": "Managed run timeout. Defaults to 120, or 300 for AI navigation workflows.", - "maximum": 300, - "minimum": 5, - "type": "integer" -} - removed
Input schema / properties / wait_timeoutRemoved value: -{ - "description": "Deprecated alias of timeout_seconds.", - "maximum": 300, - "minimum": 5, - "type": "integer" -} - removed
Input schema / properties / workflowRemoved value: -{ - "type": "string" -}
- Added
writ_help - Changed
writ_list_workflows1 field changed- changed
Input schema / properties / search / descriptionPrevious value: -"Optional name/description filter."New value: +"Name/description filter, e.g. a site."
- Changed
writ_payment15 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"request = the user approves a card for one purchase; wait = hold until they answer (grant_id) or until a checkout is settled (confirmation_id); checkout = pause at the order button for the user's confirmation, then Writ places the order; fill = type an approved virtual card early; list = the user's payment methods as handles."New value: +"request | wait | checkout | fill | list." - removed
Input schema / properties / automation_idRemoved value: -{ - "description": "request: the automation the card is for, when the purchase is a saved automation.", - "type": "integer" -} - changed
Input schema / properties / commit_selector / descriptionPrevious value: -"checkout (required): CSS selector of the button that places the order. Writ clicks it after the user confirms."New value: +"checkout: the place-order button." - removed
Input schema / properties / confirmation_id / descriptionRemoved value: -"wait: the confirmation_id action='checkout' returned." - removed
Input schema / properties / currencyRemoved value: -{ - "description": "request / checkout: the store's currency, three-letter ISO code ('eur', 'usd', 'gbp'); max_amount is in it. Omitted: the user's card currency on request, the currency the page total shows on checkout. A card pays only in its own currency.", - "type": "string" -} - removed
Input schema / properties / fieldsRemoved value: -{ - "additionalProperties": { - "oneOf": [ - { - "type": "string" - }, - { - "properties": { - "frame_url": { - "type": "string" - }, - "selector": { - "type": "string" - } - }, - "required": [ - "selector" - ], - "type": "object" - } - ] - }, - "description": "request, for live browsing: card field -> CSS selector on the checkout page (writ_browser_context reads them), or {selector, frame_url} for a field inside a payment provider's frame (frame_url = part of the frame's URL, e.g. 'js.stripe.com'). Keys: number, exp (MM/YY), exp_month, exp_year, exp_year2, cvc, name, zip. Writ types into exactly these.", - "type": "object" -} - removed
Input schema / properties / grant_id / descriptionRemoved value: -"wait / fill / checkout: the grant_id action='request' returned." - changed
Input schema / properties / max_amount / descriptionPrevious value: -"request / checkout: the most this purchase may charge, tax and shipping included (e.g. 129.99). checkout without grant_id needs it."New value: +"The most it may charge." - removed
Input schema / properties / payment_method_idRemoved value: -{ - "description": "request: a handle id from action='list' to pre-select that card; the user still approves.", - "type": "string" -} - changed
Input schema / properties / purpose / descriptionPrevious value: -"request: one line the user reads when approving, e.g. 'Buy Nike Dunk Low, size 10'."New value: +"One line the user reads." - changed
Input schema / properties / session / descriptionPrevious value: -"checkout / fill (required) / request: the session_id of the writ_browser_use session on the checkout page."New value: +"The browser session on the checkout page." - changed
Input schema / properties / site / descriptionPrevious value: -"request: the store's domain, e.g. 'store.example.com'. The card is typed only on this site and its payment frames."New value: +"request: the store's domain." - removed
Input schema / properties / stepsRemoved value: -{ - "description": "checkout: steps Writ runs after confirmation, before the order button, e.g. [{\"type\":\"fill_card\"}, {\"type\":\"click\",\"selector\":\"#continue\"}, {\"type\":\"wait\",\"seconds\":2}] for a card page followed by a review page. Default: fill the granted card, then the order button.", - "items": { - "type": "object" - }, - "type": "array" -} - removed
Input schema / properties / summaryRemoved value: -{ - "description": "checkout: one line the user reads when confirming, e.g. '1 x Nike Dunk Low, size 10, shipped to home'.", - "type": "string" -} - removed
Input schema / properties / total_selectorRemoved value: -{ - "description": "request / checkout: CSS selector of the order total on the checkout page. Writ reads it and never clicks on when it is above the maximum. Needed for an auto-confirm rule to apply.", - "type": "string" -}
- Changed
writ_personas11 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"What to do (default list). request = mint the persona link for a site (domain); wait = hold until the user saves it (link_id)."New value: +"list (default) | get | request | wait | sign_in | record_login." - removed
Input schema / properties / deviceRemoved value: -{ - "description": "A linked Writ desktop's agent_id (writ_devices) to act on. Omitted: the desktop this connection chose with writ_devices action='use', if any.", - "type": "string" -} - changed
Input schema / properties / domain / descriptionPrevious value: -"list: only personas usable on this host (suffix match), e.g. 'github.com'. With no match the answer is `persona_needed`, a request worded for the user. request: the site the new persona is for."New value: +"list: personas usable on this site. request: the site." - removed
Input schema / properties / execution_targetRemoved value: -{ - "description": "list / request: 'cloud' asks for a Writ Cloud persona (cloud runs) even when this connection is scoped to a desktop.", - "enum": [ - "cloud" - ], - "type": "string" -} - removed
Input schema / properties / forceRemoved value: -{ - "description": "sign_in: re-run the login even when the current session still looks usable.", - "type": "boolean" -} - removed
Input schema / properties / include_runsRemoved value: -{ - "description": "get: include the persona's recent runs (which workflows acted as it, and whether they succeeded).", - "type": "boolean" -} - changed
Input schema / properties / link_id / descriptionPrevious value: -"wait: the `link_id` of a persona_needed / request answer. Holds up to 75s and answers the moment the user saves the persona (persona_id), declines, or closes the window, else `still_waiting` (repeatable)."New value: +"wait: the link_id of a persona_needed / request answer." - removed
Input schema / properties / login_urlRemoved value: -{ - "description": "record_login: exact sign-in page URL when known; defaults to the persona's domain root (the AI finds the form from there). list / request: the site's sign-in page, carried into `create_url` so the new persona can record it.", - "type": "string" -} - removed
Input schema / properties / persona_id / descriptionRemoved value: -"Which persona — required for get / sign_in / record_login." - removed
Input schema / properties / waitRemoved value: -{ - "description": "list + domain: one call holds up to 75s for a persona for that site to appear. A link_id is awaited with action='wait'.", - "type": "boolean" -} - changed
Input schema / properties / why / descriptionPrevious value: -"request: one line the user sees in the window: why the account is needed."New value: +"request: one line the user sees in the window."
- Changed
writ_pin_workflow_tool2 fields changed- removed
Input schema / properties / pinned / descriptionRemoved value: -"true (default) pins; false unpins." - removed
Input schema / properties / workflowRemoved value: -{ - "description": "Workflow name (or workflow_id).", - "type": "string" -}
- Changed
writ_record_website11 fields changed- removed
Input schema / properties / auth_modeRemoved value: -{ - "description": "Browser recordings only: reuse verifies unknown saved auth before adoption; fresh_login records a new login without restoring old cookies, headers or storage. Device identity stays the same.", - "enum": [ - "reuse", - "fresh_login" - ], - "type": "string" -} - removed
Input schema / properties / deviceRemoved value: -{ - "description": "A linked Writ desktop's agent_id (writ_devices) to act on. Omitted: the desktop this connection chose with writ_devices action='use', if any.", - "type": "string" -} - removed
Input schema / properties / fresh_exitRemoved value: -{ - "description": "Residential only: skip the persona's usual exit for this site and draw a new address — after the site refused it (an IP rate limit, a sign-in rejected with correct credentials). Ignored on server-IP egress.", - "type": "boolean" -} - removed
Input schema / properties / goal / descriptionRemoved value: -"What should be recorded on the website, in plain language" - removed
Input schema / properties / human_layerRemoved value: -{ - "description": "Browser recordings only: native keyboard input, distance-adaptive mouse paths and pre-click dwell. Fresh login enables it by default; false explicitly disables it. Native actionability checks remain active.", - "type": "boolean" -} - removed
Input schema / properties / persona_id / descriptionRemoved value: -"Saved identity to sign in with (list them with writ_personas). Required for sites behind a login with 2FA — the one-time code is then minted server-side and never shown to the caller. A desktop persona ('device:…') records on its own desktop, which fills its values itself." - removed
Input schema / properties / residential_countryRemoved value: -{ - "description": "Two-letter ISO country the residential exit should be in (e.g. 'us', 'fr') — for a site that serves a different page per country, or throttles foreign traffic. Omit for an automatic exit. Ignored unless the session egresses residential.", - "type": "string" -} - removed
Input schema / properties / skip_existingRemoved value: -{ - "description": "API builds first propose the user's OWN matching workflows (replaying is instant and free); set true after the user declined those.", - "type": "boolean" -} - removed
Input schema / properties / skip_marketplaceRemoved value: -{ - "description": "API builds then propose compatible ready-made marketplace APIs; set true to skip that and record fresh.", - "type": "boolean" -} - removed
Input schema / properties / url / descriptionRemoved value: -"Website URL to start on (required)." - changed
Input schema / properties / use_residential / descriptionPrevious value: -"Open on the platform residential network (premium) for a site that blocks datacenter IPs or shows a bot wall. Default off (free datacenter egress)."New value: +"Residential network (bot walls)."
- Changed
writ_run_saved_crawl7 fields changed- removed
Input schema / properties / crawl / descriptionRemoved value: -"Saved crawl slug, name, or id (from writ_saved_crawls)." - removed
Input schema / properties / limitRemoved value: -{ - "description": "Rows of collected data to include (default 50).", - "type": "integer" -} - changed
Input schema / properties / max_age / descriptionPrevious value: -"Reuse the last completed crawl if it finished within this many seconds. 0 (default) always re-crawls."New value: +"Reuse a run younger than this (seconds)." - removed
Input schema / properties / outputRemoved value: -{ - "description": "Response shape, for an answer a program or an API consumes rather than a reader. {shape: 'envelope' (default: Writ's full answer, projected) | 'table' ({columns, rows, total}) | 'records' (bare list of records) | 'record' (the newest record alone: one entity, a usage meter, a dashboard), fields: ['used', 'percent_used as pct', 'items.0.price as first_price'] (ordered pick, renames, dotted paths; a missing path is null, so keys are stable), exclude: ['depth'], include_meta: false (page metadata content_kind/depth/thumbnails is stripped unless true), key: 'usage' (wrap)}. On writ_crawl_site with save_as it is saved as the API's default shape.", - "properties": { - "exclude": { - "items": { - "type": "string" - }, - "type": "array" - }, - "fields": { - "items": { - "type": "string" - }, - "type": "array" - }, - "include_meta": { - "type": "boolean" - }, - "key": { - "type": "string" - }, - "shape": { - "enum": [ - "envelope", - "table", - "records", - "record" - ], - "type": "string" - } - }, - "type": "object" -} - removed
Input schema / properties / preview_charsRemoved value: -{ - "description": "Cut each inline page's text cells to this many characters (default 12000; 0 = full). Full page: writ_workflow_data(workflow_id=<data_workflow_id>, refs=[...]).", - "type": "integer" -} - removed
Input schema / properties / timeout_secondsRemoved value: -{ - "description": "Max seconds to wait when wait=true.", - "type": "integer" -} - changed
Input schema / properties / wait / descriptionPrevious value: -"Hold until the crawl converges (default false: a crawl is slow)."New value: +"Hold until done."
- Changed
writ_run_workflow14 fields changed- removed
Input schema / properties / deviceRemoved value: -{ - "description": "Run on this linked Writ desktop (an agent_id from writ_devices) — overrides the desktop this connection chose with writ_devices action='use'.", - "type": "string" -} - changed
Input schema / properties / execution_target / descriptionPrevious value: -"Where this run executes: 'cloud' (managed fleet), 'auto' (prefer the user's OWN linked Writ desktop app when online, else cloud), or 'local' (require their own desktop app — keeps the run on their machine + IP). Omit to keep the workflow's own configured target. A 'local' run fails while that desktop app is offline; 'cloud' runs the same workflow on Writ's fleet, off the user's machine and IP."New value: +"cloud | auto | local (the user's own desktop app)." - removed
Input schema / properties / filesRemoved value: -{ - "additionalProperties": { - "type": "string" - }, - "description": "Optional file inputs for this run, as {slot: file_id}. Slot names come from the workflow's `file_slots` (writ_list_workflows); file_ids come from the account's file library. An upload step with a pinned file uses it when `files` is omitted; a value here swaps the file for this run only.", - "type": "object" -} - changed
Input schema / properties / function_name / descriptionPrevious value: -"One named function of a multi-function workflow (an API built with writ_website_to_api / writ_browser_compose define_function): only that function and the sign-in functions it depends on run. Omitted, the whole workflow runs. It is a control, never a workflow input."New value: +"One function of a multi-function workflow." - removed
Input schema / properties / function_namesRemoved value: -{ - "description": "Several functions in one run, in place of `function_name`: the union of their steps runs once, in recorded order (a prerequisite they share runs once). Not for a desktop (`local:`) workflow. A control, never a workflow input.", - "items": { - "type": "string" - }, - "type": "array" -} - changed
Input schema / properties / max_age / descriptionPrevious value: -"Optional. Reuse a previous result if it is younger than this many seconds, instead of running the workflow again. 0 (the default) always runs fresh. A reused result answers at once and costs nothing."New value: +"Reuse a result younger than this many seconds (free). 0 = fresh." - changed
Input schema / properties / mutation_mode / descriptionPrevious value: -"How a write function (one that creates/posts/sends/deletes) runs on this run. Default 'live': a run is an explicit call, so its writes are sent. 'dry_run' previews the request without sending it; 'private_test' sends it with the function's safe overrides. (Separately, BUILDING a function — define/compile/test — never sends a write, whatever this is.) Reads ignore this."New value: +"live (default) | dry_run (preview, nothing sent) | private_test." - removed
Input schema / properties / outputRemoved value: -{ - "description": "Response shape, for an answer a program or an API consumes rather than a reader. {shape: 'envelope' (default: Writ's full answer, projected) | 'table' ({columns, rows, total}) | 'records' (bare list of records) | 'record' (the newest record alone: one entity, a usage meter, a dashboard), fields: ['used', 'percent_used as pct', 'items.0.price as first_price'] (ordered pick, renames, dotted paths; a missing path is null, so keys are stable), exclude: ['depth'], include_meta: false (page metadata content_kind/depth/thumbnails is stripped unless true), key: 'usage' (wrap)}. On writ_crawl_site with save_as it is saved as the API's default shape.", - "properties": { - "exclude": { - "items": { - "type": "string" - }, - "type": "array" - }, - "fields": { - "items": { - "type": "string" - }, - "type": "array" - }, - "include_meta": { - "type": "boolean" - }, - "key": { - "type": "string" - }, - "shape": { - "enum": [ - "envelope", - "table", - "records", - "record" - ], - "type": "string" - } - }, - "type": "object" -} - changed
Input schema / properties / persona_id / descriptionPrevious value: -"Run AS this saved identity (see writ_personas) — the run signs in with the persona's warm session. Omit to use the workflow's default persona, if it has one. A persona of the user's linked DESKTOP (`device:<agent>:<id>`, source='device' in writ_personas) sends the run to that desktop, which signs in from its own vault: the credentials never leave it."New value: +"Run as this saved identity." - removed
Input schema / properties / residential_countryRemoved value: -{ - "description": "Two-letter ISO-3166 exit country for this call (for example ca, us, fr). Keep it aligned with the requested storefront, coordinates or delivery market. It is applied when the run uses residential egress.", - "type": "string" -} - removed
Input schema / properties / timeout_secondsRemoved value: -{ - "description": "Max seconds to wait for completion (default 120).", - "type": "integer" -} - removed
Input schema / properties / use_residentialRemoved value: -{ - "description": "Per-call network override for an owned workflow: true uses the platform residential network, false disables the workflow's residential default. For geo-sensitive sites and sites that block datacenter addresses.", - "type": "boolean" -} - removed
Input schema / properties / waitRemoved value: -{ - "description": "Wait for completion and return the data (default true).", - "type": "boolean" -} - changed
Input schema / properties / workflow_id / descriptionPrevious value: -"A number, or `local:<id>` for a workflow that lives on the user's linked Writ desktop (writ_list_workflows, runs_on='desktop') - it runs there, signed in as one of that desktop's personas when persona_id is `device:...`."New value: +"A number, or 'local:<id>' (a workflow on the user's desktop)."
- Changed
writ_saved_crawl_data4 fields changed- removed
Input schema / properties / crawl / descriptionRemoved value: -"Saved crawl slug, name, or id." - removed
Input schema / properties / limit / descriptionRemoved value: -"Rows to return (default 25)." - removed
Input schema / properties / outputRemoved value: -{ - "description": "Response shape, for an answer a program or an API consumes rather than a reader. {shape: 'envelope' (default: Writ's full answer, projected) | 'table' ({columns, rows, total}) | 'records' (bare list of records) | 'record' (the newest record alone: one entity, a usage meter, a dashboard), fields: ['used', 'percent_used as pct', 'items.0.price as first_price'] (ordered pick, renames, dotted paths; a missing path is null, so keys are stable), exclude: ['depth'], include_meta: false (page metadata content_kind/depth/thumbnails is stripped unless true), key: 'usage' (wrap)}. On writ_crawl_site with save_as it is saved as the API's default shape.", - "properties": { - "exclude": { - "items": { - "type": "string" - }, - "type": "array" - }, - "fields": { - "items": { - "type": "string" - }, - "type": "array" - }, - "include_meta": { - "type": "boolean" - }, - "key": { - "type": "string" - }, - "shape": { - "enum": [ - "envelope", - "table", - "records", - "record" - ], - "type": "string" - } - }, - "type": "object" -} - removed
Input schema / properties / preview_charsRemoved value: -{ - "description": "Cut string cells (page markdown) to this many characters (default 2000; 0 = full cells). Full single pages: writ_workflow_data(refs=...) per the response hint.", - "type": "integer" -}
- Changed
writ_saved_crawls1 field changed- removed
Input schema / properties / limit / descriptionRemoved value: -"Max saved crawls to return (default 50)."
- Changed
writ_scrape12 fields changed- removed
Input schema / properties / deviceRemoved value: -{ - "description": "A linked Writ desktop's agent_id (writ_devices) to act on. Omitted: the desktop this connection chose with writ_devices action='use', if any.", - "type": "string" -} - changed
Input schema / properties / format / descriptionPrevious value: -"markdown (default): the page's clean main content. html: the raw HTML as fetched (same egress/persona/render) — for selectors, embedded JSON, anything the cleaned text drops; clipped to preview_chars (default 40000, 0 = whole page). both: html plus the markdown derived from it, one fetch. Single `url` only."New value: +"markdown (default) | html (raw HTML) | both." - removed
Input schema / properties / include_pathsRemoved value: -{ - "description": "With top_n: regex(es) the item links match (e.g. 'item\\\\?id=', '/products/'). Optional: the server detects detail links when omitted.", - "items": { - "type": "string" - }, - "type": "array" -} - changed
Input schema / properties / persona_id / descriptionPrevious value: -"Saved identity to read as (writ_personas lists them), for pages behind a login. Forces the identity's own residential exit. A desktop persona ('device:…') reads on its own desktop, from that machine."New value: +"Read signed in as this saved identity (writ_personas)." - removed
Input schema / properties / preview_charsRemoved value: -{ - "description": "Cut each page's text to this many characters (default 12000; 0 = full pages).", - "type": "integer" -} - changed
Input schema / properties / render_mode / descriptionPrevious value: -"auto (default: plain HTTP, browser only if the page needs JS) | http | browser."New value: +"auto (default: HTTP, a browser when the page needs JS) | http | browser." - removed
Input schema / properties / residential_countryRemoved value: -{ - "description": "Two-letter ISO country the residential exit should be in (e.g. 'us', 'fr'), also used by the automatic residential retry on a blocked page. Omitted = an automatic exit. Ignored unless the session egresses residential.", - "type": "string" -} - removed
Input schema / properties / respect_robotsRemoved value: -{ - "description": "Apply robots.txt to the explicitly requested page(s). Default false for scrape; writ_crawl_site defaults true for autonomous discovery.", - "type": "boolean" -} - changed
Input schema / properties / top_n / descriptionPrevious value: -"With `url` = a listing/front/search/category page: also read its N top-ranked item pages (the page's link order is the ranking). One call, parallel."New value: +"With url = a listing: also read its N top-ranked item pages (max 20)." - removed
Input schema / properties / url / descriptionRemoved value: -"A page to read or, with `top_n`, the listing page whose top items are read." - changed
Input schema / properties / urls / descriptionPrevious value: -"Known pages to read together (max 20), fetched in parallel in one call."New value: +"Up to 20 known pages, read in parallel." - changed
Input schema / properties / use_residential / descriptionPrevious value: -"Fetch through the platform residential network (premium) for a site that blocks datacenter IPs or shows a bot wall. Default off."New value: +"Residential network for a bot wall (automatic retry when refused)."
- Changed
writ_search_data5 fields changed- removed
Input schema / properties / deviceRemoved value: -{ - "description": "A linked Writ desktop's agent_id (writ_devices) to act on. Omitted: the desktop this connection chose with writ_devices action='use', if any.", - "type": "string" -} - removed
Input schema / properties / limit / descriptionRemoved value: -"Rows per workflow (default 10)." - removed
Input schema / properties / preview_charsRemoved value: -{ - "description": "Cut matched string cells to this many characters (default 300; 0 = full cells).", - "type": "integer" -} - removed
Input schema / properties / q / descriptionRemoved value: -"Search term (required)." - removed
Input schema / properties / workflowRemoved value: -{ - "type": "string" -}
- Changed
writ_set_schedule10 fields changed- changed
Input schema / properties / days / descriptionPrevious value: -"ISO weekdays for weekly: 1=Mon .. 7=Sun."New value: +"Weekdays 1=Mon..7=Sun (weekly)." - removed
Input schema / properties / enabledRemoved value: -{ - "description": "Schedule on or off (default on).", - "type": "boolean" -} - changed
Input schema / properties / every_minutes / descriptionPrevious value: -"Interval schedule: minutes between runs."New value: +"Interval in minutes." - removed
Input schema / properties / functionRemoved value: -{ - "description": "One function name (alias of `functions`); \"\" or \"all\" = the whole workflow.", - "type": "string" -} - removed
Input schema / properties / functionsRemoved value: -{ - "description": "Function names a scheduled run calls (from writ_list_workflows / writ_update_workflow). [] or [\"all\"] = the whole workflow. Omitted: current target kept.", - "items": { - "type": "string" - }, - "type": "array" -} - removed
Input schema / properties / inputsRemoved value: -{ - "description": "Scheduled-run inputs {input_name: value} (text, number, true/false), used over the workflow's saved values for scheduled runs only. {} clears them; omitted keeps them. No secrets: those are workflow secrets or a persona.", - "type": "object" -} - changed
Input schema / properties / kind / descriptionPrevious value: -"interval | daily | weekly"New value: +"interval | daily | weekly." - changed
Input schema / properties / time / descriptionPrevious value: -"HH:MM local time for daily/weekly."New value: +"HH:MM (daily/weekly)." - changed
Input schema / properties / tz / descriptionPrevious value: -"IANA timezone for daily/weekly."New value: +"IANA timezone." - removed
Input schema / properties / workflowRemoved value: -{ - "type": "string" -}
- Changed
writ_update_saved_crawl5 fields changed- removed
Input schema / properties / crawl / descriptionRemoved value: -"Saved crawl slug, name, or id." - removed
Input schema / properties / default_max_age_secondsRemoved value: -{ - "minimum": 0, - "type": "integer" -} - removed
Input schema / properties / descriptionRemoved value: -{ - "type": "string" -} - removed
Input schema / properties / nameRemoved value: -{ - "type": "string" -} - changed
Input schema / properties / settings / descriptionPrevious value: -"Sparse crawl config patch merged recursively into the complete saved settings."New value: +"Sparse settings patch."
- Changed
writ_update_workflow17 fields changed- removed
Input schema / properties / expected_updated_atRemoved value: -{ - "description": "Workflow timestamp returned by inspection; checked under the row lock.", - "type": "string" -} - removed
Input schema / properties / function_nameRemoved value: -{ - "description": "Source of this function only.", - "type": "string" -} - removed
Input schema / properties / function_updatesRemoved value: -{ - "items": { - "additionalProperties": false, - "properties": { - "expected_hash": { - "description": "Expected whole-step hash from inspection.", - "type": "string" - }, - "function_name": { - "type": "string" - }, - "json_edits": { - "items": { - "additionalProperties": false, - "properties": { - "op": { - "enum": [ - "test", - "add", - "replace", - "remove" - ], - "type": "string" - }, - "path": { - "type": "string" - }, - "value": {} - }, - "required": [ - "op", - "path" - ], - "type": "object" - }, - "type": "array" - }, - "patch": { - "description": "Sparse type/config/enabled patch; object keys merge, arrays replace.", - "type": "object" - }, - "script_edits": { - "items": { - "additionalProperties": false, - "properties": { - "expected_hash": { - "type": "string" - }, - "new": { - "type": "string" - }, - "old": { - "type": "string" - }, - "path": { - "type": "string" - } - }, - "required": [ - "path", - "old", - "new" - ], - "type": "object" - }, - "type": "array" - }, - "step_id": { - "type": "string" - } - }, - "required": [ - "function_name" - ], - "type": "object" - }, - "maxItems": 50, - "minItems": 1, - "type": "array" -} - removed
Input schema / properties / limitRemoved value: -{ - "maximum": 100, - "minimum": 1, - "type": "integer" -} - removed
Input schema / properties / max_charsRemoved value: -{ - "maximum": 20000, - "minimum": 1000, - "type": "integer" -} - removed
Input schema / properties / offsetRemoved value: -{ - "minimum": 0, - "type": "integer" -} - removed
Input schema / properties / operatorRemoved value: -{ - "description": "section=contract: one operator, with its operands, semantics and example.", - "type": "string" -} - removed
Input schema / properties / patchRemoved value: -{ - "description": "Sparse settings patch. Supports every WorkflowUpdate field except credentials and captured recorded_session material, which vault/persona/session management own. human_behavior: 'on' types text using keyboard events every browser run; 'auto' does so on a bot-block retry; 'off' disables the default.", - "type": "object" -} - removed
Input schema / properties / pathRemoved value: -{ - "description": "JSON Pointer into the selected step, e.g. /config/flow/steps/2 or /config/script.", - "type": "string" -} - removed
Input schema / properties / regenerate_skillRemoved value: -{ - "description": "Rebuild the workflow's agent skill (SKILL.md) from its current functions, inputs and sign-in, replacing any edited version; the answer carries the new skill_md. Runs after any patch in the same call.", - "type": "boolean" -} - removed
Input schema / properties / replace_stepsRemoved value: -{ - "description": "Complete recorded-step replacement; step_updates is the targeted edit.", - "items": { - "type": "object" - }, - "type": "array" -} - removed
Input schema / properties / sectionRemoved value: -{ - "description": "source reads a source window; flow lists nested node paths; contract lists operators and their semantics without requiring a workflow.", - "enum": [ - "source", - "flow", - "contract" - ], - "type": "string" -} - removed
Input schema / properties / step_idRemoved value: -{ - "description": "Stable step id that picks one step of a multi-step function.", - "type": "string" -} - removed
Input schema / properties / step_updatesRemoved value: -{ - "items": { - "properties": { - "index": { - "description": "Zero-based step index.", - "type": "integer" - }, - "patch": { - "description": "Sparse step patch: id, type, enabled, and/or nested config. Config is merged recursively.", - "type": "object" - } - }, - "required": [ - "index", - "patch" - ], - "type": "object" - }, - "type": "array" -} - removed
Input schema / properties / validate_onlyRemoved value: -{ - "description": "Preview/validate without saving or executing.", - "type": "boolean" -} - removed
Input schema / properties / verboseRemoved value: -{ - "description": "Edits answer with the full workflow definition instead of the compact step outline (default false).", - "type": "boolean" -} - removed
Input schema / properties / workflowRemoved value: -{ - "description": "Workflow name (or workflow_id).", - "type": "string" -}
- Changed
writ_website_to_api18 fields changed- removed
Input schema / properties / ai_superviseRemoved value: -{ - "description": "AI-supervised crawl rungs (mode=crawl/browser; default true): after the crawl mines forms, POSTs, query links, scripts and listings, one bounded Writ AI call authors the API from them — which functions serve the goal, their names, inputs and example values; the live verify call then measures each response shape. false = the purely mechanical surface map (no AI spend on the crawl rungs).", - "type": "boolean" -} - removed
Input schema / properties / anonymousRemoved value: -{ - "description": "Builds from what is visible without an account even though the site shows a sign-in page; for when the user said the public part is enough.", - "type": "boolean" -} - removed
Input schema / properties / build_id / descriptionRemoved value: -"Continues a parked build (status needs_guidance from writ_discovery_status) on the guided rung: opens the browser bound to it, seeded with its map." - removed
Input schema / properties / deviceRemoved value: -{ - "description": "A linked Writ desktop's agent_id (writ_devices) to act on. Omitted: the desktop this connection chose with writ_devices action='use', if any.", - "type": "string" -} - removed
Input schema / properties / execution_targetRemoved value: -{ - "description": "'cloud' (the fleet) or a linked desktop's agent_id: builds there, in its own browser and connection. Omitted = the desktop chosen with writ_devices, else the cloud.", - "type": "string" -} - removed
Input schema / properties / goal / descriptionRemoved value: -"What the API should return or do, in plain language. Matched to the user's own workflows and marketplace listings first; narrows the crawl to what was asked (equivalent to `scope`) instead of mapping the whole app." - removed
Input schema / properties / levelRemoved value: -{ - "description": "Write policy for the crawl rungs. 'light' (default) captures every endpoint and payload but never performs a real create/update/delete. 'deep' performs each write once to capture its real confirmation response, so it changes real data; opt-in, for an explicit request.", - "enum": [ - "light", - "deep" - ], - "type": "string" -} - changed
Input schema / properties / mode / descriptionPrevious value: -"intelligent (default): the full ladder driven by Writ — the AI fast path (a live browser, a few AI steps, every function live-tested), then Writ's own AI browser rung only if needed. guided: a browser bound to a build that the caller drives and composes (sign in, capture_network, define_function, save); with build_id it continues a parked build and inherits its map. 'auto': the same ladder with the caller as the last rung — own workflows and marketplace proposed first, then the fast path; not enough => the build parks as needs_guidance, to finish guided. 'fast' = starts on the fast path. 'crawl' / 'browser' = the whole-site static / rendered crawl (unverified maps). For compatibility, regular/deep remain aliases of guided."New value: +"intelligent (default, Writ builds it) | guided (the caller drives) | auto | fast | crawl | browser." - removed
Input schema / properties / persona_id / descriptionRemoved value: -"Saved identity to sign in with (writ_personas). Without one, a site whose entry page is a sign-in wall is not built: the answer names the persona to pass, or returns `persona_needed` with `tell_user` (a message for the user) and `create_url`; a later call with the new persona_id builds. Required for 2FA: the code is minted server-side and never reaches the caller." - removed
Input schema / properties / residential_countryRemoved value: -{ - "description": "Two-letter ISO country the residential exit should be in (e.g. 'us', 'fr'); applies to every rung of the build, the guided browser included. No value means an automatic exit. Ignored unless the session egresses residential.", - "type": "string" -} - removed
Input schema / properties / respect_robotsRemoved value: -{ - "description": "Crawl rungs (mode=crawl/browser) obey the site's robots.txt (default true). false is for a target the user vouches for after a rung reported robots.txt refused the crawl (`escalations` / `message` name the rule); otherwise such a rung fetches nothing and the build goes straight to a browser. Does not apply to the AI or guided browser rungs.", - "type": "boolean" -} - removed
Input schema / properties / save_as / descriptionRemoved value: -"Name for the workflow the build saves." - removed
Input schema / properties / scopeRemoved value: -{ - "description": "Crawl lanes: maps only this surface (e.g. 'employees') and what it depends on. No value maps the whole app.", - "type": "string" -} - changed
Input schema / properties / skip_existing / descriptionPrevious value: -"Skips the proposal of the user's own matching workflows (for after they declined)."New value: +"Skip the proposal of the user's own matching workflows." - changed
Input schema / properties / skip_marketplace / descriptionPrevious value: -"Skips the ready-made marketplace proposals and builds fresh."New value: +"Skip the marketplace proposals." - removed
Input schema / properties / url / descriptionRemoved value: -"The page that already shows the rows (search-results, category or listing URL), not the home page. Required unless build_id continues a parked build." - removed
Input schema / properties / use_residentialRemoved value: -{ - "description": "Runs on the platform residential network (premium), for a site that blocks datacenter IPs. Default off. Continuing a build (build_id) keeps the build's own persona, residential exit and country unless these fields are passed.", - "type": "boolean" -} - removed
Input schema / requiredRemoved value: -[]
- Changed
writ_wire_monitor21 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"What to do on a detected change."New value: +"notify | workflow | ai_task." - removed
Input schema / properties / ai_session_idRemoved value: -{ - "description": "action='ai_task': re-run this saved AI session instead of (or as well as) a prompt.", - "type": "integer" -} - changed
Input schema / properties / buy / descriptionPrevious value: -"action='workflow': the workflow is a checkout and runs as a purchase. action='ai_task' (with a `prompt` saying what to buy): an AI purchase session browses to the order page and Writ checks out. Always saved with dry_run on (a rehearsal that places no order), whatever is sent; the user arms real purchases in the Writ app. Cloud monitors only; an AI purchase session can't use device_card."New value: +"Run the workflow or task as a purchase (saved as a rehearsal until armed)." - removed
Input schema / properties / buy / propertiesRemoved value: -{ - "commit_selector": { - "description": "action='workflow' only: the place-order button on the final page (CSS, at most 500 characters). Never click it: Writ clicks it during a live buy. A live buy needs it (or a recorded order step, or fallback_ai_session).", - "type": "string" - }, - "confirm_over": { - "description": "Ask for approval only above this amount (default: the threshold).", - "type": "number" - }, - "fallback_ai_session": { - "description": "action='workflow' only: when the recorded checkout fails at fire time, or has no order step, wake one AI purchase session with the same limits (once per fire).", - "type": "boolean" - }, - "max_amount": { - "description": "AI purchase session: the most one order may cost (0.01-10000). The page and the agent may lower it, never raise it.", - "type": "number" - }, - "payment": { - "description": "Required. {kind, ref}: kind vault_card | virtual_card | device_card (ref = the card's id from writ_payment action='list', or an approved grant's payment.ref) or merchant_saved (the card saved on the store account; no ref).", - "properties": { - "kind": { - "enum": [ - "vault_card", - "virtual_card", - "device_card", - "merchant_saved" - ], - "type": "string" - }, - "ref": { - "type": "string" - } - }, - "required": [ - "kind" - ], - "type": "object" - }, - "price_buffer_pct": { - "description": "Tax and shipping allowance over the price, 0-100 (default 20).", - "type": "number" - }, - "require_confirmation": { - "description": "Hold a purchase for the user's approval (default true).", - "type": "boolean" - }, - "spend_cap": { - "description": "Most the automation may spend per period: {amount, period: day|week|month} or a number (per day). Default with a threshold: one buy at the threshold plus the buffer, per day.", - "type": [ - "object", - "number" - ] - }, - "total_selector": { - "description": "CSS selector of the order total on the checkout page; the run stops before placing an order whose total is above the allowed amount.", - "type": "string" - } -} - removed
Input schema / properties / buy / requiredRemoved value: -[ - "payment" -] - changed
Input schema / properties / channels / descriptionPrevious value: -"Notification channels, e.g. [\"pushover\",\"email\"] — required for action='notify'; optional with action='ai_task' (finish alert)."New value: +"Notification channels, e.g. [\"email\",\"pushover\"]." - removed
Input schema / properties / cooldown_minutesRemoved value: -{ - "description": "action='ai_task': minimum minutes between wakes (default 10; 0 disables).", - "type": "integer" -} - removed
Input schema / properties / deviceRemoved value: -{ - "description": "A linked Writ desktop's agent_id (writ_devices) to act on. Omitted: the desktop this connection chose with writ_devices action='use', if any.", - "type": "string" -} - removed
Input schema / properties / enabledRemoved value: -{ - "type": "boolean" -} - removed
Input schema / properties / entry_urlRemoved value: -{ - "description": "action='ai_task': page the agent starts on (defaults to the monitored URL).", - "type": "string" -} - removed
Input schema / properties / max_stepsRemoved value: -{ - "description": "action='ai_task': cap on agent steps per wake (default 20, max 100).", - "type": "integer" -} - removed
Input schema / properties / messageRemoved value: -{ - "description": "Notification body template (supports {{event.url}}).", - "type": "string" -} - removed
Input schema / properties / monitor_id / descriptionRemoved value: -"Monitor id from writ_create_monitor." - removed
Input schema / properties / nameRemoved value: -{ - "description": "Optional automation name.", - "type": "string" -} - changed
Input schema / properties / prompt / descriptionPrevious value: -"action='ai_task': what the agent does when the monitor fires, e.g. \"Check whether the price dropped below $500 and summarize what changed\". Supports {{placeholders}} like {{diff_snippet}} and {{extracted.price}}. With `buy`, say exactly what to buy (product, quantity, options, shipping)."New value: +"action='ai_task': what the agent does." - changed
Input schema / properties / recipients / descriptionPrevious value: -"Notification recipients, e.g. [\"pushover:1\"]. Omitted = every enabled recipient on the channel; the answer names who the alert actually reaches, and warns when nobody is configured."New value: +"e.g. [\"email:3\"]; omitted = every enabled recipient." - changed
Input schema / properties / threshold / descriptionPrevious value: -"Price watch: act only when the watched price reaches this number (e.g. 477.04), once; by default at or below it (see `threshold_op`), and a price on the other side, or one the page no longer shows, does nothing. Needs a monitor that reads the price (a selector or extract, not a visual zone). Without it, any change fires. Works for a desktop monitor too (`device`)."New value: +"Price watch: act once when the price reaches this number." - changed
Input schema / properties / threshold_op / descriptionPrevious value: -"Which side of `threshold` fires: lte = at or below (default: \"drops to 477.04\" fires at 477.04), lt = strictly below (\"below / under / less than\"), gte = at or above, gt = strictly above (a rise alert)."New value: +"lte (default) | lt | gte | gt." - removed
Input schema / properties / titleRemoved value: -{ - "type": "string" -} - removed
Input schema / properties / workflow / descriptionRemoved value: -"Workflow to run (name) — required for action='workflow'." - removed
Input schema / properties / workflow_idRemoved value: -{ - "type": "integer" -}
- Changed
writ_workflow_data7 fields changed- removed
Input schema / properties / deviceRemoved value: -{ - "description": "A linked Writ desktop's agent_id (writ_devices) to act on. Omitted: the desktop this connection chose with writ_devices action='use', if any.", - "type": "string" -} - removed
Input schema / properties / outputRemoved value: -{ - "description": "Response shape, for an answer a program or an API consumes rather than a reader. {shape: 'envelope' (default: Writ's full answer, projected) | 'table' ({columns, rows, total}) | 'records' (bare list of records) | 'record' (the newest record alone: one entity, a usage meter, a dashboard), fields: ['used', 'percent_used as pct', 'items.0.price as first_price'] (ordered pick, renames, dotted paths; a missing path is null, so keys are stable), exclude: ['depth'], include_meta: false (page metadata content_kind/depth/thumbnails is stripped unless true), key: 'usage' (wrap)}. On writ_crawl_site with save_as it is saved as the API's default shape.", - "properties": { - "exclude": { - "items": { - "type": "string" - }, - "type": "array" - }, - "fields": { - "items": { - "type": "string" - }, - "type": "array" - }, - "include_meta": { - "type": "boolean" - }, - "key": { - "type": "string" - }, - "shape": { - "enum": [ - "envelope", - "table", - "records", - "record" - ], - "type": "string" - } - }, - "type": "object" -} - removed
Input schema / properties / preview_charsRemoved value: -{ - "description": "Cut string cells to this many characters (default 2000; 0 = full cells).", - "type": "integer" -} - removed
Input schema / properties / q / descriptionRemoved value: -"Substring filter across fields." - changed
Input schema / properties / refs / descriptionPrevious value: -"Hydration: full untruncated records by ref '<run_id>:<record_index>' (both fields are on every row). Max 100."New value: +"Full records by '<run_id>:<record_index>'." - removed
Input schema / properties / viewRemoved value: -{ - "description": "all | latest | run", - "type": "string" -} - removed
Input schema / properties / workflowRemoved value: -{ - "type": "string" -}
- Changed
writ_workflow_runs3 fields changed- removed
Input schema / properties / deviceRemoved value: -{ - "description": "A linked Writ desktop's agent_id (writ_devices) to act on. Omitted: the desktop this connection chose with writ_devices action='use', if any.", - "type": "string" -} - changed
Input schema / properties / status / descriptionPrevious value: -"pending|running|success|failed|cancelled|skipped"New value: +"Filter by status." - removed
Input schema / properties / workflowRemoved value: -{ - "type": "string" -}
1 tool update
- Changed
writ_personas2 fields changed- added
Input schema / properties / deviceAdded value: +{ + "description": "A linked Writ desktop's agent_id (writ_devices) to act on. Omitted: the desktop this connection chose with writ_devices action='use', if any.", + "type": "string" +} - added
Input schema / properties / execution_targetAdded value: +{ + "description": "list / request: 'cloud' asks for a Writ Cloud persona (cloud runs) even when this connection is scoped to a desktop.", + "enum": [ + "cloud" + ], + "type": "string" +}
39 tool updates
- First observed
writ_browser_act - First observed
writ_browser_ask_user - First observed
writ_browser_cancel - First observed
writ_browser_compose - First observed
writ_browser_context - First observed
writ_browser_network - First observed
writ_browser_save - First observed
writ_browser_sessions - First observed
writ_browser_use - First observed
writ_crawl_files - First observed
writ_crawl_site - First observed
writ_crawl_status - First observed
writ_create_automation - First observed
writ_create_http_extraction - First observed
writ_create_monitor - First observed
writ_devices - First observed
writ_diagnose_http_workflow - First observed
writ_discovery_status - First observed
writ_export_data - First observed
writ_expose_workflow_api - First observed
writ_list_webhooks - First observed
writ_list_workflows - First observed
writ_payment - First observed
writ_personas - First observed
writ_pin_workflow_tool - First observed
writ_record_website - First observed
writ_run_saved_crawl - First observed
writ_run_workflow - First observed
writ_saved_crawl_data - First observed
writ_saved_crawls - First observed
writ_scrape - First observed
writ_search_data - First observed
writ_set_schedule - First observed
writ_update_saved_crawl - First observed
writ_update_workflow - First observed
writ_website_to_api - First observed
writ_wire_monitor - First observed
writ_workflow_data - First observed
writ_workflow_runs
Related MCP Connectors
Websites as APIs: read pages, run site tasks via learned APIs, cloud browser with saved logins.
Automate any website: discover, run and create browser scripts that work behind logins.
AI-powered browser automation — navigate, click, fill forms, and extract data from any website.
Let your AI agent operate any website through a real, logged-in browser session.
Related MCP Servers
- FlicenseNot gradedqualityBmaintenanceEnables AI assistants to browse websites, extract information, fill forms, interact with pages, and execute multi-step web tasks autonomously.-
- AlicenseNot gradedqualityCmaintenanceLets AI assistants control your real Chrome browser to perform web tasks like reading pages, taking screenshots, clicking, and typing, using your existing logged-in sessions.145MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to call typed tools compiled from ordinary websites, performing reads and verified writes through their web UIs and returning data, screenshots, and execution traces.MIT
- AlicenseNot gradedqualityDmaintenanceAutomate web browsing and data extraction by converting live pages into clean Markdown. Execute multi-step workflows and interact with websites using human-like movements.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.