FlashData API V2

API reference

The stable V2 HTTP surface. Every failure uses an application/problem+json body with a request ID.

Contract version 0.2.0-draft72 public operations88 schemas

Authentication

cookieSession

apiKey / cookie / __Host-fd_session

Opaque Web session. The browser cannot read this cookie.

csrfToken

apiKey / header / X-CSRF-Token

apiKey

apiKey / header / X-API-Key

System

2
GET/healthService health
Operation ID
getHealth
Security
Public
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Responses

200

Healthy

Schema / application/json
{
  "$ref": "#/components/schemas/Health"
}
GET/statusRead the public component status summary
Operation ID
getPublicStatus
Security
Public
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Responses

200

Public status summary

Cache-Control

Schema / application/json
{
  "$ref": "#/components/schemas/PublicStatus"
}

Auth

14
POST/auth/registerCreate a pending FlashData account

The submitted Terms and Privacy versions must match the current published legal bundle.

Operation ID
register
Security
Public
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Request body

Required
Schema / application/json
{
  "$ref": "#/components/schemas/RegisterRequest"
}

Responses

201

Account created; email verification required

Cache-Control / X-Request-Id

Schema / application/json
{
  "$ref": "#/components/schemas/RegisterResponse"
}
409

Resource state or idempotency conflict

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
422

Request validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
429

Rate, concurrency, batch, or pending-job limit exceeded

Retry-After

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
500

An unexpected internal error occurred

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
503

A required dependency or catalog is temporarily unavailable

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
POST/auth/loginCreate an opaque Web session

Sets the Secure, HttpOnly `__Host-fd_session` cookie. An active account receives a full Session unless its migrated identity still requires a current legal acceptance, in which case it receives a restricted legal_acceptance Session. An account with a scheduled deletion request receives a restricted deletion_recovery Session. Accounts whose deletion is processing/failed/completed, and suspended accounts, receive 403.

Operation ID
login
Security
Public
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Request body

Required
Schema / application/json
{
  "$ref": "#/components/schemas/LoginRequest"
}

Responses

200

Authenticated

Set-Cookie / Cache-Control / X-Request-Id

Schema / application/json
{
  "$ref": "#/components/schemas/LoginResponse"
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
403

Login is forbidden; Problem.code is email_not_verified, account_suspended, account_deletion_processing, account_deletion_failed, or account_deleted

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
422

Request validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
423

Account temporarily locked

Retry-After

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
429

Rate, concurrency, batch, or pending-job limit exceeded

Retry-After

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
POST/auth/logoutRevoke the current session
Operation ID
logout
Security
cookieSession + csrfToken
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Responses

204

Session revoked and cookie cleared

Set-Cookie / Cache-Control / X-Request-Id

401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
403

Authenticated but not permitted, or CSRF validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
GET/auth/meRead the current account and user
Operation ID
getCurrentAccount
Security
cookieSession
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Responses

200

Current account

Cache-Control / X-Request-Id

Schema / application/json
{
  "$ref": "#/components/schemas/Account"
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
GET/auth/csrfGet the CSRF token bound to the current session
Operation ID
getCsrfToken
Security
cookieSession
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Responses

200

CSRF token

Cache-Control / X-Request-Id

Schema / application/json
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "csrfToken"
  ],
  "properties": {
    "csrfToken": {
      "type": "string",
      "minLength": 32,
      "readOnly": true
    }
  }
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
POST/auth/email-verificationsRequest or resend an email verification message

For every syntactically valid email, returns the same response regardless of whether the account is missing, pending, active, suspended, or deleted. Eligible pending accounts receive a rotated one-time link after the resend cooldown.

Operation ID
requestEmailVerification
Security
Public
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Request body

Required
Schema / application/json
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "email"
  ],
  "properties": {
    "email": {
      "type": "string",
      "format": "email",
      "maxLength": 320
    }
  }
}

Responses

202

Request accepted. The response does not reveal whether an account exists.

Cache-Control / X-Request-Id

Schema / application/json
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "accepted"
  ],
  "properties": {
    "accepted": {
      "type": "boolean",
      "const": true
    }
  }
}
422

Anonymous authentication request validation failed

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
429

Anonymous authentication rate limit exceeded

Cache-Control / Retry-After / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
500

An unexpected anonymous authentication error occurred

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
503

An anonymous authentication dependency is temporarily unavailable

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
POST/auth/email-verifications/confirmVerify an email and activate the account

Atomically consumes the one-time token, activates the Account and User, and grants the entitlement snapshot's trial microcredits once with idempotency key `trial:{accountId}`. It does not create a Session; the user must log in explicitly.

Operation ID
confirmEmailVerification
Security
Public
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Request body

Required
Schema / application/json
{
  "$ref": "#/components/schemas/TokenRequest"
}

Responses

200

Account activated

Cache-Control / X-Request-Id

Schema / application/json
{
  "allOf": [
    {
      "$ref": "#/components/schemas/Account"
    },
    {
      "type": "object",
      "properties": {
        "status": {
          "const": "active"
        },
        "emailVerified": {
          "const": true
        }
      }
    }
  ]
}
410

One-time token is invalid, expired, invalidated, already used, or lost a concurrent confirmation race. Problem.code is `token_unavailable`.

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
422

Anonymous authentication request validation failed

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
429

Anonymous authentication rate limit exceeded

Cache-Control / Retry-After / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
500

An unexpected anonymous authentication error occurred

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
503

An anonymous authentication dependency is temporarily unavailable

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
POST/auth/password-resetsRequest a password reset email

Always returns the same 202 response for a syntactically valid email regardless of account existence or lifecycle state. Only eligible active or locked identities receive mail.

Operation ID
requestPasswordReset
Security
Public
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Request body

Required
Schema / application/json
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "email"
  ],
  "properties": {
    "email": {
      "type": "string",
      "format": "email",
      "maxLength": 320
    }
  }
}

Responses

202

Request accepted. The response does not reveal whether an account exists.

Cache-Control / X-Request-Id

Schema / application/json
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "accepted"
  ],
  "properties": {
    "accepted": {
      "type": "boolean",
      "const": true
    }
  }
}
422

Anonymous authentication request validation failed

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
429

Anonymous authentication rate limit exceeded

Cache-Control / Retry-After / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
500

An unexpected anonymous authentication error occurred

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
503

An anonymous authentication dependency is temporarily unavailable

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
POST/auth/password-resets/confirmSet a new password and revoke existing sessions

Atomically consumes the password-reset token, stores a new Argon2id credential, revokes every existing Session, and invalidates other password-reset tokens. It does not log the user in or create a Session.

Operation ID
confirmPasswordReset
Security
Public
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Request body

Required
Schema / application/json
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "token",
    "password"
  ],
  "properties": {
    "token": {
      "type": "string",
      "minLength": 32,
      "maxLength": 256,
      "writeOnly": true
    },
    "password": {
      "$ref": "#/components/schemas/Password"
    }
  }
}

Responses

204

Password updated; existing sessions revoked

Cache-Control / X-Request-Id

410

One-time token is invalid, expired, invalidated, already used, or lost a concurrent confirmation race. Problem.code is `token_unavailable`.

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
422

Anonymous authentication request validation failed

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
429

Anonymous authentication rate limit exceeded

Cache-Control / Retry-After / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
500

An unexpected anonymous authentication error occurred

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
503

An anonymous authentication dependency is temporarily unavailable

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
GET/auth/sessionsList active sessions for the current user
Operation ID
listSessions
Security
cookieSession
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Responses

200

Sessions

Cache-Control / X-Request-Id

Schema / application/json
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "data"
  ],
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/Session"
      }
    }
  }
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
DELETE/auth/sessionsRevoke all sessions except the current one
Operation ID
revokeOtherSessions
Security
cookieSession + csrfToken
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Responses

204

Other sessions revoked

Cache-Control / X-Request-Id

401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
403

Authenticated but not permitted, or CSRF validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
DELETE/auth/sessions/{sessionId}Revoke one session
Operation ID
revokeSession
Security
cookieSession + csrfToken
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Parameters

sessionIdpathRequired
Schema
{
  "type": "string",
  "pattern": "^ses_"
}

Responses

204

Session revoked. If it was the current Session, the cookie is cleared.

Set-Cookie / Cache-Control / X-Request-Id

401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
403

Authenticated but not permitted, or CSRF validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
404

Resource not found or not owned by the caller

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
409

Resource state or idempotency conflict

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
422

Request validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
503

A required dependency or catalog is temporarily unavailable

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
POST/auth/re-authenticateVerify the current password for a sensitive operation

Records a short-lived recent-auth proof on the current server-side session.

Operation ID
reauthenticateSession
Security
cookieSession + csrfToken
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Request body

Required
Schema / application/json
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "password"
  ],
  "properties": {
    "password": {
      "type": "string",
      "minLength": 1,
      "maxLength": 128,
      "writeOnly": true
    }
  }
}

Responses

200

Session has recent authentication

Cache-Control / X-Request-Id

Schema / application/json
{
  "$ref": "#/components/schemas/Reauthentication"
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
403

Authenticated but not permitted, or CSRF validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
429

Rate, concurrency, batch, or pending-job limit exceeded

Retry-After

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
PATCH/auth/passwordChange the password and rotate the current session
Operation ID
changePassword
Security
cookieSession + csrfToken
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Request body

Required
Schema / application/json
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "currentPassword",
    "newPassword"
  ],
  "properties": {
    "currentPassword": {
      "type": "string",
      "minLength": 1,
      "maxLength": 128,
      "writeOnly": true
    },
    "newPassword": {
      "$ref": "#/components/schemas/Password"
    },
    "revokeOtherSessions": {
      "type": "boolean",
      "default": true
    }
  }
}

Responses

204

Password changed; current session rotated and other sessions revoked when requested

Set-Cookie / Cache-Control / X-Request-Id

401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
403

Authenticated but not permitted, or CSRF validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
422

Request validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}

Account

6
GET/accountRead account settings
Operation ID
getAccount
Security
cookieSession
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Responses

200

Account

Schema / application/json
{
  "$ref": "#/components/schemas/Account"
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
PATCH/accountUpdate profile settings
Operation ID
updateAccount
Security
cookieSession + csrfToken
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Request body

Required
Schema / application/json
{
  "$ref": "#/components/schemas/UpdateAccountRequest"
}

Responses

200

Updated account

Schema / application/json
{
  "$ref": "#/components/schemas/Account"
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
403

Authenticated but not permitted, or CSRF validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
422

Request validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
DELETE/accountSchedule account deletion and revoke all existing sessions and API Keys

A unique active deletion request is the natural idempotency boundary. Concurrent authenticated schedules return the same request. After Session revocation, a lost response is recovered by logging into deletion_recovery mode and reading GET /account/deletion; revoked Sessions are never accepted for replay.

Operation ID
deleteAccount
Security
cookieSession + csrfToken
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Request body

Required
Schema / application/json
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "password",
    "confirmation"
  ],
  "properties": {
    "password": {
      "type": "string",
      "minLength": 1,
      "maxLength": 128,
      "writeOnly": true
    },
    "confirmation": {
      "type": "string",
      "const": "DELETE"
    }
  }
}

Responses

202

Deletion scheduled; active sessions and keys revoked

