Braiins Contracts API

Quote, schedule, manage, and inspect caller-owned fixed-duration contracts.

Operations 16

GET /contract List caller-owned contracts #
POST /contract Schedule a new caller-owned contract #
POST /contract/quote Quote and validate a contract creation request #
GET /contract/pricing List current contract pricing #
GET /contract/cancel-fee List current contract cancellation fees #
POST /contract/availability Check whether requested contract hashrate is available #
GET /contract/active List caller-owned pending, running, or paused contracts #
GET /contract/{contract_id}/detail Get a caller-owned contract #
GET /contract/settings Get effective contract policy settings #
POST /contract/{contract_id}:cancel Request cancellation for a pending caller-owned contract #
POST /contract/{contract_id}:terminate Terminate an active caller-owned contract #
GET /contract/activity List contract activity for the caller #
GET /contract/{contract_id}/reservation List reservation history for a caller-owned contract #
GET /contract/{contract_id}/settlement List settlement history for a caller-owned contract #
GET /contract/{contract_id}/speed Get contract hashrate history time series #
GET /contract/{contract_id}/delivery Get contract delivery history time series #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/braiins-academy-contracts-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

braiins-academy-contracts-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Braiins Hashpower Contracts API
  description: 'Public HTTP API for buying hashrate on the spot market, scheduling fixed-duration

    contracts, and reading account and market data.'
  version: 1.0.0
servers:
- url: https://hashpower.braiins.com/v1
  description: Production public API
security:
- ApiKey: []
tags:
- name: Contracts
  description: Quote, schedule, manage, and inspect caller-owned fixed-duration contracts.
