Skip to Content
dFlow

dFlow API

Process is up

GET
/healthz

Response Body

Process is up. This check does not touch a database.

application/json
  1. response
status*string
Example Request
curl -X GET 'https://k8s.dflow.sh/healthz'
Example Response200
{  "status": "ok"}

Process can serve work

GET
/readyz

Response Body

Registered checks passed.

application/json
  1. response
status*string
Example Request
curl -X GET 'https://k8s.dflow.sh/readyz'
Example Response
{  "status": "ready"}

Build version

GET
/v1/version

Response Body

Build version and API version.

application/json
  1. response
version*string
api_version*string
Example Request
curl -X GET 'https://k8s.dflow.sh/v1/version'
Example Response200
{  "version": "dev",  "api_version": "v1"}
GET
/v1/whoami

Response Body

Token id, display prefix, role, scope, and workspace id. A user session also includes user_id, email, and credential_kind user. An API token includes credential_kind api_token and omits user_id and email. The bearer secret is absent.

application/json
  1. response
Example Request
curl -X GET 'https://k8s.dflow.sh/v1/whoami'
Example Response200
{}
POST
/v1/auth/register

Response Body

User created. A token pair is included when email verification is off, and workspace_id is that user's personal workspace. When verification is on, delivery is log or smtp, the verify token is not in this response, and the personal workspace is created at the first successful login.

Example Request
curl -X POST 'https://k8s.dflow.sh/v1/auth/register'
Example Response
Empty
POST
/v1/auth/verify

Response Body

The address is verified.

Example Request
curl -X POST 'https://k8s.dflow.sh/v1/auth/verify'
Example Response200
Empty
POST
/v1/auth/login

Response Body

Access token and refresh token.

Example Request
curl -X POST 'https://k8s.dflow.sh/v1/auth/login'
Example Response
Empty

Rotate a refresh token

POST
/v1/auth/refresh

Response Body

A new access token and refresh token.

Example Request
curl -X POST 'https://k8s.dflow.sh/v1/auth/refresh'
Example Response200
Empty
POST
/v1/auth/logout

Response Body

The session is revoked.

Example Request
curl -X POST 'https://k8s.dflow.sh/v1/auth/logout'
Example Response200
Empty

Request a password reset

POST
/v1/auth/forgot

Response Body

Accepted. delivery is log or smtp. The response does not say whether the email exists and does not include the reset token.

Example Request
curl -X POST 'https://k8s.dflow.sh/v1/auth/forgot'
Example Response
Empty
POST
/v1/auth/reset

Response Body

The password was replaced.

Example Request
curl -X POST 'https://k8s.dflow.sh/v1/auth/reset'
Example Response
Empty
POST
/v1/auth/workspace

Response Body

A token pair for that membership.

Example Request
curl -X POST 'https://k8s.dflow.sh/v1/auth/workspace'
Example Response200
Empty
POST
/v1/auth/invites/accept

Response Body

The user is a member.

Example Request
curl -X POST 'https://k8s.dflow.sh/v1/auth/invites/accept'
Example Response200
Empty
POST
/v1/workspaces/{workspace_id}/invites

Response Body

The invite token is shown once. delivery is log or smtp when a copy was also sent. A personal workspace returns precondition.

Example Request
curl -X POST 'https://k8s.dflow.sh/v1/workspaces/{workspace_id}/invites'
Example Response201
Empty
GET
/v1/workspaces

A verified user receives every workspace they belong to, including the personal one, even when the session is inside one workspace. An API token receives only its workspace. A platform owner receives a page of every workspace. Any verified user can create another workspace. An API token cannot. An invite into the personal workspace is rejected.

Response Body

Items of id and name. next is null when the page is complete.

Example Request
curl -X GET 'https://k8s.dflow.sh/v1/workspaces'
Example Response200
Empty

Create a workspace

POST
/v1/workspaces

Response Body

