Docs

API reference

Reference for the decentralised.art HTTP APIs: the chain API for operations, simulation, publication and execution, and the services API for sign-in, profiles and Worlds.

Overview

decentralised.art has two HTTP APIs. Both speak JSON over HTTPS.

APIBase URLWhat it does
Chain APIhttps://api.decentralised.art/chainConnectors, transformations and conditions: reading them, creating drafts, simulating, publishing on chain and executing. Also accounts, formats and the event feed.
Services APIhttps://api.decentralised.art/servicesSign-in, user profiles, follows, and publishing and serving Worlds.

Reading needs no account. The SDK wraps the chain API for JavaScript and Python, and the MCP server offers it to AI agents. For the ideas behind it, see About.

Try it
# Read a connector
curl https://api.decentralised.art/chain/connector/pitch

# Run it on chain for four steps (no login, no gas)
curl -X POST https://api.decentralised.art/chain/execute \
  -H "Content-Type: application/json" \
  -d '{"connector_name":"pitch","particles_count":4}'

Authentication

Each API has its own sign-in, and both prove that you control an Ethereum address by signing a message. Send the resulting token as Authorization: Bearer <token>.

Chain APIServices API
Needed forCreating drafts and publishingYour profile, follows, and uploading Worlds
StepsGET /nonce/{address}, sign Login nonce: <nonce>, then POST /authPOST /auth/siwe/challenge, sign the message, then POST /auth/siwe/verify
SignatureEIP-191 personal_signSign-In with Ethereum (EIP-4361), signed with EIP-191
TokenJWT access tokenSession token
Valid for5 minutes24 hours, or until sign-out

The two tokens are not interchangeable. Reading, simulating and executing need neither.

Conventions

Names and addresses

  • Operation names start with a letter or underscore and contain letters, digits and underscores, up to 128 characters. They are global and cannot be changed.
  • Addresses are 40 hexadecimal characters, with or without 0x. The chain API returns owner addresses in lowercase without 0x; the services API returns checksummed addresses with 0x.
  • A draft reports the address "0x0" until it is published.

Field names

The chain API and the user endpoints use snake_case (format_hash, display_name). World endpoints use camelCase (entryUrn, acceptedFormatHashes). Publication transactions use the Ethereum JSON-RPC spelling with hex quantities (chainId, maxFeePerGas).

Pagination

  • Chain API lists take a required limit (1–256) and return a cursor. Pass cursor.next_after back as after (or, for the feed, cursor.next_before as before) while cursor.has_more is true.
  • Services API lists take a zero-based page and a limit.

Errors

Errors use HTTP status codes. Chain API errors carry a JSON body with a message; publication errors can add status, tx_hash, missing and mismatched. Services API errors carry the status, and World endpoints add a plain-text message.

Chain API error
{ "message": "Connector not found" }

Chain API

Base URL https://api.decentralised.art/chain. This part of the reference is generated from the OpenAPI specification.

Core

Server version information.

GET /version No auth

Get version

Get server build/version info

Responses

StatusDescriptionBody
200Version infoVersionResponse
Request
curl https://api.decentralised.art/chain/version
Response
{
  "build_timestamp": "2026-10-01 11:42:09 UTC",
  "version": "0.4.0"
}

Authentication

Creating and publishing need a bearer token. Ask for a nonce, sign the message Login nonce: <nonce> with the account (EIP-191 personal_sign) and exchange the signature for an access token. Tokens are valid for five minutes.

GET /nonce/{address} No auth

Get nonce

Get a one-time nonce for an address. Sign Login nonce: <nonce> and submit it to /auth.

Responses

StatusDescriptionBody
200Nonce returnedNonceResponse
400Bad requestErrorResponse
Request
curl https://api.decentralised.art/chain/nonce/0xYourAddress
Response (illustrative)
{
  "nonce": "827334"
}
POST /auth No auth

Authenticate

Authenticate using an address, the signed login message, and its signature.

Request body application/json AuthRequest

FieldTypeDescription
addressrequiredstring (Address)Ethereum-style address, with or without a 0x prefix.
messagerequiredstringLogin message signed by the account owner. Must be Login nonce: <nonce>.
signaturerequiredstringWallet signature of the login message.

Responses

StatusDescriptionBody
200Authentication successfulAuthResponse
400Invalid address, nonce, message, or signature.ErrorResponse
Request
curl -X POST https://api.decentralised.art/chain/auth \
  -H "Content-Type: application/json" \
  -d '{"address":"0xYourAddress","message":"Login nonce: 827334","signature":"0x…"}'
Response (illustrative)
{
  "access_token": "eyJhbGciOiJIUzI1NiIs…"
}

Accounts

Addresses that own published operations, and what each one owns.

GET /accounts No auth

List accounts

List chain accounts known to the registry.

HEAD /accounts checks the same query without a body.

Parameters

NameInTypeDescription
limitrequiredqueryintegerPage size. (1–256)
afterquerystringAccount cursor from a previous response cursor.next_after.

Responses

StatusDescriptionBody
200Account pageAccountListResponse
400Invalid queryErrorResponse
Request
curl https://api.decentralised.art/chain/accounts?limit=50
Response
{
  "accounts": [
    "fa71ff2394596f824d69961293d095a50d322e4e"
  ],
  "cursor": {
    "has_more": false,
    "next_after": null
  },
  "limit": 50,
  "total_accounts": 1
}
GET /account/{address} No auth

Get account

Get owned connectors/transformations/conditions for an address.

Parameters

NameInTypeDescription
limitrequiredqueryintegerPage size for each ownership list. (1–256)
after_connectorsquerystringCursor for owned connectors.
after_transformationsquerystringCursor for owned transformations.
after_conditionsquerystringCursor for owned conditions.

Responses

StatusDescriptionBody
200Account infoAccountInfoResponse
400Invalid address, limit, or cursorErrorResponse
Request
curl https://api.decentralised.art/chain/account/fa71ff2394596f824d69961293d095a50d322e4e?limit=50
Response
{
  "address": "fa71ff2394596f824d69961293d095a50d322e4e",
  "owned_connectors": [
    "pitch"
  ],
  "owned_transformations": [
    "add"
  ],
  "owned_conditions": [],
  "cursor_connectors": {
    "has_more": false,
    "next_after": null
  },
  "cursor_transformations": {
    "has_more": false,
    "next_after": null
  },
  "cursor_conditions": {
    "has_more": false,
    "next_after": null
  },
  "limit": 50
}

Connectors

Read a connector by name, or create one as your draft. A draft reports address "0x0" until it is published.

GET /connector/{name} No auth

Get connector by name

Returns connector definition, owner and derived format hash.

HEAD /connector/{name} answers 200 or 404 without a body.

Responses