paths:
  /contract:
    get:
      summary: List caller-owned contracts
      description: 'Lists contracts owned by the authenticated caller for one proof-of-work algorithm. Results can be paginated, reversed, and restricted to a created-at interval expressed in Unix nanoseconds.


        **Access:** API key required; allowed ACLs: `owner`, `read-only`.


        **Rate limit:** 100 requests/minute per API credential.'
      tags:
      - Contracts
      operationId: getContracts
      x-required-acl:
      - owner
      - read-only
      x-rate-limit: 100 requests/minute per API credential
      parameters:
      - name: pow_algo
        in: query
        required: true
        schema:
          type: string
        description: 'Proof-of-work algorithm filter. Canonical spelling: `sha256`; parsing is ASCII case-insensitive.'
      - name: limit
        in: query
        description: Maximum number of contracts to return. Omit to use the service default.
        schema:
          type: integer
          format: int32
      - name: offset
        in: query
        description: Zero-based number of matching contracts to skip.
        schema:
          type: integer
          format: int32
      - name: reverse
        in: query
        description: Return newest contracts first when true; the default order is oldest first.
        schema:
          type: boolean
      - name: start_timestamp
        in: query
        schema:
          type: integer
          format: int64
          minimum: 0
          maximum: 9223372036854775807
        description: Inclusive lower created-at filter as Unix timestamp in nanoseconds. Zero disables the filter.
      - name: end_timestamp
        in: query
        schema:
          type: integer
          format: int64
          minimum: 0
          maximum: 9223372036854775807
        description: Exclusive upper created-at filter as Unix timestamp in nanoseconds. Zero disables the filter.
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetContractsResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        default:
          $ref: '#/components/responses/ServiceError'
    post:
      summary: Schedule a new caller-owned contract
      description: 'Schedules a fixed-duration contract and reserves the required caller funds. Pricing, funds, policy, and capacity are recalculated atomically; a preceding quote or availability check is advisory and does not reserve capacity.


        **Access:** API key required; allowed ACL: `owner`.


        **Rate limit:** 100 requests/minute per API credential.'
      tags:
      - Contracts
      operationId: scheduleContract
      x-required-acl:
      - owner
      x-rate-limit: 100 requests/minute per API credential
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ScheduleContractRequest'
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ScheduleContractResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        default:
          $ref: '#/components/responses/ServiceError'
  /contract/quote:
    post:
      summary: Quote and validate a contract creation request
      tags:
      - Contracts
      operationId: quoteContractCreation
      description: 'Calculates the current hashrate cost, premium, cancellation-weighted premium on the Contractual Funding Tail, available capacity, and caller balance for a proposed contract. This is advisory only and does not reserve funds or capacity; scheduling recomputes all checks.


        **Access:** API key required; allowed ACL: `owner`.


        **Rate limit:** 100 requests/minute per API credential.'
      x-required-acl:
      - owner
      x-rate-limit: 100 requests/minute per API credential
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/QuoteContractCreationRequest'
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/QuoteContractCreationResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        default:
          $ref: '#/components/responses/ServiceError'
  /contract/pricing:
    get:
      summary: List current contract pricing
      tags:
      - Contracts
      operationId: getCurrentContractPricing
      description: 'Lists the active standard and time-limited pricing layers for the requested proof-of-work algorithm.

        A valid API key also includes the authenticated caller''s active individual pricing layer.

        Requests without an API key, or with an invalid API key, receive generic pricing only.


        **Access:** API key optional; allowed ACLs: `contract-pricing-public`, `owner`, `read-only`.


        **Rate limit:** 100 requests/minute per client IP.'
      security:
      - {}
      - ApiKey: []
      x-required-acl:
      - contract-pricing-public
      - owner
      - read-only
      x-rate-limit: 100 requests/minute per client IP
      parameters:
      - name: pow_algo
        in: query
        required: true
        schema:
          type: string
        description: 'Proof-of-work algorithm. Canonical spelling: `sha256`; parsing is ASCII case-insensitive.'
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetCurrentContractPricingResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        default:
          $ref: '#/components/responses/ServiceError'
  /contract/cancel-fee:
    get:
      summary: List current contract cancellation fees
      tags:
      - Contracts
      operationId: getCurrentContractCancelFees
      description: 'Lists active standard and time-limited cancellation-fee layers for the requested proof-of-work algorithm.

        A valid API key also includes the authenticated caller''s active individual fee layer.

        Requests without an API key, or with an invalid API key, receive generic fee layers only.


        **Access:** API key optional; allowed ACLs: `contract-cancel-fee-public`, `owner`, `read-only`.


        **Rate limit:** 100 requests/minute per client IP.'
      security:
      - {}
      - ApiKey: []
      x-required-acl:
      - contract-cancel-fee-public
      - owner
      - read-only
      x-rate-limit: 100 requests/minute per client IP
      parameters:
      - name: pow_algo
        in: query
        required: true
        schema:
          type: string
        description: 'Proof-of-work algorithm. Canonical spelling: `sha256`; parsing is ASCII case-insensitive.'
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetCurrentContractCancelFeesResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        default:
          $ref: '#/components/responses/ServiceError'
  /contract/availability:
    post:
      summary: Check whether requested contract hashrate is available
      tags:
      - Contracts
      operationId: checkContractSpeedAvailability
      description: 'Checks current contract capacity for the requested proof-of-work algorithm, hashrate, and time window. This is advisory and does not reserve capacity; scheduling rechecks while holding the service lock.


        **Access:** API key required; allowed ACL: `owner`.


        **Rate limit:** 100 requests/minute per API credential.'
      x-required-acl:
      - owner
      x-rate-limit: 100 requests/minute per API credential
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CheckContractSpeedAvailabilityRequest'
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CheckContractSpeedAvailabilityResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        default:
          $ref: '#/components/responses/ServiceError'
  /contract/active:
    get:
      summary: List caller-owned pending, running, or paused contracts
      description: 'Returns only caller-owned contracts that can still activate or deliver hashrate. Finished, canceled, and terminated contracts remain available from the general contract list.


        **Access:** API key required; allowed ACLs: `owner`, `read-only`.


        **Rate limit:** 100 requests/minute per API credential.'
      tags:
      - Contracts
      operationId: getActiveContracts
      x-required-acl:
      - owner
      - read-only
      x-rate-limit: 100 requests/minute per API credential
      parameters:
      - name: pow_algo
        in: query
        required: true
        schema:
          type: string
        description: 'Proof-of-work algorithm filter. Canonical spelling: `sha256`; parsing is ASCII case-insensitive.'
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetContractsResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        default:
          $ref: '#/components/responses/ServiceError'
  /contract/{contract_id}/detail:
    get:
      summary: Get a caller-owned contract
      description: 'Returns the schedule, destination, lifecycle status, and commercial terms for one caller-owned contract. Current delivery state is included when runtime state is available.


        **Access:** API key required; allowed ACLs: `owner`, `read-only`.


        **Rate limit:** 100 requests/minute per API credential.'
      tags:
      - Contracts
      operationId: getContractDetail
      x-required-acl:
      - owner
      - read-only
      x-rate-limit: 100 requests/minute per API credential
      parameters:
      - name: contract_id
        in: path
        required: true
        description: Contract ID prefixed with C.
        schema:
          type: string
          pattern: ^C[0-9]+$
          examples:
          - C123456789
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetContractDetailResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        default:
          $ref: '#/components/responses/ServiceError'
  /contract/settings:
    get:
      summary: Get effective contract policy settings
      description: 'Returns the currently effective contract-duration, hashrate, activation-gap, cancellation-gap, and reservation-lead settings for the requested proof-of-work algorithm. Clients should validate scheduling forms against these settings.


        **Access:** API key required; allowed ACLs: `owner`, `read-only`.


        **Rate limit:** 100 requests/minute per API credential.'
      tags:
      - Contracts
      operationId: getContractSettings
      x-required-acl:
      - owner
      - read-only
      x-rate-limit: 100 requests/minute per API credential
      parameters:
      - name: pow_algo
        in: query
        required: true
        description: 'Proof-of-work algorithm whose settings should be returned. Canonical spelling: `sha256`; parsing is ASCII case-insensitive.'
        schema:
          type: string
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetContractSettingsResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        default:
          $ref: '#/components/responses/ServiceError'
  /contract/{contract_id}:cancel:
    post:
      summary: Request cancellation for a pending caller-owned contract
      description: 'Requests cancellation of a contract that has not started delivery. Flux evaluates the request and the response reports whether it was accepted; cancellation rules and fees can apply.


        **Access:** API key required; allowed ACL: `owner`.


        **Rate limit:** 100 requests/minute per API credential.'
      tags:
      - Contracts
      operationId: cancelContract
      x-required-acl:
      - owner
      x-rate-limit: 100 requests/minute per API credential
      parameters:
      - name: contract_id
        in: path
        required: true
        description: Contract ID prefixed with C.
        schema:
          type: string
          pattern: ^C[0-9]+$
          examples:
          - C123456789
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CancelContractRequest'
      responses:
        '200':
          description: Cancellation request accepted or rejected by Flux
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CancelContractResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        default:
          $ref: '#/components/responses/ServiceError'
  /contract/{contract_id}:terminate:
    post:
      summary: Terminate an active caller-owned contract
      description: 'Permanently stops an active caller-owned contract before its scheduled expiry. Termination is distinct from canceling a pending contract and can trigger final accounting.


        **Access:** API key required; allowed ACL: `owner`.


        **Rate limit:** 100 requests/minute per API credential.'
      tags:
      - Contracts
      operationId: terminateContract
      x-required-acl:
      - owner
      x-rate-limit: 100 requests/minute per API credential
      parameters:
      - name: contract_id
        in: path
        required: true
        description: Contract ID prefixed with C.
        schema:
          type: string
          pattern: ^C[0-9]+$
          examples:
          - C123456789
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TerminateContractRequest'
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TerminateContractResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        default:
          $ref: '#/components/responses/ServiceError'
  /contract/activity:
    get:
      summary: List contract activity for the caller
      tags:
      - Contracts
      operationId: getContractActivity
      description: 'Returns caller-owned reservation, settlement, termination, funding-warning, blocked-settlement, and late-yield events in ascending cursor order. Store `next_cursor` and pass it as `after_cursor` to continue without replaying the last item.


        **Access:** API key required; allowed ACLs: `owner`, `read-only`.


        **Rate limit:** 100 requests/minute per API credential.'
      x-required-acl:
      - owner
      - read-only
      x-rate-limit: 100 requests/minute per API credential
      parameters:
      - name: after_cursor
        in: query
        description: Return events with a cursor strictly greater than this value. Zero starts at the beginning.
        schema:
          type: integer
          format: uint64
          minimum: 0
      - name: limit
        in: query
        description: Maximum number of events. Zero uses the server default; the service maximum is 500.
        schema:
          type: integer
          format: uint32
          minimum: 0
          maximum: 4294967295
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetContractActivityResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        default:
          $ref: '#/components/responses/ServiceError'
  /contract/{contract_id}/reservation:
    get:
      summary: List reservation history for a caller-owned contract
      description: 'Returns up to 1,000 reservation adjustments for the contract, including when each became effective, the reserved amount, and the share price used when available.


        **Access:** API key required; allowed ACLs: `owner`, `read-only`.


        **Rate limit:** 100 requests/minute per API credential.'
      tags:
      - Contracts
      operationId: getContractReservations
      x-required-acl:
      - owner
      - read-only
      x-rate-limit: 100 requests/minute per API credential
      parameters:
      - name: contract_id
        in: path
        required: true
        description: Contract ID prefixed with C.
        schema:
          type: string
          pattern: ^C[0-9]+$
          examples:
          - C123456789
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetContractReservationsResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        default:
          $ref: '#/components/responses/ServiceError'
  /contract/{contract_id}/settlement:
    get:
      summary: List settlement history for a caller-owned contract
      description: 'Returns daily settlement records for the contract, including delivered value, fees, indicative PPS rate, and any cancellation settlement data. Zero-share rows represent completed accounting days without delivery.


        **Access:** API key required; allowed ACLs: `owner`, `read-only`.


        **Rate limit:** 100 requests/minute per API credential.'
      tags:
      - Contracts
      operationId: getContractSettlements
      x-required-acl:
      - owner
      - read-only
      x-rate-limit: 100 requests/minute per API credential
      parameters:
      - name: contract_id
        in: path
        required: true
        description: Contract ID prefixed with C.
        schema:
          type: string
          pattern: ^C[0-9]+$
          examples:
          - C123456789
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetContractSettlementsResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        default:
          $ref: '#/components/responses/ServiceError'
  /contract/{contract_id}/speed:
    get:
      summary: Get contract hashrate history time series
      tags:
      - Contracts
      operationId: getContractSpeedHistory
      description: 'Returns estimated delivered hashrate samples for a caller-visible contract. `aggregation_period` controls sample buckets and `sliding_window_size` controls the estimator window.


        **Access:** API key required; allowed ACLs: `staff`, `owner`, `read-only`.


        **Rate limit:** 100 requests/minute per API credential.'
      x-required-acl:
      - staff
      - owner
      - read-only
      x-rate-limit: 100 requests/minute per API credential
      parameters:
      - name: contract_id
        in: path
        required: true
        description: The contract ID (e.g., C123456789)
        schema:
          type: string
          pattern: ^C[0-9]+$
          examples:
          - C123456789
      - name: aggregation_period
        in: query
        description: Aggregation period for resampling the data.
        schema:
          $ref: '#/components/schemas/ContractHistoryAggregationPeriod'
      - name: sliding_window_size
        in: query
        description: Sliding window size for estimating hashrate.
        schema:
          $ref: '#/components/schemas/SlidingWindowSize'
      - name: datetime_from
        in: query
        description: Datetime from which to start the history (optional). RFC 3339 format expected.
        schema:
          type: string
          format: date-time
          examples:
          - '2025-10-04T12:00:00Z'
      - name: limit
        in: query
        description: Maximum number of items to return (optional).
        schema:
          $ref: '#/components/schemas/Uint32'
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetContractSpeedHistoryResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        default:
          $ref: '#/components/responses/ServiceError'
  /contract/{contract_id}/delivery:
    get:
      summary: Get contract delivery history time series
      tags:
      - Contracts
      operationId: getContractDeliveryHistory
      description: 'Returns delivered, accepted, and rejected shares for a caller-visible contract, grouped by the selected aggregation period. Each value is expressed in millions of shares.


        **Access:** API key required; allowed ACLs: `staff`, `owner`, `read-only`.


        **Rate limit:** 100 requests/minute per API credential.'
      x-required-acl:
      - staff
      - owner
      - read-only
      x-rate-limit: 100 requests/minute per API credential
      parameters:
      - name: contract_id
        in: path
        required: true
        description: The contract ID (e.g., C123456789)
        schema:
          type: string
          pattern: ^C[0-9]+$
          examples:
          - C123456789
      - name: aggregation_period
        in: query
        description: Aggregation period for resampling the data.
        schema:
          $ref: '#/components/schemas/ContractHistoryAggregationPeriod'
      - name: datetime_from
        in: query
        description: Datetime from which to start the history (optional). RFC 3339 format expected.
        schema:
          type: string
          format: date-time
          examples:
          - '2025-10-04T12:00:00Z'
      - name: limit
        in: query
        description: Maximum number of items to return (optional).
        schema:
          $ref: '#/components/schemas/Uint32'
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetContractDeliveryHistoryResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        default:
          $ref: '#/components/responses/ServiceError'