Workspace created. personal is false. Any verified user becomes the owner. An API token cannot create a workspace. The platform owner is forbidden. The personal workspace from signup stays private and cannot accept invites.

Example Request
curl -X POST 'https://k8s.dflow.sh/v1/workspaces'
Example Response
Empty

Read a workspace

GET
/v1/workspaces/{workspace_id}

Response Body

The workspace.

Example Request
curl -X GET 'https://k8s.dflow.sh/v1/workspaces/{workspace_id}'
Example Response
Empty
GET
/v1/workspaces/{workspace_id}/github-token

Response Body

stored is true or false. The token is absent.

Example Request
curl -X GET 'https://k8s.dflow.sh/v1/workspaces/{workspace_id}/github-token'
Example Response200
Empty
PUT
/v1/workspaces/{workspace_id}/github-token

The token is encrypted and is not returned. A later GET reports stored true or false. A workspace owner or admin stores it. The platform owner is forbidden. An empty DFLOW_DATA_KEY returns HTTP 412. The token is not placed in a clone URL.

Response Body

stored is true. The token is absent.

Example Request
curl -X PUT 'https://k8s.dflow.sh/v1/workspaces/{workspace_id}/github-token'
Example Response
Empty
GET
/v1/workspaces/{workspace_id}/projects

Response Body

Project items. next is null when the page is complete.

Example Request
curl -X GET 'https://k8s.dflow.sh/v1/workspaces/{workspace_id}/projects'
Example Response200
Empty

Create a project

POST
/v1/workspaces/{workspace_id}/projects

The workspace id is in the path. A repeated Idempotency-Key with the same name returns HTTP 200. A different name with that key returns 409. A missing key still creates the project.

Response Body

The project row. No namespace is created.

Example Request
curl -X POST 'https://k8s.dflow.sh/v1/workspaces/{workspace_id}/projects'
Example Response
Empty
GET
/v1/projects/{project_id}/environments

Deleted environments are omitted. This route does not read Kubernetes.

Response Body

Environment items.

Example Request
curl -X GET 'https://k8s.dflow.sh/v1/projects/{project_id}/environments'
Example Response200
Empty

Create an environment

POST
/v1/projects/{project_id}/environments

Stores a namespace name and does not create that namespace in Kubernetes. namespace_created is false. Optional region, such as in or us, selects one cluster in that region. The application and its database stay on that cluster. An omitted region uses the single workspace cluster, or the hosted cluster when the workspace has none. When no cluster is registered, the environment is stored and a later deploy asks for one. The stored cluster_id is not changed later.

Response Body

The environment row.

Example Request
curl -X POST 'https://k8s.dflow.sh/v1/projects/{project_id}/environments'
Example Response201
Empty
DELETE
/v1/environments/{env_id}

Returns HTTP 202 and a pending environment.delete operation when no application row exists. Returns HTTP 412 when an application still exists. A second delete while the environment is deleting returns the same operation. This route does not delete a Kubernetes namespace.

Response Body

The delete operation was accepted.

Example Request
curl -X DELETE 'https://k8s.dflow.sh/v1/environments/{env_id}'
Example Response
Empty
GET
/v1/environments/{env_id}/applications

Deleted applications are omitted. desired is the latest deployment. observed is the last worker snapshot, or null.

Response Body

Application items. next is null when the page is complete.

Example Request
curl -X GET 'https://k8s.dflow.sh/v1/environments/{env_id}/applications'
Example Response200
Empty

Create an application

POST
/v1/environments/{env_id}/applications

The environment must be active. A viewer cannot create one. The platform owner cannot create one. No Kubernetes object is created.

Response Body

The application. desired and observed are null.

Example Request
curl -X POST 'https://k8s.dflow.sh/v1/environments/{env_id}/applications'
Example Response
Empty
GET
/v1/providers

