> ## Documentation Index
> Fetch the complete documentation index at: https://docs.aura.markets/llms.txt
> Use this file to discover all available pages before exploring further.

# Build an unsigned multi-leg market proposal (one tx, N legs).

> The right primitive for any market with more than two outcomes — sports games, multi-candidate races, conditional markets. Provide an array of `legs[]` with their individual question/imageUrl/metadata + the shared masterQuestion / category / rules / sources. The endpoint picks the right ProposeAndSubmitMarketLinked{N} script (2..60 legs), packs each leg into the contract's expected ByteVec layout, and returns ONE unsigned tx covering all proposals.

The total ALPH attached scales linearly with the leg count (PROPOSAL_DEPOSIT + DUST per leg). The `legCount` field in the response confirms which Linked{N} script was selected.



## OpenAPI

````yaml /api-reference/openapi.json post /v1/tx/factory/propose-linked-market
openapi: 3.1.0
info:
  title: Aura API
  description: >-
    Public REST API for Aura — prediction markets on Alephium.


    This API exposes everything a user can see or do in the app:

    markets, prices, orderbook, trades, vault state, oracle and

    governance, plus build-tx endpoints that return unsigned

    transactions for the client to sign with its own wallet.


    Interactive reference: https://docs.aurabets.io/api-reference/introduction


    ## Discovery


    Built for integrators, not for lazy implementers:


    - **Faceted lists** — every list endpoint accepts `?facets=true`
      and returns category / tag / status counts in the same response,
      so a UI can render filter chips without a second request.
    - **Cursor pagination** — stable across inserts and fast at depth.
      Offset paging via `?page=` is still supported for compat.
    - **Rich filters** — `?q=`, `?category=`, `?tags=`, `?status=`,
      `?creator=`, `?minVolume=` on `/v1/markets`. Tag matching is
      AND (all listed tags must be present).
    - **Sortable** — `?sort=created-at|volume|best-bid-yes|recently-traded`
      with `?order=asc|desc`. Use `/v1/trending` for the composite-score sort.
    - **Field projection** — `?fields=id,question,bestBidYes` trims the
      wire weight for thin clients.
    - **Unified search** — `/v1/search?q=` runs a strict tsquery first
      with a fuzzy trigram fallback when nothing matches; result type is
      a discriminated union so adding events / users later is non-breaking.
    - **Transparent trending** — `/v1/trending` returns the full
      algorithm + per-market component scores so the ranking is auditable.
    - **Categories + tags as first-class** — `/v1/categories` and
      `/v1/tags` enumerate the taxonomy with market counts.

    ## Authentication


    Most endpoints accept (and many require) an API key:


    ```

    Authorization: Bearer aura_live_<your-key>

    ```


    Mint a key by signing a one-time challenge with your Alephium wallet:


    ```

    POST /v1/auth/challenge   { "address": "..." }

    POST /v1/auth/keys        { "address": "...", "publicKey": "...",
    "signature": "..." }

    ```


    Reads are accessible anonymously with low IP-based rate limits;

    write endpoints (`/v1/tx/*`) always require a key.


    ## Rate limits


    | Tier      | Reads (req/min) | Writes (req/min) |

    |-----------|----------------:|-----------------:|

    | Anonymous | 100000 per IP | 100000 per IP |

    | API key   | 100000 per key | 100000 per key |


    Standard `RateLimit-*` response headers are returned on every

    request (IETF `draft-ietf-httpapi-ratelimit-headers`).


    ## Write endpoints


    Aura is non-custodial — the API never holds private keys.

    Endpoints under `/v1/tx/*` return an *unsigned* transaction

    that the caller must sign with its own wallet (passkey, mobile

    wallet, hardware wallet, etc.) and submit to an Alephium node.


    A typical "place order" flow:


    1. `POST /v1/tx/markets/{address}/orders` → server returns
       `{ unsignedTx, gasEstimate, ... }`.
    2. Wallet signs `unsignedTx`.

    3. Wallet submits the signed tx to any Alephium node.
  version: 0.1.0
  license:
    name: MIT
  contact:
    name: Aura
    url: https://docs.aurabets.io
servers:
  - url: /
    description: this server
security:
  - ApiKey: []
  - {}
tags:
  - name: Health
    description: Liveness + version info.
  - name: Auth
    description: Mint, list, and revoke API keys (wallet-signed).
  - name: Markets
    description: Browse and look up prediction markets.
  - name: Categories
    description: Top-level market taxonomy with counts.
  - name: Tags
    description: Free-form market tags with counts.
  - name: Events
    description: Linked-market groups (multi-leg events).
  - name: Search
    description: Full-text + fuzzy search across markets.
  - name: Orderbook
    description: Live order book + recent fills.
  - name: Prices
    description: Latest prices and historical price series.
  - name: Orders
    description: Build unsigned tx to place / cancel orders.
  - name: Vault
    description: AURA token vault — build unsigned deposit / unlock / withdraw txs.
  - name: Disputes
    description: Optimistic oracle disputes — read-side state and votes.
  - name: Oracle votes
    description: Build unsigned oracle txs (submit / dispute / commit / reveal).
  - name: Voting
    description: Governance proposals + voting period state.
  - name: Vote
    description: Build unsigned governance vote tx.
  - name: Proposals
    description: Validate + build market-proposal txs (single-leg, linked, parlay).
  - name: Drafts
    description: Wallet-private market-proposal drafts (never on chain).
  - name: Users
    description: Wallet-scoped reads — profile, positions, orders, parlays.
  - name: Account actions
    description: Aggregated "what does this wallet need to do" views.
  - name: Leaderboard
    description: Top traders by composite score.
  - name: Faucet
    description: Testnet faucet (proxied to indexer).