StatusDescriptionBody
200Connector info.ConnectorInfoResponse
400Invalid connector name.ErrorResponse
404Connector not found.ErrorResponse
500Internal connector serialization or format lookup error.ErrorResponse
Request
curl https://api.decentralised.art/chain/connector/pitch
Response
{
  "name": "pitch",
  "dimensions": [
    {
      "transformations": [
        {
          "name": "add",
          "args": [
            1
          ]
        }
      ],
      "composite": "",
      "bindings": {}
    }
  ],
  "condition_name": "",
  "condition_args": [],
  "static_ri": {},
  "owner": "fa71ff2394596f824d69961293d095a50d322e4e",
  "address": "0xee5fc0669ae1c9f12db4ef0c216ae387fbede644",
  "format_hash": "4e5aa46feeb2db48b7df17d424f29bfdee2ccbfdf2433a99da6be58d3c9e3101"
}
POST /connector Chain bearer token

Create connector

Compile and deploy a connector locally for simulation. The name must not be reserved on chain. Publish it on chain through /publish/connector.

Request body application/json CreateConnectorRequest

FieldTypeDescription
namerequiredstring (EntityName)Entity name. Starts with a letter or '_', contains only letters, digits and '_', at most 128 characters.
dimensionsrequiredarray of ConnectorDimensionOrdered dimension definitions.
condition_namestringCondition name. Omitted or empty string means no condition.
condition_argsarray of integerCondition arguments. Omitted means no condition arguments.
static_rimap of RunningInstanceOptional static running-instance map. Keys are canonical decimal positions (for example "0", "3", "5").

Responses

StatusDescriptionBody
201Created.CreateConnectorResponse
400Invalid payload.ErrorResponse
401Unauthorized.ErrorResponse
409Name is reserved on chain.ErrorResponse
500Internal connector format lookup error.ErrorResponse
503Live on-chain name check is unavailable.ErrorResponse
Request
curl -X POST https://api.decentralised.art/chain/connector \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{"name":"rising_line","dimensions":[{"transformations":[{"name":"add","args":[1]},{"name":"shift_up","args":[2]}]}],"condition_name":"positive_only","condition_args":[1]}'
Response (illustrative)
{
  "name": "rising_line",
  "owner": "0xyouraddress…",
  "address": "0x0",
  "format_hash": "…"
}

Transformations

sol_src is the body of function run(uint32 x, uint32[] args) returns (uint32); args_count is derived from the highest args[i] it uses. Solidity source is never returned.

GET /transformation/{name} No auth

Get transformation by name

HEAD /transformation/{name} answers 200 or 404 without a body.

Responses

StatusDescriptionBody
200Transformation info.TransformationInfoResponse
400Invalid request.ErrorResponse
404Not found.ErrorResponse
500Internal transformation serialization error.ErrorResponse
Request
curl https://api.decentralised.art/chain/transformation/add
Response
{
  "name": "add",
  "args_count": 1,
  "owner": "fa71ff2394596f824d69961293d095a50d322e4e",
  "address": "0xa112a62768ec809c50a66a6efc16cb9dd9545d03"
}
POST /transformation Chain bearer token

Create transformation

Compile and deploy a transformation locally for simulation. The name must not be reserved on chain. Publish it on chain through /publish/transformation.

Request body application/json CreateTransformationRequest

FieldTypeDescription
namerequiredstring (EntityName)Entity name. Starts with a letter or '_', contains only letters, digits and '_', at most 128 characters.
sol_srcrequiredstringSolidity source code

Responses

StatusDescriptionBody
201Created.CreateTransformationResponse
400Invalid request.ErrorResponse
401Unauthorized.ErrorResponse
409Name is reserved on chain.ErrorResponse
503Live on-chain name check is unavailable.ErrorResponse
Request
curl -X POST https://api.decentralised.art/chain/transformation \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{"name":"shift_up","sol_src":"return x + args[0];"}'
Response (illustrative)
{
  "name": "shift_up",
  "owner": "0xyouraddress…",
  "address": "0x0",
  "args_count": 1
}

Conditions

sol_src is the body of function check(int32[] args) view returns (bool). A connector stops with ConditionNotMet when its condition returns false.

GET /condition/{name} No auth

Get condition by name

HEAD /condition/{name} answers 200 or 404 without a body.

Responses

StatusDescriptionBody
200Condition info.ConditionInfoResponse
400Invalid request.ErrorResponse
404Not found.ErrorResponse
500Internal condition serialization error.ErrorResponse
Request
curl https://api.decentralised.art/chain/condition/positive_only
Response (illustrative)
{
  "name": "positive_only",
  "args_count": 1,
  "owner": "fa71ff2394596f824d69961293d095a50d322e4e",
  "address": "0x…"
}
POST /condition Chain bearer token

Create condition

Compile and deploy a condition locally for simulation. The name must not be reserved on chain. Publish it on chain through /publish/condition.

Request body application/json CreateConditionRequest

FieldTypeDescription
namerequiredstring (EntityName)Entity name. Starts with a letter or '_', contains only letters, digits and '_', at most 128 characters.
sol_srcrequiredstringSolidity source code

Responses

StatusDescriptionBody
201Created.CreateConditionResponse
400Invalid request.ErrorResponse
401Unauthorized.ErrorResponse
409Name is reserved on chain.ErrorResponse
503Live on-chain name check is unavailable.ErrorResponse
Request
curl -X POST https://api.decentralised.art/chain/condition \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{"name":"positive_only","sol_src":"return args[0] > 0;"}'
Response (illustrative)
{
  "name": "positive_only",
  "owner": "0xyouraddress…",
  "address": "0x0",
  "args_count": 1
}

Formats

A format hash identifies the shape of a connector's output. Connectors that share it produce compatible streams.

GET /formats No auth

List format hashes

List connector format hashes known to the registry.

HEAD /formats checks the same query without a body.

Parameters

NameInTypeDescription
limitrequiredqueryintegerPage size. (1–256)
afterquerystringFormat hash cursor from a previous response cursor.next_after.

Responses

StatusDescriptionBody
200Format hash page.FormatListResponse
400Invalid query.ErrorResponse
Request
curl https://api.decentralised.art/chain/formats?limit=50
Response
{
  "formats": [
    "4e5aa46feeb2db48b7df17d424f29bfdee2ccbfdf2433a99da6be58d3c9e3101"
  ],
  "cursor": {
    "has_more": false,
    "next_after": null
  },
  "limit": 50,
  "total_formats": 1
}
GET /format/{hash} No auth

Get format membership

List connector names and scalar labels for a format hash.

Parameters

NameInTypeDescription
limitrequiredqueryintegerPage size for connector names. (1–256)
afterquerystringConnector name cursor from a previous response cursor.next_after.

Responses

