openapi: 3.1.0
servers:
  - url: http://localhost:20443
    description: Local
info:
  title: Stacks 3.0+ RPC API
  version: '1.0.0'
  description: |
    This is the documentation for the `stacks-node` RPC interface.
  license:
    name: CC-0

paths:
  /v2/transactions:
    post:
      summary: Broadcast raw transaction
      tags:
        - Transactions
      description: Broadcast raw transactions on the network. You can use the [@stacks/transactions](https://github.com/blockstack/stacks.js) project to generate a raw transaction payload.
      operationId: post_core_node_transactions
      requestBody:
        content:
          application/octet-stream:
            schema:
              type: string
              format: binary
            example: binary format of 00000000010400bed38c2aadffa348931bcb542880ff79d607afec000000000000000000000000000000c800012b0b1fff6cccd0974966dcd665835838f0985be508e1322e09fb3d751eca132c492bda720f9ef1768d14fdabed6127560ba52d5e3ac470dcb60b784e97dc88c9030200000000000516df0ba3e79792be7be5e50a370289accfc8c9e032000000000000303974657374206d656d6f00000000000000000000000000000000000000000000000000
      responses:
        "200":
          description: Transaction ID of successful post of a raw tx to the node's mempool
          content:
            text/plain:
              schema:
                type: string
                example: '"e161978626f216b2141b156ade10501207ae535fa365a13ef5d7a7c9310a09f2"'
        "400":
          description: Rejections result in a 400 error
          content:
            application/json:
              schema:
                $ref: ./api/transaction/post-core-node-transactions-error.schema.json
              example:
                $ref: ./api/transaction/post-core-node-transactions-error.example.json

  /v2/contracts/interface/{contract_address}/{contract_name}:
    get:
      summary: Get contract interface
      description: Get contract interface using a `contract_address` and `contract name`
      tags:
        - Smart Contracts
      operationId: get_contract_interface
      responses:
        "200":
          description: Contract interface
          content:
            application/json:
              schema:
                $ref: ./api/core-node/get-contract-interface.schema.json
              example:
                $ref: ./api/core-node/get-contract-interface.example.json
    parameters:
      - name: contract_address
        in: path
        required: true
        description: Stacks address
        schema:
          type: string
      - name: contract_name
        in: path
        required: true
        description: Contract name
        schema:
          type: string
      - name: tip
        in: query
        schema:
          type: string
        description: The Stacks chain tip to query from. If tip == latest, the query will be run from the latest
          known tip (includes unconfirmed state).
  /v2/map_entry/{contract_address}/{contract_name}/{map_name}:
    post:
      summary: Get specific data-map inside a contract
      tags:
        - Smart Contracts
      operationId: get_contract_data_map_entry
      description: |
        Attempt to fetch data from a contract data map. The contract is identified with [Stacks Address] and [Contract Name] in the URL path. The map is identified with [Map Name].

        The key to lookup in the map is supplied via the POST body. This should be supplied as the hex string serialization of the key (which should be a Clarity value). Note, this is a JSON string atom.

        In the response, `data` is the hex serialization of the map response. Note that map responses are Clarity option types, for non-existent values, this is a serialized none, and for all other responses, it is a serialized (some ...) object.
      responses:
        "200":
          description: Success
          content:
            application/json:
              schema:
                $ref: ./api/core-node/get-contract-data-map-entry.schema.json
              example:
                $ref: ./api/core-node/get-contract-data-map-entry.example.json
        "400":
          description: Failed loading data map
      parameters:
        - name: contract_address
          in: path
          required: true
          description: Stacks address
          schema:
            type: string
        - name: contract_name
          in: path
          required: true
          description: Contract name
          schema:
            type: string
        - name: map_name
          in: path
          required: true
          description: Map name
          schema:
            type: string
        - name: proof
          in: query
          description: Returns object without the proof field when set to 0
          schema:
            type: integer
        - name: tip
          in: query
          schema:
            type: string
          description: The Stacks chain tip to query from. If tip == latest, the query will be run from the latest
            known tip (includes unconfirmed state).
      x-codegen-request-body-name: key
      requestBody:
        description: Hex string serialization of the lookup key (which should be a Clarity value)
        required: true
        content:
          application/json:
            schema:
              type: string

  /v2/contracts/source/{contract_address}/{contract_name}:
    get:
      summary: Get contract source
      tags:
        - Smart Contracts
      operationId: get_contract_source
      description: Returns the Clarity source code of a given contract, along with the block height it was published in, and the MARF proof for the data
      responses:
        "200":
          description: Success
          content:
            application/json:
              schema:
                $ref: ./api/core-node/get-contract-source.schema.json
              example:
                $ref: ./api/core-node/get-contract-source.example.json
    parameters:
      - name: contract_address
        in: path
        required: true
        description: Stacks address
        schema:
          type: string
      - name: contract_name
        in: path
        required: true
        description: Contract name
        schema:
          type: string
      - name: proof
        in: query
        description: Returns object without the proof field if set to 0
        schema:
          type: integer
      - name: tip
        in: query
        schema:
          type: string
        description: The Stacks chain tip to query from. If tip == latest, the query will be run from the latest
          known tip (includes unconfirmed state).
        required: false

  /v2/contracts/call-read/{contract_address}/{contract_name}/{function_name}:
    post:
      summary: Call read-only function
      tags:
        - Smart Contracts
      operationId: call_read_only_function
      description: |
        Call a read-only public function on a given smart contract.

        The smart contract and function are specified using the URL path. The arguments and the simulated tx-sender are supplied via the POST body in the following JSON format:
      responses:
        "200":
          description: Success
          content:
            application/json:
              schema:
                $ref: ./api/contract/post-call-read-only-fn.schema.json
              examples:
                success:
                  $ref: ./api/contract/post-call-read-only-fn-success.example.json
                fail:
                  $ref: ./api/contract/post-call-read-only-fn-fail.example.json
      parameters:
        - name: contract_address
          in: path
          required: true
          description: Stacks address
          schema:
            type: string
        - name: contract_name
          in: path
          required: true
          description: Contract name
          schema:
            type: string
        - name: function_name
          in: path
          required: true
          description: Function name
          schema:
            type: string
        - name: tip
          in: query
          schema:
            type: string
          description: The Stacks chain tip to query from. If tip == latest, the query will be run from the latest
            known tip (includes unconfirmed state).
          required: false
      requestBody:
        description: map of arguments and the simulated tx-sender where sender is either a Contract identifier or a normal Stacks address, and arguments is an array of hex serialized Clarity values.
        required: true
        content:
          application/json:
            schema:
              $ref: './entities/contracts/read-only-function-args.schema.json'
              example:
                sender: 'SP31DA6FTSJX2WGTZ69SFY11BH51NZMB0ZW97B5P0.get-info'
                arguments:
                  - '0x0011...'
                  - '0x00231...'

  /v2/accounts/{principal}:
    get:
      summary: Get account info
      tags:
        - Accounts
      operationId: get_account_info
      description: |
        Get the account data for the provided principal

        Where balance is the hex encoding of a unsigned 128-bit integer (big-endian), nonce is a unsigned 64-bit integer, and the proofs are provided as hex strings.

        For non-existent accounts, this does not 404, rather it returns an object with balance and nonce of 0.
      parameters:
        - name: principal
          in: path
          description: Stacks address or a Contract identifier (e.g. `SP31DA6FTSJX2WGTZ69SFY11BH51NZMB0ZW97B5P0.get-info`)
          required: true
          schema:
            type: string
        - name: proof
          in: query
          description: Returns object without the proof field if set to 0
          schema:
            type: integer
        - name: tip
          in: query
          schema:
            type: string
          description: The Stacks chain tip to query from. If tip == latest, the query will be run from the latest
            known tip (includes unconfirmed state).
      responses:
        "200":
          description: Success
          content:
            application/json:
              schema:
                $ref: ./api/core-node/get-account-data.schema.json
              example:
                $ref: ./api/core-node/get-account-data.example.json

  /v2/fees/transaction:
    post:
      summary: Get approximate fees for the given transaction
      tags:
        - Fees
      description: |
        Get an estimated fee for the supplied transaction.  This
        estimates the execution cost of the transaction, the current
        fee rate of the network, and returns estimates for fee
        amounts.

        * `transaction_payload` is a hex-encoded serialization of
          the TransactionPayload for the transaction.
        * `estimated_len` is an optional argument that provides the
          endpoint with an estimation of the final length (in bytes)
          of the transaction, including any post-conditions and
          signatures

        If the node cannot provide an estimate for the transaction
        (e.g., if the node has never seen a contract-call for the
        given contract and function) or if estimation is not
        configured on this node, a 400 response is returned.
        The 400 response will be a JSON error containing a `reason`
        field which can be one of the following:

        * `DatabaseError` - this Stacks node has had an internal
          database error while trying to estimate the costs of the
          supplied transaction.
        * `NoEstimateAvailable` - this Stacks node has not seen this
          kind of contract-call before, and it cannot provide an
          estimate yet.
        * `CostEstimationDisabled` - this Stacks node does not perform
          fee or cost estimation, and it cannot respond on this
          endpoint.

        The 200 response contains the following data:

        * `estimated_cost` - the estimated multi-dimensional cost of
          executing the Clarity VM on the provided transaction.
        * `estimated_cost_scalar` - a unitless integer that the Stacks
          node uses to compare how much of the block limit is consumed
          by different transactions. This value incorporates the
          estimated length of the transaction and the estimated
          execution cost of the transaction. The range of this integer
          may vary between different Stacks nodes. In order to compute
          an estimate of total fee amount for the transaction, this
          value is multiplied by the same Stacks node's estimated fee
          rate.
        * `cost_scalar_change_by_byte` - a float value that indicates how
          much the `estimated_cost_scalar` value would increase for every
          additional byte in the final transaction.
        * `estimations` - an array of estimated fee rates and total fees to
          pay in microSTX for the transaction. This array provides a range of
          estimates (default: 3) that may be used. Each element of the array
          contains the following fields:
            * `fee_rate` - the estimated value for the current fee
              rates in the network
            * `fee` - the estimated value for the total fee in
              microSTX that the given transaction should pay. These
              values are the result of computing:
              `fee_rate` x `estimated_cost_scalar`.
              If the estimated fees are less than the minimum relay
              fee `(1 ustx x estimated_len)`, then that minimum relay
              fee will be returned here instead.


        Note: If the final transaction's byte size is larger than
        supplied to `estimated_len`, then applications should increase
        this fee amount by:

          `fee_rate` x `cost_scalar_change_by_byte` x (`final_size` - `estimated_size`)

      operationId: post_fee_transaction
      requestBody:
        content:
          application/json:
            schema:
              $ref: ./api/core-node/post-fee-transaction.schema.json
            example:
              $ref: ./api/core-node/post-fee-transaction.example.json
      responses:
        "200":
          description: Estimated fees for the transaction
          content:
            application/json:
              schema:
                $ref: ./api/core-node/post-fee-transaction-response.schema.json
              example:
                $ref: ./api/core-node/post-fee-transaction-response.example.json

  /v2/fees/transfer:
    get:
      summary: Get estimated fee
      tags:
        - Fees
      operationId: get_fee_transfer
      description: Get an estimated fee rate for STX transfer transactions. This a a fee rate / byte, and is returned as a JSON integer
      responses:
        "200":
          description: Success
          content:
            application/json:
              schema:
                $ref: ./api/core-node/get-fee-transfer.schema.json
              example:
                $ref: ./api/core-node/get-fee-transfer.example.json

  /v2/info:
    get:
      summary: Get Core API info
      description: Get Core API information
      tags:
        - Info
      operationId: get_core_api_info
      responses:
        "200":
          description: Success
          content:
            application/json:
              schema:
                $ref: ./api/core-node/get-info.schema.json
              example:
                $ref: ./api/core-node/get-info.example.json

  /v2/pox:
    get:
      summary: Get PoX details
      description: Get Proof of Transfer (PoX) information. Can be used for Stacking.
      tags:
        - Info
      operationId: get_pox_info
      responses:
        "200":
          description: Success
          content:
            application/json:
              schema:
                $ref: ./api/core-node/get-pox.schema.json
              example:
                $ref: ./api/core-node/get-pox.example.json
      parameters:
        - name: tip
          in: query
          schema:
            type: string
          description: The Stacks chain tip to query from. If tip == latest, the query will be run from the latest
            known tip (includes unconfirmed state).

  /v2/traits/{contract_address}/{contract_name}/{trait_contract_address}/{trait_contract_name}/{trait_name}:
    get:
      summary: Get trait implementation details
      description: Determine whether or not a specified trait is implemented (either explicitly or implicitly) within a given contract.
      tags:
        - Smart Contracts
      operationId: get_is_trait_implemented
      responses:
        "200":
          description: Success
          content:
            application/json:
              schema:
                $ref: ./api/trait/get-is-trait-implemented.schema.json
              example:
                $ref: ./api/trait/get-is-trait-implemented.example.json
    parameters:
      - name: contract_address
        in: path
        required: true
        description: Stacks address
        schema:
          type: string
      - name: contract_name
        in: path
        required: true
        description: Contract name
        schema:
          type: string
      - name: trait_contract_address
        in: path
        required: true
        description: Trait Stacks address
        schema:
          type: string
      - name: trait_contract_name
        in: path
        required: true
        description: Trait contract name
        schema:
          type: string
      - name: trait_name
        in: path
        required: true
        description: Trait name
        schema:
          type: string
      - name: tip
        in: query
        schema:
          type: string
        description: |
          The Stacks chain tip to query from.
          If tip == "latest", the query will be run from the latest known tip (includes unconfirmed state).
          If the tip is left unspecified, the stacks chain tip will be selected (only includes confirmed state).

  /v2/clarity/marf/{clarity_marf_key}:
    post:
      summary: Get the MARF value for a given key
      tags:
        - Smart Contracts
      operationId: get_clarity_marf_value
      description: |
        Attempt to fetch the value of a MARF key.

        In the response, `data` is the hex serialization of the value.
      responses:
        200:
          description: Success
          content:
            application/json:
              schema:
                $ref: ./api/core-node/get-clarity-marf-value.schema.json
              example:
                $ref: ./api/core-node/get-clarity-marf-value.example.json
        400:
          description: Failed to retrieve MARF key
      parameters:
        - name: clarity_marf_key
          in: path
          required: true
          description: MARF key
          schema:
            type: string
        - name: proof
          in: query
          description: Returns object without the proof field when set to 0
          schema:
            type: integer
        - name: tip
          in: query
          schema:
            type: string
          description: The Stacks chain tip to query from. If tip == latest, the query will be run from the latest
            known tip (includes unconfirmed state).

  /v2/clarity/metadata/{contract_address}/{contract_name}/{clarity_metadata_key}:
    post:
      summary: Get the contract metadata for the metadata key
      tags:
        - Smart Contracts
      operationId: get_clarity_metadata_key
      description: |
        Attempt to fetch the metadata of a contract. The contract is identified with [Contract Address] and [Contract Name] in the URL path. The metadata key is identified with [Clarity Metadata Key].

        In the response, `data` is formatted as JSON.
      responses:
        200:
          description: Success
          content:
            application/json:
              schema:
                $ref: ./api/core-node/get-clarity-metadata.schema.json
              example:
                $ref: ./api/core-node/get-clarity-metadata.example.json
        400:
          description: Failed to retrieve constant value from contract
      parameters:
        - name: contract_address
          in: path
          required: true
          description: Stacks address
          schema:
            type: string
        - name: contract_name
          in: path
          required: true
          description: Contract name
          schema:
            type: string
        - name: clarity_metadata_key
          in: path
          required: true
          description: Metadata key
          schema:
            type: string
        - name: tip
          in: query
          schema:
            type: string
          description: The Stacks chain tip to query from. If tip == latest, the query will be run from the latest
            known tip (includes unconfirmed state).

  /v2/constant_val/{contract_address}/{contract_name}/{constant_name}:
    post:
      summary: Get the value of a constant inside a contract
      tags:
        - Smart Contracts
      operationId: get_constant_val
      description: |
        Attempt to fetch the value of a constant inside a contract. The contract is identified with [Stacks Address] and [Contract Name] in the URL path. The constant is identified with [Constant Name].

        In the response, `data` is the hex serialization of the constant value.
      responses:
        "200":
          description: Success
          content:
            application/json:
              schema:
                $ref: ./api/core-node/get-constant-val.schema.json
              example:
                $ref: ./api/core-node/get-constant-val.example.json
        "400":
          description: Failed to retrieve constant value from contract
      parameters:
        - name: contract_address
          in: path
          required: true
          description: Stacks address
          schema:
            type: string
        - name: contract_name
          in: path
          required: true
          description: Contract name
          schema:
            type: string
        - name: constant_name
          in: path
          required: true
          description: Constant name
          schema:
            type: string
        - name: tip
          in: query
          schema:
            type: string
          description: The Stacks chain tip to query from. If tip == latest, the query will be run from the latest
            known tip (includes unconfirmed state).

  /v3/block_proposal:
    post:
      summary: Validate a proposed Stacks block
      tags:
        - Mining
      operationId: post_block_proposal
      description: |
        Used by stackers to validate a proposed Stacks block from a miner.

        **This API endpoint requires a basic Authorization header.**
      responses:
        "202":
          description: Block proposal has been accepted for processing.
            The result will be returned via the event observer.
          content:
            application/json:
              example:
                $ref: ./api/core-node/post-block-proposal-response.example.json
        "400":
          description: Endpoint not enabled.
        "401":
          description: Unauthorized.
        "429":
          description: There is an ongoing proposal validation being processed,
            the new request cannot be accepted until the prior request has been processed.
          content:
            application/json:
              example:
                $ref: ./api/core-node/post-block-proposal-response.429.json
      requestBody:
        content:
          application/json:
            example:
              $ref: ./api/core-node/post-block-proposal-req.example.json

  /v3/stacker_set/{cycle_number}:
    get:
      summary: Fetch the stacker and signer set information for a given cycle.
      tags:
        - Mining
      operationId: get_stacker_set
      description: |
        Used to get stacker and signer set information for a given cycle.

        This will only return information for cycles started in Epoch-2.5 where PoX-4 was active and subsequent cycles.
      parameters:
        - name: cycle_number
          in: path
          required: true
          description: reward cycle number
          schema:
            type: integer
      responses:
        "200":
          description: Information for the given reward cycle
          content:
            application/json:
              example:
                $ref: ./api/core-node/get_stacker_set.example.json
        "400":
          description: Could not fetch the given reward set
          content:
            application/json:
              example:
                $ref: ./api/core-node/get_stacker_set.400.example.json

  /v3/blocks/{block_id}:
    get:
      summary: Fetch a Nakamoto block
      tags:
        - Blocks
      operationId: get_block_v3
      description:
        Fetch a Nakamoto block by its index block hash.
      parameters:
        - name: block_id
          in: path
          description: The block's ID hash
          required: true
          schema:
            type: string
      responses:
        "200":
          description: The raw SIP-003-encoded block will be returned.
          content:
            application/octet-stream:
              schema:
                type: string
                format: binary
        "404":
          description: The block could not be found
          content:
            application/text-plain: {}

  /v3/blocks/height/{block_height}:
    get:
      summary: Fetch a Nakamoto block by its height and optional tip
      tags:
        - Blocks
      operationId: get_block_v3_by_height
      description:
        Fetch a Nakamoto block by its height and optional tip.
      parameters:
        - name: block_height
          in: path
          description: The block's height
          required: true
          schema:
            type: integer
        - name: tip
          in: query
          schema:
            type: string
          description: The Stacks chain tip to query from. If tip == latest or empty, the query will be run
            from the latest known tip.
      responses:
        "200":
          description: The raw SIP-003-encoded block will be returned.
          content:
            application/octet-stream:
              schema:
                type: string
                format: binary
        "404":
          description: The block could not be found
          content:
            application/text-plain: {}

  /v3/tenures/info:
    get:
      summary: Fetch metadata about the ongoing Nakamoto tenure
      tags:
        - Blocks
      operationId: get_tenure_info
      description:
        Fetch metadata about the ongoing Nakamoto tenure. This information is sufficient to obtain and authenticate the highest complete tenure, as well as obtain new tenure blocks.
      responses:
        "200":
          description: Metadata about the ongoing tenure
          content:
            application/json:
              example:
                $ref: ./api/core-node/get_tenure_info.json

  /v3/tenures/{block_id}:
    get:
      summary: Fetch a sequence of Nakamoto blocks in a tenure
      tags:
        - Blocks
      operationId: get_tenures
      description:
        Fetch a sequence of Nakamoto blocks in a tenure.  The blocks will be served in order from highest to lowest.  The blocks will be encoded in their SIP-003 wire format, and concatenated together.
      responses:
        "200":
          description: SIP-003-encoded Nakamoto blocks, concatenated together
          content:
            application/octet-stream:
              schema:
                type: string
                format: binary
    parameters:
      - name: block_id
        in: path
        description:
          The tenure-start block ID of the tenure to query
        required: true
        schema:
          type: string
      - name: stop
        in: query
        description:
          The block ID hash of the highest block in this tenure that is already known to the caller.  Neither the corresponding block nor any of its ancestors will be served.  This is used to fetch tenure blocks that the caller does not have.
        required: false
        schema:
          type: string

  /v3/sortitions/{lookup_kind}/{lookup}:
    get:
      summary: Fetch information about evaluated burnchain blocks (i.e., sortitions).
      tags:
        - Blocks
      operationId: get_sortitions
      description:
        Fetch sortition information about a burnchain block. If the `lookup_kind` and `lookup` parameters are empty, it will return information about the latest burn block.
      responses:
        "200":
          description: Information for the burn block or in the case of `latest_and_last`, multiple burn blocks
          content:
            application/json:
              examples:
                Latest:
                  description: A single element list is returned when just one sortition is requested
                  value:
                    $ref: ./api/core-node/get_sortitions.example.json
                LatestAndLast:
                  description: Sortition information about the latest burn block with a winning miner, and the previous such burn block.
                  value:
                    $ref: ./api/core-node/get_sortitions_latest_and_prior.example.json
    parameters:
      - name: lookup_kind
        in: path
        description: |-
          The style of lookup that should be performed. If not given, the most recent burn block processed will be returned.
          Otherwise, the `lookup_kind` should be one of the following strings:
            * `consensus` - find the burn block using the consensus hash supplied in the `lookup` field.
            * `burn_height` - find the burn block using the burn block height supplied in the `lookup` field.
            * `burn` - find the burn block using the burn block hash supplied in the `lookup` field.
            * `latest_and_last` - return information about the latest burn block with a winning miner *and* the previous such burn block
        required: false
        schema:
          type: string
      - name: lookup
        in: path
        description: The value to use for the lookup if `lookup_kind` is `consensus`, `burn_height`, or `burn`
        required: false
        schema:
          type: string
  /v3/signer/{signer}/{cycle_number}:
    get:
      summary: Get number of blocks signed by signer during a given reward cycle
      tags:
        - Blocks
        - Signers
      operationId: get_signer
      description: Get number of blocks signed by signer during a given reward cycle
      parameters:
        - name: signer
          in: path
          required: true
          description: Hex-encoded compressed Secp256k1 public key of signer
          schema:
            type: string
        - name: cycle_number
          in: path
          required: true
          description: Reward cycle number
          schema:
            type: integer
      responses:
        200:
          description: Number of blocks signed
          content:
            text/plain:
              schema:
                type: integer
                example: 7
  /v3/transaction/{txid}:
    post:
      summary: Retrieve transaction details by TXID
      tags:
        - Transactions
      description: Get a JSON with the transaction details including the `index_block_hash`, the hex-encoded transaction body, and the `result`.
      operationId: get_transaction
      parameters:
      - name: txid
        in: path
        required: true
        description: Transaction ID
        schema:
          type: string
      responses:
        "200":
          description: Transaction JSON with index_block_hash, transaction body and result
          content:
            application/json:
              example:
                $ref: ./api/core-node/get_transaction.json
        "404":
          description: Transaction not found
          content:
            application/text-plain: {}
        "501":
          description: Transaction indexing not enabled
          content:
            application/text-plain: {}