Schema / application/json
{
  "$ref": "#/components/schemas/AccountDeletionRequest"
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
403

Authenticated but not permitted, or CSRF validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
422

Request validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
GET/account/deletionRead the current account deletion request
Operation ID
getAccountDeletion
Security
cookieSession
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Responses

200

Current deletion request

Schema / application/json
{
  "$ref": "#/components/schemas/AccountDeletionRequest"
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
404

Resource not found or not owned by the caller

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
DELETE/account/deletionCancel a scheduled deletion during the grace period

Uses a scheduled-to-cancelled compare-and-set. A processor race returns 409; after success the recovery Session is rotated and cannot replay the old transition.

Operation ID
cancelAccountDeletion
Security
cookieSession + csrfToken
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Responses

204

Deletion cancelled, account reactivated, and recovery Session rotated according to the legal-acceptance gate

Set-Cookie / Cache-Control / X-Request-Id

401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
403

Authenticated but not permitted, or CSRF validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
404

Resource not found or not owned by the caller

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
409

Resource state or idempotency conflict

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
POST/account/legal-acceptancesAccept the currently published Terms and Privacy versions

Appends an immutable legal acceptance, clears the migration gate, and rotates the Session. Stale submitted versions are rejected.

Operation ID
acceptCurrentLegalTerms
Security
cookieSession + csrfToken
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Request body

Required
Schema / application/json
{
  "$ref": "#/components/schemas/LegalAcceptanceRequest"
}

Responses

200

Legal acceptance recorded and Session rotated to full mode

Set-Cookie / Cache-Control / X-Request-Id

Schema / application/json
{
  "$ref": "#/components/schemas/LoginResponse"
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
403

Authenticated but not permitted, or CSRF validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
404

Resource not found or not owned by the caller

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
422

Request validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}

Onboarding

2
GET/onboardingRead resumable onboarding progress
Operation ID
getOnboardingProgress
Security
cookieSession
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Responses

200

Current onboarding state

Cache-Control / X-Request-Id

Schema / application/json
{
  "$ref": "#/components/schemas/OnboardingProgress"
}
401

Authentication required or invalid

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
500

An unexpected internal error occurred

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
503

A required dependency or onboarding record is temporarily unavailable

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
PATCH/onboardingAdvance onboarding without allowing progress to move backward
Operation ID
updateOnboardingProgress
Security
cookieSession + csrfToken
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Request body

Required
Schema / application/json
{
  "$ref": "#/components/schemas/UpdateOnboardingRequest"
}

Responses

200

Updated onboarding state

Cache-Control / X-Request-Id

Schema / application/json
{
  "$ref": "#/components/schemas/OnboardingProgress"
}
401

Authentication required or invalid

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
403

Authenticated but not permitted, or CSRF validation failed

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
409

Resource state or idempotency conflict

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
422

Request validation failed

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
500

An unexpected internal error occurred

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
503

A required dependency or onboarding record is temporarily unavailable

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}

Overview

1
GET/overviewRead the account dashboard aggregate
Operation ID
getConsoleOverview
Security
cookieSession
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Responses

200

Account-scoped overview

Cache-Control / X-Request-Id

Schema / application/json
{
  "$ref": "#/components/schemas/ConsoleOverview"
}
401

Authentication required or invalid

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
500

An unexpected internal error occurred

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
503

A required dependency or onboarding record is temporarily unavailable

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}

Playground

3
POST/playground/queries/realtimeExecute a synchronous query from the authenticated Web console

The browser submits an owned API Key public ID, never its plaintext secret. The server verifies that the Key is active and grants queries:write before invoking the same query application service as the Data API.

Operation ID
executeConsoleRealtimeQuery
Security
cookieSession + csrfToken
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Parameters

Idempotency-KeyheaderRequired
Schema
{
  "type": "string",
  "minLength": 1,
  "maxLength": 255
}

Request body

Required
Schema / application/json
{
  "$ref": "#/components/schemas/ConsoleQueryRequest"
}

Responses

200

Completed query

Cache-Control / X-Request-Id

Schema / application/json
{
  "$ref": "#/components/schemas/RealtimeQueryResponse"
}
401

Authentication required or invalid

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
402

Account has insufficient available credits

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
403

Authenticated but not permitted, or CSRF validation failed

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
404

Resource not found or not owned by the caller

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
409

Resource state or idempotency conflict

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
422

Request validation failed

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
429

Rate, concurrency, batch, or pending-job limit exceeded

Retry-After

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
502

An upstream provider failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
503

A required dependency or onboarding record is temporarily unavailable

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
504

An upstream provider timed out

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
POST/playground/queriesSubmit a durable asynchronous query from the authenticated Web console

The selected API Key is referenced by public ID for attribution and scope enforcement; its plaintext secret is never loaded by the Web console.

Operation ID
createConsoleAsyncQuery
Security
cookieSession + csrfToken
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Parameters

Idempotency-KeyheaderRequired
Schema
{
  "type": "string",
  "minLength": 1,
  "maxLength": 255
}

Request body

Required
Schema / application/json
{
  "$ref": "#/components/schemas/ConsoleQueryRequest"
}

Responses

202

Job accepted

Cache-Control / X-Request-Id / Location

Schema / application/json
{
  "$ref": "#/components/schemas/Job"
}
401

Authentication required or invalid

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
402

Account has insufficient available credits

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
403

Authenticated but not permitted, or CSRF validation failed

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
404

Resource not found or not owned by the caller

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
409

Resource state or idempotency conflict

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
422

Request validation failed

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
429

Rate, concurrency, batch, or pending-job limit exceeded

Retry-After

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
503

A required dependency or onboarding record is temporarily unavailable

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
POST/playground/queries/batchAtomically validate and submit a Web console query batch

All items are validated before one reservation. Any validation, reservation, or submission failure rejects the entire batch; execution-time Job failures remain independently visible after acceptance.

Operation ID
createConsoleBatchQueries
Security
cookieSession + csrfToken
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Parameters

Idempotency-KeyheaderRequired
Schema
{
  "type": "string",
  "minLength": 1,
  "maxLength": 255
}

Request body

Required
Schema / application/json
{
  "$ref": "#/components/schemas/ConsoleBatchQueryRequest"
}

Responses

202

Batch accepted

Cache-Control / X-Request-Id

Schema / application/json
{
  "$ref": "#/components/schemas/BatchQueryResponse"
}
401

Authentication required or invalid

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
402

Account has insufficient available credits

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
403

Authenticated but not permitted, or CSRF validation failed

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
404

Resource not found or not owned by the caller

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
409

Resource state or idempotency conflict

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
422

Request validation failed

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
429

Rate, concurrency, batch, or pending-job limit exceeded

Retry-After

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
503

A required dependency or onboarding record is temporarily unavailable

Cache-Control / X-Request-Id

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}

API Keys

4
GET/api-keysList API Key metadata
Operation ID
listApiKeys
Security
cookieSession
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Responses

200

API Keys without secrets

Schema / application/json
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "data"
  ],
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/ApiKey"
      }
    }
  }
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
POST/api-keysCreate an API Key and reveal its secret once
Operation ID
createApiKey
Security
cookieSession + csrfToken
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Parameters

Idempotency-KeyheaderRequired
Schema
{
  "type": "string",
  "minLength": 1,
  "maxLength": 255
}

Request body

Required
Schema / application/json
{
  "$ref": "#/components/schemas/CreateApiKeyRequest"
}

Responses

201

Created; the same idempotent replay may return the same encrypted response for five minutes

Schema / application/json
{
  "$ref": "#/components/schemas/ApiKeyCreated"
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
403

Authenticated but not permitted, or CSRF validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
409

Resource state or idempotency conflict

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
422

Request validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
503

A required dependency or catalog is temporarily unavailable

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
DELETE/api-keys/{keyId}Revoke an API Key
Operation ID
revokeApiKey
Security
cookieSession + csrfToken
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Parameters

keyIdpathRequired
Schema
{
  "type": "string",
  "pattern": "^key_"
}

Responses

204

Revoked

401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
403

Authenticated but not permitted, or CSRF validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
404

Resource not found or not owned by the caller

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
503

A required dependency or catalog is temporarily unavailable

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
POST/api-keys/{keyId}/rotateCreate a replacement key and schedule old-key revocation

The old key remains active during a bounded overlap window. Omitting `revokeOldAt` uses a 24-hour overlap, capped by the old key expiry. An explicit value must be in the future, no more than seven days from the request, and no later than the old key expiry. Internal primary and retiring rotation states are not exposed as public API Key statuses.

Operation ID
rotateApiKey
Security
cookieSession + csrfToken
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Parameters

keyIdpathRequired
Schema
{
  "type": "string",
  "pattern": "^key_"
}
Idempotency-KeyheaderRequired
Schema
{
  "type": "string",
  "minLength": 1,
  "maxLength": 255
}

Request body

Optional
Schema / application/json
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "revokeOldAt": {
      "type": "string",
      "format": "date-time",
      "description": "Optional old-key revocation time; defaults to 24 hours and cannot exceed seven days or the old key expiry."
    }
  }
}

Responses

201

Replacement created; secret returned once

Schema / application/json
{
  "$ref": "#/components/schemas/ApiKeyCreated"
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
403

Authenticated but not permitted, or CSRF validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
404

Resource not found or not owned by the caller

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
409

Resource state or idempotency conflict

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
422

Request validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
503

A required dependency or catalog is temporarily unavailable

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}

Catalog

3
GET/catalog/sourcesList public source capabilities without account-specific pricing
Operation ID
listPublicDataSources
Security
Public
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Responses

200

Public source catalog

Cache-Control

Schema / application/json
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "data"
  ],
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/DataSource"
      }
    }
  }
}
GET/plansList public USD plans and prices
Operation ID
listPlans
Security
Public
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Responses

200

Public plan catalog

Cache-Control

Schema / application/json
{
  "$ref": "#/components/schemas/PlanCatalog"
}
GET/legal/currentRead the current Terms and Privacy versions required for signup
Operation ID
getCurrentLegalVersions
Security
Public
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Responses

200

Current legal version catalog

Cache-Control

Schema / application/json
{
  "$ref": "#/components/schemas/PublicLegalVersions"
}

Billing

5
GET/billing/subscriptionRead the effective Stripe subscription
Operation ID
getSubscription
Security
cookieSession
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Responses

200

Subscription or PAYG entitlement

Schema / application/json
{
  "$ref": "#/components/schemas/Subscription"
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
POST/billing/checkout-sessionsCreate a Stripe-hosted Checkout Session

The server verifies that the FlashData price is active, available in the current livemode, USD-denominated, and matches purchaseType. Product, provider price, currency, success URL and cancel URL are never accepted from the browser.

Operation ID
createCheckoutSession
Security
cookieSession + csrfToken
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Parameters

Idempotency-KeyheaderRequired
Schema
{
  "type": "string",
  "minLength": 1,
  "maxLength": 255
}

Request body

Required
Schema / application/json
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "priceId"
  ],
  "properties": {
    "priceId": {
      "type": "string",
      "pattern": "^prc_"
    },
    "purchaseType": {
      "type": "string",
      "enum": [
        "subscription",
        "top_up"
      ],
      "default": "subscription"
    }
  }
}

Responses

201

Stripe Checkout Session