StatusDescriptionBody
200Format membership.FormatInfoResponse
400Invalid format hash, limit, or cursor.ErrorResponse
Request
curl https://api.decentralised.art/chain/format/4e5aa46feeb2db48b7df17d424f29bfdee2ccbfdf2433a99da6be58d3c9e3101?limit=50
Response
{
  "format_hash": "4e5aa46feeb2db48b7df17d424f29bfdee2ccbfdf2433a99da6be58d3c9e3101",
  "connectors": [
    "pitch"
  ],
  "scalars": [
    "pitch:0"
  ],
  "cursor": {
    "has_more": false,
    "next_after": null
  },
  "limit": 50,
  "total_connectors": 1
}

Feed

Chain events, newest first, as connectors, transformations and conditions are published. Items move through observed, safe and finalized, or become removed after a reorganisation.

GET /feed No auth

List feed items

Returns a newest-first page of feed items. Each item is keyed by a stable feed_id and includes compact payload metadata identifying the changed entity. Use /connector/{name}, /transformation/{name}, or /condition/{name} to hydrate full entity details.

Parameters

NameInTypeDescription
limitrequiredqueryintegerPage size. The current server requires this parameter. (1–256)
beforequerystringHistory cursor from a previous response cursor.next_before.
typequeryFeedEventTypeOptional event type filter.
include_unfinalizedquery0 | 1Set to 1 to include observed and safe events. Set to 0 to return only finalized events. When omitted, the current server includes unfinalized events.

Responses

StatusDescriptionBody
200Feed page.FeedPage
400Invalid query.ErrorResponse
Request
curl https://api.decentralised.art/chain/feed?limit=1&include_unfinalized=0
Response
{
  "items": [
    {
      "feed_id": "local:11155111:connector_added:pitch",
      "event_type": "connector_added",
      "status": "finalized",
      "visible": true,
      "tx_hash": "0x0fc499e4f88ae66792da639b29af1794fded0efd75d892b56e7591380e29d190",
      "block_number": 12,
      "tx_index": 0,
      "log_index": 0,
      "history_cursor": "c1790857774523:12:0:local:11155111:connector_added:pitch",
      "created_at_ms": 1790857774523,
      "updated_at_ms": 1790857792829,
      "projector_version": 1,
      "payload": {
        "type": "connector",
        "name": "pitch",
        "owner": "0xfa71ff2394596f824d69961293d095a50d322e4e"
      }
    }
  ],
  "cursor": {
    "has_more": true,
    "next_before": "c1790857774523:12:0:local:11155111:connector_added:pitch"
  },
  "limit": 1
}
GET /feed/stream No auth

Stream feed deltas

Opens a Server-Sent Events stream. The response starts with a bounded replay from since_seq, then emits a stream_meta event describing the replay window, and then tails live feed deltas. Delta event names match their feed event type (connector_added, transformation_added, or condition_added). The JSON in each delta data: frame conforms to schemas/feedStreamDelta.yaml; stream_meta frame data conforms to schemas/feedStreamMeta.yaml. Idle live streams emit keepalive comments.

Parameters

NameInTypeDescription
since_seqqueryinteger (int64)Replay stream deltas with stream_seq greater than this value. (≥ 0, default 0)
limitqueryintegerMaximum number of replay deltas returned before live tailing. (1–2048, default 200)

Responses

StatusDescriptionBody
200Server-Sent Events stream.string
400Invalid query.ErrorResponse
Request
curl -N "https://api.decentralised.art/chain/feed/stream?since_seq=0"
Response
: min_available_seq=1

id: 42
event: connector_added
data: {"stream_seq":42,"event_type":"connector_added","status":"finalized","feed_id":"…","history_cursor":"…","created_at_ms":1790857774523,"payload":{"type":"connector","name":"pitch","owner":"0x…"}}

event: stream_meta
data: {…}

Run

Simulate drafts for free in the server's local EVM, or execute published connectors on chain. Neither needs a login. particles_count is the number of steps; dynamic_ri sets running instances by position for one run.

POST /simulate No auth

Simulate locally

Run a connector in the server's local simulation EVM: drafts created on this server, and published connectors. A connector that exists only on chain is first deployed locally with its dependencies from their verified artifacts. No login is required, and the result carries no chain provenance.

Request body application/json ExecuteRequest

FieldTypeDescription
connector_namerequiredstringConnector name to execute.
particles_countrequiredinteger or stringNumber of particles to generate. The backend accepts protobuf JSON uint32 values between 1 and 65536.
dynamic_rimap of RunningInstanceDynamic running-instance overrides keyed by canonical decimal RI position. Omitted means no overrides. At most 4096 entries.

Responses

StatusDescriptionBody
200Executed.array of ParticlesResultItem
400Bad request, or execution rejected by the runner (for example a condition was not met).ErrorResponse
404Connector not found.ErrorResponse
500Internal deployment, execution or response decoding error.ErrorResponse
503A chain-only connector cannot be simulated yet: the verified artifacts of it or its dependencies are not available.ErrorResponse
Request
curl -X POST https://api.decentralised.art/chain/simulate \
  -H "Content-Type: application/json" \
  -d '{"connector_name":"pitch","particles_count":4}'
Response
[
  {
    "path": "/pitch:0",
    "data": [
      0,
      1,
      2,
      3
    ]
  }
]
POST /execute No auth

Execute on chain

eth_call of Runner.gen on the configured runner, pinned to the block the server's execute block tag resolves to. The chain decides whether the connector exists; the server's own registry is not consulted. No login is required: an eth_call sends no transaction and costs no gas.

Request body application/json ExecuteRequest

FieldTypeDescription
connector_namerequiredstringConnector name to execute.
particles_countrequiredinteger or stringNumber of particles to generate. The backend accepts protobuf JSON uint32 values between 1 and 65536.
dynamic_rimap of RunningInstanceDynamic running-instance overrides keyed by canonical decimal RI position. Omitted means no overrides. At most 4096 entries.

Responses

StatusDescriptionBody
200ExecutedExecuteResponse
400Bad request, or execution rejected by the runner.ErrorResponse
404Connector not found in the runner's registry.ErrorResponse
500Response decoding error.ErrorResponse
502Chain returned a malformed result.ErrorResponse
503On-chain execution is not configured, or the chain endpoint is unavailable.ErrorResponse
Request
curl -X POST https://api.decentralised.art/chain/execute \
  -H "Content-Type: application/json" \
  -d '{"connector_name":"pitch","particles_count":4,"dynamic_ri":{"0":{"start_point":12,"transformation_shift":0}}}'
Response
{
  "block_number": 11825489,
  "block_hash": "0x1c4b37dc907b055ffd53e0d32536a408a2d93e9bedfa7ed167cba14991729cfa",
  "runner": "0xe0e70f522b64a6c8d2301697cd7133be33eae77f",
  "particles": [
    {
      "path": "/pitch:0",
      "data": [
        12,
        13,
        14,
        15
      ]
    }
  ]
}