Requires a bearer token. Returns product capability, not tenant data. The registered provider is postgresql, with capabilities provision, status, and deprovision.

Response Body

Provider name and capability list for each registered provider.

application/json
  1. response
items*array<>
Example Request
curl -X GET 'https://k8s.dflow.sh/v1/providers'
Example Response
{  "items": [    {      "name": "postgresql",      "capabilities": [        "provision",        "status",        "deprovision"      ]    }  ]}
GET
/v1/environments/{env_id}/services

Deleted instances are omitted. Requires workspace membership.

Response Body

Service instance items.

Example Request
curl -X GET 'https://k8s.dflow.sh/v1/environments/{env_id}/services'
Example Response200
Empty
POST
/v1/environments/{env_id}/services

Validates parameters, inserts a pending service_instances row, and returns a pending service.provision operation. Provider postgresql accepts parameters database, storage, and optional version. version is 16, 17, or 18. Any other value returns 400 and creates no instance. Omitting version leaves the cluster image unset. application_id, when set, records the new service on that application's dflow.json before the database is ready. A missing provider capability returns 412 and creates no operation. An unknown provider name returns 404.

Request Body

application/json
  1. body
provider*string
name*string
capability*string
parameters?
application_id?string

Application whose stored dflow.json should name this service.

Response Body

Accepted. The worker will call the provider.

Example Request
curl -X POST 'https://k8s.dflow.sh/v1/environments/{env_id}/services' \  -H 'Content-Type: application/json' \  -d '{  "provider": "fake",  "name": "demo",  "capability": "provision",  "parameters": {}}'
Example Response
Empty
GET
/v1/services/{svc_id}

Returns desired and observed JSON without secret values.

Response Body

The service instance.

Example Request
curl -X GET 'https://k8s.dflow.sh/v1/services/{svc_id}'
Example Response
Empty
DELETE
/v1/services/{svc_id}

Requires header Confirm-Name equal to the service name. Returns HTTP 202 and a pending service.deprovision operation. Data is deleted without a backup.

Header Parameters

Confirm-Name*string

Response Body

Accepted.

Example Request
curl -X DELETE 'https://k8s.dflow.sh/v1/services/{svc_id}' \  -H 'Confirm-Name: string'
Example Response
Empty
POST
/v1/services/{svc_id}/credentials

After the service is ready, the first call returns host, port, database, username, and password and writes an audit event. A second call returns 412 credentials_already_read and does not return the password. The runtime Kubernetes Secret is unchanged.

Response Body

One-time credential payload.

application/json
  1. response
host*string
port*string
database*string
username*string
password*string
Example Request
curl -X POST 'https://k8s.dflow.sh/v1/services/{svc_id}/credentials'
Example Response
{  "host": "string",  "port": "string",  "database": "string",  "username": "string",  "password": "string"}
POST
/v1/applications/{app_id}/service-bindings

Writes DFLOW_DATABASE_HOST, PORT, NAME, and USERNAME as env and DFLOW_DATABASE_PASSWORD as a secret, then queues application.deploy. Fails with 409 if any of those keys already exist.

Request Body

application/json
  1. body
service_id*string

Response Body

Accepted deploy operation.

Example Request
curl -X POST 'https://k8s.dflow.sh/v1/applications/{app_id}/service-bindings' \  -H 'Content-Type: application/json' \  -d '{  "service_id": "string"}'
Example Response
Empty

Read one application

GET
/v1/applications/{app_id}

Returns the desired image, port, and replica count together with the last observed status. This route reads PostgreSQL only.

Response Body

The application.

Example Request
curl -X GET 'https://k8s.dflow.sh/v1/applications/{app_id}'
Example Response200
Empty

Delete an application

DELETE
/v1/applications/{app_id}

Requires header Confirm-Name equal to the application name. Returns HTTP 202 and a pending application.delete operation. With no stored cluster credential the worker marks the application deleted without calling Kubernetes. The desired image row is kept. When the application is already deleting, send Force: true (or force=1) to re-queue delete.

