OpenArtifacts

Files in.
A live URL out.

Static pages, whole sites, and services that run your code. Built for agents, claimed by humans.

OpenArtifacts is a hosting service where the first-class user is an AI agent: an agent can create an account and publish a page in two HTTP calls, with no email, no browser, and no human involved. The human claims ownership with one click.

It hosts static pages and whole sites, and it runs services: hand it a bundle and a start command (Python, Node, or Bun) and the code runs in its own container, which sleeps when idle and wakes on the next request.

People can start first, too: pick a username and a password, then mint a token for your agent from the dashboard.

See something it hosts: demo.openartifactsusercontent.com

What you can do with it

How

# 1. Get a token (no signup form exists)
curl -X POST https://api.openartifacts.sh/v1/signup
    -> {"token":"oa_sk_...",
        "claim_url":"https://openartifacts.sh/claim/<claim-code>"}

# 2. Publish
curl -X POST https://api.openartifacts.sh/v1/publish \
  -H "Authorization: Bearer oa_sk_..." \
  -F slug=retro-snake -F files=@index.html
    -> {"url":"https://retro-snake-x7k2.openartifactsusercontent.com"}

# 3. Or run a service: a bundle plus a start command (Python, Node, or Bun)
curl -X POST https://api.openartifacts.sh/v1/publish \
  -H "Authorization: Bearer oa_sk_..." \
  -F type=service -F slug=hello-api \
  -F 'install=pip install -r requirements.txt' \
  -F 'start=uvicorn app:app --host 0.0.0.0 --port $PORT' \
  -F files=@app.py -F files=@requirements.txt
    -> {"url":"https://hello-api-m3q8.openartifactsusercontent.com",
        "status":"starting"}

Give the human two things: the url (the point of all this) and the claim_url. A fresh account is provisional and expires 30 minutes after signup — long enough for an agent to build and a human to click. Claiming once makes everything permanent, and the agent's token keeps working.

A service sleeps after ten idle minutes and the next request wakes it. Its runtime is billed per minute from a prepaid balance and has no free tier; the rates are in the table below.

Other ways in, all equivalent to the two calls above:

Cost

WhatPriceNotes
Free tier$0Publish instantly. Provisional accounts last 30 minutes and get 5 free publishes; claiming keeps everything and unlocks 100 free publishes a month.
Publish$0.005Per publish past your monthly free allowance.
Storage$0.05 / GB / monthMetered monthly from the first byte.
Traffic$1.00 / million viewsFirst million views each month are free.
Private or unlisted$0.50 / artifact / monthPublic stays free forever.
Service runtime$0.03 / hour + CPUA type=service container: $0.03 / $0.12 / $0.12 per hour awake (small / medium / large), billed per minute from the first, plus $0.216 per vCPU-hour of CPU. No free tier: a service needs a prepaid hour of its rate to start, and it pauses at a zero balance until the balance covers an hour of its rate again. An account runs one service at a time per $1 of balance (at most 10).

An agent never needs a checkout page. Past the free tier, a publish returns HTTP 402 with the price and instructions; the agent pays (USDC on Base or Tempo, or a card through its human's Link wallet) and retries the same request with one extra header. Humans can also top up by card on the credits page, and an agent with no wallet can hand its human a payment link (MCP add_credits over an API token) to pay by card. Every error on this service says what to do next, including that one.

Agents are instructed to get their human's agreement before paying anything. Every payment returns a receipt with the rail and its reference, and the CLI never signs a payment: on a 402 it prints the amount and the exact commands that pay it. Top-ups by card have a $5 minimum (card fees make smaller ones wasteful); a USDC payment settles at least $0.25, and anything above what is due stays as credit.

Rules

Every published version is scanned as it goes live. A page that asks for keys, seed phrases, or card numbers is taken down and serves a 451; one that imitates a login screen is flagged for human review and keeps serving until a person decides. Each artifact serves from its own isolated domain and can never touch another artifact's data. The full policy is at aup.md. Report anything: abuse@openartifacts.sh.