Schema / application/json
{
  "$ref": "#/components/schemas/HostedSession"
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
403

Authenticated but not permitted, or CSRF validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
409

Resource state or idempotency conflict

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
422

Request validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
502

An upstream provider failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
503

The billing catalog or provider is not configured or is temporarily unavailable

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
POST/billing/portal-sessionsCreate a Stripe Customer Portal Session
Operation ID
createBillingPortalSession
Security
cookieSession + csrfToken
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Parameters

Idempotency-KeyheaderRequired
Schema
{
  "type": "string",
  "minLength": 1,
  "maxLength": 255
}

Responses

201

Stripe Customer Portal Session

Schema / application/json
{
  "$ref": "#/components/schemas/HostedSession"
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
403

Authenticated but not permitted, or CSRF validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
404

Resource not found or not owned by the caller

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
409

Resource state or idempotency conflict

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
502

An upstream provider failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
503

The billing catalog or provider is not configured or is temporarily unavailable

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
GET/billing/invoicesList Stripe invoice projections
Operation ID
listInvoices
Security
cookieSession
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Parameters

cursorqueryOptional
Schema
{
  "type": "string",
  "maxLength": 512
}
limitqueryOptional
Schema
{
  "type": "integer",
  "minimum": 1,
  "maximum": 100,
  "default": 50
}

Responses

200

Invoices

Schema / application/json
{
  "allOf": [
    {
      "$ref": "#/components/schemas/Page"
    },
    {
      "type": "object",
      "properties": {
        "data": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/Invoice"
          }
        }
      }
    }
  ]
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
GET/billing/paymentsList account-scoped top-up and refund payment projections
Operation ID
listBillingPayments
Security
cookieSession
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Parameters

cursorqueryOptional
Schema
{
  "type": "string",
  "maxLength": 512
}
limitqueryOptional
Schema
{
  "type": "integer",
  "minimum": 1,
  "maximum": 100,
  "default": 50
}

Responses

200

One-time payment history without provider secrets

Schema / application/json
{
  "$ref": "#/components/schemas/BillingPaymentPage"
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}

Credits

3
GET/credits/balanceRead current available and reserved credits
Operation ID
getCreditBalance
Security
cookieSession
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Responses

200

Credit balance

Schema / application/json
{
  "$ref": "#/components/schemas/CreditBalance"
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
GET/credits/policyRead the effective account credit grant and charging policy
Operation ID
getCreditPolicy
Security
cookieSession
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Responses

200

Effective credit policy

Schema / application/json
{
  "$ref": "#/components/schemas/CreditPolicy"
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
GET/credits/transactionsList credit ledger entries
Operation ID
listCreditTransactions
Security
cookieSession
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Parameters

cursorqueryOptional
Schema
{
  "type": "string",
  "maxLength": 512
}
limitqueryOptional
Schema
{
  "type": "integer",
  "minimum": 1,
  "maximum": 100,
  "default": 50
}
typequeryOptional
Schema
{
  "$ref": "#/components/schemas/CreditEntryType"
}

Responses

200

Ledger entries

Schema / application/json
{
  "allOf": [
    {
      "$ref": "#/components/schemas/Page"
    },
    {
      "type": "object",
      "properties": {
        "data": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/CreditTransaction"
          }
        }
      }
    }
  ]
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}

Usage

3
GET/usage/summaryAggregate usage by source or day
Operation ID
getUsageSummary
Security
cookieSession
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Parameters

fromqueryRequired

Inclusive range start. Usage ranges cannot exceed 366 days.

Schema
{
  "type": "string",
  "format": "date-time"
}
toqueryRequired

Exclusive range end. Usage ranges cannot exceed 366 days.

Schema
{
  "type": "string",
  "format": "date-time"
}
groupByqueryOptional
Schema
{
  "type": "string",
  "enum": [
    "day",
    "source"
  ],
  "default": "day"
}

Responses

200

Usage summary

Schema / application/json
{
  "$ref": "#/components/schemas/UsageSummary"
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
422

Request validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
GET/usage/eventsList account-scoped request and job usage
Operation ID
listUsageEvents
Security
cookieSession
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Parameters

cursorqueryOptional
Schema
{
  "type": "string",
  "maxLength": 512
}
limitqueryOptional
Schema
{
  "type": "integer",
  "minimum": 1,
  "maximum": 100,
  "default": 50
}
fromqueryRequired

Inclusive range start. Usage ranges cannot exceed 366 days.

Schema
{
  "type": "string",
  "format": "date-time"
}
toqueryRequired

Exclusive range end. Usage ranges cannot exceed 366 days.

Schema
{
  "type": "string",
  "format": "date-time"
}
sourcequeryOptional
Schema
{
  "type": "string"
}
statusqueryOptional
Schema
{
  "type": "string",
  "enum": [
    "accepted",
    "processing",
    "completed",
    "failed",
    "cancelled"
  ]
}

Responses

200

Usage events

Schema / application/json
{
  "allOf": [
    {
      "$ref": "#/components/schemas/Page"
    },
    {
      "type": "object",
      "properties": {
        "data": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/UsageEvent"
          }
        }
      }
    }
  ]
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
422

Request validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
GET/usage/exportExport account usage as a streamed CSV file
Operation ID
exportUsageCsv
Security
cookieSession
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Parameters

fromqueryRequired

Inclusive range start. Usage ranges cannot exceed 366 days.

Schema
{
  "type": "string",
  "format": "date-time"
}
toqueryRequired

Exclusive range end. Usage ranges cannot exceed 366 days.

Schema
{
  "type": "string",
  "format": "date-time"
}
sourcequeryOptional
Schema
{
  "type": "string"
}

Responses

200

UTF-8 CSV with a header row

Content-Disposition

Schema / text/csv
{
  "type": "string"
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
422

Request validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}

Jobs

5
GET/jobsList account jobs for the Web console
Operation ID
listJobsForConsole
Security
cookieSession
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Parameters

cursorqueryOptional
Schema
{
  "type": "string",
  "maxLength": 512
}
limitqueryOptional
Schema
{
  "type": "integer",
  "minimum": 1,
  "maximum": 100,
  "default": 50
}
statusqueryOptional
Schema
{
  "$ref": "#/components/schemas/JobStatus"
}
sourcequeryOptional
Schema
{
  "type": "string"
}

Responses

200

Jobs

Schema / application/json
{
  "allOf": [
    {
      "$ref": "#/components/schemas/Page"
    },
    {
      "type": "object",
      "properties": {
        "data": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/Job"
          }
        }
      }
    }
  ]
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
GET/jobs/{jobId}Read one account job for the Web console
Operation ID
getJobForConsole
Security
cookieSession
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Parameters

jobIdpathRequired
Schema
{
  "type": "string",
  "pattern": "^job_"
}

Responses

200

Job

Schema / application/json
{
  "$ref": "#/components/schemas/Job"
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
404

Resource not found or not owned by the caller

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
DELETE/jobs/{jobId}Cancel an account job that has not reached a terminal state
Operation ID
cancelJobForConsole
Security
cookieSession + csrfToken
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Parameters

jobIdpathRequired
Schema
{
  "type": "string",
  "pattern": "^job_"
}

Responses

204

Job cancelled and unused reservation released

401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
403

Authenticated but not permitted, or CSRF validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
404

Resource not found or not owned by the caller

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
409

Resource state or idempotency conflict

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
GET/jobs/{jobId}/resultsRead a completed job result page for the Web console
Operation ID
getJobResultsForConsole
Security
cookieSession
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Parameters

jobIdpathRequired
Schema
{
  "type": "string",
  "pattern": "^job_"
}
cursorqueryOptional
Schema
{
  "type": "string",
  "maxLength": 512
}
limitqueryOptional
Schema
{
  "type": "integer",
  "minimum": 1,
  "maximum": 100,
  "default": 50
}

Responses

200

Result page

Schema / application/json
{
  "$ref": "#/components/schemas/QueryResults"
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
404

Resource not found or not owned by the caller

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
409

Resource state or idempotency conflict

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
POST/jobs/{jobId}/retryCreate a new job from a retryable failed job
Operation ID
retryJobForConsole
Security
cookieSession + csrfToken
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Parameters

jobIdpathRequired
Schema
{
  "type": "string",
  "pattern": "^job_"
}
Idempotency-KeyheaderRequired
Schema
{
  "type": "string",
  "minLength": 1,
  "maxLength": 255
}

Request body

Required
Schema / application/json
{
  "$ref": "#/components/schemas/ConsoleJobRetryRequest"
}

Responses

202

Replacement job accepted

Schema / application/json
{
  "$ref": "#/components/schemas/Job"
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
403

Authenticated but not permitted, or CSRF validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
404

Resource not found or not owned by the caller

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
409

Resource state or idempotency conflict

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
422

Request validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
429

Rate, concurrency, batch, or pending-job limit exceeded

Retry-After

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
503

A required dependency or catalog is temporarily unavailable

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}

Storage Destinations

5
GET/storage-destinationsList safe storage destination metadata

Disabled/soft-deleted destinations are excluded. Credentials are never projected.

Operation ID
listStorageDestinations
Security
cookieSession
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Responses

200

Destinations without credentials

Schema / application/json
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "data"
  ],
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/StorageDestination"
      }
    }
  }
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
POST/storage-destinationsSave an encrypted customer storage destination

The destination starts in `invalid` state and becomes `active` only after a successful connection test. A soft-deleted name remains reserved.

Operation ID
createStorageDestination
Security
cookieSession + csrfToken
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Parameters

Idempotency-KeyheaderRequired
Schema
{
  "type": "string",
  "minLength": 1,
  "maxLength": 255
}

Request body

Required
Schema / application/json
{
  "$ref": "#/components/schemas/CreateStorageDestinationRequest"
}

Responses

201

Destination created

Schema / application/json
{
  "$ref": "#/components/schemas/StorageDestination"
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
403

Authenticated but not permitted, or CSRF validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
409

Resource state or idempotency conflict

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
422

Request validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
PATCH/storage-destinations/{destinationId}Update a destination or replace its credentials

Desired-state update uses `expectedVersion` for aggregate CAS. Credentials are optional unless the provider changes. Connection-affecting changes return the destination to `invalid` until retested.

Operation ID
updateStorageDestination
Security
cookieSession + csrfToken
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Parameters

destinationIdpathRequired
Schema
{
  "type": "string",
  "pattern": "^dst_"
}

Request body

Required
Schema / application/json
{
  "$ref": "#/components/schemas/UpdateStorageDestinationRequest"
}

Responses

200

Updated destination

Schema / application/json
{
  "$ref": "#/components/schemas/StorageDestination"
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
403

Authenticated but not permitted, or CSRF validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
404

Resource not found or not owned by the caller

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
409

Resource state or idempotency conflict

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
422

Request validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
DELETE/storage-destinations/{destinationId}Disable and soft-delete a destination

Repeated deletion of the same owned destination is a no-op and returns 204. Deletion returns 409 while a pending or processing Job references the destination snapshot; successful deletion destroys the encrypted credential payload.

Operation ID
deleteStorageDestination
Security
cookieSession + csrfToken
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Parameters

destinationIdpathRequired
Schema
{
  "type": "string",
  "pattern": "^dst_"
}

Responses

204

Destination deleted

401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
403

Authenticated but not permitted, or CSRF validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
404

Resource not found or not owned by the caller

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
409

Resource state or idempotency conflict

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
POST/storage-destinations/{destinationId}/testTest destination credentials without returning secrets

A connection test may execute more than once; it has no billing effect and only advances the latest test projection.

Operation ID
testStorageDestination
Security
cookieSession + csrfToken
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Parameters

destinationIdpathRequired
Schema
{
  "type": "string",
  "pattern": "^dst_"
}

Responses

200

Connection test result

Schema / application/json
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "ok",
    "latencyMs",
    "testedAt"
  ],
  "properties": {
    "ok": {
      "type": "boolean"
    },
    "latencyMs": {
      "type": "integer",
      "minimum": 0
    },
    "testedAt": {
      "type": "string",
      "format": "date-time"
    }
  }
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
403

Authenticated but not permitted, or CSRF validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
404

Resource not found or not owned by the caller

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
502

An upstream provider failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}

Webhook Endpoints

9
GET/webhook-endpointsList customer webhook endpoint metadata
Operation ID
listWebhookEndpoints
Security
cookieSession
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Responses

200

Webhook endpoints

Schema / application/json
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "data"
  ],
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/WebhookEndpoint"
      }
    }
  }
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
POST/webhook-endpointsCreate and verify a customer webhook endpoint
Operation ID
createWebhookEndpoint
Security
cookieSession + csrfToken
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Parameters

Idempotency-KeyheaderRequired
Schema
{
  "type": "string",
  "minLength": 1,
  "maxLength": 255
}

Request body

Required
Schema / application/json
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "url",
    "events"
  ],
  "properties": {
    "url": {
      "type": "string",
      "format": "uri",
      "pattern": "^https://",
      "description": "Public HTTPS origin only; credentials, paths, query strings, and fragments are rejected."
    },
    "events": {
      "type": "array",
      "minItems": 1,
      "uniqueItems": true,
      "items": {
        "$ref": "#/components/schemas/OutboundWebhookEventType"
      }
    }
  }
}

Responses

201

Endpoint created; signing secret returned once

Schema / application/json
{
  "$ref": "#/components/schemas/WebhookEndpointCreated"
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
403

Authenticated but not permitted, or CSRF validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
409

Resource state or idempotency conflict

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
422

Request validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
PATCH/webhook-endpoints/{endpointId}Update subscriptions or enable/disable an endpoint

Desired-state update is naturally idempotent by endpoint ID and aggregate version.

Operation ID
updateWebhookEndpoint
Security
cookieSession + csrfToken
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Parameters

endpointIdpathRequired
Schema
{
  "type": "string",
  "pattern": "^whe_"
}

Request body

Required
Schema / application/json
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "expectedVersion"
  ],
  "properties": {
    "expectedVersion": {
      "type": "integer",
      "minimum": 0
    },
    "status": {
      "type": "string",
      "enum": [
        "active",
        "disabled"
      ]
    },
    "events": {
      "type": "array",
      "minItems": 1,
      "uniqueItems": true,
      "items": {
        "$ref": "#/components/schemas/OutboundWebhookEventType"
      }
    }
  }
}

Responses

200

Updated endpoint

