Skip to main content
For query engines not natively supported by Ryft, you can send query data directly using the Ryft Ingest API.

Get your Ryft Ingest Token

Ryft will provide a unique ingest token for your environment. This token is required to authenticate requests to the Ingest API.

Send Query Data

Send a POST request to the ingest endpoint with your query data as JSON:
curl -X POST https://ingest.ryft.io/ingest/push/queries \
  -H "X-Ryft-Token: <RYFT_INGEST_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
    "context": {
      "catalog": "iceberg",
      "schema": "gold",
      "queryType": "SELECT",
      "user": "my-service",
      "userAgent": "my-client"
    },
    "timestamp": "2026-03-10T12:00:00.000Z",
    "duration_ms": 100,
    "query": "SELECT * FROM gold.my_table",
    "queryId": "test-001",
    "queryState": "FINISHED",
    "tags": ["source:my-engine"]
  }'
A 200 response means the message was accepted and will be processed.

Bulk Ingestion

You can send multiple queries in a single request by passing a JSON array instead of a single object:
curl -X POST https://ingest.ryft.io/ingest/push/queries \
  -H "X-Ryft-Token: <RYFT_INGEST_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '[
    {
      "context": { "catalog": "iceberg" },
      "queryId": "q-123",
      "query": "SELECT * FROM my_table",
      "queryState": "FINISHED",
      "duration_ms": 1230,
      "timestamp": "2026-03-10T12:00:00.000Z"
    },
    {
      "context": { "catalog": "iceberg" },
      "queryId": "q-124",
      "query": "SELECT count(*) FROM events",
      "queryState": "FINISHED",
      "duration_ms": 450,
      "timestamp": "2026-03-10T12:01:00.000Z"
    }
  ]'

Payload Schema

FieldTypeRequiredDescription
contextobjectyesQuery environment context. All fields within are optional — pass {} if no context is available.
context.catalogstringnoCatalog name (e.g. iceberg)
context.schemastringnoDefault namespace for unqualified table names
context.queryTypestringnoOne of: SELECT, EXPLAIN, DESCRIBE, INSERT, UPDATE, DELETE, ANALYZE, DATA_DEFINITION, ALTER_TABLE_EXECUTE, MERGE
context.serverVersionstringnoQuery engine version
context.userstringnoUser or service account that ran the query
context.userAgentstringnoClient identifier
querystringyesThe SQL query text
queryIdstringyesUnique query identifier
queryStatestringyesTerminal query state: FINISHED, SUCCEEDED, or FAILED
timestampstringyesISO 8601 timestamp of query execution
duration_msnumberyesExecution time in milliseconds
tagsstring[]noFree-form labels for filtering in Query Explorer
failureInfoobject or object[]noOnly needed for failed queries (queryState: "FAILED"). Can be a single object or an array.
failureInfo.errorCode.typestringyes (within failureInfo)One of: USER_ERROR, INTERNAL_ERROR, INSUFFICIENT_RESOURCES, EXTERNAL
failureInfo.errorCode.codenumbernoNumeric error code (free-form)
failureInfo.errorCode.namestringnoError name (free-form)
failureInfo.failureMessagestringnoHuman-readable error description
failureInfo.failureTypestringnoException or error class name
Make sure outbound connectivity is enabled to ingest.ryft.io on port 443 (HTTPS).