Publication

Publish one of your drafts on chain, paid from your own wallet. Prepare, send the transaction (with a browser wallet, or signed offline and relayed through /send), then confirm. Dependencies must be published first, and publications from one owner must be made one at a time.

POST /publish/{kind}/prepare Chain bearer token

Prepare publication

Rebuild the entity from the definition retained when it was created, store its artifact durably, and return the unsigned registry transaction. The caller must own the entity. A connector's dependencies must already be registered with the artifacts it was built against; they are never published recursively. Deterministic reverts (name taken, stale nonce, identity mismatch) are reported here, before the owner pays.

Request body application/json PrepareRequest

FieldTypeDescription
namerequiredstring (EntityName)Entity name. Starts with a letter or '_', contains only letters, digits and '_', at most 128 characters.
relaybooleanAlso return signing, what an offline signer needs to complete the transaction for POST /publish/{kind}/send. Leave unset for a browser wallet, which chooses its own nonce and fees. (default false)

Responses

StatusDescriptionBody
200Prepared transaction, or the existing identical publication.PrepareResponse
400Invalid request, the entity cannot be rebuilt, or the transaction would revert.PublishError
401Unauthorized.PublishError
403Publication is disabled on this server, or the caller does not own the entity.PublishError
404Unknown kind, or no local definition of this entity exists.PublishError
409The registry holds different content under this name, or connector dependencies are missing or mismatched.PublishError
503Chain provider or durable artifact storage failure.PublishError
Request
curl -X POST https://api.decentralised.art/chain/publish/transformation/prepare \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{"name":"shift_up","relay":true}'
Response (illustrative)
{
  "status": "prepared",
  "kind": "transformation",
  "name": "shift_up",
  "address": "0x…",
  "content_hash": "0x5d3f…c41a",
  "publication_nonce": 0,
  "deadline": 1790903600,
  "transaction": {
    "from": "0xyouraddress…",
    "to": "0xregistry…",
    "data": "0x…",
    "chainId": "0xaa36a7",
    "gas": "0x3d090"
  },
  "signing": {
    "type": "0x2",
    "nonce": "0x7",
    "maxFeePerGas": "0x2540be400",
    "maxPriorityFeePerGas": "0x3b9aca00",
    "value": "0x0"
  }
}
POST /publish/{kind}/send Chain bearer token

Relay publication

Broadcast a publication transaction the owner signed offline, through the server's own chain provider, so the owner needs no RPC endpoint. The owner still pays for it. The server forwards it only when the caller signed it, it calls the configured registry on its chain with no value, it publishes exactly the named entity with this content hash, and a dry run succeeds within its gas limit. Confirm it with POST /publish/{kind}.

Request body application/json SendRequest

FieldTypeDescription
namerequiredstring (EntityName)Entity name. Starts with a letter or '_', contains only letters, digits and '_', at most 128 characters.
content_hashrequiredstring (Hash32)32-byte hex value.
raw_txrequiredstringSigned type-2 transaction: transaction merged with signing from a relay prepare, as 0x02 || rlp(...).

Responses

StatusDescriptionBody
202Broadcast, or already held by the provider.SendResponse
400Invalid request or transaction, a transaction other than this publication, a dry-run revert, too little gas, or insufficient funds.PublishError
401Unauthorized.PublishError
403Publication is disabled on this server, or another account signed the transaction.PublishError
404Unknown kind.PublishError
409The account nonce is already used, or another transaction with it is pending. Prepare again.PublishError
503Chain provider failure.PublishError
Request
curl -X POST https://api.decentralised.art/chain/publish/transformation/send \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{"name":"shift_up","content_hash":"0x5d3f…c41a","raw_tx":"0x02f8…"}'
Response (illustrative)
{
  "status": "pending",
  "tx_hash": "0x8b21…77e0"
}
POST /publish/{kind} Chain bearer token

Confirm publication

Look the transaction receipt up once. Repeat the request while it answers 202; that is the status check. The registry projection of the event, not this response, is what the read endpoints serve.

Request body application/json ConfirmRequest

FieldTypeDescription
namerequiredstring (EntityName)Entity name. Starts with a letter or '_', contains only letters, digits and '_', at most 128 characters.
content_hashrequiredstring (Hash32)32-byte hex value.
tx_hashrequiredstringHash of the sent publication transaction.

Responses

StatusDescriptionBody
201Mined and matched.ConfirmResponse
202Transaction not mined yet (status is pending).PublishError
400Invalid request, the transaction reverted, or it registered something else.PublishError
401Unauthorized.PublishError
403Publication is disabled on this server.PublishError
404Unknown kind.PublishError
409The registry holds something else under this name.PublishError
503Chain provider failure.PublishError
Request
curl -X POST https://api.decentralised.art/chain/publish/transformation \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{"name":"shift_up","content_hash":"0x5d3f…c41a","tx_hash":"0x8b21…77e0"}'
Response (illustrative)
{
  "status": "mined",
  "kind": "transformation",
  "name": "shift_up",
  "tx_hash": "0x8b21…77e0",
  "block_number": 11825600,
  "address": "0x…",
  "owner": "0xyouraddress…",
  "content_hash": "0x5d3f…c41a"
}

Services API

Base URL https://api.decentralised.art/services.

Health

Liveness check.

GET /health No auth

Health check

Answers ok when the service is running.

Responses

StatusDescriptionBody
200The text ok.text/plain
Request
curl https://api.decentralised.art/services/health
Response
ok

Sign-in (SIWE)

Sign-In with Ethereum (EIP-4361). Ask for a challenge, sign its message with the wallet (EIP-191), and verify it to get a session token. Send the token as Authorization: Bearer <token>. Sessions last 24 hours. This session is separate from the chain API's access token.

POST /auth/siwe/challenge No auth

Request a sign-in message

Creates a single-use SIWE message for the address, valid for five minutes. Its domain and URI come from the request's Origin header (or app_origin), which must be an allowed origin. At most five unexpired challenges can exist per address.

Request body application/json

FieldTypeDescription
addressrequiredstringThe wallet's Ethereum address.
chain_idrequiredintegerThe wallet's chain. Must be a chain the server allows (by default Ethereum mainnet 1, Sepolia 11155111 and local development chains).
app_originstringThe page's origin, used when the request carries no Origin header.

Responses

StatusDescriptionBody
200The message to sign and when it expires.{ message, expires_at }
400Invalid address, chain not allowed, or invalid origin.
403The origin is not allowed.
429Too many active challenges for this address.
Request
curl -X POST https://api.decentralised.art/services/auth/siwe/challenge \
  -H "Content-Type: application/json" \
  -H "Origin: https://decentralised.art" \
  -d '{"address":"0xfa71Ff2394596F824D69961293D095A50d322e4E","chain_id":11155111}'