components:
  schemas:
    CancelContractResponse:
      type: object
      properties:
        cancellation_request:
          $ref: '#/components/schemas/ContractCancellationRequest'
    GetContractSettlementsResponse:
      type: object
      required:
      - contract_id
      - items
      properties:
        contract_id:
          type: string
          description: Contract ID prefixed with C.
        items:
          type: array
          items:
            $ref: '#/components/schemas/ContractSettlementPublicItem'
    ContractReservationOriginPublic:
      type: string
      enum:
      - CONTRACT_RESERVATION_ORIGIN_UNSPECIFIED
      - CONTRACT_RESERVATION_ORIGIN_INITIAL
      - CONTRACT_RESERVATION_ORIGIN_RECURRING
    GetCurrentContractCancelFeesResponse:
      type: object
      required:
      - items
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/CurrentContractCancelFeeLayer'
    CheckContractSpeedAvailabilityRequest:
      type: object
      required:
      - pow_algo
      - speed_ph
      - activates_at
      - expires_at
      properties:
        pow_algo:
          type: string
          description: 'Proof-of-work algorithm. Canonical spelling: `sha256`; parsing is ASCII case-insensitive.'
        speed_ph:
          $ref: '#/components/schemas/Double'
          description: Contract hashrate in PH/s.
        activates_at:
          type: string
          format: date-time
          description: Desired activation datetime of the contract.
        expires_at:
          type: string
          format: date-time
          description: Desired expiration datetime of the contract.
    CheckContractSpeedAvailabilityResponse:
      type: object
      required:
      - available
      - reason_code
      - reason
      properties:
        available:
          type: boolean
          description: True when the requested hashrate and window currently fit configured contract capacity.
        reason_code:
          type: string
          description: Empty when available is true; otherwise a stable machine-readable rejection code.
        reason:
          type: string
          description: Empty when available is true; otherwise a human-readable rejection reason.
    CurrentContractCancelFeeLayer:
      type: object
      required:
      - kind
      - label
      - valid_from
      - valid_to
      - cancel_fee_pct
      properties:
        kind:
          $ref: '#/components/schemas/CurrentContractCancelFeeLayerKind'
        label:
          type: string
        valid_from:
          type: string
          format: date-time
          description: RFC3339 UTC timestamp from which this fee layer is valid.
        valid_to:
          type: string
          description: RFC3339 UTC timestamp at which this fee layer stops being valid. Empty means open-ended.
        cancel_fee_pct:
          type: string
          description: Cancellation fee as a percentage of unpaid remaining contract premium.
    ProfileIdentifier:
      type: object
      required:
      - profile_name
      - client_name
      properties:
        profile_name:
          type: string
        client_name:
          type: string
    GetContractDeliveryHistoryResponse:
      type: object
      required:
      - items
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/GetContractDeliveryHistoryItem'
    GetContractSpeedHistoryResponse:
      type: object
      required:
      - items
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/GetContractSpeedHistoryItem'
    GetContractsResponse:
      type: object
      required:
      - items
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/GetContractsResponseItem'
    ContractCreationQuoteReason:
      type: string
      enum:
      - CONTRACT_CREATION_QUOTE_REASON_UNSPECIFIED
      - CONTRACT_CREATION_QUOTE_REASON_SALES_DISABLED
      - CONTRACT_CREATION_QUOTE_REASON_SHARE_PRICE_UNAVAILABLE
      - CONTRACT_CREATION_QUOTE_REASON_NO_VALID_PRICING
      - CONTRACT_CREATION_QUOTE_REASON_SPEED_LIMIT_NOT_CONFIGURED
      - CONTRACT_CREATION_QUOTE_REASON_INSUFFICIENT_SPEED_CAPACITY
      - CONTRACT_CREATION_QUOTE_REASON_SPEED_UNAVAILABLE
      - CONTRACT_CREATION_QUOTE_REASON_INSUFFICIENT_FUNDS
    Int64:
      type: integer
      format: int64
    CurrentContractPricingLayer:
      type: object
      required:
      - kind
      - label
      - valid_from
      - valid_to
      - bands
      properties:
        kind:
          $ref: '#/components/schemas/CurrentContractPricingLayerKind'
        label:
          type: string
        valid_from:
          type: string
          format: date-time
          description: RFC3339 UTC timestamp from which this pricing layer is valid.
        valid_to:
          type: string
          description: RFC3339 UTC timestamp at which this pricing layer stops being valid. Empty means open-ended.
        bands:
          type: array
          items:
            $ref: '#/components/schemas/CurrentContractPricingBand'
    GetContractActivityResponse:
      type: object
      required:
      - items
      - next_cursor
      - has_more
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/ContractActivityItem'
        next_cursor:
          type: integer
          format: uint64
          minimum: 0
          description: Cursor of the final returned item, or the request cursor when no items were returned.
        has_more:
          type: boolean
          description: True when more matching events are currently availa

# --- truncated at 32 KB (53 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/braiins-academy/refs/heads/main/openapi/braiins-academy-contracts-api-openapi.yml