Schema / application/json
{
  "$ref": "#/components/schemas/WebhookEndpoint"
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
403

Authenticated but not permitted, or CSRF validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
404

Resource not found or not owned by the caller

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
409

Resource state or idempotency conflict

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
DELETE/webhook-endpoints/{endpointId}Delete a customer webhook endpoint

Repeated deletion of the same owned endpoint is a no-op and returns 204.

Operation ID
deleteWebhookEndpoint
Security
cookieSession + csrfToken
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Parameters

endpointIdpathRequired
Schema
{
  "type": "string",
  "pattern": "^whe_"
}

Responses

204

Endpoint deleted

401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
403

Authenticated but not permitted, or CSRF validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
404

Resource not found or not owned by the caller

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
POST/webhook-endpoints/{endpointId}/rotate-secretRotate a customer webhook signing secret
Operation ID
rotateWebhookSecret
Security
cookieSession + csrfToken
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Parameters

endpointIdpathRequired
Schema
{
  "type": "string",
  "pattern": "^whe_"
}
Idempotency-KeyheaderRequired
Schema
{
  "type": "string",
  "minLength": 1,
  "maxLength": 255
}

Responses

201

New secret returned once

Schema / application/json
{
  "$ref": "#/components/schemas/OneTimeSigningSecret"
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
403

Authenticated but not permitted, or CSRF validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
409

Resource state or idempotency conflict

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
POST/webhook-endpoints/{endpointId}/testRevalidate the endpoint target and enqueue a signed test delivery
Operation ID
testWebhookEndpoint
Security
cookieSession + csrfToken
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Parameters

endpointIdpathRequired
Schema
{
  "type": "string",
  "pattern": "^whe_"
}
Idempotency-KeyheaderRequired
Schema
{
  "type": "string",
  "minLength": 1,
  "maxLength": 255
}

Responses

202

Test delivery accepted after SSRF and DNS validation

Schema / application/json
{
  "$ref": "#/components/schemas/WebhookDelivery"
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
403

Authenticated but not permitted, or CSRF validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
404

Resource not found or not owned by the caller

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
409

Resource state or idempotency conflict

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
422

Request validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
GET/webhook-deliveriesList customer webhook delivery attempts
Operation ID
listWebhookDeliveries
Security
cookieSession
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Parameters

cursorqueryOptional
Schema
{
  "type": "string",
  "maxLength": 512
}
limitqueryOptional
Schema
{
  "type": "integer",
  "minimum": 1,
  "maximum": 100,
  "default": 50
}
endpointIdqueryOptional
Schema
{
  "type": "string",
  "pattern": "^whe_"
}

Responses

200

Delivery attempts

Schema / application/json
{
  "allOf": [
    {
      "$ref": "#/components/schemas/Page"
    },
    {
      "type": "object",
      "properties": {
        "data": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/WebhookDelivery"
          }
        }
      }
    }
  ]
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
GET/webhook-deliveries/{deliveryId}Read one safe delivery timeline
Operation ID
getWebhookDelivery
Security
cookieSession
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Parameters

deliveryIdpathRequired
Schema
{
  "type": "string",
  "pattern": "^whd_"
}

Responses

200

Delivery metadata and attempts

Schema / application/json
{
  "$ref": "#/components/schemas/WebhookDeliveryDetail"
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
404

Resource not found or not owned by the caller

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
POST/webhook-deliveries/{deliveryId}/retryRetry an eligible dead-letter delivery

Reserves the next absolute attempt for the latest dead-letter delivery and starts a new bounded automatic retry window. A failed attempt with `nextAttemptAt` is still owned by the existing automatic retry command and cannot be retried manually. The event/endpoint lifecycle is capped at 1000 attempts; concurrent reservations return `409`.

Operation ID
retryWebhookDelivery
Security
cookieSession + csrfToken
Server
https://api.flashdata.dev/v2http://localhost:5000/v2

Parameters

deliveryIdpathRequired
Schema
{
  "type": "string",
  "pattern": "^whd_"
}
Idempotency-KeyheaderRequired
Schema
{
  "type": "string",
  "minLength": 1,
  "maxLength": 255
}

Responses

202

Retry attempt scheduled

Schema / application/json
{
  "$ref": "#/components/schemas/WebhookDelivery"
}
401

Authentication required or invalid

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
403

Authenticated but not permitted, or CSRF validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
404

Resource not found or not owned by the caller

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
409

Resource state or idempotency conflict

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}

Data Sources

1
GET/sourcesList currently executable source modes and baseline cost estimates

`modes` 只包含当前部署具有真实 adapter/consumer 的模式;后续可靠 consumer 上线时通过 registry 扩展。`estimatedMicrocredits` 是提交前基线估算,最终收费 仍由账户 entitlement 与 reservation 结果决定。

Operation ID
listDataSources
Security
apiKey
Server
https://data.flashdata.dev/v2http://localhost:5000/v2

Responses

200

Sources

Cache-Control / X-Request-Id

Schema / application/json
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "data"
  ],
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/DataSource"
      }
    }
  }
}
401

API Key is missing, invalid, expired, or revoked

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
403

Authenticated but not permitted, or CSRF validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
503

A required dependency or catalog is temporarily unavailable

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}

Queries

6
POST/queries/realtimeExecute a synchronous query
Operation ID
executeRealtimeQuery
Security
apiKey
Server
https://data.flashdata.dev/v2http://localhost:5000/v2

Parameters

Idempotency-KeyheaderRequired
Schema
{
  "type": "string",
  "minLength": 1,
  "maxLength": 255
}

Request body

Required
Schema / application/json
{
  "$ref": "#/components/schemas/QueryRequest"
}

Responses

200

Completed query

Cache-Control / X-Request-Id

Schema / application/json
{
  "$ref": "#/components/schemas/RealtimeQueryResponse"
}
401

API Key is missing, invalid, expired, or revoked

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
402

Account has insufficient available credits

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
403

Authenticated but not permitted, or CSRF validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
409

Resource state or idempotency conflict

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
422

Request validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
429

Rate, concurrency, batch, or pending-job limit exceeded

Retry-After

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
502

An upstream provider failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
503

A required dependency or catalog is temporarily unavailable

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
504

An upstream provider timed out

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
POST/queriesSubmit a durable asynchronous query
Operation ID
createAsyncQuery
Security
apiKey
Server
https://data.flashdata.dev/v2http://localhost:5000/v2

Parameters

Idempotency-KeyheaderRequired
Schema
{
  "type": "string",
  "minLength": 1,
  "maxLength": 255
}

Request body

Required
Schema / application/json
{
  "$ref": "#/components/schemas/QueryRequest"
}

Responses

202

Job accepted

Cache-Control / X-Request-Id / Location

Schema / application/json
{
  "$ref": "#/components/schemas/Job"
}
401

API Key is missing, invalid, expired, or revoked

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
402

Account has insufficient available credits

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
403

Authenticated but not permitted, or CSRF validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
409

Resource state or idempotency conflict

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
422

Request validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
429

Rate, concurrency, batch, or pending-job limit exceeded

Retry-After

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
503

A required dependency or catalog is temporarily unavailable

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
POST/queries/batchAtomically validate and submit a batch of queries

全部 query 先完成 schema/mode 校验,再原子预留整批额度并一次提交。 任一预校验、预留或提交失败时整批不接受;不存在部分 accepted 响应。

Operation ID
createBatchQueries
Security
apiKey
Server
https://data.flashdata.dev/v2http://localhost:5000/v2

Parameters

Idempotency-KeyheaderRequired
Schema
{
  "type": "string",
  "minLength": 1,
  "maxLength": 255
}

Request body

Required
Schema / application/json
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "queries"
  ],
  "properties": {
    "queries": {
      "type": "array",
      "minItems": 1,
      "maxItems": 1000,
      "items": {
        "$ref": "#/components/schemas/QueryRequest"
      }
    }
  }
}

Responses

202

Batch accepted

Cache-Control / X-Request-Id

Schema / application/json
{
  "$ref": "#/components/schemas/BatchQueryResponse"
}
401

API Key is missing, invalid, expired, or revoked

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
402

Account has insufficient available credits

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
403

Authenticated but not permitted, or CSRF validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
409

Resource state or idempotency conflict

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
422

Request validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
429

Rate, concurrency, batch, or pending-job limit exceeded

Retry-After

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
503

A required dependency or catalog is temporarily unavailable

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
GET/queries/{jobId}Read an asynchronous query job
Operation ID
getQueryJob
Security
apiKey
Server
https://data.flashdata.dev/v2http://localhost:5000/v2

Parameters

jobIdpathRequired
Schema
{
  "type": "string",
  "pattern": "^job_"
}

Responses

200

Job owned by the authenticated account

Cache-Control / X-Request-Id

Schema / application/json
{
  "$ref": "#/components/schemas/Job"
}
401

API Key is missing, invalid, expired, or revoked

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
403

Authenticated but not permitted, or CSRF validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
404

Resource not found or not owned by the caller

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
503

A required dependency or catalog is temporarily unavailable

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
DELETE/queries/{jobId}Cancel a job that has not reached a terminal state

取消使用 Job 状态机的自然幂等边界;重复取消已 cancelled Job 仍返回 204。 completed/failed 等不可取消终态返回 409,缺失和非本账户 Job 统一返回 404。

Operation ID
cancelQueryJob
Security
apiKey
Server
https://data.flashdata.dev/v2http://localhost:5000/v2

Parameters

jobIdpathRequired
Schema
{
  "type": "string",
  "pattern": "^job_"
}

Responses

204

Job cancelled; unused reservation released

Cache-Control / X-Request-Id

401

API Key is missing, invalid, expired, or revoked

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
403

Authenticated but not permitted, or CSRF validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
404

Resource not found or not owned by the caller

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
409

Resource state or idempotency conflict

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
503

A required dependency or catalog is temporarily unavailable

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
GET/queries/{jobId}/resultsRead completed job results

pending/processing Job 返回 409 `query_job_not_completed`;failed/cancelled Job 没有可读取结果,同样返回该稳定冲突码。缺失和非本账户 Job 统一返回 404。

Operation ID
getQueryJobResults
Security
apiKey
Server
https://data.flashdata.dev/v2http://localhost:5000/v2

Parameters

jobIdpathRequired
Schema
{
  "type": "string",
  "pattern": "^job_"
}
cursorqueryOptional
Schema
{
  "type": "string",
  "maxLength": 512
}
limitqueryOptional
Schema
{
  "type": "integer",
  "minimum": 1,
  "maximum": 100,
  "default": 50
}

Responses

200

Result page

Cache-Control / X-Request-Id

Schema / application/json
{
  "$ref": "#/components/schemas/QueryResults"
}
401

API Key is missing, invalid, expired, or revoked

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
403

Authenticated but not permitted, or CSRF validation failed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
404

Resource not found or not owned by the caller

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
409

Job has not completed

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}
503

A required dependency or catalog is temporarily unavailable

Schema / application/problem+json
{
  "$ref": "#/components/schemas/Problem"
}

Schema catalog