Response (illustrative)
{
  "message": "decentralised.art wants you to sign in with your Ethereum account:\n0xfa71Ff…2e4E\n\nSign in to decentralised.art.\n\nURI: https://decentralised.art/auth/siwe/verify\nVersion: 1\nChain ID: 11155111\nNonce: …\nIssued At: …\nExpiration Time: …",
  "expires_at": "2026-10-02T10:05:00Z"
}
POST /auth/siwe/verify No auth

Verify the signed message

Checks the signature against an unused, unexpired challenge and opens a session. The response body is the session token itself, as a JSON string. The user record is created on first sign-in.

Request body application/json

FieldTypeDescription
messagerequiredstringThe exact message from the challenge.
signaturerequiredstringThe wallet's EIP-191 signature of the message, hex encoded.

Responses

StatusDescriptionBody
200The session token: two 64-character hex parts joined by a dot.string
400Malformed message or signature.
401Unknown, used or expired challenge, or the signature does not match.
Request
curl -X POST https://api.decentralised.art/services/auth/siwe/verify \
  -H "Content-Type: application/json" \
  -d '{"message":"decentralised.art wants you to sign in…","signature":"0x…"}'
Response (illustrative)
"6f1c…e2a0.b94d…07c3"
GET /auth/me Session

Current user

The signed-in user's record.

Responses

StatusDescriptionBody
200The user.UserPublic
401Missing, invalid or expired session.
Request
curl https://api.decentralised.art/services/auth/me \
  -H "Authorization: Bearer $SESSION"
POST /auth/logout Session

Sign out

Ends the current session.

Responses

StatusDescriptionBody
204Signed out.
401Missing, invalid or expired session.
Request
curl -X POST https://api.decentralised.art/services/auth/logout \
  -H "Authorization: Bearer $SESSION"

Users

Public profiles. A user's id is their Ethereum address.

GET /users No auth

List users

Addresses of registered users, one page at a time.

Parameters

NameInTypeDescription
pagequeryintegerZero-based page number (default 0).
limitqueryintegerPage size (default 50).

Responses

StatusDescriptionBody
200User addresses.array of string
Request
curl "https://api.decentralised.art/services/users?limit=50"
Response
[
  "0xfa71Ff2394596F824D69961293D095A50d322e4E",
  "0xb530bF08D76015080C67D6b5f00CdeE53b45bdDA"
]
GET /users/{address} No auth

Get a user

A user's public record.

Parameters

NameInTypeDescription
addressrequiredpathstringEthereum address, in any letter case.

Responses

StatusDescriptionBody
200The user.UserPublic
400Not a valid address.
404No user with this address.
Request
curl https://api.decentralised.art/services/users/0xfa71Ff2394596F824D69961293D095A50d322e4E
Response
{
  "id": "0xfa71Ff2394596F824D69961293D095A50d322e4E",
  "display_name": "Sawyer",
  "status": "active",
  "roles": [
    "user"
  ],
  "profile_json": {
    "public": {
      "bio": "",
      "kind": "human",
      "nickname": "Sawyer"
    }
  },
  "created_at": "2026-10-01T00:48:26.030755101Z",
  "updated_at": "2026-10-01T03:09:12.648956949Z",
  "last_login_at": "2026-10-01T03:09:12.648956949Z"
}
PATCH /users/{address} Session · owner only

Update your profile

Changes your own display name or profile. Fields you leave out are not changed.

Parameters

NameInTypeDescription
addressrequiredpathstringYour own address.

Request body application/json

FieldTypeDescription
display_namestring, nullableNew display name; null clears it.
profile_jsonobjectReplaces the profile data.

Responses

StatusDescriptionBody
200The updated user.UserPublic
400Not a valid address.
401Missing, invalid or expired session.
403This is not your profile.
Request
curl -X PATCH https://api.decentralised.art/services/users/0xfa71Ff2394596F824D69961293D095A50d322e4E \
  -H "Authorization: Bearer $SESSION" \
  -H "Content-Type: application/json" \
  -d '{"display_name":"Sawyer","profile_json":{"public":{"nickname":"Sawyer","bio":"Composer"}}}'
DELETE /users/{address} Session · owner only

Delete your account

Deletes your own user record.

Parameters

NameInTypeDescription
addressrequiredpathstringYour own address.

Responses

StatusDescriptionBody
204Deleted.
401Missing, invalid or expired session.
403This is not your account.

Follows

Follow other users. These endpoints act on the signed-in user.

GET /social/following Session

Who you follow

Addresses the signed-in user follows.

GET /social/followers returns the addresses that follow the signed-in user.

Responses

StatusDescriptionBody
200Addresses.array of string
401Missing, invalid or expired session.
POST /social/follow Session

Follow a user

Starts following another user.

POST /social/unfollow takes the same body and stops following.

Request body application/json

FieldTypeDescription
followed_idrequiredstringAddress of the user to follow.

Responses

StatusDescriptionBody
204Done.
400Empty id, or your own address.
401Missing, invalid or expired session.
404No such user.
Request
curl -X POST https://api.decentralised.art/services/social/follow \
  -H "Authorization: Bearer $SESSION" \
  -H "Content-Type: application/json" \
  -d '{"followed_id":"0xfa71Ff2394596F824D69961293D095A50d322e4E"}'

Worlds

Browse and publish Worlds. Uploads are multipart/form-data with the ZIP in a field named bundle (up to 25 MB). The bundle rules are described in SDK → Building a World. World endpoints answer errors with a plain-text message.

GET /worlds No auth

List Worlds

Active Worlds, one page at a time.

Parameters

NameInTypeDescription
pagequeryintegerZero-based page number (default 0).
limitqueryintegerPage size, 1–100 (default 50).
surfacequery"world-page" | "studio-plugin"Only Worlds that support this surface.
qquerystringSearch text.

Responses

StatusDescriptionBody
200Worlds.array of WorldDescriptor
400Invalid surface.
Request
curl "https://api.decentralised.art/services/worlds?surface=world-page&limit=30"
GET /worlds/{id} No auth

Get a World

One World's descriptor.

Parameters

NameInTypeDescription
idrequiredpathstringWorld id.

Responses

StatusDescriptionBody
200The World.WorldDescriptor
404World not found.
POST /worlds/validate No auth

Validate a bundle

Checks a World bundle without publishing it. No sign-in needed.

Request body multipart/form-data

FieldTypeDescription
bundlerequiredfile (ZIP)The World bundle, with world-manifest.json at its root.

Responses

StatusDescriptionBody
200The manifest as it would be published, bundle and manifest hashes, and warnings.{ descriptor, bundleHash, manifestHash, warnings }
400Invalid bundle or manifest; the message says what is wrong.
413The bundle is larger than 25 MB.
Request
curl -X POST https://api.decentralised.art/services/worlds/validate \
  -F "bundle=@my-world.zip"