Header Parameters

Confirm-Name*string
Force?"true"

Re-queue delete when status is already deleting.

Value in"true"

Response Body

The delete operation was accepted.

Example Request
curl -X DELETE 'https://k8s.dflow.sh/v1/applications/{app_id}' \  -H 'Confirm-Name: string'
Example Response
Empty

Request an image deploy

POST
/v1/applications/{app_id}/deployments

image is required. port defaults to 8080. replicas defaults to 1 and cannot exceed 5. The image must match letters, digits, and . _ / : @ + -, up to 512 characters. HTTP 202 means the operation was recorded. It does not mean the workload is ready. Until a cluster credential is stored, the worker fails the operation with cluster credential is not stored and creates no object. A repeated Idempotency-Key with the same image, port, and replicas returns that operation. A different body returns 409. A missing key still creates the deployment. GET observed, once a worker has written it, contains conditions Progressing, Available, and Degraded.

Response Body

A pending application.deploy operation.

Example Request
curl -X POST 'https://k8s.dflow.sh/v1/applications/{app_id}/deployments'
Example Response
Empty
POST
/v1/applications/{app_id}/builds

repo is an https github.com URL with no token in the URL. Omit repo to clone build.repo from the application's stored dflow.json. An explicit repo is the clone URL. A dflow.json in that repository still supplies the other settings. A template install clones build.repo, branch, and root from the submitted document and does not replace that document with a file from the repository. A public repository needs no token. A private repository uses the stored workspace token and returns HTTP 412 when that token is missing. The clone URL stays free of the token. The server clones it, builds it with Railpack, pushes the image to DFLOW_REGISTRY, and deploys that image. HTTP 202 is the build operation. An empty registry is HTTP 412. A failed build returns the build log on the operation. The message says whether the failure is in the repository or in the builder. dFlow does not open a GitHub pull request.

Response Body

A pending application.build operation.

Example Request
curl -X POST 'https://k8s.dflow.sh/v1/applications/{app_id}/builds'
Example Response
Empty
GET
/v1/applications/{app_id}/releases

Each item has id, revision, image_digest, status, and current. current is true when that succeeded release is the desired image. An application in another workspace returns HTTP 404.

Response Body

The release list. items is empty when the application has no release.

Example Request
curl -X GET 'https://k8s.dflow.sh/v1/applications/{app_id}/releases'
Example Response200
Empty
POST
/v1/applications/{app_id}/rollbacks

Body is {"release_id":"rel_..."}. The response is HTTP 202 and an application.deploy operation. The image is that release's digest. Rollback does not start a build. An unknown release, or a release for another application, returns HTTP 404. A release that is not succeeded returns HTTP 412. The release that is already the desired image returns HTTP 409 and error code conflict, message already current.

Response Body

A pending application.deploy operation.

Example Request
curl -X POST 'https://k8s.dflow.sh/v1/applications/{app_id}/rollbacks'
Example Response
Empty
GET
/v1/applications/{app_id}/volumes
Example Request
curl -X GET 'https://k8s.dflow.sh/v1/applications/{app_id}/volumes'
POST
/v1/applications/{app_id}/volumes

Requires Idempotency-Key. size_gi is 1 through 10. storage_class must be on the cluster capability report. mount_path is an absolute directory. One volume per application. HTTP 202 is not Bound. The operation succeeds when the claim phase is Bound. Delete removes the disk.

Example Request
curl -X POST 'https://k8s.dflow.sh/v1/applications/{app_id}/volumes'
POST
/v1/volumes/{volume_id}/delete

Body confirm_name must equal the stored name. Requires Idempotency-Key. Data is deleted.

Example Request
curl -X POST 'https://k8s.dflow.sh/v1/volumes/{volume_id}/delete'
GET
/v1/applications/{app_id}/jobs
Example Request
curl -X GET 'https://k8s.dflow.sh/v1/applications/{app_id}/jobs'

