Skip to main content
PATCH
Update a skill
Send only what you want to change. You get back the skill as Get a skill returns it, plus changes (what changed, in words), warnings, and login. Inputs and output fields. Renaming one renames it in the skill’s steps too. Removing an input the steps still use returns 422 naming the step. A new input with recorded_value (the value the recording typed or opened) replaces that value on each run; without it the input is added but changes nothing yet. A change to the steps becomes a new version. To add output fields, use Improve a skill with mode: "add_fields": the skill has to learn where they are. Who. The owner or a workspace editor. login_id and visibility are owner only, and a login is only used on the owner’s own runs. Needs skills:write. MCP tool: update_skill.

Authorizations

Authorization
string
header
required

API key with the vd_sk_ prefix, as Authorization: Bearer vd_sk_.... Create keys in Settings → API Keys.

Headers

Idempotency-Key
string

Any unique string (such as your order id). Resending the same request with the same key within 24 hours returns the first answer (with Idempotent-Replayed: true) and does nothing twice; the same key with a different request is a 422 idempotency_key_reused.

Required string length: 1 - 255

Path Parameters

slug
string
required

Body

application/json

Every key is optional; an absent key leaves that setting as it is. To ADD output fields, use POST /v1/skills/{slug}/improve with mode add_fields (the skill has to learn where they are).

name
string | null
Required string length: 1 - 100
description
string | null
Maximum string length: 500
inputs
InputsPatch · object | null
outputs
OutputsPatch · object | null
default_max_results
integer | null

Rows a run returns when the caller does not say; 0 = all

Required range: 0 <= x <= 500
browser_type
string | null

'remote' | 'extension' | 'none'; '' clears it

proxy_config
string | null

'identity', 'residential', 'residential:', a country code, 'random' or 'none'; null, '' or 'automatic' = automatic

profile_id
string | null

The owner's browser profile id; '' removes it

scrape_mode
string | null

'deep' | 'flash'; '' clears it

data_retention_days
integer | null
Required range: 1 <= x <= 90
login_id
string | null

The owner's saved login; null or '' removes it (needs the logins:write scope)

visibility
enum<string> | null

private: only you. workspace: shared with a team workspace (owner only)

Available options:
private,
workspace
workspace_id
string | null

With visibility=workspace: which team workspace (needed when you are in several)

Response

The skill after the change.

The skill after the edit (the GET /v1/skills/{slug} shape), and what changed.

id
string
required
owner_id
string
required
name
string
required
slug
string
required
description
string | null
required
version
string
required
visibility
enum<string>
required

Skill visibility settings.

Available options:
private,
public
status
enum<string>
required

Skill lifecycle status.

Available options:
draft,
active,
published,
deprecated
parameters
SkillParameter · object[]
required
output_schema
Output Schema · object
required
category
string | null
required
tags
string[]
required
total_runs
integer
required
total_clones
integer
required
is_official
boolean
required
created_at
string<date-time>
required
published_at
string<date-time> | null
required
creator_id
string
required
workspace_id
string | null
validation_status
string | null
validation_reason
string | null
validation_diagnosis
Validation Diagnosis · object | null
validated_at
string<date-time> | null
image_url
string | null
target_domain
string | null
sample_output
Sample Output · object
start_url
string | null
rating
number | null
user_rating
number | null
has_cloned
boolean
default:false
user_cloned_skill_id
string | null
update_frequency
string
default:manual
data_retention_days
integer
default:90
last_run_at
string<date-time> | null
next_run_at
string<date-time> | null
health_status
string
default:unknown
success_rate
number
default:0
last_run
RunSummary · object | null

The last finished run of a skill or workflow, as a list row shows it.

running_run_id
string | null
smart_suggestions
Smart Suggestions · object | null
enriched_fields
string[]
expected_shapes
Expected Shapes · object
default_max_results
integer | null
default_max_pages
integer | null
browser_type
string | null
profile_id
string | null
login_id
string | null
skill_type
string | null
updated_at
string<date-time> | null
proxy_config
string | null
scrape_mode
string | null
scrape_mode_applies
boolean
default:false
creator_name
string | null
creator_avatar_url
string | null
cloned_from_id
string | null
cloned_from_name
string | null
is_monetized
boolean
default:false
base_run_cost
integer
default:0
avg_duration_seconds
number | null
clones_this_week
integer
default:0
uses_remote_browser
boolean
default:false
llm_model
string
default:GEMINI 3.5 FLASH
total_ratings
integer
default:0
rating_breakdown
Rating Breakdown · object | null
reviews
Reviews · object[]
api_endpoint
string | null
config_id
string | null
health
SkillHealth · object | null
input_schema
Input Schema · object
output_json_schema
Output Json Schema · object
reliability
SkillReliability · object

Lifetime aggregates kept on the skill row (updated by every terminal run), plus the rolling window over the last 20 runs (app/published_skills/reliability.py).

runs_endpoint
string | null
recipe_version
integer | null
pinned_recipe_version
integer | null
versions_endpoint
string | null
fast_path
string | null
tiers
Tiers · object
login
LoginOut · object | null

A saved login as every caller sees it: never the password, seed or a code.

changes
string[]
warnings
string[]