POST /worlds/upload Session

Publish a World

Validates and publishes a bundle. You become the World's owner.

Request body multipart/form-data

FieldTypeDescription
bundlerequiredfile (ZIP)The World bundle.

Responses

StatusDescriptionBody
200The published World.WorldDescriptor
400Invalid bundle or manifest.
401Missing, invalid or expired session.
409The World already exists.
413The bundle is larger than 25 MB.
Request
curl -X POST https://api.decentralised.art/services/worlds/upload \
  -H "Authorization: Bearer $SESSION" \
  -F "bundle=@my-world.zip"
PATCH /worlds/{id} Session · owner only

Replace a World's bundle

Publishes a new bundle for a World you own (administrators can update any World).

Parameters

NameInTypeDescription
idrequiredpathstringWorld id.

Request body multipart/form-data

FieldTypeDescription
bundlerequiredfile (ZIP)The new World bundle.

Responses

StatusDescriptionBody
200The updated World.WorldDescriptor
400Invalid bundle or manifest.
401Missing, invalid or expired session.
403You do not own this World.
404World not found.
409The bundle conflicts with the World's current content.
DELETE /worlds/{id} Session · owner only

Delete a World

Removes a World you own from the gallery and stops serving its files.

Parameters

NameInTypeDescription
idrequiredpathstringWorld id.

Responses

StatusDescriptionBody
204Deleted.
401Missing, invalid or expired session.
403You do not own this World.
404World not found.

World files and SDK

Static files served for Worlds.

GET /world-assets/{id}/{path} No auth

World file

A file from a published World's bundle, such as its entry page. Files are served with a Content-Security-Policy that keeps the World from reaching the network directly; it talks to its host through the World runtime.

Parameters

NameInTypeDescription
idrequiredpathstringWorld id.
pathrequiredpathstringFile path inside the bundle.

Responses

StatusDescriptionBody
200The file.
404Unknown or deleted World, or no such file.
GET /js/sdk/{file} No auth

World runtime and host scripts

The platform's builds of the SDK's World modules: world-runtime.js (imported by Worlds) and world-host.js (used by pages that embed Worlds).

Parameters

NameInTypeDescription
filerequiredpath"world-runtime.js" | "world-host.js"Script name.

Responses

StatusDescriptionBody
200JavaScript module.
404Any other file name.
Request
curl https://api.decentralised.art/services/js/sdk/world-runtime.js

Chain schemas

Object types used by the chain API, from its OpenAPI specification.

AccountAddressCursorState

Cursor state for the account list.

FieldTypeDescription
has_morerequiredbooleanIndicates whether more account addresses are available.
next_afterrequiredstring, nullableAccount cursor for the next page, or null when exhausted.

AccountInfoResponse

Cursor-based account ownership response.

FieldTypeDescription
addressrequiredstring (Address)Ethereum-style address, with or without a 0x prefix.
limitrequiredintegerPage size used for this response. (1–256)
owned_connectorsrequiredarray of stringOwned connector names.
owned_transformationsrequiredarray of stringOwned transformation names.
owned_conditionsrequiredarray of stringOwned condition names.
cursor_connectorsrequiredNameCursorStateCursor state for one ownership list.
cursor_transformationsrequiredNameCursorStateCursor state for one ownership list.
cursor_conditionsrequiredNameCursorStateCursor state for one ownership list.

AccountListResponse

Cursor-based account list response.

FieldTypeDescription
limitrequiredintegerPage size used for this response. (1–256)
total_accountsrequiredintegerTotal number of known accounts. (≥ 0)
cursorrequiredAccountAddressCursorStateCursor state for the account list.
accountsrequiredarray of string (Address)Account addresses in ascending cursor order.

AlreadyPublished

The registry already holds this exact publication; nothing to send.

FieldTypeDescription
statusrequired"published"
kindrequiredEntityKindKind of entity being published.
namerequiredstring (EntityName)Entity name. Starts with a letter or '_', contains only letters, digits and '_', at most 128 characters.
addressrequiredstring (Address)Ethereum-style address, with or without a 0x prefix.
ownerrequiredstring (Address)Ethereum-style address, with or without a 0x prefix.
content_hashrequiredstring (Hash32)32-byte hex value.

AuthRequest

Auth request.

FieldTypeDescription
addressrequiredstring (Address)Ethereum-style address, with or without a 0x prefix.
messagerequiredstringLogin message signed by the account owner. Must be `Login nonce: <nonce>`.
signaturerequiredstringWallet signature of the login message.

AuthResponse

Auth response.

FieldTypeDescription
access_tokenrequiredstringJWT access token for protected chain endpoints.

ConditionInfoResponse

Condition information. The Solidity source is an execution input kept in local storage or a verified artifact and is never served.

FieldTypeDescription
namerequiredstringCondition name.
args_countrequiredintegerNumber of arguments (uint32), derived from the source and registered on chain. (0–4294967295)
ownerrequiredstring (Address)Ethereum-style address, with or without a 0x prefix.
addressrequiredstringOn-chain address once published; "0x0" for a local simulation entity.

ConfirmRequest

Confirm a publication transaction the owner's wallet sent.

FieldTypeDescription
namerequiredstring (EntityName)Entity name. Starts with a letter or '_', contains only letters, digits and '_', at most 128 characters.
content_hashrequiredstring (Hash32)32-byte hex value.
tx_hashrequiredstringHash of the sent publication transaction.

ConfirmResponse

The transaction was mined with status 1 and carries exactly one matching registry event naming the entity, owner, content and metadata hashes.

FieldTypeDescription
statusrequired"mined"
kindrequiredEntityKindKind of entity being published.
namerequiredstring (EntityName)Entity name. Starts with a letter or '_', contains only letters, digits and '_', at most 128 characters.
tx_hashrequiredstring
block_numberrequiredinteger (int64) (≥ 0)
addressrequiredstring (Address)Ethereum-style address, with or without a 0x prefix.
ownerrequiredstring (Address)Ethereum-style address, with or without a 0x prefix.
content_hashrequiredstring (Hash32)32-byte hex value.

ConnectorDimension

Single connector dimension definition.

FieldTypeDescription
transformationsrequiredarray of TransformationCallDefOrdered transformation calls for this dimension.
compositestringConnected composite connector name. Omitted or empty string means none.
bindingsmap of stringSlot bindings map for composite connectors. Omitted means no bindings. Keys are canonical decimal slot ids and values are connector names.

ConnectorInfoResponse

Connector definition payload returned by GET /connector/{name}.