externalDocs:
  description: Full Aura documentation (guides + interactive API reference)
  url: https://docs.aurabets.io
paths:
  /v1/tx/factory/propose-linked-market:
    post:
      tags:
        - Proposals
      summary: Build an unsigned multi-leg market proposal (one tx, N legs).
      description: >-
        The right primitive for any market with more than two outcomes — sports
        games, multi-candidate races, conditional markets. Provide an array of
        `legs[]` with their individual question/imageUrl/metadata + the shared
        masterQuestion / category / rules / sources. The endpoint picks the
        right ProposeAndSubmitMarketLinked{N} script (2..60 legs), packs each
        leg into the contract's expected ByteVec layout, and returns ONE
        unsigned tx covering all proposals.


        The total ALPH attached scales linearly with the leg count
        (PROPOSAL_DEPOSIT + DUST per leg). The `legCount` field in the response
        confirms which Linked{N} script was selected.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                signerAddress:
                  type: string
                  minLength: 30
                  maxLength: 80
                  pattern: >-
                    ^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz:]+$
                  description: Alephium address (base58, optional `:N` group suffix).
                signerPublicKey:
                  type: string
                  pattern: ^(0x)?[0-9a-fA-F]+$
                  description: >-
                    Signer's public key (33-byte secp256k1 hex). Required for
                    the node to build the witness layout.
                signerKeyType:
                  default: default
                  description: >-
                    Defaults to "default" (groupless secp256k1). Pass
                    "gl-webauthn" for passkey wallets.
                  type: string
                  enum:
                    - default
                    - bip340-schnorr
                    - gl-secp256k1
                    - gl-secp256r1
                    - gl-ed25519
                    - gl-webauthn
                masterQuestion:
                  type: string
                  minLength: 1
                  maxLength: 300
                  description: >-
                    Display question shown in markets-list UIs as the parent
                    event row.
                masterImageUrl:
                  type: string
                  maxLength: 500
                category:
                  type: string
                  minLength: 1
                  maxLength: 80
                rules:
                  type: string
                  maxLength: 1000
                resolutionSources:
                  type: string
                  maxLength: 1000
                legs:
                  minItems: 2
                  maxItems: 60
                  type: array
                  items:
                    type: object
                    properties:
                      question:
                        type: string
                        minLength: 1
                        maxLength: 300
                      imageUrl:
                        description: Per-leg image URL. Empty defers to masterImageUrl.
                        type: string
                        maxLength: 500
                      metadata:
                        description: >-
                          JSON-serialised structured metadata (e.g.
                          sportsSubMarket payload).
                        type: string
                        maxLength: 4000
                    required:
                      - question
              required:
                - signerAddress
                - signerPublicKey
                - masterQuestion
                - category
                - legs
      responses:
        '200':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  unsignedTx:
                    type: string
                    description: >-
                      Hex-encoded unsigned transaction. Sign and submit via your
                      wallet.
                  txId:
                    type: string
                  fromGroup:
                    type: integer
                    minimum: -9007199254740991
                    maximum: 9007199254740991
                  toGroup:
                    type: integer
                    minimum: -9007199254740991
                    maximum: 9007199254740991
                  gasAmount:
                    type: integer
                    minimum: -9007199254740991
                    maximum: 9007199254740991
                  gasPrice:
                    type: string
                  attoAlphAmount:
                    type: string
                  tokens:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                          pattern: ^(0x)?[0-9a-fA-F]+$
                          description: Hex string, with or without `0x` prefix.
                        amount:
                          type: string
                      required:
                        - id
                        - amount
                      additionalProperties: false
                  collateralRequired:
                    type: string
                  legCount:
                    type: integer
                    minimum: 2
                    maximum: 60
                required:
                  - unsignedTx
                  - txId
                  - fromGroup
                  - toGroup
                  - gasAmount
                  - gasPrice
                  - legCount
                additionalProperties: false
        '400':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        description: Machine-readable error code (snake_case).
                      message:
                        type: string
                        description: Human-readable error message.
                      details: {}
                    required:
                      - code
                      - message
                    additionalProperties: false
                required:
                  - error
                additionalProperties: false
        '401':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        description: Machine-readable error code (snake_case).
                      message:
                        type: string
                        description: Human-readable error message.
                      details: {}
                    required:
                      - code
                      - message
                    additionalProperties: false
                required:
                  - error
                additionalProperties: false
        '403':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        description: Machine-readable error code (snake_case).
                      message:
                        type: string
                        description: Human-readable error message.
                      details: {}
                    required:
                      - code
                      - message
                    additionalProperties: false
                required:
                  - error
                additionalProperties: false
        '502':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        description: Machine-readable error code (snake_case).
                      message:
                        type: string
                        description: Human-readable error message.
                      details: {}
                    required:
                      - code
                      - message
                    additionalProperties: false
                required:
                  - error
                additionalProperties: false
      security:
        - ApiKey: []
components:
  securitySchemes:
    ApiKey:
      type: http
      scheme: bearer
      bearerFormat: aura_live_<32 char secret>
      description: API key obtained from POST /v1/auth/keys.

````