Datasets
Curated, Snowflake-backed blockchain datasets spanning Ethereum, Solana, Arbitrum, Polygon, and 20+ other chains, queried through the same JSON-RPC SQL interface using the snowflake-default data source and flipside data provider.
Curated, Snowflake-backed blockchain datasets spanning Ethereum, Solana, Arbitrum, Polygon, and 20+ other chains, queried through the same JSON-RPC SQL interface using the snowflake-default data source and flipside data provider.
openapi: 3.0.1
info:
title: Flipside Crypto Data API
description: >-
The Flipside Crypto Data API runs Snowflake-compatible SQL against curated
on-chain datasets covering Ethereum, Solana, and 20+ other chains. The API
uses a JSON-RPC 2.0 transport over a single HTTP endpoint: every call is an
HTTP POST to /json-rpc whose body carries a {jsonrpc, method, params, id}
envelope. Methods include createQuery, getQueryRun, getQueryRunResults, and
cancelQueryRun. Authentication is via an x-api-key request header. Note: in
May 2026 Flipside sold its blockchain data business to SonarX; this document
describes the Flipside Data API as published.
termsOfService: https://flipsidecrypto.xyz
contact:
name: Flipside Crypto
url: https://docs.flipsidecrypto.xyz
version: '2.0'
servers:
- url: https://api-v2.flipsidecrypto.xyz
description: Flipside Data API (JSON-RPC 2.0 over HTTP)
security:
- ApiKeyAuth: []
paths:
/json-rpc:
post:
operationId: jsonRpc
summary: JSON-RPC 2.0 entry point for all Data API methods.
description: >-
Single HTTP endpoint for the Flipside Data API. The JSON-RPC `method`
field selects the operation (createQuery, getQueryRun,
getQueryRunResults, cancelQueryRun) and `params` carries an array with
a single parameters object. All calls require the x-api-key header.
tags:
- JSON-RPC
requestBody:
required: true
content:
application/json:
schema:
oneOf:
- $ref: '#/components/schemas/CreateQueryRequest'
- $ref: '#/components/schemas/GetQueryRunRequest'
- $ref: '#/components/schemas/GetQueryRunResultsRequest'
- $ref: '#/components/schemas/CancelQueryRunRequest'
examples:
createQuery:
summary: Create and run a SQL query
value:
jsonrpc: '2.0'
method: createQuery
params:
- sql: SELECT block_number, tx_hash FROM ethereum.core.fact_transactions LIMIT 100
resultTTLHours: 1
maxAgeMinutes: 0
tags:
sdk_package: python
dataSource: snowflake-default
dataProvider: flipside
id: 1
getQueryRun:
summary: Poll a query run status
value:
jsonrpc: '2.0'
method: getQueryRun
params:
- queryRunId: 01h8z9e1-0000-0000-0000-000000000000
id: 1
getQueryRunResults:
summary: Fetch a page of results
value:
jsonrpc: '2.0'
method: getQueryRunResults
params:
- queryRunId: 01h8z9e1-0000-0000-0000-000000000000
format: json
page:
number: 1
size: 1000
id: 1
cancelQueryRun:
summary: Cancel a running query
value:
jsonrpc: '2.0'
method: cancelQueryRun
params:
- queryRunId: 01h8z9e1-0000-0000-0000-000000000000
id: 1
responses:
'200':
description: >-
JSON-RPC response. HTTP status is 200 even for JSON-RPC errors; the
envelope contains either a `result` or an `error` member.
content:
application/json:
schema:
oneOf:
- $ref: '#/components/schemas/CreateQueryResponse'
- $ref: '#/components/schemas/GetQueryRunResponse'
- $ref: '#/components/schemas/GetQueryRunResultsResponse'
- $ref: '#/components/schemas/CancelQueryRunResponse'
- $ref: '#/components/schemas/JsonRpcError'
'401':
description: Missing or invalid x-api-key.
'429':
description: Rate limit or query-seconds quota exceeded.
components:
securitySchemes:
ApiKeyAuth:
type: apiKey
in: header
name: x-api-key
description: Flipside Data API key, created in the Flipside account settings.
schemas:
JsonRpcEnvelope:
type: object
required:
- jsonrpc
- method
- params
- id
properties:
jsonrpc:
type: string
enum:
- '2.0'
method:
type: string
params:
type: array
description: Array containing a single parameters object.
id:
oneOf:
- type: integer
- type: string
JsonRpcError:
type: object
properties:
jsonrpc:
type: string
enum:
- '2.0'
id:
oneOf:
- type: integer
- type: string
error:
type: object
properties:
code:
type: integer
message:
type: string
data:
type: object
CreateQueryRequest:
allOf:
- $ref: '#/components/schemas/JsonRpcEnvelope'
- type: object
properties:
method:
type: string
enum:
- createQuery
params:
type: array
items:
$ref: '#/components/schemas/CreateQueryParams'
CreateQueryParams:
type: object
required:
- sql
properties:
sql:
type: string
description: Flipside Snowflake-compatible SQL query string.
resultTTLHours:
type: integer
default: 1
description: Hours to retain the materialized result set for retrieval.
maxAgeMinutes:
type: integer
default: 0
description: >-
Maximum acceptable age of a cached result. 0 forces fresh
execution.
ttlMinutes:
type: integer
description: Legacy cache time-to-live in minutes.
tags:
type: object
additionalProperties:
type: string
description: Arbitrary key/value labels attached to the query run.
dataSource:
type: string
default: snowflake-default
dataProvider:
type: string
default: flipside
CreateQueryResponse:
type: object
properties:
jsonrpc:
type: string
id:
oneOf:
- type: integer
- type: string
result:
type: object
properties:
queryRequest:
type: object
properties:
queryRunId:
type: string
userId:
type: string
tags:
type: object
queryRun:
$ref: '#/components/schemas/QueryRun'
GetQueryRunRequest:
allOf:
- $ref: '#/components/schemas/JsonRpcEnvelope'
- type: object
properties:
method:
type: string
enum:
- getQueryRun
params:
type: array
items:
$ref: '#/components/schemas/QueryRunIdParams'
QueryRunIdParams:
type: object
required:
- queryRunId
properties:
queryRunId:
type: string
description: Identifier returned by createQuery.
GetQueryRunResponse:
type: object
properties:
jsonrpc:
type: string
id:
oneOf:
- type: integer
- type: string
result:
type: object
properties:
queryRun:
$ref: '#/components/schemas/QueryRun'
QueryRun:
type: object
properties:
id:
type: string
sqlStatementId:
type: string
state:
type: string
enum:
- QUERY_STATE_READY
- QUERY_STATE_RUNNING
- QUERY_STATE_STREAMING_RESULTS
- QUERY_STATE_SUCCESS
- QUERY_STATE_FAILED
- QUERY_STATE_CANCELED
rowCount:
type: integer
totalSize:
type: integer
errorName:
type: string
nullable: true
errorMessage:
type: string
nullable: true
startedAt:
type: string
format: date-time
nullable: true
endedAt:
type: string
format: date-time
nullable: true
GetQueryRunResultsRequest:
allOf:
- $ref: '#/components/schemas/JsonRpcEnvelope'
- type: object
properties:
method:
type: string
enum:
- getQueryRunResults
params:
type: array
items:
$ref: '#/components/schemas/GetQueryRunResultsParams'
GetQueryRunResultsParams:
type: object
required:
- queryRunId
properties:
queryRunId:
type: string
format:
type: string
enum:
- csv
- json
default: csv
description: Result serialization format.
page:
type: object
properties:
number:
type: integer
default: 1
description: 1-indexed page number; each page is capped at ~30MB.
size:
type: integer
default: 1000
description: Rows per page.
GetQueryRunResultsResponse:
type: object
properties:
jsonrpc:
type: string
id:
oneOf:
- type: integer
- type: string
result:
type: object
properties:
columnNames:
type: array
items:
type: string
columnTypes:
type: array
items:
type: string
rows:
type: array
items:
type: array
items: {}
page:
type: object
properties:
currentPageNumber:
type: integer
currentPageSize:
type: integer
totalRows:
type: integer
totalPages:
type: integer
originalQueryRun:
$ref: '#/components/schemas/QueryRun'
CancelQueryRunRequest:
allOf:
- $ref: '#/components/schemas/JsonRpcEnvelope'
- type: object
properties:
method:
type: string
enum:
- cancelQueryRun
params:
type: array
items:
$ref: '#/components/schemas/QueryRunIdParams'
CancelQueryRunResponse:
type: object
properties:
jsonrpc:
type: string
id:
oneOf:
- type: integer
- type: string
result:
type: object
properties:
canceledQueryRun:
$ref: '#/components/schemas/QueryRun'