FieldTypeDescription
namerequiredstringConnector name.
dimensionsrequiredarray of ConnectorDimensionOrdered dimension definitions.
condition_namerequiredstringCondition name. Empty string means no condition.
condition_argsrequiredarray of integerCondition arguments.
static_rirequiredmap of RunningInstanceStatic running-instance map keyed by decimal position; empty object when none.
ownerrequiredstring (Address)Ethereum-style address, with or without a 0x prefix.
addressrequiredstringOn-chain address once published; "0x0" for a local simulation entity.
format_hashrequiredstringDerived format hash for this connector definition.

CreateConditionRequest

Create condition request

FieldTypeDescription
namerequiredstring (EntityName)Entity name. Starts with a letter or '_', contains only letters, digits and '_', at most 128 characters.
sol_srcrequiredstringSolidity source code

CreateConditionResponse

Create condition response

FieldTypeDescription
namerequiredstringName of the created condition
ownerrequiredstring (Address)Ethereum-style address, with or without a 0x prefix.
addressrequiredstringAlways "0x0"; the entity is local until published through /publish/condition.
args_countrequiredintegerNumber of arguments (uint32) parsed from the Solidity source. (0–4294967295)

CreateConnectorRequest

Connector create request payload.

FieldTypeDescription
namerequiredstring (EntityName)Entity name. Starts with a letter or '_', contains only letters, digits and '_', at most 128 characters.
dimensionsrequiredarray of ConnectorDimensionOrdered dimension definitions.
condition_namestringCondition name. Omitted or empty string means no condition.
condition_argsarray of integerCondition arguments. Omitted means no condition arguments.
static_rimap of RunningInstanceOptional static running-instance map. Keys are canonical decimal positions (for example "0", "3", "5").

CreateConnectorResponse

Connector create response payload.

FieldTypeDescription
namerequiredstringConnector name.
ownerrequiredstring (Address)Ethereum-style address, with or without a 0x prefix.
addressrequiredstringAlways "0x0"; the entity is local until published through /publish/connector.
format_hashrequiredstringDerived format hash for this connector definition.

CreateTransformationRequest

Create transformation request

FieldTypeDescription
namerequiredstring (EntityName)Entity name. Starts with a letter or '_', contains only letters, digits and '_', at most 128 characters.
sol_srcrequiredstringSolidity source code

CreateTransformationResponse

Create transformation response

FieldTypeDescription
namerequiredstringName of the created transformation
ownerrequiredstring (Address)Ethereum-style address, with or without a 0x prefix.
addressrequiredstringAlways "0x0"; the entity is local until published through /publish/transformation.
args_countrequiredintegerNumber of arguments (uint32) parsed from the Solidity source. (0–4294967295)

ErrorResponse

Error response

FieldTypeDescription
messagerequiredstringHuman-readable message.

ExecuteRequest

Execute request payload.

FieldTypeDescription
connector_namerequiredstringConnector name to execute.
particles_countrequiredinteger or stringNumber of particles to generate. The backend accepts protobuf JSON uint32 values between 1 and 65536.
dynamic_rimap of RunningInstanceDynamic running-instance overrides keyed by canonical decimal RI position. Omitted means no overrides. At most 4096 entries.

ExecuteResponse

On-chain execution result. Anyone can check it by calling the runner at the same block.

FieldTypeDescription
block_numberrequiredinteger (int64)Block the call was pinned to. (≥ 0)
block_hashrequiredstringHash of that block.
runnerrequiredstringRunner contract address that executed the call.
particlesrequiredarray of ParticlesResultItemExecution result list.

FeedCursor

Pagination cursor metadata for `/feed`.

FieldTypeDescription
has_morerequiredbooleanWhether another older page is available.
next_beforerequiredstring, nullableCursor to pass as `before` for the next older page.

FeedEventPayload

Compact feed payload for discovery. Full entity details are available through the exact entity endpoints.

FieldTypeDescription
typerequired"connector" | "transformation" | "condition"Entity kind represented by the feed item.
namerequiredstringEntity name.
ownerrequiredstring (Address)Ethereum-style address, with or without a 0x prefix.

FeedItem

One projected chain feed item.

FieldTypeDescription
feed_idrequiredstringStable feed identity for this logical entity event.
event_typerequiredFeedEventTypeSupported feed event type.
statusrequiredFeedEventStatusChain-finality or removal status for a feed item.
visiblerequiredbooleanFalse when the item should be hidden, for example after removal.
tx_hashrequiredstringSource transaction hash.
block_numberrequiredinteger (int64)Source block number. (≥ 0)
tx_indexrequiredinteger (int64)Source transaction index inside the block. (≥ 0)
log_indexrequiredinteger (int64)Source log index. (≥ 0)
history_cursorrequiredstringCursor identifying this feed item's position in history.
created_at_msrequiredinteger (int64)Feed creation time in Unix milliseconds. (≥ 0)
updated_at_msrequiredinteger (int64)Feed update time in Unix milliseconds. (≥ 0)
projector_versionrequiredintegerFeed projector version that produced this item. (≥ 1)
payloadrequiredFeedEventPayloadCompact feed payload for discovery. Full entity details are available through the exact entity endpoints.

FeedPage

Newest-first feed page.

FieldTypeDescription
limitrequiredintegerPage size used for this response. (1–256)
cursorrequiredFeedCursorPagination cursor metadata for `/feed`.
itemsrequiredarray of FeedItemFeed items in newest-first order.

FormatHashCursorState

Cursor state for the format hash list.

FieldTypeDescription
has_morerequiredbooleanIndicates whether more format hashes are available.
next_afterrequiredstring, nullableFormat hash cursor for the next page, or null when exhausted.

FormatInfoResponse

Connector membership and scalar labels for one format hash.

FieldTypeDescription
format_hashrequiredstring (FormatHash)32-byte connector format hash, with or without a 0x prefix.
limitrequiredintegerPage size used for connector names. (1–256)
total_connectorsrequiredintegerTotal number of connectors using this format hash. (≥ 0)
cursorrequiredFormatNameCursorStateCursor state for connector names within one format.
scalarsrequiredarray of stringScalar labels encoded as `scalar:tail_id` entries.
connectorsrequiredarray of stringConnector names using this format hash.

FormatListResponse

Cursor-based format hash list response.

FieldTypeDescription
limitrequiredintegerPage size used for this response. (1–256)
total_formatsrequiredintegerTotal number of known format hashes. (≥ 0)
cursorrequiredFormatHashCursorStateCursor state for the format hash list.
formatsrequiredarray of string (FormatHash)Format hashes in ascending cursor order.

FormatNameCursorState

Cursor state for connector names within one format.

FieldTypeDescription
has_morerequiredbooleanIndicates whether more connector names are available.
next_afterrequiredstring, nullableConnector name cursor for the next page, or null when exhausted.

NameCursorState

Cursor state for one ownership list.