Account
{
  "type": "object",
  "description": "Deleted accounts are only returned through authorized Admin projections; their identity fields are redacted.",
  "additionalProperties": false,
  "required": [
    "id",
    "name",
    "email",
    "status",
    "emailVerified",
    "legalAcceptanceRequired",
    "role",
    "timezone",
    "createdAt",
    "updatedAt"
  ],
  "properties": {
    "id": {
      "type": "string",
      "pattern": "^acct_"
    },
    "name": {
      "type": "string"
    },
    "email": {
      "type": [
        "string",
        "null"
      ],
      "format": "email"
    },
    "status": {
      "type": "string",
      "enum": [
        "pending_verification",
        "active",
        "suspended",
        "deleting",
        "deleted"
      ]
    },
    "emailVerified": {
      "type": "boolean"
    },
    "legalAcceptanceRequired": {
      "type": "boolean"
    },
    "role": {
      "type": "string",
      "enum": [
        "user",
        "admin"
      ]
    },
    "timezone": {
      "type": "string",
      "minLength": 1,
      "maxLength": 80
    },
    "createdAt": {
      "type": "string",
      "format": "date-time"
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time"
    }
  }
}
AccountDeletionRequest
{
  "type": "object",
  "description": "User-safe deletion summary. Durable processor cursor and per-step metadata are internal operational state and are intentionally omitted.",
  "additionalProperties": false,
  "required": [
    "id",
    "status",
    "requestedAt",
    "scheduledFor",
    "cancellable",
    "billingCancellationStatus",
    "activeJobsAtRequest",
    "retryable"
  ],
  "properties": {
    "id": {
      "type": "string",
      "pattern": "^del_"
    },
    "status": {
      "type": "string",
      "enum": [
        "scheduled",
        "cancelled",
        "processing",
        "completed",
        "failed"
      ]
    },
    "requestedAt": {
      "type": "string",
      "format": "date-time"
    },
    "scheduledFor": {
      "type": "string",
      "format": "date-time"
    },
    "cancellable": {
      "type": "boolean"
    },
    "cancelledAt": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    },
    "processingStartedAt": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    },
    "completedAt": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    },
    "failureCode": {
      "type": [
        "string",
        "null"
      ],
      "maxLength": 80
    },
    "billingCancellationStatus": {
      "type": "string",
      "enum": [
        "not_required",
        "pending",
        "completed",
        "failed"
      ]
    },
    "activeJobsAtRequest": {
      "type": "integer",
      "minimum": 0
    },
    "retryable": {
      "type": "boolean",
      "description": "True only when an Admin-audited processor retry is possible; it does not grant the user mutation access."
    }
  }
}
ApiKey
{
  "type": "object",
  "description": "Public API Key metadata. Internal primary/retiring rotation state is intentionally omitted; a retiring key remains `active` until scheduledRevocationAt.",
  "additionalProperties": false,
  "required": [
    "id",
    "name",
    "environment",
    "prefix",
    "last4",
    "scopes",
    "status",
    "createdAt"
  ],
  "properties": {
    "id": {
      "type": "string",
      "pattern": "^key_"
    },
    "name": {
      "type": "string"
    },
    "environment": {
      "type": "string",
      "enum": [
        "test",
        "live"
      ]
    },
    "prefix": {
      "type": "string"
    },
    "last4": {
      "type": "string",
      "minLength": 4,
      "maxLength": 4
    },
    "scopes": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "status": {
      "type": "string",
      "enum": [
        "active",
        "revoked",
        "expired"
      ]
    },
    "lastUsedAt": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    },
    "expiresAt": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    },
    "scheduledRevocationAt": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time",
      "description": "Planned revocation time for an overlapping retiring key; null for a primary or immediately revoked key."
    },
    "createdAt": {
      "type": "string",
      "format": "date-time"
    }
  }
}
ApiKeyCreated
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "apiKey",
    "secret"
  ],
  "properties": {
    "apiKey": {
      "$ref": "#/components/schemas/ApiKey"
    },
    "secret": {
      "type": "string",
      "readOnly": true,
      "pattern": "^fd_(test|live)_",
      "description": "Plaintext secret returned only by this create/rotate transaction. An authenticated replay with the same Idempotency-Key and request body may receive the same KMS-encrypted response for five minutes; it is not recoverable afterward.",
      "x-secret-reveal": "once"
    }
  }
}
BatchQueryResponse
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "batchId",
    "jobs",
    "totalEstimatedMicrocredits"
  ],
  "properties": {
    "batchId": {
      "type": "string",
      "pattern": "^batch_"
    },
    "jobs": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/Job"
      }
    },
    "totalEstimatedMicrocredits": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    }
  }
}
BillingPaymentPage
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "data",
    "pagination"
  ],
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/BillingPayment"
      }
    },
    "pagination": {
      "$ref": "#/components/schemas/Pagination"
    }
  }
}
BillingPayment
{
  "description": "Account-scoped top-up projection. Refund state is updated only from verified provider events; this API does not initiate refunds.",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "id",
    "purchaseType",
    "status",
    "currency",
    "amount",
    "refundedAmount",
    "creditsMicrocredits",
    "reversedCreditsMicrocredits",
    "createdAt"
  ],
  "properties": {
    "id": {
      "type": "string",
      "pattern": "^pay_"
    },
    "purchaseType": {
      "type": "string",
      "const": "top_up"
    },
    "status": {
      "type": "string",
      "enum": [
        "pending",
        "paid",
        "partially_refunded",
        "refunded",
        "failed"
      ]
    },
    "currency": {
      "type": "string",
      "const": "USD"
    },
    "amount": {
      "type": "integer",
      "minimum": 0,
      "description": "USD cents"
    },
    "refundedAmount": {
      "type": "integer",
      "minimum": 0,
      "description": "USD cents"
    },
    "creditsMicrocredits": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "reversedCreditsMicrocredits": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991,
      "description": "Cumulative credits removed by append-only payment_reversal entries; never exceeds creditsMicrocredits."
    },
    "paidAt": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    },
    "refundedAt": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    },
    "createdAt": {
      "type": "string",
      "format": "date-time"
    }
  }
}
ConsoleBatchQueryRequest
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "apiKeyId",
    "queries"
  ],
  "properties": {
    "apiKeyId": {
      "type": "string",
      "pattern": "^key_[A-Za-z0-9_-]{8,}$",
      "description": "Owned active API Key metadata selected for scope enforcement and usage attribution; never a plaintext API Key."
    },
    "queries": {
      "type": "array",
      "minItems": 1,
      "maxItems": 1000,
      "items": {
        "$ref": "#/components/schemas/QueryRequest"
      }
    }
  }
}
ConsoleJobRetryRequest
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "apiKeyId"
  ],
  "properties": {
    "apiKeyId": {
      "type": "string",
      "pattern": "^key_[A-Za-z0-9_-]{8,}$",
      "description": "Owned active API Key used for the replacement Job. The original Job's Key is never restored implicitly."
    }
  }
}
ConsoleOverview
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "account",
    "onboarding",
    "subscription",
    "balance",
    "usage",
    "recentJobs",
    "publicStatus",
    "degradedSections",
    "generatedAt"
  ],
  "properties": {
    "account": {
      "$ref": "#/components/schemas/Account"
    },
    "onboarding": {
      "$ref": "#/components/schemas/OnboardingProgress"
    },
    "subscription": {
      "oneOf": [
        {
          "$ref": "#/components/schemas/Subscription"
        },
        {
          "type": "null"
        }
      ]
    },
    "balance": {
      "oneOf": [
        {
          "$ref": "#/components/schemas/CreditBalance"
        },
        {
          "type": "null"
        }
      ]
    },
    "usage": {
      "oneOf": [
        {
          "$ref": "#/components/schemas/UsageSummary"
        },
        {
          "type": "null"
        }
      ]
    },
    "recentJobs": {
      "type": "array",
      "maxItems": 10,
      "items": {
        "$ref": "#/components/schemas/Job"
      }
    },
    "publicStatus": {
      "oneOf": [
        {
          "$ref": "#/components/schemas/PublicStatus"
        },
        {
          "type": "null"
        }
      ]
    },
    "degradedSections": {
      "type": "array",
      "uniqueItems": true,
      "items": {
        "type": "string",
        "enum": [
          "subscription",
          "balance",
          "usage",
          "recent_jobs",
          "public_status"
        ]
      },
      "description": "A listed section uses its unavailable representation; null and empty values must not be interpreted as zero or healthy."
    },
    "generatedAt": {
      "type": "string",
      "format": "date-time"
    }
  }
}
ConsoleQueryRequest
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "apiKeyId",
    "query"
  ],
  "properties": {
    "apiKeyId": {
      "type": "string",
      "pattern": "^key_[A-Za-z0-9_-]{8,}$",
      "description": "Owned active API Key metadata selected for scope enforcement and usage attribution; never a plaintext API Key."
    },
    "query": {
      "$ref": "#/components/schemas/QueryRequest"
    }
  }
}
CreateApiKeyRequest
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "name",
    "environment",
    "scopes"
  ],
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 80
    },
    "environment": {
      "type": "string",
      "enum": [
        "test",
        "live"
      ]
    },
    "scopes": {
      "type": "array",
      "minItems": 1,
      "uniqueItems": true,
      "items": {
        "type": "string",
        "enum": [
          "queries:read",
          "queries:write",
          "usage:read"
        ]
      }
    },
    "expiresAt": {
      "type": "string",
      "format": "date-time"
    }
  }
}
CreateStorageDestinationRequest
{
  "oneOf": [
    {
      "$ref": "#/components/schemas/S3StorageDestinationWrite"
    },
    {
      "$ref": "#/components/schemas/S3CompatibleStorageDestinationWrite"
    },
    {
      "$ref": "#/components/schemas/GcsStorageDestinationWrite"
    },
    {
      "$ref": "#/components/schemas/AzureStorageDestinationWrite"
    },
    {
      "$ref": "#/components/schemas/BosStorageDestinationWrite"
    },
    {
      "$ref": "#/components/schemas/OssStorageDestinationWrite"
    },
    {
      "$ref": "#/components/schemas/TosStorageDestinationWrite"
    }
  ]
}
AzureStorageDestinationWrite
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "name",
    "provider",
    "config",
    "credentials"
  ],
  "properties": {
    "name": {
      "$ref": "#/components/schemas/StorageDestinationName"
    },
    "provider": {
      "type": "string",
      "const": "azure"
    },
    "config": {
      "$ref": "#/components/schemas/AzureStorageConfig"
    },
    "credentials": {
      "$ref": "#/components/schemas/AzureStorageCredentials",
      "writeOnly": true
    }
  }
}
AzureStorageConfig
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "accountUrl",
    "container"
  ],
  "properties": {
    "accountUrl": {
      "$ref": "#/components/schemas/PublicHttpsStorageEndpoint"
    },
    "container": {
      "type": "string",
      "minLength": 3,
      "maxLength": 63,
      "pattern": "^[a-z0-9](?:[a-z0-9]|-(?!-))*[a-z0-9]$"
    },
    "objectPrefix": {
      "$ref": "#/components/schemas/StorageObjectPrefix"
    }
  }
}
AzureStorageCredentials
{
  "oneOf": [
    {
      "type": "object",
      "title": "Standard Azure connection string",
      "additionalProperties": false,
      "required": [
        "connectionString"
      ],
      "properties": {
        "connectionString": {
          "type": "string",
          "minLength": 1,
          "maxLength": 8192,
          "description": "Standard public Azure connection string. Its derived or explicit BlobEndpoint must normalize to the accompanying config.accountUrl."
        }
      }
    },
    {
      "type": "object",
      "title": "Azure named key",
      "additionalProperties": false,
      "required": [
        "accountName",
        "accountKey"
      ],
      "properties": {
        "accountName": {
          "type": "string",
          "pattern": "^[a-z0-9]{3,24}$"
        },
        "accountKey": {
          "type": "string",
          "minLength": 1,
          "maxLength": 4096
        }
      }
    },
    {
      "type": "object",
      "title": "Azure SAS token",
      "additionalProperties": false,
      "required": [
        "sasToken"
      ],
      "properties": {
        "sasToken": {
          "type": "string",
          "minLength": 1,
          "maxLength": 8192
        }
      }
    }
  ]
}
BosStorageDestinationWrite
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "name",
    "provider",
    "config",
    "credentials"
  ],
  "properties": {
    "name": {
      "$ref": "#/components/schemas/StorageDestinationName"
    },
    "provider": {
      "type": "string",
      "const": "bos"
    },
    "config": {
      "$ref": "#/components/schemas/BosStorageConfig"
    },
    "credentials": {
      "$ref": "#/components/schemas/StaticAccessKeyStorageCredentials",
      "writeOnly": true
    }
  }
}
BosStorageConfig
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "bucket",
    "endpoint"
  ],
  "properties": {
    "bucket": {
      "$ref": "#/components/schemas/StorageBucketName"
    },
    "endpoint": {
      "$ref": "#/components/schemas/PublicHttpsStorageEndpoint"
    },
    "objectPrefix": {
      "$ref": "#/components/schemas/StorageObjectPrefix"
    }
  }
}
CreditBalance
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "balanceMicrocredits",
    "reservedMicrocredits",
    "availableMicrocredits",
    "lifetimeGrantedMicrocredits",
    "lifetimeUsedMicrocredits",
    "lifetimeRefundedMicrocredits",
    "lifetimePaymentReversedMicrocredits",
    "updatedAt"
  ],
  "properties": {
    "balanceMicrocredits": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Signed settled balance equal to the sum of ledger deltas; verified provider reversals may make it negative."
    },
    "reservedMicrocredits": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "availableMicrocredits": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991,
      "description": "max(balanceMicrocredits - reservedMicrocredits, 0)."
    },
    "lifetimeGrantedMicrocredits": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "lifetimeUsedMicrocredits": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "lifetimeRefundedMicrocredits": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991,
      "description": "Credits returned to the account by positive usage_refund entries."
    },
    "lifetimePaymentReversedMicrocredits": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991,
      "description": "Absolute credits removed by provider payment_reversal entries."
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time"
    }
  }
}
CreditEntryType
{
  "type": "string",
  "enum": [
    "trial_grant",
    "subscription_grant",
    "topup_grant",
    "usage",
    "usage_refund",
    "payment_reversal",
    "expiration",
    "admin_adjustment",
    "migration_opening_balance"
  ]
}
CreditPolicy
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "unit",
    "failedRequestsCharged",
    "subscriptionGrantTiming",
    "refundHandling",
    "trialGrantMicrocredits",
    "expiresAt"
  ],
  "properties": {
    "unit": {
      "type": "string",
      "const": "microcredit"
    },
    "failedRequestsCharged": {
      "type": "boolean",
      "const": false
    },
    "subscriptionGrantTiming": {
      "type": "string",
      "const": "invoice_paid"
    },
    "refundHandling": {
      "type": "string",
      "const": "append_only_reversal",
      "description": "Failed requests release reservations; provider refunds create negative payment_reversal ledger entries."
    },
    "trialGrantMicrocredits": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "expiresAt": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    }
  }
}
CreditTransaction
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "id",
    "type",
    "deltaMicrocredits",
    "balanceAfterMicrocredits",
    "createdAt"
  ],
  "properties": {
    "id": {
      "type": "string",
      "pattern": "^ctx_"
    },
    "type": {
      "$ref": "#/components/schemas/CreditEntryType"
    },
    "deltaMicrocredits": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "balanceAfterMicrocredits": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Signed settled balance after this immutable entry."
    },
    "description": {
      "type": "string"
    },
    "requestId": {
      "type": [
        "string",
        "null"
      ]
    },
    "jobId": {
      "type": [
        "string",
        "null"
      ]
    },
    "createdAt": {
      "type": "string",
      "format": "date-time"
    }
  }
}
DataSource
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "id",
    "name",
    "category",
    "modes",
    "inputSchema",
    "estimatedMicrocredits",
    "requiresStorageDestination"
  ],
  "properties": {
    "id": {
      "type": "string",
      "enum": [
        "google_search",
        "google_images",
        "google_news",
        "google_shopping",
        "google_videos",
        "google_places",
        "youtube_search",
        "youtube_search_extended",
        "youtube_metadata",
        "youtube_transcript",
        "youtube_captions",
        "youtube_trainability",
        "youtube_channel",
        "youtube_suggestions",
        "youtube_download"
      ]
    },
    "name": {
      "type": "string"
    },
    "category": {
      "type": "string",
      "enum": [
        "google",
        "youtube"
      ]
    },
    "modes": {
      "type": "array",
      "minItems": 1,
      "uniqueItems": true,
      "description": "Only modes backed by a real adapter or consumer in the current release",
      "items": {
        "type": "string",
        "enum": [
          "realtime",
          "async",
          "batch"
        ]
      }
    },
    "inputSchema": {
      "type": "object",
      "additionalProperties": true,
      "description": "JSON Schema used by the Playground and generated clients"
    },
    "estimatedMicrocredits": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "requiresStorageDestination": {
      "type": "boolean",
      "description": "Whether query submission must reference an owned active storage destination."
    }
  }
}
GcsStorageDestinationWrite
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "name",
    "provider",
    "config",
    "credentials"
  ],
  "properties": {
    "name": {
      "$ref": "#/components/schemas/StorageDestinationName"
    },
    "provider": {
      "type": "string",
      "const": "gcs"
    },
    "config": {
      "$ref": "#/components/schemas/GcsStorageConfig"
    },
    "credentials": {
      "$ref": "#/components/schemas/GcsStorageCredentials",
      "writeOnly": true
    }
  }
}
GcsStorageConfig
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "bucket",
    "projectId"
  ],
  "properties": {
    "bucket": {
      "$ref": "#/components/schemas/StorageBucketName"
    },
    "projectId": {
      "type": "string",
      "minLength": 6,
      "maxLength": 63,
      "pattern": "^[a-z][a-z0-9-]*[a-z0-9]$"
    },
    "objectPrefix": {
      "$ref": "#/components/schemas/StorageObjectPrefix"
    }
  }
}
GcsStorageCredentials
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "serviceAccount"
  ],
  "properties": {
    "serviceAccount": {
      "$ref": "#/components/schemas/GcsServiceAccount"
    }
  }
}
GcsServiceAccount
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "type",
    "project_id",
    "private_key_id",
    "private_key",
    "client_email",
    "client_id",
    "auth_uri",
    "token_uri"
  ],
  "properties": {
    "type": {
      "type": "string",
      "const": "service_account"
    },
    "project_id": {
      "type": "string"
    },
    "private_key_id": {
      "type": "string"
    },
    "private_key": {
      "type": "string",
      "maxLength": 16384
    },
    "client_email": {
      "type": "string",
      "format": "email"
    },
    "client_id": {
      "type": "string"
    },
    "auth_uri": {
      "type": "string",
      "const": "https://accounts.google.com/o/oauth2/auth"
    },
    "token_uri": {
      "type": "string",
      "const": "https://oauth2.googleapis.com/token"
    },
    "auth_provider_x509_cert_url": {
      "type": "string"
    },
    "client_x509_cert_url": {
      "type": "string"
    },
    "universe_domain": {
      "type": "string"
    }
  }
}
Health
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "status",
    "service",
    "version",
    "time"
  ],
  "properties": {
    "status": {
      "type": "string",
      "enum": [
        "healthy",
        "degraded"
      ]
    },
    "service": {
      "type": "string"
    },
    "version": {
      "type": "string"
    },
    "time": {
      "type": "string",
      "format": "date-time"
    }
  }
}
HostedSession
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "id",
    "url",
    "expiresAt"
  ],
  "properties": {
    "id": {
      "type": "string"
    },
    "url": {
      "type": "string",
      "format": "uri",
      "description": "Provider-hosted HTTPS URL. Production Stripe sessions use a Stripe-controlled *.stripe.com host; non-production fake adapters may use a reserved .test host. Web clients must validate the origin and redirect from a server-only boundary."
    },
    "expiresAt": {
      "type": "string",
      "format": "date-time"
    }
  }
}
Invoice
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "id",
    "number",
    "status",
    "currency",
    "total",
    "amountPaid",
    "refundedAmount",
    "createdAt"
  ],
  "properties": {
    "id": {
      "type": "string",
      "pattern": "^inv_"
    },
    "number": {
      "type": "string"
    },
    "status": {
      "type": "string",
      "enum": [
        "draft",
        "open",
        "paid",
        "void",
        "uncollectible"
      ]
    },
    "currency": {
      "type": "string",
      "const": "USD"
    },
    "total": {
      "type": "integer",
      "description": "USD cents"
    },
    "amountPaid": {
      "type": "integer",
      "description": "USD cents"
    },
    "refundedAmount": {
      "type": "integer",
      "minimum": 0,
      "description": "Cumulative USD cents observed from verified provider events."
    },
    "hostedInvoiceUrl": {
      "type": [
        "string",
        "null"
      ],
      "format": "uri",
      "description": "Stripe-hosted HTTPS invoice URL. Production Web clients accept only Stripe-controlled *.stripe.com origins."
    },
    "createdAt": {
      "type": "string",
      "format": "date-time"
    },
    "paidAt": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    }
  }
}
Job
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "id",
    "source",
    "status",
    "progress",
    "version",
    "usage",
    "createdAt",
    "updatedAt",
    "links"
  ],
  "properties": {
    "id": {
      "type": "string",
      "pattern": "^job_"
    },
    "source": {
      "type": "string"
    },
    "status": {
      "$ref": "#/components/schemas/JobStatus"
    },
    "progress": {
      "type": "integer",
      "minimum": 0,
      "maximum": 100
    },
    "version": {
      "type": "integer",
      "minimum": 0
    },
    "usage": {
      "$ref": "#/components/schemas/QueryUsage"
    },
    "error": {
      "oneOf": [
        {
          "$ref": "#/components/schemas/SafeJobError"
        },
        {
          "type": "null"
        }
      ]
    },
    "createdAt": {
      "type": "string",
      "format": "date-time"
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time"
    },
    "completedAt": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    },
    "links": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "self"
      ],
      "properties": {
        "self": {
          "type": "string"
        },
        "results": {
          "type": [
            "string",
            "null"
          ]
        }
      }
    }
  }
}
JobStatus
{
  "type": "string",
  "enum": [
    "pending",
    "processing",
    "completed",
    "failed",
    "cancelled"
  ]
}
LegalAcceptanceRequest
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "acceptedTerms",
    "termsVersion",
    "privacyVersion"
  ],
  "properties": {
    "acceptedTerms": {
      "type": "boolean",
      "const": true
    },
    "termsVersion": {
      "type": "string",
      "minLength": 1,
      "maxLength": 64
    },
    "privacyVersion": {
      "type": "string",
      "minLength": 1,
      "maxLength": 64
    }
  }
}
LoginRequest
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "email",
    "password"
  ],
  "properties": {
    "email": {
      "type": "string",
      "format": "email",
      "maxLength": 320
    },
    "password": {
      "type": "string",
      "minLength": 1,
      "maxLength": 128,
      "writeOnly": true
    },
    "rememberMe": {
      "type": "boolean",
      "default": false,
      "description": "Ignored for legal_acceptance and deletion_recovery Sessions, which always use a short fixed expiry."
    }
  }
}
LoginResponse
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "account",
    "csrfToken",
    "sessionMode"
  ],
  "properties": {
    "account": {
      "$ref": "#/components/schemas/Account"
    },
    "csrfToken": {
      "type": "string",
      "minLength": 32,
      "readOnly": true
    },
    "sessionMode": {
      "type": "string",
      "enum": [
        "full",
        "legal_acceptance",
        "deletion_recovery"
      ]
    }
  }
}
OnboardingProgress
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "currentStep",
    "apiKeyStepStatus",
    "firstRequestStatus",
    "version",
    "updatedAt"
  ],
  "properties": {
    "currentStep": {
      "type": "string",
      "enum": [
        "welcome",
        "api_key",
        "first_request",
        "completed"
      ]
    },
    "useCase": {
      "type": [
        "string",
        "null"
      ],
      "enum": [
        "google_search",
        "youtube_data",
        "download",
        null
      ]
    },
    "apiKeyStepStatus": {
      "type": "string",
      "enum": [
        "pending",
        "created",
        "skipped"
      ]
    },
    "firstRequestStatus": {
      "type": "string",
      "enum": [
        "pending",
        "succeeded",
        "skipped"
      ]
    },
    "firstApiKeyId": {
      "type": [
        "string",
        "null"
      ],
      "pattern": "^key_"
    },
    "firstRequestId": {
      "type": [
        "string",
        "null"
      ],
      "pattern": "^req_"
    },
    "completedAt": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    },
    "version": {
      "type": "integer",
      "minimum": 0
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time"
    }
  }
}
OneTimeSigningSecret
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "signingSecret"
  ],
  "properties": {
    "signingSecret": {
      "type": "string",
      "readOnly": true,
      "minLength": 32,
      "description": "Plaintext signing secret returned only by this rotation transaction. The same authenticated idempotent replay may return it for five minutes.",
      "x-secret-reveal": "once"
    }
  }
}
OssStorageDestinationWrite
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "name",
    "provider",
    "config",
    "credentials"
  ],
  "properties": {
    "name": {
      "$ref": "#/components/schemas/StorageDestinationName"
    },
    "provider": {
      "type": "string",
      "const": "oss"
    },
    "config": {
      "$ref": "#/components/schemas/OssStorageConfig"
    },
    "credentials": {
      "$ref": "#/components/schemas/StaticAccessKeyStorageCredentials",
      "writeOnly": true
    }
  }
}
OssStorageConfig
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "bucket",
    "endpoint",
    "region"
  ],
  "properties": {
    "bucket": {
      "$ref": "#/components/schemas/StorageBucketName"
    },
    "endpoint": {
      "$ref": "#/components/schemas/PublicHttpsStorageEndpoint"
    },
    "region": {
      "$ref": "#/components/schemas/StorageRegion"
    },
    "objectPrefix": {
      "$ref": "#/components/schemas/StorageObjectPrefix"
    }
  }
}
OutboundWebhookEventType
{
  "type": "string",
  "enum": [
    "job.completed",
    "job.failed",
    "job.cancelled"
  ]
}
Page
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "data",
    "pagination"
  ],
  "properties": {
    "data": {
      "type": "array",
      "items": {}
    },
    "pagination": {
      "$ref": "#/components/schemas/Pagination"
    }
  }
}
Pagination
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "hasMore",
    "limit"
  ],
  "properties": {
    "nextCursor": {
      "type": [
        "string",
        "null"
      ]
    },
    "hasMore": {
      "type": "boolean"
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    }
  }
}
Password
{
  "type": "string",
  "minLength": 12,
  "maxLength": 128,
  "writeOnly": true
}
PlanCatalog
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "data",
    "currency",
    "billingAvailability"
  ],
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/Plan"
      }
    },
    "currency": {
      "type": "string",
      "const": "USD"
    },
    "billingAvailability": {
      "type": "string",
      "enum": [
        "available",
        "unconfigured",
        "unavailable"
      ]
    },
    "billingMessage": {
      "type": [
        "string",
        "null"
      ],
      "description": "Stable, non-sensitive explanation suitable for the Pricing and Billing UI."
    }
  }
}
Plan
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "id",
    "slug",
    "name",
    "description",
    "includedMicrocredits",
    "limits",
    "prices",
    "features"
  ],
  "properties": {
    "id": {
      "type": "string",
      "pattern": "^plan_"
    },
    "slug": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "description": {
      "type": "string"
    },
    "includedMicrocredits": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991,
      "description": "Integer microcredits; 1 credit equals 1,000,000 microcredits."
    },
    "limits": {
      "$ref": "#/components/schemas/PlanLimits"
    },
    "prices": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/PlanPrice"
      }
    },
    "features": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  }
}
PlanLimits
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "concurrency",
    "maxBatchSize",
    "maxPendingJobs"
  ],
  "properties": {
    "concurrency": {
      "type": "integer",
      "minimum": 1
    },
    "maxBatchSize": {
      "type": "integer",
      "minimum": 1
    },
    "maxPendingJobs": {
      "type": "integer",
      "minimum": 1
    }
  }
}
PlanPrice
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "id",
    "currency",
    "unitAmount",
    "creditsMicrocredits",
    "type",
    "interval"
  ],
  "properties": {
    "id": {
      "type": "string",
      "pattern": "^prc_"
    },
    "currency": {
      "type": "string",
      "const": "USD"
    },
    "unitAmount": {
      "type": "integer",
      "minimum": 0,
      "description": "USD cents"
    },
    "creditsMicrocredits": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991,
      "description": "Credits granted by a successful one-time top-up; zero for recurring prices."
    },
    "type": {
      "type": "string",
      "enum": [
        "recurring",
        "one_time"
      ]
    },
    "interval": {
      "type": [
        "string",
        "null"
      ],
      "enum": [
        "month",
        "year",
        null
      ]
    }
  }
}
Problem
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "type",
    "title",
    "status",
    "code",
    "requestId"
  ],
  "properties": {
    "type": {
      "type": "string",
      "format": "uri-reference"
    },
    "title": {
      "type": "string"
    },
    "status": {
      "type": "integer",
      "minimum": 400,
      "maximum": 599
    },
    "code": {
      "type": "string",
      "pattern": "^[a-z0-9_]+$"
    },
    "detail": {
      "type": "string"
    },
    "requestId": {
      "type": "string",
      "pattern": "^req_"
    },
    "fieldErrors": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/FieldError"
      }
    }
  }
}
FieldError
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "field",
    "code",
    "message"
  ],
  "properties": {
    "field": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "message": {
      "type": "string"
    }
  }
}
PublicHttpsStorageEndpoint
{
  "type": "string",
  "format": "uri",
  "maxLength": 2048,
  "pattern": "^https://",
  "description": "Public HTTPS origin only; userinfo, path/query/fragment, special hostnames, and private/link-local DNS answers are rejected. Every DNS answer is validated before probe/upload and the connection is pinned to a validated address while preserving Host and TLS SNI."
}
PublicLegalVersions
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "availability",
    "termsVersion",
    "privacyVersion"
  ],
  "properties": {
    "availability": {
      "type": "string",
      "enum": [
        "configured",
        "unconfigured"
      ]
    },
    "termsVersion": {
      "type": [
        "string",
        "null"
      ],
      "minLength": 1,
      "maxLength": 64
    },
    "privacyVersion": {
      "type": [
        "string",
        "null"
      ],
      "minLength": 1,
      "maxLength": 64
    }
  }
}
PublicStatus
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "status",
    "updatedAt",
    "components"
  ],
  "properties": {
    "status": {
      "type": "string",
      "enum": [
        "healthy",
        "degraded",
        "outage"
      ]
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time"
    },
    "components": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/PublicStatusComponent"
      }
    }
  }
}
PublicStatusComponent
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "id",
    "name",
    "status"
  ],
  "properties": {
    "id": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "status": {
      "type": "string",
      "enum": [
        "operational",
        "degraded",
        "outage"
      ]
    }
  }
}
QueryRequest
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "source"
  ],
  "properties": {
    "source": {
      "type": "string"
    },
    "query": {
      "type": "string",
      "maxLength": 2000
    },
    "params": {
      "type": "object",
      "additionalProperties": true
    },
    "context": {
      "type": "array",
      "deprecated": true,
      "description": "V1 compatibility only; new clients should use params.",
      "items": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "key",
          "value"
        ],
        "properties": {
          "key": {
            "type": "string"
          },
          "value": {}
        }
      }
    },
    "webhookEndpointId": {
      "type": "string",
      "pattern": "^whe_"
    },
    "storageDestinationId": {
      "type": "string",
      "pattern": "^dst_"
    }
  }
}
QueryResults
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "data",
    "pagination"
  ],
  "properties": {
    "data": {
      "type": "array",
      "items": {}
    },
    "pagination": {
      "$ref": "#/components/schemas/Pagination"
    }
  }
}
QueryUsage
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "estimatedMicrocredits",
    "chargedMicrocredits"
  ],
  "properties": {
    "estimatedMicrocredits": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "chargedMicrocredits": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "downloadedBytes": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    }
  }
}
RealtimeQueryResponse
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "requestId",
    "source",
    "status",
    "results",
    "usage",
    "createdAt"
  ],
  "properties": {
    "requestId": {
      "type": "string",
      "pattern": "^req_"
    },
    "source": {
      "type": "string"
    },
    "status": {
      "type": "string",
      "const": "completed"
    },
    "results": {
      "type": "array",
      "items": {}
    },
    "usage": {
      "$ref": "#/components/schemas/QueryUsage"
    },
    "createdAt": {
      "type": "string",
      "format": "date-time"
    }
  }
}
Reauthentication
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "reauthenticatedUntil"
  ],
  "properties": {
    "reauthenticatedUntil": {
      "type": "string",
      "format": "date-time"
    }
  }
}
RegisterRequest
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "name",
    "email",
    "password",
    "acceptedTerms",
    "termsVersion",
    "privacyVersion"
  ],
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100
    },
    "email": {
      "type": "string",
      "format": "email",
      "maxLength": 320
    },
    "password": {
      "$ref": "#/components/schemas/Password"
    },
    "acceptedTerms": {
      "type": "boolean",
      "const": true
    },
    "termsVersion": {
      "type": "string",
      "minLength": 1,
      "maxLength": 64,
      "description": "Exact version rendered by the signup page; stale versions are rejected."
    },
    "privacyVersion": {
      "type": "string",
      "minLength": 1,
      "maxLength": 64,
      "description": "Exact version rendered by the signup page; stale versions are rejected."
    }
  }
}
RegisterResponse
{
  "type": "object",
  "additionalProperties": false,
  "description": "Generic receipt returned for both a new account and a recoverable pending account. It intentionally omits identity data to limit account enumeration.",
  "required": [
    "emailVerificationRequired"
  ],
  "properties": {
    "emailVerificationRequired": {
      "type": "boolean",
      "const": true
    }
  }
}
S3CompatibleStorageDestinationWrite
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "name",
    "provider",
    "config",
    "credentials"
  ],
  "properties": {
    "name": {
      "$ref": "#/components/schemas/StorageDestinationName"
    },
    "provider": {
      "type": "string",
      "const": "s3_compatible"
    },
    "config": {
      "$ref": "#/components/schemas/S3CompatibleStorageConfig"
    },
    "credentials": {
      "$ref": "#/components/schemas/AccessKeyStorageCredentials",
      "writeOnly": true
    }
  }
}
AccessKeyStorageCredentials
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "accessKeyId",
    "secretAccessKey"
  ],
  "properties": {
    "accessKeyId": {
      "type": "string",
      "minLength": 1,
      "maxLength": 512
    },
    "secretAccessKey": {
      "type": "string",
      "minLength": 1,
      "maxLength": 4096
    },
    "sessionToken": {
      "type": "string",
      "minLength": 1,
      "maxLength": 8192
    }
  }
}
S3CompatibleStorageConfig
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "bucket",
    "endpoint",
    "region",
    "forcePathStyle"
  ],
  "properties": {
    "bucket": {
      "$ref": "#/components/schemas/StorageBucketName"
    },
    "endpoint": {
      "$ref": "#/components/schemas/PublicHttpsStorageEndpoint"
    },
    "region": {
      "$ref": "#/components/schemas/StorageRegion"
    },
    "forcePathStyle": {
      "type": "boolean",
      "default": true
    },
    "objectPrefix": {
      "$ref": "#/components/schemas/StorageObjectPrefix"
    }
  }
}
S3StorageDestinationWrite
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "name",
    "provider",
    "config",
    "credentials"
  ],
  "properties": {
    "name": {
      "$ref": "#/components/schemas/StorageDestinationName"
    },
    "provider": {
      "type": "string",
      "const": "s3"
    },
    "config": {
      "$ref": "#/components/schemas/S3StorageConfig"
    },
    "credentials": {
      "$ref": "#/components/schemas/AccessKeyStorageCredentials",
      "writeOnly": true
    }
  }
}
S3StorageConfig
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "bucket",
    "region"
  ],
  "properties": {
    "bucket": {
      "$ref": "#/components/schemas/StorageBucketName"
    },
    "region": {
      "$ref": "#/components/schemas/StorageRegion"
    },
    "objectPrefix": {
      "$ref": "#/components/schemas/StorageObjectPrefix"
    }
  }
}
SafeJobError
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "code",
    "message",
    "retryable"
  ],
  "properties": {
    "code": {
      "type": "string"
    },
    "message": {
      "type": "string"
    },
    "retryable": {
      "type": "boolean"
    }
  }
}
Session
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "id",
    "current",
    "mode",
    "createdAt",
    "lastSeenAt",
    "expiresAt",
    "device"
  ],
  "properties": {
    "id": {
      "type": "string",
      "pattern": "^ses_"
    },
    "current": {
      "type": "boolean"
    },
    "mode": {
      "type": "string",
      "enum": [
        "full",
        "legal_acceptance",
        "deletion_recovery"
      ]
    },
    "createdAt": {
      "type": "string",
      "format": "date-time"
    },
    "lastSeenAt": {
      "type": "string",
      "format": "date-time"
    },
    "expiresAt": {
      "type": "string",
      "format": "date-time"
    },
    "device": {
      "type": "string"
    },
    "approximateLocation": {
      "type": "string"
    },
    "reauthenticatedUntil": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    }
  }
}
StaticAccessKeyStorageCredentials
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "accessKeyId",
    "secretAccessKey"
  ],
  "properties": {
    "accessKeyId": {
      "type": "string",
      "minLength": 1,
      "maxLength": 512
    },
    "secretAccessKey": {
      "type": "string",
      "minLength": 1,
      "maxLength": 4096
    }
  }
}
StorageBucketName
{
  "type": "string",
  "minLength": 3,
  "maxLength": 63,
  "pattern": "^[a-z0-9][a-z0-9.-]*[a-z0-9]$"
}
StorageDestination
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "id",
    "name",
    "provider",
    "status",
    "version",
    "config",
    "hasCredentials",
    "lastTestStatus",
    "lastTestedAt",
    "createdAt",
    "updatedAt"
  ],
  "properties": {
    "id": {
      "type": "string",
      "pattern": "^dst_"
    },
    "name": {
      "type": "string"
    },
    "provider": {
      "type": "string",
      "enum": [
        "s3",
        "s3_compatible",
        "gcs",
        "azure",
        "bos",
        "oss",
        "tos"
      ]
    },
    "status": {
      "type": "string",
      "enum": [
        "active",
        "invalid",
        "disabled"
      ]
    },
    "version": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "config": {
      "oneOf": [
        {
          "$ref": "#/components/schemas/S3StorageConfig"
        },
        {
          "$ref": "#/components/schemas/S3CompatibleStorageConfig"
        },
        {
          "$ref": "#/components/schemas/GcsStorageConfig"
        },
        {
          "$ref": "#/components/schemas/AzureStorageConfig"
        },
        {
          "$ref": "#/components/schemas/BosStorageConfig"
        },
        {
          "$ref": "#/components/schemas/OssStorageConfig"
        },
        {
          "$ref": "#/components/schemas/TosStorageConfig"
        }
      ],
      "description": "Provider-specific non-secret fields. The provider discriminator determines the branch."
    },
    "hasCredentials": {
      "type": "boolean"
    },
    "lastTestStatus": {
      "type": [
        "string",
        "null"
      ],
      "enum": [
        "succeeded",
        "failed",
        null
      ]
    },
    "lastTestedAt": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    },
    "createdAt": {
      "type": "string",
      "format": "date-time"
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time"
    }
  }
}
StorageDestinationName
{
  "type": "string",
  "minLength": 1,
  "maxLength": 80
}
StorageObjectPrefix
{
  "type": "string",
  "minLength": 1,
  "maxLength": 512,
  "description": "Relative object-key prefix; leading slash, backslash, and dot path segments are rejected."
}
StorageRegion
{
  "type": "string",
  "minLength": 1,
  "maxLength": 80,
  "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]*$"
}
Subscription
{
  "type": "object",
  "description": "Effective entitlement projection. `status=payg` and `id=null` means no billing subscription record exists.",
  "additionalProperties": false,
  "required": [
    "status",
    "plan",
    "cancelAtPeriodEnd"
  ],
  "properties": {
    "id": {
      "type": [
        "string",
        "null"
      ],
      "pattern": "^sub_"
    },
    "status": {
      "type": "string",
      "enum": [
        "payg",
        "trialing",
        "active",
        "past_due",
        "grace",
        "cancelled"
      ]
    },
    "plan": {
      "$ref": "#/components/schemas/Plan"
    },
    "currentPeriodStart": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    },
    "currentPeriodEnd": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    },
    "cancelAtPeriodEnd": {
      "type": "boolean"
    },
    "graceEndsAt": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    }
  }
}
TokenRequest
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "token"
  ],
  "properties": {
    "token": {
      "type": "string",
      "minLength": 32,
      "maxLength": 256,
      "writeOnly": true
    }
  }
}
TosStorageConfig
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "bucket",
    "endpoint",
    "region"
  ],
  "properties": {
    "bucket": {
      "$ref": "#/components/schemas/StorageBucketName"
    },
    "endpoint": {
      "$ref": "#/components/schemas/PublicHttpsStorageEndpoint"
    },
    "region": {
      "$ref": "#/components/schemas/StorageRegion",
      "description": "TOS signing region used with the configured native endpoint."
    },
    "objectPrefix": {
      "$ref": "#/components/schemas/StorageObjectPrefix"
    }
  }
}
TosStorageDestinationWrite
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "name",
    "provider",
    "config",
    "credentials"
  ],
  "properties": {
    "name": {
      "$ref": "#/components/schemas/StorageDestinationName"
    },
    "provider": {
      "type": "string",
      "const": "tos"
    },
    "config": {
      "$ref": "#/components/schemas/TosStorageConfig"
    },
    "credentials": {
      "$ref": "#/components/schemas/StaticAccessKeyStorageCredentials",
      "writeOnly": true
    }
  }
}
UpdateAccountRequest
{
  "type": "object",
  "additionalProperties": false,
  "minProperties": 1,
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100
    },
    "timezone": {
      "type": "string",
      "minLength": 1,
      "maxLength": 80
    }
  }
}
UpdateOnboardingRequest
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "version",
    "action"
  ],
  "properties": {
    "version": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "action": {
      "type": "string",
      "enum": [
        "select_use_case",
        "confirm_api_key_saved",
        "skip_api_key",
        "confirm_first_request",
        "skip_first_request"
      ]
    },
    "useCase": {
      "type": "string",
      "enum": [
        "google_search",
        "youtube_data",
        "download"
      ]
    }
  },
  "allOf": [
    {
      "if": {
        "properties": {
          "action": {
            "const": "select_use_case"
          }
        }
      },
      "then": {
        "required": [
          "useCase"
        ],
        "properties": {
          "useCase": {}
        }
      },
      "else": {
        "not": {
          "required": [
            "useCase"
          ],
          "properties": {
            "useCase": {}
          }
        }
      }
    }
  ],
  "description": "Server-owned resource state validates confirmation actions; clients never submit API Key or request IDs."
}
UpdateStorageDestinationRequest
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "expectedVersion"
  ],
  "minProperties": 2,
  "properties": {
    "expectedVersion": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "name": {
      "$ref": "#/components/schemas/StorageDestinationName"
    },
    "provider": {
      "type": "string",
      "enum": [
        "s3",
        "s3_compatible",
        "gcs",
        "azure",
        "bos",
        "oss",
        "tos"
      ]
    },
    "config": {
      "oneOf": [
        {
          "$ref": "#/components/schemas/S3StorageConfig"
        },
        {
          "$ref": "#/components/schemas/S3CompatibleStorageConfig"
        },
        {
          "$ref": "#/components/schemas/GcsStorageConfig"
        },
        {
          "$ref": "#/components/schemas/AzureStorageConfig"
        },
        {
          "$ref": "#/components/schemas/BosStorageConfig"
        },
        {
          "$ref": "#/components/schemas/OssStorageConfig"
        },
        {
          "$ref": "#/components/schemas/TosStorageConfig"
        }
      ]
    },
    "credentials": {
      "writeOnly": true,
      "anyOf": [
        {
          "$ref": "#/components/schemas/AccessKeyStorageCredentials"
        },
        {
          "$ref": "#/components/schemas/StaticAccessKeyStorageCredentials"
        },
        {
          "$ref": "#/components/schemas/GcsStorageCredentials"
        },
        {
          "$ref": "#/components/schemas/AzureStorageCredentials"
        }
      ]
    }
  }
}
UsageEvent
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "id",
    "requestId",
    "jobId",
    "source",
    "mode",
    "status",
    "estimatedMicrocredits",
    "chargedMicrocredits",
    "durationMs",
    "errorCode",
    "createdAt"
  ],
  "properties": {
    "id": {
      "type": "string",
      "pattern": "^use_"
    },
    "requestId": {
      "type": "string",
      "pattern": "^req_"
    },
    "jobId": {
      "type": [
        "string",
        "null"
      ]
    },
    "source": {
      "type": "string"
    },
    "mode": {
      "type": "string",
      "enum": [
        "realtime",
        "async",
        "batch"
      ]
    },
    "status": {
      "type": "string",
      "enum": [
        "accepted",
        "processing",
        "completed",
        "failed",
        "cancelled"
      ]
    },
    "estimatedMicrocredits": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "chargedMicrocredits": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "durationMs": {
      "type": "integer",
      "minimum": 0
    },
    "errorCode": {
      "type": [
        "string",
        "null"
      ]
    },
    "createdAt": {
      "type": "string",
      "format": "date-time"
    }
  }
}
UsageSummary
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "from",
    "to",
    "requestCount",
    "successCount",
    "failedCount",
    "chargedMicrocredits",
    "buckets"
  ],
  "properties": {
    "from": {
      "type": "string",
      "format": "date-time"
    },
    "to": {
      "type": "string",
      "format": "date-time"
    },
    "requestCount": {
      "type": "integer"
    },
    "successCount": {
      "type": "integer"
    },
    "failedCount": {
      "type": "integer"
    },
    "chargedMicrocredits": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "buckets": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/UsageBucket"
      }
    }
  }
}
UsageBucket
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "key",
    "requestCount",
    "chargedMicrocredits"
  ],
  "properties": {
    "key": {
      "type": "string"
    },
    "requestCount": {
      "type": "integer"
    },
    "chargedMicrocredits": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    }
  }
}
WebhookDelivery
{
  "type": "object",
  "description": "One immutable HTTP attempt timeline entry. Outbound requests carry\n`X-FlashData-Event-Id`, `X-FlashData-Event-Type`, `X-FlashData-Delivery-Id`,\n`X-FlashData-Timestamp`, and `X-FlashData-Signature` headers. A pending entry can reach\nexactly one terminal status and cannot be overwritten by a duplicate processor.\n",
  "additionalProperties": false,
  "required": [
    "id",
    "endpointId",
    "eventId",
    "jobId",
    "eventType",
    "attempt",
    "status",
    "responseStatus",
    "nextAttemptAt",
    "createdAt",
    "updatedAt",
    "deliveredAt",
    "durationMs",
    "lastErrorCode"
  ],
  "properties": {
    "id": {
      "type": "string",
      "pattern": "^whd_"
    },
    "endpointId": {
      "type": "string",
      "pattern": "^whe_"
    },
    "eventId": {
      "type": "string",
      "pattern": "^owe_"
    },
    "jobId": {
      "type": [
        "string",
        "null"
      ]
    },
    "eventType": {
      "$ref": "#/components/schemas/WebhookDeliveryEventType"
    },
    "attempt": {
      "type": "integer",
      "minimum": 1,
      "maximum": 1000
    },
    "status": {
      "type": "string",
      "enum": [
        "pending",
        "delivered",
        "failed",
        "dead_letter"
      ]
    },
    "responseStatus": {
      "type": [
        "integer",
        "null"
      ]
    },
    "nextAttemptAt": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    },
    "createdAt": {
      "type": "string",
      "format": "date-time"
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time"
    },
    "deliveredAt": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    },
    "durationMs": {
      "type": [
        "integer",
        "null"
      ],
      "minimum": 0
    },
    "lastErrorCode": {
      "type": [
        "string",
        "null"
      ]
    }
  }
}
WebhookDeliveryDetail
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "delivery",
    "attempts",
    "payloadAvailable"
  ],
  "properties": {
    "delivery": {
      "$ref": "#/components/schemas/WebhookDelivery"
    },
    "attempts": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/WebhookDelivery"
      }
    },
    "payloadAvailable": {
      "type": "boolean"
    }
  }
}
WebhookDeliveryEventType
{
  "type": "string",
  "enum": [
    "job.completed",
    "job.failed",
    "job.cancelled",
    "endpoint.test"
  ]
}
WebhookEndpoint
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "id",
    "url",
    "status",
    "events",
    "secretLast4",
    "failureCount",
    "version",
    "createdAt",
    "updatedAt"
  ],
  "properties": {
    "id": {
      "type": "string",
      "pattern": "^whe_"
    },
    "url": {
      "type": "string",
      "format": "uri"
    },
    "status": {
      "type": "string",
      "enum": [
        "pending",
        "active",
        "disabled"
      ]
    },
    "events": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/OutboundWebhookEventType"
      }
    },
    "secretLast4": {
      "type": "string"
    },
    "failureCount": {
      "type": "integer",
      "minimum": 0
    },
    "version": {
      "type": "integer",
      "minimum": 0
    },
    "createdAt": {
      "type": "string",
      "format": "date-time"
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time"
    }
  }
}
WebhookEndpointCreated
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "id",
    "url",
    "status",
    "events",
    "secretLast4",
    "failureCount",
    "version",
    "createdAt",
    "updatedAt",
    "signingSecret"
  ],
  "properties": {
    "id": {
      "type": "string",
      "pattern": "^whe_"
    },
    "url": {
      "type": "string",
      "format": "uri"
    },
    "status": {
      "type": "string",
      "enum": [
        "pending",
        "active",
        "disabled"
      ]
    },
    "events": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/OutboundWebhookEventType"
      }
    },
    "secretLast4": {
      "type": "string"
    },
    "failureCount": {
      "type": "integer",
      "minimum": 0
    },
    "version": {
      "type": "integer",
      "minimum": 0
    },
    "createdAt": {
      "type": "string",
      "format": "date-time"
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time"
    },
    "signingSecret": {
      "type": "string",
      "readOnly": true,
      "minLength": 32,
      "description": "Plaintext signing secret returned only by this creation transaction. The same authenticated idempotent replay may return it for five minutes.",
      "x-secret-reveal": "once"
    }
  }
}