Run or schedule a job

POST
/v1/applications/{app_id}/jobs

Requires Idempotency-Key. image is required. schedule of five cron fields creates a CronJob. Omitting schedule creates a Job. privileged, host_path, host_network, host_pid, host_ipc, and security_context are rejected. The platform sets the security context.

Example Request
curl -X POST 'https://k8s.dflow.sh/v1/applications/{app_id}/jobs'
POST
/v1/jobs/{job_id}/delete

Body confirm_name must equal the stored name. Requires Idempotency-Key.

Example Request
curl -X POST 'https://k8s.dflow.sh/v1/jobs/{job_id}/delete'

List official templates

GET
/v1/templates

Returns the recipes in templates/*/dflow.json. supabase is not listed. examples/ is not listed.

Example Request
curl -X GET 'https://k8s.dflow.sh/v1/templates'

Install a template

POST
/v1/environments/{env_id}/template-installs

Body {"name":"umami"} installs an official recipe. A dflow.json document, with applications and services, installs that document. Requires Idempotency-Key. HTTP 202 starts the install. The same template can be installed again in one environment. The application and database service keep the recipe names when those names are free. When either name is taken, both gain the same four-character suffix a route adds to a taken hostname. The operation succeeds only when the public URL returns HTTP 200. One-time secrets are read from GET /v1/template-installs/{install_id} once.

Example Request
curl -X POST 'https://k8s.dflow.sh/v1/environments/{env_id}/template-installs'

Read a template install

GET
/v1/template-installs/{install_id}

Returns the public URL. Secrets are included once and then cleared.

Example Request
curl -X GET 'https://k8s.dflow.sh/v1/template-installs/{install_id}'

List config file paths

GET
/v1/applications/{app_id}/files
Example Request
curl -X GET 'https://k8s.dflow.sh/v1/applications/{app_id}/files'

Store one config file

PUT
/v1/applications/{app_id}/files

Body path and contents. path is absolute and is not /. Contents are not returned later. Requires a deployment.

Example Request
curl -X PUT 'https://k8s.dflow.sh/v1/applications/{app_id}/files'

List tokens

GET
/v1/workspaces/{workspace_id}/tokens

Response Body

Token ids, prefixes, roles, and timestamps. The bearer secret is absent.

Example Request
curl -X GET 'https://k8s.dflow.sh/v1/workspaces/{workspace_id}/tokens'
Example Response200
Empty

Create a token

POST
/v1/workspaces/{workspace_id}/tokens

Response Body

The token secret is included once.

Example Request
curl -X POST 'https://k8s.dflow.sh/v1/workspaces/{workspace_id}/tokens'
Example Response201
Empty
POST
/v1/workspaces/{workspace_id}/clusters

The response is HTTP 200 because the check finishes inside the request. When DFLOW_KUBECONFIG_KEY is set, a successful check stores an AES-256-GCM blob and the operation status is succeeded. When that variable is empty, status failed with error_code precondition means the report was saved and the credential was not stored. The response has no kubeconfig and no ciphertext. The body requires region, a short name such as in or us. This cluster stays on that workspace. A body with shared true is rejected. A platform cluster is POST /v1/admin/clusters and has no workspace. A missing Idempotency-Key creates no row.

Header Parameters

Idempotency-Key*string

Response Body

The operation already finished. This is not a stored credential.

Example Request
curl -X POST 'https://k8s.dflow.sh/v1/workspaces/{workspace_id}/clusters' \  -H 'Idempotency-Key: string'
Example Response
Empty
GET
/v1/workspaces/{workspace_id}/clusters/{cluster_id}

Response Body

The cluster row. credential_state is not_persisted or stored. The response has no kubeconfig and no ciphertext.

Example Request
curl -X GET 'https://k8s.dflow.sh/v1/workspaces/{workspace_id}/clusters/{cluster_id}'
Example Response
Empty
GET
/v1/admin/clusters

Platform owner only. Each item has id, name, provider, and credential_state. workspace_id is present for a private cluster. A platform cluster has no workspace. The response has no kubeconfig.

Response Body

Items ordered by id. An empty list is an empty items array.

Example Request
curl -X GET 'https://k8s.dflow.sh/v1/admin/clusters'
Example Response
Empty
POST
/v1/admin/clusters

Platform owner only. The cluster has a region and no workspace. Every workspace can place an environment on it. The response is HTTP 200 because the check finishes inside the request. The response has no kubeconfig. A missing Idempotency-Key creates no row.

Header Parameters

Idempotency-Key*string

Response Body

The operation already finished.

Example Request
curl -X POST 'https://k8s.dflow.sh/v1/admin/clusters' \  -H 'Idempotency-Key: string'
Example Response
Empty
GET
/v1/admin/operations

Platform owner only. Each item has id, type, status, and workspace_id. message is present when the operation failed. page_size defaults to 50 and cannot exceed 200. There is no next page.

Response Body

The newest operations, newest first.

Example Request
curl -X GET 'https://k8s.dflow.sh/v1/admin/operations'
Example Response
Empty
GET
/v1/admin/backups

Platform owner only. recovery_point and recovery_time are the word assumption. They are not a commitment. objective_met is false when no successful run finished inside 24 hours. The response has no database URL and no platform key.

Response Body

The newest backup runs.

Example Request
curl -X GET 'https://k8s.dflow.sh/v1/admin/backups'
Example Response
Empty
POST
/v1/admin/backups

Requires Idempotency-Key. HTTP 202 means the dump was queued. It does not mean the dump finished. An empty DFLOW_BACKUP_DIR or a directory on the database volume returns 412 and writes no file.

Response Body

operation_id and status pending.

Example Request
curl -X POST 'https://k8s.dflow.sh/v1/admin/backups'
Example Response
Empty

Read one operation

GET
/v1/operations/{operation_id}

HTTP 200 includes a failed operation. The body has no idempotency key and no credential.

Response Body

The operation. status failed is still HTTP 200.

Example Request
curl -X GET 'https://k8s.dflow.sh/v1/operations/{operation_id}'
Example Response
Empty

Cancel one operation

POST
/v1/operations/{operation_id}/cancel

A pending operation becomes cancelled. A running operation stays running until the handler stops. A finished operation is unchanged.

Response Body

The operation was pending or running.

Example Request
curl -X POST 'https://k8s.dflow.sh/v1/operations/{operation_id}/cancel'
Example Response
Empty

Revoke a token

POST
/v1/tokens/{token_id}/revoke

Response Body

The token is revoked after the display prefix matches.

Example Request
curl -X POST 'https://k8s.dflow.sh/v1/tokens/{token_id}/revoke'
Example Response
Empty
GET
/v1/applications/{app_id}/logs

Returns the tailed log of each container for pods labeled with this application. Query tail defaults to 100 and must be from 1 to 1000. Query container selects one container name. No pods, or pods with no log text, returns an empty lines array and message No logs yet. A bearer token, a platform token, a URL password, or a kubeconfig secret in the text is replaced with [redacted]. The route does not hold a follow stream. No selected cluster returns 412.

Response Body

Log lines for this application's pods.

application/json
  1. response
lines*array<>
message?string
Example Request
curl -X GET 'https://k8s.dflow.sh/v1/applications/{app_id}/logs'
Example Response
{  "lines": [],  "message": "No logs yet."}
GET
/v1/applications/{app_id}/pod-events

Returns events whose involved object is a pod labeled for this application. This is separate from the platform operation list. page_size defaults to 50 and must be from 1 to 200. An empty page includes message No pod events yet. No selected cluster returns 412.

Response Body

Kubernetes events for this application's pods.

application/json
  1. response
events*array<>
next_page_token?string
message?string
Example Request
curl -X GET 'https://k8s.dflow.sh/v1/applications/{app_id}/pod-events'
Example Response
{  "events": [],  "message": "No pod events yet."}
GET
/v1/applications/{app_id}/events

Items are operation records. They are not Kubernetes Event objects. An empty list includes the message No events yet.

Response Body

Operation history for the application.

application/json
  1. response
items*array<>
message?string
Example Request
curl -X GET 'https://k8s.dflow.sh/v1/applications/{app_id}/events'
Example Response
{  "items": [],  "message": "No events yet."}
GET
/v1/applications/{app_id}/route

tls is tls_disabled, pending, or ready. custom_domains lists the extra hostnames. No platform row returns 404.

Response Body

The stored platform host, its custom hostnames, and the last observation.

Example Request
curl -X GET 'https://k8s.dflow.sh/v1/applications/{app_id}/route'
Example Response
Empty
PUT
/v1/applications/{app_id}/route

Returns 202 and an operation of type application.route. An omitted host uses the application, project, and environment names plus DFLOW_APPS_DOMAIN. That platform hostname is the only name under the platform suffix. A host outside that suffix is a custom hostname. Adding one creates the platform hostname first when it is missing. An application stores at most 10 custom hostnames. A name under the platform suffix, other than the stored platform hostname, returns 400. An empty ingress class or an empty apps domain returns 412. The response has no kubeconfig.

Response Body

The route operation was accepted.

Example Request
curl -X PUT 'https://k8s.dflow.sh/v1/applications/{app_id}/route'
Example Response
Empty
DELETE
/v1/applications/{app_id}/route/{host}

Returns 202 and an operation of type application.route. The platform hostname stays. An unknown host returns 404.

Response Body

The route operation was accepted.

Example Request
curl -X DELETE 'https://k8s.dflow.sh/v1/applications/{app_id}/route/{host}'
Example Response
Empty
GET
/v1/applications/{app_id}/env

Returns revision and values. Secret values are never included.

Response Body

The stored non-secret map.

Example Request
curl -X GET 'https://k8s.dflow.sh/v1/applications/{app_id}/env'
Example Response200
Empty
PUT
/v1/applications/{app_id}/env

Replaces the whole non-secret map. A changed map returns 202 and an application.deploy operation when an image exists. An unchanged map returns 200. With no image yet the map is stored and the response is 200 with status stored. The next image deploy includes it.

Response Body

The map was unchanged, or it was stored before any image deploy.

Example Request
curl -X PUT 'https://k8s.dflow.sh/v1/applications/{app_id}/env'
Example Response
Empty

List secret key names

GET
/v1/applications/{app_id}/secrets

Returns sorted key names only. Values and ciphertext are never returned.

Response Body

The key name list.

Example Request
curl -X GET 'https://k8s.dflow.sh/v1/applications/{app_id}/secrets'
Example Response200
Empty

Remove one secret

DELETE
/v1/applications/{app_id}/secrets/{key}

Returns 202 and an application.deploy operation when an image exists.

Response Body

A deploy operation was accepted.

Example Request
curl -X DELETE 'https://k8s.dflow.sh/v1/applications/{app_id}/secrets/{key}'
Example Response
Empty
PUT
/v1/applications/{app_id}/secrets/{key}

Stores AES-256-GCM ciphertext under DFLOW_DATA_KEY. Returns 202 and an application.deploy operation when an image exists. With no image yet the secret is stored and the response is 200 with status stored. The next image deploy includes it. GET of secrets never returns the value. A body field named data_key is rejected.

Response Body

The secret was stored before any image deploy.

Example Request
curl -X PUT 'https://k8s.dflow.sh/v1/applications/{app_id}/secrets/{key}'
Example Response
Empty

How is this guide?