Feldera Platform API
The Platform API from Feldera — 9 operation(s) for platform.
The Platform API from Feldera — 9 operation(s) for platform.
openapi: 3.0.3
info:
title: Feldera Input Connectors Platform API
description: "\nWith Feldera, users create data pipelines out of SQL programs.\nA SQL program comprises tables and views, and includes as well the definition of\ninput and output connectors for each respectively. A connector defines a data\nsource or data sink to feed input data into tables or receive output data\ncomputed by the views respectively.\n\n## Pipeline\n\nThe API is centered around the **pipeline**, which most importantly consists\nout of the SQL program, but also has accompanying metadata and configuration parameters\n(e.g., compilation profile, number of workers, etc.).\n\n* A pipeline is identified and referred to by its user-provided unique name.\n* The pipeline program is asynchronously compiled when the pipeline is first created or\n when its program is subsequently updated.\n* Pipeline deployment start is only able to proceed to provisioning once the program is successfully\n compiled.\n* A pipeline cannot be updated while it is deployed.\n\n## Concurrency\n\nEach pipeline has a version, which is incremented each time its core fields are updated.\nThe version is monotonically increasing. There is additionally a program version which covers\nonly the program-related core fields, and is used by the compiler to discern when to recompile.\n\n## Client request handling\n\n### Request outcome expectations\n\nThe outcome of a request is that it either fails (e.g., DNS lookup failed) without any response\n(no status code nor body), or it succeeds and gets back a response status code and body.\n\nIn case of a response, usually it is the Feldera endpoint that generated it:\n- If it is success (2xx), it will return whichever body belongs to the success response.\n- Otherwise, if it is an error (4xx, 5xx), it will return a Feldera error response JSON body\n which will have an application-level `error_code`.\n\nHowever, there are two notable exceptions when the response is not generated by the Feldera\nendpoint:\n- If the HTTP server, to which the endpoint belongs, encountered an issue, it might return\n 4xx (e.g., for an unknown endpoint) or 5xx error codes by itself (e.g., when it is initializing).\n- If the Feldera API server is behind a (reverse) proxy, the proxy can return error codes by itself,\n for example BAD GATEWAY (502) or GATEWAY TIMEOUT (504).\n\nAs such, it is not guaranteed that the (4xx, 5xx) will have a Feldera error response JSON body\nin these latter cases.\n\n### Error handling and retrying\n\nThe error type returned by the client should distinguish between the error responses generated\nby Feldera endpoints themselves (which have a Feldera error response body) and those that are\ngenerated by other sources.\n\nIn order for a client operation (e.g., `pipeline.resume()`) to be robust (i.e., not fail due to\na single HTTP request not succeeding) the client should use a retry mechanism if the operation\nis idempotent. The retry mechanism must however have a time limit, after which it times out.\nThis guarantees that the client operation is eventually responsive, which enables the script\nit is a part of to not hang indefinitely on Feldera operations and instead be able to decide\nby itself whether and how to proceed. If no response is returned, the mechanism should generally\nretry. When a response is returned, the decision whether to retry can generally depend on the status\ncode: especially the status codes 408, 502, 503 and 504 should be considered as transient errors.\nFiner grained retry decisions should be made by taking into account the application-level\n`error_code` if the response body was indeed a Feldera error response body.\n\n## Feldera client errors (4xx)\n\n_Client behavior:_ clients should generally return with an error when they get back a 4xx status\ncode, as it usually means the request will likely not succeed even if it is sent again. Certain\nrequests might make use of a timed retry mechanism when the client error is transient without\nrequiring any user intervention to overcome, for instance a transaction already being in progress\nleading to a temporary CONFLICT (409) error.\n\n- **BAD REQUEST (400)**: invalid user request (general).\n - _Example:_ the new pipeline name `example1@~` contains invalid characters.\n\n- **UNAUTHORIZED (401)**: the user is not authorized to issue the request.\n - _Example:_ an invalid API key is provided.\n\n- **NOT FOUND (404)**: a resource required to exist in order to process the request was not found.\n - _Example:_ a pipeline named `example` does not exist when trying to update it.\n\n- **CONFLICT (409)**: there is a conflict between the request and a relevant resource.\n - _Example:_ a pipeline named `example` already exists.\n - _Example:_ another transaction is already in process.\n\n## Feldera server errors (5xx)\n\n- **INTERNAL SERVER ERROR (500)**: the server is unexpectedly unable to process the request\n (general).\n - _Example:_ unable to reach the database.\n - _Client behavior:_ immediately return with an error.\n\n- **NOT IMPLEMENTED (501)**: the server does not implement functionality required to process the\n request.\n - _Example:_ making a request to an enterprise-only endpoint in the OSS edition.\n - _Client behavior:_ immediately return with an error.\n\n- **SERVICE UNAVAILABLE (503)**: the server is not (yet) able to process the request.\n - _Example:_ pausing a pipeline which is still provisioning.\n - _Client behavior:_ depending on the type of request, client may use a timed retry mechanism.\n\n## Feldera error response body\n\nWhen the Feldera API returns an HTTP error status code (4xx, 5xx), the body will contain the\nfollowing JSON object:\n\n```json\n{\n \"message\": \"Human-readable explanation.\",\n \"error_code\": \"CodeSpecifyingError\",\n \"details\": {\n\n }\n}\n```\n\nIt contains the following fields:\n- **message (string)**: human-readable explanation of the error that occurred and potentially\n hinting what can be done about it.\n- **error_code (string)**: application-level code about the error that occurred, written in CamelCase.\n For example: `UnknownPipelineName`, `DuplicateName`, `PauseWhileNotProvisioned`, ... .\n- **details (object)**: JSON object corresponding to the `error_code` with fields that provide\n details relevant to it. For example: if a name is unknown, a field with the unknown name in\n question.\n"
contact:
name: Feldera Team
email: dev@feldera.com
license:
name: MIT OR Apache-2.0
version: 0.323.0
tags:
- name: Platform
paths:
/config/authentication:
get:
tags:
- Platform
summary: Get Auth Config
description: Retrieve the authentication provider configuration.
operationId: get_config_authentication
responses:
'200':
description: The response body contains Authentication Provider configuration, or is empty if no auth is configured.
content:
application/json:
schema:
$ref: '#/components/schemas/AuthProvider'
'500':
description: Request failed.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
/v0/api_keys:
get:
tags:
- Platform
summary: List API Keys
description: Retrieve a list of your API keys.
operationId: list_api_keys
responses:
'200':
description: API keys retrieved successfully
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/ApiKeyDescr'
'500':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
security:
- JSON web token (JWT) or API key: []
post:
tags:
- Platform
summary: Create API Key
description: 'Create a new API key with the specified name. The generated API key
will be returned in the response and cannot be retrieved again later.'
operationId: post_api_key
requestBody:
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/NewApiKeyRequest'
required: true
responses:
'201':
description: API key created successfully
content:
application/json:
schema:
$ref: '#/components/schemas/NewApiKeyResponse'
'409':
description: API key with that name already exists
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
message: An entity with this name already exists
error_code: DuplicateName
details: null
security:
- JSON web token (JWT) or API key: []
/v0/api_keys/{api_key_name}:
get:
tags:
- Platform
summary: Get API Key
description: Retrieve the metadata of a specific API key by its name.
operationId: get_api_key
parameters:
- name: api_key_name
in: path
description: Unique API key name
required: true
schema:
type: string
responses:
'200':
description: API key retrieved successfully
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/ApiKeyDescr'
'404':
description: API key with that name does not exist
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
message: Unknown API key 'non-existent-api-key'
error_code: UnknownApiKey
details:
name: non-existent-api-key
security:
- JSON web token (JWT) or API key: []
delete:
tags:
- Platform
summary: Delete API Key
description: Remove an API key by its name.
operationId: delete_api_key
parameters:
- name: api_key_name
in: path
description: Unique API key name
required: true
schema:
type: string
responses:
'200':
description: API key deleted successfully
'404':
description: API key with that name does not exist
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
message: Unknown API key 'non-existent-api-key'
error_code: UnknownApiKey
details:
name: non-existent-api-key
security:
- JSON web token (JWT) or API key: []
/v0/cluster/events:
get:
tags:
- Platform
summary: List Cluster Events
description: 'Retrieve a list of retained cluster monitor events ordered from most recent to least recent.
The returned events only have limited details, the full details can be retrieved using
the `GET /v0/cluster/events/<event-id>` endpoint.
Cluster monitor events are collected at a periodic interval (every 10s), however only
every 10 minutes or if the overall health changes, does it get inserted into the database
(and thus, served by this endpoint). At most 1000 events are retained (newest first),
and events older than 72h are deleted. The latest event, if it already exists, is never
cleaned up.'
operationId: list_cluster_events
responses:
'200':
description: ''
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/ClusterMonitorEventSelectedInfo'
'500':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'501':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
security:
- JSON web token (JWT) or API key: []
/v0/cluster/events/{event_id}:
get:
tags:
- Platform
summary: Get Cluster Event
description: 'Get specific cluster monitor event.
The identifiers of the events can be retrieved via `GET /v0/cluster/events`.
At most 1000 events are retained (newest first), and events older than 72h are deleted.
The latest event, if it already exists, is never cleaned up.
This endpoint can return a 404 for an event that no longer exists due to clean-up.'
operationId: get_cluster_event
parameters:
- name: event_id
in: path
description: Cluster monitor event identifier or `latest`
required: true
schema:
type: string
- name: selector
in: query
description: 'The `selector` parameter limits which fields are returned.
Limiting which fields is particularly handy for instance when frequently
monitoring over low bandwidth connections while being only interested
in status.'
required: false
schema:
$ref: '#/components/schemas/ClusterMonitorEventFieldSelector'
responses:
'200':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/ClusterMonitorEventSelectedInfo'
'404':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'501':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
security:
- JSON web token (JWT) or API key: []
/v0/cluster_healthz:
get:
tags:
- Platform
summary: Check Cluster Health
description: Determine the latest cluster health via the latest cluster monitor event.
operationId: get_cluster_health
responses:
'200':
description: All services healthy
content:
application/json:
schema:
$ref: '#/components/schemas/HealthStatus'
'503':
description: One or more services unhealthy
content:
application/json:
schema:
$ref: '#/components/schemas/HealthStatus'
security:
- JSON web token (JWT) or API key: []
/v0/config:
get:
tags:
- Platform
summary: Get Platform Config
description: Retrieve configuration of the Feldera Platform.
operationId: get_config
responses:
'200':
description: The response body contains basic configuration information about this host.
content:
application/json:
schema:
$ref: '#/components/schemas/Configuration'
'500':
description: Request failed.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
security:
- JSON web token (JWT) or API key: []
/v0/config/demos:
get:
tags:
- Platform
summary: List Demos
description: Retrieve the list of demos available in the WebConsole.
operationId: get_config_demos
responses:
'200':
description: List of demos
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Demo'
'500':
description: Failed to read demos from the demos directories
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
security:
- JSON web token (JWT) or API key: []
/v0/config/session:
get:
tags:
- Platform
summary: Get Session
description: Retrieve login session information for your current user session.
operationId: get_config_session
responses:
'200':
description: The response body contains current session information including tenant details.
content:
application/json:
schema:
$ref: '#/components/schemas/SessionInfo'
'500':
description: Request failed.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
security:
- JSON web token (JWT) or API key: []
components:
schemas:
ClusterMonitorEventFieldSelector:
type: string
enum:
- all
- status
SessionInfo:
type: object
required:
- tenant_id
- tenant_name
properties:
tenant_id:
$ref: '#/components/schemas/TenantId'
tenant_name:
type: string
description: Current user's tenant name
ServiceStatus:
type: object
required:
- healthy
- message
- unchanged_since
- checked_at
properties:
checked_at:
type: string
format: date-time
healthy:
type: boolean
message:
type: string
unchanged_since:
type: string
format: date-time
ClusterMonitorEventSelectedInfo:
type: object
description: 'Cluster monitor event information which has a selected subset of optional fields.
If an optional field is not selected (i.e., is `None`), it will not be serialized.'
required:
- id
- recorded_at
- all_healthy
- api_status
- compiler_status
- runner_status
properties:
all_healthy:
type: boolean
api_resources_info:
type: string
nullable: true
api_self_info:
type: string
nullable: true
api_status:
$ref: '#/components/schemas/MonitorStatus'
compiler_resources_info:
type: string
nullable: true
compiler_self_info:
type: string
nullable: true
compiler_status:
$ref: '#/components/schemas/MonitorStatus'
id:
$ref: '#/components/schemas/ClusterMonitorEventId'
recorded_at:
type: string
format: date-time
runner_resources_info:
type: string
nullable: true
runner_self_info:
type: string
nullable: true
runner_status:
$ref: '#/components/schemas/MonitorStatus'
HealthStatus:
type: object
required:
- all_healthy
- api
- compiler
- runner
properties:
all_healthy:
type: boolean
api:
$ref: '#/components/schemas/ServiceStatus'
compiler:
$ref: '#/components/schemas/ServiceStatus'
runner:
$ref: '#/components/schemas/ServiceStatus'
BuildInformation:
type: object
description: Information about the build of the platform.
required:
- build_timestamp
- build_cpu
- build_os
- cargo_dependencies
- cargo_features
- cargo_debug
- cargo_opt_level
- cargo_target_triple
- rustc_version
properties:
build_cpu:
type: string
description: CPU of build machine.
build_os:
type: string
description: OS of build machine.
build_timestamp:
type: string
description: Timestamp of the build.
cargo_debug:
type: string
description: Whether the build is optimized for performance.
cargo_dependencies:
type: string
description: Dependencies used during the build.
cargo_features:
type: string
description: Features enabled during the build.
cargo_opt_level:
type: string
description: Optimization level of the build.
cargo_target_triple:
type: string
description: Target triple of the build.
rustc_version:
type: string
description: Rust version of the build used.
AuthProvider:
oneOf:
- type: object
required:
- AwsCognito
properties:
AwsCognito:
$ref: '#/components/schemas/ProviderAwsCognito'
- type: object
required:
- GenericOidc
properties:
GenericOidc:
$ref: '#/components/schemas/ProviderGenericOidc'
ApiKeyDescr:
type: object
description: API key descriptor.
required:
- id
- name
- scopes
properties:
id:
$ref: '#/components/schemas/ApiKeyId'
name:
type: string
scopes:
type: array
items:
$ref: '#/components/schemas/ApiPermission'
ErrorResponse:
type: object
description: Information returned by REST API endpoints on error.
required:
- message
- error_code
- details
properties:
details:
description: 'Detailed error metadata.
The contents of this field is determined by `error_code`.'
error_code:
type: string
description: Error code is a string that specifies this error type.
example: CodeSpecifyingErrorType
message:
type: string
description: Human-readable error message.
example: Explanation of the error that occurred.
TenantId:
type: string
format: uuid
ApiKeyId:
type: string
format: uuid
description: API key identifier.
MonitorStatus:
type: string
enum:
- InitialUnhealthy
- Unhealthy
- Healthy
Configuration:
type: object
required:
- telemetry
- edition
- version
- revision
- runtime_revision
- changelog_url
- build_info
- build_source
properties:
build_info:
$ref: '#/components/schemas/BuildInformation'
build_source:
type: string
description: 'Build source: "ci" for GitHub Actions builds, "source" for local builds'
changelog_url:
type: string
description: URL that navigates to the changelog of the current version
edition:
type: string
description: 'Feldera edition: "Open source" or "Enterprise"'
license_validity:
allOf:
- $ref: '#/components/schemas/LicenseValidity'
nullable: true
revision:
type: string
description: Specific revision corresponding to the edition `version` (e.g., git commit hash).
runtime_revision:
type: string
description: Specific revision corresponding to the default runtime version of the platform (e.g., git commit hash).
telemetry:
type: string
description: Telemetry key.
unstable_features:
type: string
description: List of unstable features that are enabled.
nullable: true
update_info:
allOf:
- $ref: '#/components/schemas/UpdateInformation'
nullable: true
version:
type: string
description: 'The version corresponding to the type of `edition`.
Format is `x.y.z`.'
NewApiKeyResponse:
type: object
description: Response to a successful API key creation.
required:
- id
- name
- api_key
properties:
api_key:
type: string
description: 'Generated secret API key. There is no way to retrieve this
key again through the API, so store it securely.'
example: apikey:v5y5QNtlPNVMwkmNjKwFU8bbIu5lMge3yHbyddxAOdXlEo84SEoNn32DUhQaf1KLeI9aOOfnJjhQ1pYzMrU4wQXON6pm6BS7Zgzj46U2b8pwz1280vYBEtx41hiDBRP
id:
$ref: '#/components/schemas/ApiKeyId'
name:
type: string
description: API key name provided by the user.
example: my-api-key
ClusterMonitorEventId:
type: string
format: uuid
description: Cluster monitor event identifier.
Demo:
type: object
required:
- name
- title
- description
- program_code
- udf_rust
- udf_toml
properties:
description:
type: string
description: Description of the demo (parsed from SQL preamble).
name:
type: string
description: Name of the demo (parsed from SQL preamble).
program_code:
type: string
description: Program SQL code.
title:
type: string
description: Title of the demo (parsed from SQL preamble).
udf_rust:
type: string
description: User defined function (UDF) Rust code.
udf_toml:
type: string
description: User defined function (UDF) TOML dependencies.
ProviderAwsCognito:
type: object
required:
- issuer
- login_url
- logout_url
properties:
issuer:
type: string
login_url:
type: string
logout_url:
type: string
LicenseValidity:
oneOf:
- type: object
required:
- Exists
properties:
Exists:
$ref: '#/components/schemas/LicenseInformation'
- type: object
required:
- DoesNotExistOrNotConfirmed
properties:
DoesNotExistOrNotConfirmed:
type: string
description: 'Either the license key is invalid according to the server, or the request that checks with
the server failed (e.g., if it could not reach the server).'
ApiPermission:
type: string
description: Permission types for invoking API endpoints.
enum:
- Read
- Write
ProviderGenericOidc:
type: object
required:
- issuer
- client_id
- extra_oidc_scopes
properties:
client_id:
type: string
extra_oidc_scopes:
type: array
items:
type: string
issuer:
type: string
UpdateInformation:
type: object
required:
- latest_version
- is_latest_version
- instructions_url
- remind_schedule
properties:
instructions_url:
type: string
description: URL that navigates the user to instructions on how to update their deployment's version
is_latest_version:
type: boolean
description: Whether the current version matches the latest version
latest_version:
type: string
description: Latest version corresponding to the edition
remind_schedule:
$ref: '#/components/schemas/DisplaySchedule'
NewApiKeyRequest:
type: object
description: Request to create a new API key.
required:
- name
properties:
name:
type: string
description: Key name.
example: my-api-key
DisplaySchedule:
oneOf:
- type: string
description: 'Display it only once: after dismissal do not show it again'
enum:
- Once
- type: string
description: Display it again the next session if it is dismissed
enum:
- Session
- type: object
required:
- Every
properties:
Every:
type: object
description: Display it again after a certain period of time after it is dismissed
required:
- seconds
properties:
seconds:
type: integer
format: int64
minimum: 0
- type: string
description: Always display it, do not allow it to be dismissed
enum:
- Always
LicenseInformation:
type: object
required:
- current
- is_trial
- description_html
- remind_schedule
properties:
current:
type: string
format: date-time
description: Timestamp when the server responded.
description_html:
type: string
description: Optional description of the advantages of extending the license / upgrading from a trial
extension_url:
type: string
description: URL that navigates the user to extend / upgrade their license
nullable: true
is_trial:
type: boolean
description: Whether the license is a trial
remind_schedule:
$ref: '#/components/schemas/DisplaySchedule'
remind_starting_at:
type: string
format: date-time
description: Timestamp from which the user should be reminded of the license expiring soon
nullable: true
valid_until:
type: string
format: date-time
description: Timestamp at which point the license expires
nullable: true
securitySchemes:
JSON web token (JWT) or API key:
type: http
scheme: bearer
bearerFormat: JWT
description: "Use a JWT token obtained via an OAuth2/OIDC\n login workflow or an API key obtained via\n the `/v0/api-keys` endpoint."