Press / to search

All documentation
docs Operate Marketplace

Runs onWrit Cloud

marketplace ▸ install ▸ bind ▸ run

Someone already built it.

A listing is a workflow or an automation that someone else got working, shared as something you can run. You install it — free — bind your own logins and inputs into the slots it declares, and run it: POST /api/marketplace/listings/{slug}/run. You run a listing; you do not read it.

A creator never receives your credentials, and you never receive their steps. Bindings are the seam that keeps both true.

browse ▸ filters

Find one that already works.

GET /api/marketplace/listings takes the filters below, and GET /api/marketplace/listings/{slug} reads one in full. Results carry measured performance, not adjectives.

FilterValues
q · category · tagFree text, category, tag.
asset_typeworkflow | automation
sortrank | fastest | success | on_time | newest | most_used
capability_key · target_siteWhat it does, and which site it does it on.
min_success_rateFloor on measured success.
max_p50_latency_ms · max_p95_latency_msCeilings on measured latency.
min_on_time_rateHow often it finishes inside its promised baseline.
min_reputation_tierrising | trusted | top
verified_only · established_onlyNarrow to verified or long-standing creators.
limit · offsetlimit 1–100, default 24.

What a listing card tells you

Every card carries the same measured signals, so two listings for the same job are directly comparable:

  • Latency, success rate and on-time rate — measured from real runs.
  • A failure-spike flag when recent runs have got worse.
  • The creator’s reputation tier.
  • Its rank inside the capability set it competes in.

install ▸ free

Installing is free, and it is idempotent.

POST /api/marketplace/listings/{slug}/install puts the listing on your account. Calling it twice does not install it twice — an install is idempotent per account and listing. What lands is a frozen, data-less snapshot: the steps plus the manifest of slots it needs, with the creator’s credentials stripped at publish.

Nothing in the marketplace is for sale. Installing costs nothing, the creator charges nothing, and a run costs only Writ platform compute — free and unmetered on your own machine, metered by running time on the managed cloud fleet.

bindings ▸ the seam

You bind your own credentials. That is the whole design.

A listing declares slots: the login it needs, the secret it needs, the inputs it takes. It does not ship the creator’s. You fill the slots with things you own, and a run resolves them from your bindings and from nowhere else. Read the slots with GET /api/marketplace/installs/{slug}/manifest before or after you install.

slot_kindWhat goes in it
personaA saved login identity. Workflow and automation installs.
secretA reference to a secret in your vault, never the value itself.
inputA plain value the workflow takes.
monitor_urlAutomation installs: the page to watch.
notify_recipientAutomation installs: where the alert goes.

Setting and clearing one

PUT /api/marketplace/installs/{slug}/bindings sets a slot; DELETE with ?slot_kind= and ?slot_key= clears it. The body is five fields:

slot_kind · slot_keyWhich slot. Both are required, on set and on clear.
persona_idFor a persona slot.
vault_secret_refFor a secret slot — the name, not the secret.
input_valueFor an input, a monitor_url or a notify_recipient slot.

A persona binding may only point at a persona you own. There is no way to bind someone else’s login identity, and no way for a listing to arrive carrying one.

Install, bind, run

The four calls in the order you make them.

install-bind-run.sh

# 1. See what slots this listing needs before you install it.
curl https://api.usewrit.app/api/marketplace/installs/invoice-puller/manifest \
  -H "Authorization: Bearer $WRIT_API_KEY"

# 2. Install. Free, and idempotent per account + listing.
curl -X POST https://api.usewrit.app/api/marketplace/listings/invoice-puller/install \
  -H "Authorization: Bearer $WRIT_API_KEY"

# 3. Bind YOUR persona and YOUR secret into the slots it declared.
curl -X PUT https://api.usewrit.app/api/marketplace/installs/invoice-puller/bindings \
  -H "Authorization: Bearer $WRIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"slot_kind": "persona", "slot_key": "login", "persona_id": 12}'

curl -X PUT https://api.usewrit.app/api/marketplace/installs/invoice-puller/bindings \
  -H "Authorization: Bearer $WRIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"slot_kind": "input", "slot_key": "account_number", "input_value": "88213"}'

# 4. Run it. Everything it signs in with came from step 3.
curl -X POST https://api.usewrit.app/api/marketplace/listings/invoice-puller/run \
  -H "Authorization: Bearer $WRIT_API_KEY"

run ▸ what is guaranteed

What a run promises.

POST /api/marketplace/listings/{slug}/run executes the listing on your account. Four things hold on every run:

  1. It uses your bindings, and only your bindings — Personas, credentials, secrets and inputs are resolved from what you bound. Nothing arrives from the creator.
  2. It runs the snapshot you installed — Install captures the recipe as it was that day. A creator editing their live workflow does not change what your install runs.
  3. A missing required slot blocks it — The run answers 422 rather than starting and failing halfway. Bind the slot, run again.
  4. The listing itself is free — There is no listing charge and no creator fee on a run. What a run can cost is Writ platform compute: nothing on your own machine, metered running time on the managed cloud fleet.

The rest of the lifecycle

Everything else you can do with an install:

CallWhat it does
GET /api/marketplace/installsEverything you have installed.
GET /api/marketplace/installs/{slug}/usagestatus and last_run_at, plus the creator’s caps with used, remaining and reset per window.
POST /api/marketplace/installs/{slug}/syncMove your install onto the creator’s newer recipe. It needs your consent — it never happens on its own.
DELETE /api/marketplace/listings/{slug}/installUninstall. Cascades to your bindings.

