SnowSignals Phase API

The Phase API from SnowSignals — 6 operation(s) for phase.

Operations 6

GET /api/phase/resolution-stats Public, unmetered: how each phase historically resolves, to help interpret a… #
GET /api/phase/boundary Metered Phase-Event read: boundary (the last closed-boundary phase… #
GET /api/phase/updates Metered Phase-Event read: updates (the intra-bucket phase on the timeframe's… #
GET /phase/boundary Settled phase (last closed bar) #
GET /phase/updates Live phase (current bar) #
GET /phase/resolution-stats Phase resolution statistics (free) #

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/snowsignals-phase-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

snowsignals-phase-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Snowsignals Phase API
  version: 1.0.0
  contact:
    name: SnowSignals
    url: https://snowsignals.io
  description: 'Operations tagged Phase across 2 of this provider''s published API definitions: snowsignals-daas-openapi.json, snowsignals-x402-openapi.json. Each path carries the servers of the definition it was published in.'
servers:
- url: https://snowsignals.io/v1
- url: https://pay.snowsignals.io
tags:
- name: Phase
paths:
  /api/phase/resolution-stats:
    get:
      security: []
      summary: 'Public, unmetered: how each phase historically resolves, to help interpret a…'
      description: Serves the same generated research artifact as the MCP `phase_resolution_stats` tool. Returns the successor-phase transition matrix, the trend-hold continuation funnel, and per-phase reward-vs-drawdown (MFE/MAE), each with provenance (`statsVersion`, `generatedAt`, window). The model is built from BTC history over a fixed research window rather than per-currency live data, so it takes no query parameters. Use it to interpret a `/api/phase/{boundary,updates}` reading.
      responses:
        '200':
          description: The phase-resolution artifact, served verbatim, plus a `legend`. `schemaVersion` pins the shape and the stat sections sit under provenance. `legend` (added at serve time) declares the units, how each transition edge is counted, the MFE/MAE horizon, and the pooling/scope. The on-site 'How it works' charts render the same artifact.
          content:
            application/json:
              schema:
                type: object
                description: Generated phase-resolution research artifact (served verbatim) + serve-time legend.
                properties:
                  schemaVersion:
                    type: integer
                    description: Artifact shape version.
                    example: 3
                  statsVersion:
                    type: string
                    description: Dated version of the generated stats.
                    example: 2026-09-01.2
                  generatedAt:
                    type: string
                    format: date-time
                    example: '2026-09-01T10:40:30.000Z'
                  provenance:
                    type: object
                    description: 'How the model was derived: source product, currency (BTC), and the research window.'
                  legend:
                    type: object
                    description: 'Units and definitions for interpreting the stat sections: a code↔enum↔label vocabulary crosswalk, plus transitionMatrix / trendHoldFunnel / rewardDrawdown / pooling / scope notes.'
                additionalProperties: true
              example:
                legend:
                  vocabulary:
                  - label: Establishing
                    code: EST
                    enum: establishing_bull | establishing_bear
                    statsLabel: Establishing
                  - label: Running-First
                    code: RF
                    enum: running_first_bull | running_first_bear
                    statsLabel: Running-First
                  - label: Consolidating
                    code: CON
                    enum: consolidating_bull | consolidating_bear
                    statsLabel: Consolidating
                  - label: Re-entry
                    code: REE
                    enum: running_reentry_bull | running_reentry_bear
                    statsLabel: Re-entry
                  - label: Post-FE
                    code: PFE
                    enum: running_post_fe_bull | running_post_fe_bear
                    statsLabel: Post-FE
                  - label: Breaking
                    code: BRK
                    enum: breaking_bull | breaking_bear
                    statsLabel: Breaking
                  howToRead: 'n is an occurrence count: how many times the phase showed up in the window. It tells you the phase is common or rare, nothing about whether the pattern holds, so read the transitions (what tends to follow what) at any n. Read the mfe/mae figures as rough ranges rather than targets. They land closest to face value on the 4h and 1d, where steady price action forms clean moving-average channels, and carry more noise on the faster timeframes. Every timeframe is worth reading; the short ones just move quicker and rougher.'
                  transitionMatrix: nodes.nBull/nBear = number of phase occurrences in that direction over the window. An edge value is the integer percent (0–100) of transitions LEAVING the source phase-state, row-normalized over that node's outgoing transitions. Edge id is 'SRC>DEST'; a _same/_flip suffix marks whether the successor keeps the side or flips it.
                  trendHoldFunnel:
                    _about: Per trend channel; integer percents.
                    commit: '% of channels that reach a Running phase.'
                    hold: '% of committed channels that close favorably vs entry.'
                    reach: '% of committed channels that reach a Breaking phase.'
                    exitWins: of channels reaching Breaking, % where exiting at the FIRST Breaking beats holding to the channel's end.
                  rewardDrawdown: Measured per phase occurrence from the price at the phase's opening boundary to the phase's end. mfe = average max FAVORABLE excursion (% of entry price; up for bull, down for bear), floored at 0; mae = average max ADVERSE excursion. *Min/*Max give the range across occurrences; n = sample size. Horizon = the phase's own duration (entry boundary → phase end), not a fixed bar count.
                  pooling: pooled_1h_2h and pooled_4h_1d group adjacent timeframes for larger samples; standalone 1h/2h/4h/1d are also provided.
                  scope: 'Derived from BTC only, 2022-01-01 → 2026-07-01, on closed boundaries. 15m and 1w are excluded. A research model of phase behavior: not per-asset live expectancy; other currencies and the excluded timeframes are not represented.'
        '429':
          description: Per-IP rate limit exceeded (Retry-After header).
      tags:
      - Phase
      operationId: getApiPhaseResolutionStats
      x-operation-id-source: derived
    servers:
    - url: https://snowsignals.io/v1
  /api/phase/boundary:
    get:
      summary: 'Metered Phase-Event read: boundary (the last closed-boundary phase…'
      parameters:
      - name: currency
        in: query
        schema:
          type: string
        description: 'Comma list or ''all''. GET /v1/api/phases for the live enabled currency list. Default: all.'
      - name: tf
        in: query
        schema:
          type: string
        description: 'Comma list or ''all''. Enabled: 15m, 1h, 2h, 4h, 1d, 1w. Default: all.'
      responses:
        '200':
          description: Phase readings (currency → timeframe) + metering meta.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    description: currency → timeframe → reading (null when that timeframe has no reading yet).
                    additionalProperties:
                      type: object
                      additionalProperties:
                        oneOf:
                        - $ref: '#/components/schemas/PhaseReading'
                        - type: 'null'
                  stale:
                    type: object
                    description: Present ONLY inside the upstream composition window just after a minute boundary, when the exchange candle for the new minute has not yet settled and the returned phase may still reflect the previous minute. Absent means the data is settled. Poll again after pollAfterMs.
                    properties:
                      reason:
                        type: string
                        description: Human-readable explanation of why the data may be stale.
                      pollAfterMs:
                        type: integer
                        description: Milliseconds until the composition window closes; poll again after this.
                        example: 8200
                  meta:
                    type: object
                    properties:
                      rows:
                        type: integer
                        description: Rows served (n = |currencies| × |tfs|).
                        example: 2
                      debitMicroUsd:
                        type: integer
                        description: Amount billed for this request (rows × base rate × mult(rows)).
                        example: 2661
                      cached:
                        type: boolean
                        description: Whether the serve was a Redis cache hit. Billing is cache-independent.
                        example: false
                      endpoint:
                        type: string
                        enum:
                        - boundary
                        - updates
                        description: Which serve semantic produced this response.
                        example: boundary
              example:
                data:
                  BTC:
                    1h:
                      ts: '2026-07-14T17:00:00.000Z'
                      phase: establishing_bull
                      label: Establishing Bull
                meta:
                  rows: 1
                  debitMicroUsd: 1446
                  cached: false
                  endpoint: boundary
        '400':
          description: Invalid currency or tf.
        '402':
          description: Out of credits.
        '423':
          description: Account spending is paused (a refund is settling).
        '429':
          description: Per-key rate limit exceeded (Retry-After header).
      tags:
      - Phase
      security:
      - UrlKey: []
      - ApiKey: []
      operationId: getApiPhaseBoundary
      x-operation-id-source: derived
    servers:
    - url: https://snowsignals.io/v1
  /api/phase/updates:
    get:
      summary: 'Metered Phase-Event read: updates (the intra-bucket phase on the timeframe''s…'
      parameters:
      - name: currency
        in: query
        schema:
          type: string
        description: 'Comma list or ''all''. GET /v1/api/phases for the live enabled currency list. Default: all.'
      - name: tf
        in: query
        schema:
          type: string
        description: 'Comma list or ''all''. Enabled: 15m, 1h, 2h, 4h, 1d, 1w. Default: all.'
      responses:
        '200':
          description: Phase readings (currency → timeframe) + metering meta.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    description: currency → timeframe → reading (null when that timeframe has no reading yet).
                    additionalProperties:
                      type: object
                      additionalProperties:
                        oneOf:
                        - $ref: '#/components/schemas/PhaseReading'
                        - type: 'null'
                  stale:
                    type: object
                    description: Present ONLY inside the upstream composition window just after a minute boundary, when the exchange candle for the new minute has not yet settled and the returned phase may still reflect the previous minute. Absent means the data is settled. Poll again after pollAfterMs.
                    properties:
                      reason:
                        type: string
                        description: Human-readable explanation of why the data may be stale.
                      pollAfterMs:
                        type: integer
                        description: Milliseconds until the composition window closes; poll again after this.
                        example: 8200
                  meta:
                    type: object
                    properties:
                      rows:
                        type: integer
                        description: Rows served (n = |currencies| × |tfs|).
                        example: 2
                      debitMicroUsd:
                        type: integer
                        description: Amount billed for this request (rows × base rate × mult(rows)).
                        example: 2661
                      cached:
                        type: boolean
                        description: Whether the serve was a Redis cache hit. Billing is cache-independent.
                        example: false
                      endpoint:
                        type: string
                        enum:
                        - boundary
                        - updates
                        description: Which serve semantic produced this response.
                        example: updates
              example:
                data:
                  BTC:
                    1h:
                      ts: '2026-07-14T17:00:00.000Z'
                      phase: establishing_bull
                      label: Establishing Bull
                meta:
                  rows: 1
                  debitMicroUsd: 1446
                  cached: false
                  endpoint: updates
        '400':
          description: Invalid currency or tf.
        '402':
          description: Out of credits.
        '423':
          description: Account spending is paused (a refund is settling).
        '429':
          description: Per-key rate limit exceeded (Retry-After header).
      tags:
      - Phase
      security:
      - UrlKey: []
      - ApiKey: []
      operationId: getApiPhaseUpdates
      x-operation-id-source: derived
    servers:
    - url: https://snowsignals.io/v1
  /phase/boundary:
    get:
      summary: Settled phase (last closed bar)
      description: The deterministic phase from the last closed bar. Metered per row; requires an x402 payment. The 402 response quotes the exact price.
      parameters:
      - $ref: '#/components/parameters/currency'
      - $ref: '#/components/parameters/tf'
      responses:
        '200':
          $ref: '#/components/responses/PhaseData'
        '402':
          $ref: '#/components/responses/PaymentRequired'
        '400':
          $ref: '#/components/responses/BadRequest'
      tags:
      - Phase
      operationId: getPhaseBoundary
      x-operation-id-source: derived
    servers:
    - url: https://pay.snowsignals.io
  /phase/updates:
    get:
      summary: Live phase (current bar)
      description: The phase forming in the current bar; refreshed about once per minute. Metered per row; requires an x402 payment.
      parameters:
      - $ref: '#/components/parameters/currency'
      - $ref: '#/components/parameters/tf'
      responses:
        '200':
          $ref: '#/components/responses/PhaseData'
        '402':
          $ref: '#/components/responses/PaymentRequired'
        '400':
          $ref: '#/components/responses/BadRequest'
      tags:
      - Phase
      operationId: getPhaseUpdates
      x-operation-id-source: derived
    servers:
    - url: https://pay.snowsignals.io
  /phase/resolution-stats:
    get:
      summary: Phase resolution statistics (free)
      description: Successor-phase transition probabilities and reward-vs-drawdown stats. Free, no payment.
      responses:
        '200':
          description: Resolution-stats document
      tags:
      - Phase
      operationId: getPhaseResolutionStats
      x-operation-id-source: derived
    servers:
    - url: https://pay.snowsignals.io
components:
  schemas:
    PhaseReading:
      type: object
      properties:
        ts:
          type: string
          format: date-time
          example: '2026-07-14T17:00:00.000Z'
        phase:
          type: string
          enum:
          - establishing_bull
          - establishing_bear
          - running_reentry_bull
          - running_reentry_bear
          - running_first_bull
          - running_first_bear
          - consolidating_bull
          - consolidating_bear
          - running_post_fe_bull
          - running_post_fe_bear
          - breaking_bull
          - breaking_bear
          example: establishing_bull
        label:
          type: string
          description: Human display label for `phase` (the full map is at GET /v1/api/phases). Derived from `phase`; do not key logic on it.
          example: Establishing Bull
  parameters:
    currency:
      name: currency
      in: query
      description: A single currency (e.g. BTC), a comma list, or 'all'.
      schema:
        type: string
        default: BTC
    tf:
      name: tf
      in: query
      description: A single timeframe, a comma list, or 'all'. One of 15m, 1h, 2h, 4h, 1d, 1w.
      schema:
        type: string
        default: 1h
  responses:
    BadRequest:
      description: Invalid currency or timeframe, or a request exceeding the enabled-basket cap.
      content:
        application/json:
          schema:
            type: object
            properties:
              error:
                type: string
    PhaseData:
      description: Phase readings keyed currency -> timeframe.
      content:
        application/json:
          schema:
            type: object
            properties:
              data:
                type: object
                additionalProperties:
                  type: object
                  additionalProperties:
                    type:
                    - object
                    - 'null'
                    properties:
                      ts:
                        type: string
                        format: date-time
                      phase:
                        type: string
                        example: establishing_bull
                      label:
                        type: string
                        example: Establishing Bull
    PaymentRequired:
      description: x402 payment required (x402 v2). The accepted payment requirements — price (USDC on Base), pay-to address, and asset — are carried in the base64 PAYMENT-REQUIRED response header; an x402 client decodes it, signs a USDC authorization for the quoted amount, and retries. The response body is empty.
      headers:
        PAYMENT-REQUIRED:
          description: 'Base64-encoded x402 v2 PaymentRequired document: x402Version, accepts[] (scheme, network, asset, amount, payTo), and discovery extensions.'
          schema:
            type: string
  securitySchemes:
    UrlKey:
      type: apiKey
      in: query
      name: apiKey
      description: 'url method (default): pass your key as `?apiKey=<key>`. The key is the whole credential.'
    ApiKey:
      type: apiKey
      in: header
      name: Authorization
      description: 'nonce method: `ApiKey base64(key:nonce:proof)` where `proof = SHA256("secret:nonce")` hex truncated to 19 chars (see the API description for the signing scheme).'
x-refined-from:
- snowsignals-daas-openapi.json
- snowsignals-x402-openapi.json
x-apisguru-categories:
- financial
- analytics