FieldTypeDescription
has_morerequiredbooleanIndicates whether more names are available.
next_afterrequiredstring, nullableCursor token for the next page (or null when exhausted).

NonceResponse

Nonce response.

FieldTypeDescription
noncerequiredstringOne-time nonce to be signed by the account owner.

ParticlesResultItem

One returned scalar stream for an execution path.

FieldTypeDescription
pathrequiredstringFully-qualified execution path.
datarequiredarray of integerOutput particle values for this path.

PreparedPublication

The transaction the owner's wallet must send to publish the entity.

FieldTypeDescription
statusrequired"prepared"
kindrequiredEntityKindKind of entity being published.
namerequiredstring (EntityName)Entity name. Starts with a letter or '_', contains only letters, digits and '_', at most 128 characters.
transactionrequiredUnsignedTransactionRegistry call ready for eth_sendTransaction; quantities are hex, as wallets expect. The calldata carries an empty owner signature, which the registry accepts because the owner is the sender.
addressrequiredstring (Address)Ethereum-style address, with or without a 0x prefix.
content_hashrequiredstring (Hash32)32-byte hex value.
publication_noncerequiredinteger (int64)Owner's publication nonce bound into the transaction. (≥ 0)
deadlinerequiredinteger (int64)Unix seconds after which the registry refuses the transaction. (≥ 0)
signingSigningFieldsPresent only when the request set `relay`. Merged into `transaction`, these complete an EIP-1559 transaction an owner can sign offline. Quantities are hex.

PrepareRequest

Prepare the publication of an entity the caller created on this server.

FieldTypeDescription
namerequiredstring (EntityName)Entity name. Starts with a letter or '_', contains only letters, digits and '_', at most 128 characters.
relaybooleanAlso return `signing`, what an offline signer needs to complete the transaction for POST /publish/{kind}/send. Leave unset for a browser wallet, which chooses its own nonce and fees. (default false)

PrepareResponse

Either the transaction the owner's wallet must send, or, when the registry already holds this exact publication, the existing registration.

One of: PreparedPublication, AlreadyPublished

PublishError

Publication error. Optional fields appear only when relevant.

FieldTypeDescription
messagerequiredstringHuman-readable message.
status"pending"Present on 202 while the transaction is not mined yet.
tx_hashstringTransaction the error refers to.
missingarray of stringConnector dependencies absent from the target registry.
mismatchedarray of stringConnector dependencies registered with a different artifact.

RunningInstance

Running-instance coordinates pair.

FieldTypeDescription
start_pointrequiredintegerStart point index (uint32). (0–4294967295)
transformation_shiftrequiredintegerTransformation shift index (uint32). (0–4294967295)

SendRequest

Broadcast a publication transaction the owner signed offline.

FieldTypeDescription
namerequiredstring (EntityName)Entity name. Starts with a letter or '_', contains only letters, digits and '_', at most 128 characters.
content_hashrequiredstring (Hash32)32-byte hex value.
raw_txrequiredstringSigned type-2 transaction: `transaction` merged with `signing` from a relay prepare, as `0x02 || rlp(...)`.

SendResponse

The provider accepted the transaction, or already held it. Confirm it with POST /publish/{kind}.

FieldTypeDescription
statusrequired"pending"
tx_hashrequiredstringHash of the broadcast transaction.

SigningFields

Present only when the request set `relay`. Merged into `transaction`, these complete an EIP-1559 transaction an owner can sign offline. Quantities are hex.

FieldTypeDescription
typerequired"0x2"
noncerequiredstringThe owner's pending account nonce.
maxFeePerGasrequiredstring
maxPriorityFeePerGasrequiredstring
valuerequired"0x0"

TransformationCallDef

Transformation invocation in a connector dimension.

FieldTypeDescription
namerequiredstringTransformation name
argsarray of integerTransformation arguments. Omitted means no arguments.

TransformationInfoResponse

Transformation information. The Solidity source is an execution input kept in local storage or a verified artifact and is never served.

FieldTypeDescription
namerequiredstringTransformation name.
args_countrequiredintegerNumber of arguments (uint32), derived from the source and registered on chain. (0–4294967295)
ownerrequiredstring (Address)Ethereum-style address, with or without a 0x prefix.
addressrequiredstringOn-chain address once published; "0x0" for a local simulation entity.

UnsignedTransaction

Registry call ready for eth_sendTransaction; quantities are hex, as wallets expect. The calldata carries an empty owner signature, which the registry accepts because the owner is the sender.

FieldTypeDescription
fromrequiredstring (Address)Ethereum-style address, with or without a 0x prefix.
torequiredstring (Address)Ethereum-style address, with or without a 0x prefix.
datarequiredstringHex-encoded calldata.
chainIdrequiredstringChain id as a hex quantity.
gasrequiredstringGas limit (estimate plus headroom) as a hex quantity.

VersionResponse

Version information.

FieldTypeDescription
build_timestamprequiredstringISO-8601 build timestamp of the running server
versionrequiredstringHuman-readable API version

Services schemas

UserPublic

A user's public record. Fields are snake_case.

FieldTypeDescription
idrequiredstringThe user's Ethereum address (EIP-55 checksummed). Users are identified by address.
display_namerequiredstring, nullableName shown on the platform.
statusrequired"active" | "suspended" | "deleted"Account status.
rolesrequiredarray of "user" | "admin" | "moderator"Roles of the user.
profile_jsonrequiredobjectFree-form profile data, such as public.nickname, public.bio and public.kind.
created_atrequiredstring (date-time)When the user first signed in.
updated_atrequiredstring (date-time)Last profile change.
last_login_atrequiredstring (date-time), nullableLast sign-in.

WorldDescriptor

A published World. Fields are camelCase.

FieldTypeDescription
idrequiredstringWorld id, used in asset URLs.
slug, name, version, descriptionrequiredstringFrom the World's manifest.
entryUrnrequiredstringWhere the World's entry page is served, under /world-assets.
entryPathrequiredstringEntry file inside the bundle.
runtimerequired"iframe"How the World runs.
surfacesrequiredarray of "world-page" | "studio-plugin"Where the World can be shown.
permissionsrequiredarray of stringPermissions granted to the World.
shortDescription, heroLabel, accentColor, previewstringOptional presentation details from the manifest.
acceptedFormatHashesrequiredarray of stringFormats the World understands.
acceptedConnectorSetsrequiredarray of { connectors, optionalConnectors }Connector names the World understands.
valueLimitsobjectRanges for particlesCount and for values on specific output paths.
ownerIdrequiredstringAddress of the user who uploaded it.
bundleHash, manifestHashrequiredstringHashes of the uploaded bundle and its manifest.
statusrequired"active" | "deleted"World status.
createdAt, updatedAtrequiredstring (date-time)Timestamps.

Specification