An install keeps working even if the listing is later unpublished. You installed a snapshot, not a live link to the creator’s workspace.

reviews ▸ verified runs

Reviews come from people who ran it.

Only someone who installed a listing and accumulated enough successful runs can review it, and an organization gets one review. That is why the ratings track the measured signals instead of drifting from them.

CallWhat it does
GET /api/marketplace/listings/{slug}/reviewsReviews from accounts that actually ran it, plus the rating summary.
GET /api/marketplace/listings/{slug}/reviews/eligibilityWhether you may review it yet, and what is missing.
POST /api/marketplace/listings/{slug}/reviewsLeave yours. One per organization.
DELETE /api/marketplace/listings/{slug}/reviews/meWithdraw it.

problems ▸ reports

When it does not deliver.

Report the run that went wrong. The creator and the platform admins are notified, and a listing that collects unresolved reports is flagged for review.

CallWhat it does
POST /api/marketplace/installs/{slug}/reportRaise a problem with an install, optionally pinned to the run that failed.
GET /api/marketplace/reportsYour own reports, each with status: open | reviewing | resolved | dismissed.

publish ▸ creators

Publishing your own.

POST /api/marketplace/publish needs a verified account and accept_creator_agreement: true. Any plan, Free included, may publish, and what you publish is a free recipe: your personas, secrets and sessions are stripped at publish, so what anyone installs can never contain them. The body describes the asset and the guardrails you want on every run of it.

FieldWhat it does
asset_typeworkflow | automation.
workflow_id · automation_idWhat you are publishing.
title · summary · categorytitle up to 140 characters.
keywords[] · tags[] · icon · cover_image_urlHow it is found and how it looks.
intentUp to 60 characters — the job it does, in one line.
visibilityWho can see the listing.
baseline_duration_msThe speed you are promising. On-time rate is measured against it.
marketplace_exec_policycustomer | cloud | local | creator — where a run of it is allowed to execute.
usage_limitsPer-install, global and concurrency caps, each with its own window and mode.
input_rulesA regex per input, enforced on every run of your listing.

Publish a recipe

The publish call, and the guardrails that ride with it.

publish.sh

curl -X POST https://api.usewrit.app/api/marketplace/publish \
  -H "Authorization: Bearer $WRIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "accept_creator_agreement": true,
    "asset_type": "workflow",
    "workflow_id": 41,
    "title": "Invoice puller",
    "summary": "Signs in and pulls every invoice since a date you pass in.",
    "category": "finance",
    "keywords": ["invoices", "accounting"],
    "tags": ["billing"],
    "intent": "Pull invoices from a billing portal",
    "baseline_duration_ms": 18000,
    "marketplace_exec_policy": "cloud",
    "usage_limits": {
      "per_buyer": { "count": 200, "window": "day", "mode": "enforce" },
      "global": { "count": 20000, "window": "month", "mode": "enforce" },
      "max_concurrent_per_buyer": { "count": 4, "mode": "enforce" }
    },
    "input_rules": {
      "rules": {
        "account_number": { "pattern": "^[0-9]{4,8}$", "message": "4 to 8 digits" }
      }
    }
  }'

ip ▸ run, not read

People run a listing. They do not read it.

If you publish a recipe you spent weeks getting right, sharing it should not mean handing it over. That is a design constraint, not a promise — so here is exactly how it is arranged:

  1. Install captures a data-less snapshot — What lands on someone else’s account is the shape of the recipe, without the data it was built against.
  2. No install-side endpoint returns the steps — There is no read path for the recipe. Not on the listing, not on the install, not on a run.
  3. The desktop path receives a sealed recipe — When a run executes on a machine, that machine receives a form only it can open.

faq

Marketplace questions, answered.

Does the creator get my login when I install their listing?
No. A listing declares slots — a persona slot, a secret slot, inputs — and you fill them from things you own. A persona binding may only reference a persona in your own account, and a secret binding carries a vault reference rather than the secret. A run resolves those from your bindings and from nowhere else.
If the creator changes their workflow, does my install change?
No. Install captures a snapshot, and your runs execute that snapshot. Moving to a newer recipe is a deliberate call to the sync endpoint, with your consent. An install also keeps working if the listing is later unpublished.
What does a listing cost?
Nothing. Every listing is free to install and free to run — the marketplace sells nothing, and no creator charges for a listing. The only thing a run can cost is Writ platform compute: free and unmetered on your own machine, metered by running time on the managed cloud fleet.
What does it take to publish something?
A verified account and accept_creator_agreement: true. Any plan, Free included, may publish. Your own personas, secrets and sessions are stripped at publish, so what lands on someone else’s account is the recipe and its manifest of slots — never your logins.
Can anyone see my workflow steps?
No. Install captures a data-less snapshot, no install-side endpoint returns the recipe’s steps, and a run executing on a machine receives a sealed form only that machine can open.
Where does an installed listing run?
Within the policy the creator set on the listing — marketplace_exec_policy is customer, cloud, local or creator — and you choose inside it. A local run is free and unmetered, and it reaches intranet, localhost and VPN-only systems the cloud cannot see.

end ▸ install one

Install one and bind your own login.

The manifest tells you which slots a listing needs before you install it. Read it first, then install.