`POST /api/marketplace/runner-offers` — create a runner offer. The seller profile is resolved from the authenticated user.
const url = 'https://example.com/api/marketplace/runner-offers';const options = { method: 'POST', headers: {'Content-Type': 'application/json'}, body: '{"capabilities":"example","display_region":"example","hardware":"example","heartbeat_interval_secs":1,"job_class_allowlist":["example"],"max_concurrency":1,"network_policy":"example","rate_minor_per_minute":1,"runner_pool_id":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","secret_trust_policy":"example","terms_accepted":true,"trust_tier":"example","item_id":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://example.com/api/marketplace/runner-offers \ --header 'Content-Type: application/json' \ --data '{ "capabilities": "example", "display_region": "example", "hardware": "example", "heartbeat_interval_secs": 1, "job_class_allowlist": [ "example" ], "max_concurrency": 1, "network_policy": "example", "rate_minor_per_minute": 1, "runner_pool_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "secret_trust_policy": "example", "terms_accepted": true, "trust_tier": "example", "item_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0" }'Request Bodyrequired
Section titled “Request Bodyrequired”object
#521 — the metered per-minute price (minor currency units). Folded into the
offer capabilities as rate_minor_per_minute so the dispatch-terminal
metering seam prices each run by its ACTUAL run time (ADR 0046 marriage). A
non-positive / absent value leaves the offer un-priced (recorded, never charged).
#626 — bind the offer to a REAL fleet runner at create time. When Some(id)
the offer’s runner_pool_id is stamped to the runner so activation’s heartbeat
gate (offer_health_from_runner) reads the runner’s ACTUAL liveness. The org
“offer this runner” path always sets this; the legacy marketplace seller-create
route leaves it None (the offer stays unbound, health unknown).
#521 — the seller accepts the marketplace runner terms at create time. When
Some(true) the offer’s terms_accepted_at is stamped (a prerequisite for
activation); None/Some(false) leaves it unset.
Examplegenerated
{ "capabilities": "example", "display_region": "example", "hardware": "example", "heartbeat_interval_secs": 1, "job_class_allowlist": [ "example" ], "max_concurrency": 1, "network_policy": "example", "rate_minor_per_minute": 1, "runner_pool_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "secret_trust_policy": "example", "terms_accepted": true, "trust_tier": "example", "item_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0"}Responses
Section titled “Responses”Runner offer capacity metadata for a runner_offer item. Owned by the
catalog slice; later slices add FK constraints for seller_profile_id
and runner_pool_id.
object
Examplegenerated
{ "activation_status": "example", "active": true, "capabilities": "example", "created_at": "2026-04-15T12:00:00Z", "display_region": "example", "hardware": "example", "health_status": "example", "heartbeat_interval_secs": 1, "id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "item_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "job_class_allowlist": [ "example" ], "last_heartbeat_at": "2026-04-15T12:00:00Z", "max_concurrency": 1, "network_policy": "example", "runner_pool_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "secret_trust_policy": "example", "seller_profile_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "terms_accepted_at": "2026-04-15T12:00:00Z", "trust_tier": "example", "updated_at": "2026-04-15T12:00:00Z"}