{"openapi":"3.1.0","info":{"title":"Admin API","description":"This API exposes the admin operations of a Restate cluster, such as registering new service deployments, interacting with running invocations, register Kafka subscriptions, retrieve service metadata. For an overview, check out the [Operate documentation](https://docs.restate.dev/operate/). If you're looking for how to call your services, check out the [Ingress HTTP API](https://docs.restate.dev/invoke/http) instead.","contact":{"name":"restate.dev"},"license":{"name":"MIT","url":"https://opensource.org/license/mit"},"version":"1.7.2"},"paths":{"/cluster-health":{"get":{"tags":["cluster_health"],"summary":"Cluster state endpoint","operationId":"cluster_health","responses":{"200":{"description":"Cluster health information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterHealthResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDescriptionResponse"}}}},"503":{"description":"The cluster does not seem to be provisioned yet.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDescriptionResponse"}}}}},"deprecated":true}},"/deployments":{"get":{"tags":["deployment"],"summary":"List deployments","description":"Returns a list of all registered deployments, including their endpoints and associated services.","operationId":"list_deployments","responses":{"200":{"description":"List of all registered deployments with their metadata","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListDeploymentsResponse"}}}}}},"post":{"tags":["deployment"],"summary":"Register deployment","description":"Registers a new deployment (HTTP or Lambda). Restate will invoke the endpoint to discover available services and handlers,\nand make them available for invocation. For more information, see the [deployment documentation](https://docs.restate.dev/services/versioning#registering-a-deployment).","operationId":"create_deployment","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterDeploymentRequest"}}},"required":true},"responses":{"200":{"description":"Deployment already exists. No change if force = false, services overwritten if force = true","headers":{"Location":{"schema":{"type":"string"},"description":"URI of the deployment"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterDeploymentResponse"}}}},"201":{"description":"Deployment created successfully and services discovered","headers":{"Location":{"schema":{"type":"string"},"description":"URI of the created deployment"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterDeploymentResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/deployments/{deployment}":{"get":{"tags":["deployment"],"summary":"Get deployment","description":"Returns detailed information about a registered deployment, including deployment metadata and the services it exposes.","operationId":"get_deployment","parameters":[{"name":"deployment","in":"path","description":"Deployment identifier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Deployment details including services and configuration","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DetailedDeploymentResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalServerError"}}},"delete":{"tags":["deployment"],"summary":"Delete deployment","description":"Delete a deployment. Currently, only forced deletions are supported.\n**Use with caution**: forcing a deployment deletion can break in-flight invocations.","operationId":"delete_deployment","parameters":[{"name":"deployment","in":"path","description":"Deployment identifier","required":true,"schema":{"type":"string"}},{"name":"force","in":"query","description":"If true, the deployment will be forcefully deleted. This might break in-flight invocations, use with caution.","required":false,"schema":{"type":["boolean","null"]}}],"responses":{"202":{"description":"Deployment deletion accepted and will be processed asynchronously"},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalServerError"},"501":{"description":"Not implemented. Graceful deployment deletion (force=false) is not yet supported.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDescriptionResponse"}}}}}},"patch":{"tags":["deployment"],"summary":"Update deployment","description":"Updates an existing deployment configuration, such as the endpoint address or invocation headers.\nBy default, service schemas are not re-discovered. Set `overwrite: true` to trigger re-discovery.","operationId":"update_deployment","parameters":[{"name":"deployment","in":"path","description":"Deployment identifier","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDeploymentRequest"}}},"required":true},"responses":{"200":{"description":"Deployment updated successfully. Address and invocation options are updated. Service schemas are only updated if overwrite was set to true.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DetailedDeploymentResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/health":{"get":{"tags":["health"],"summary":"Health check endpoint","operationId":"health","responses":{"200":{"description":"The Admin API is ready to accept requests."}}}},"/invocations/{invocation_id}":{"delete":{"tags":["invocation"],"summary":"Delete an invocation","description":"Use kill_invocation/cancel_invocation/purge_invocation instead.","operationId":"delete_invocation","parameters":[{"name":"invocation_id","in":"path","description":"Invocation identifier.","required":true,"schema":{"type":"string"}},{"name":"mode","in":"query","description":"If cancel, it will gracefully terminate the invocation.\nIf kill, it will terminate the invocation with a hard stop.\nIf purge, it will only cleanup the response for completed invocations,\nand leave unaffected an in-flight invocation.","required":false,"schema":{"oneOf":[{"type":"null"},{"type":"string","enum":["Cancel","Kill","Purge"]}]}}],"responses":{"202":{"description":"Accepted"},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalServerError"}},"deprecated":true}},"/invocations/{invocation_id}/cancel":{"patch":{"tags":["invocation"],"summary":"Cancel an invocation","description":"Gracefully cancels an invocation. The invocation is terminated, but its progress is persisted, allowing consistency guarantees to be maintained.\nFor more information, see the [cancellation documentation](https://docs.restate.dev/services/invocation/managing-invocations#cancel).","operationId":"cancel_invocation","parameters":[{"name":"invocation_id","in":"path","description":"Invocation identifier.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Invocation cancelled successfully"},"202":{"description":"Cancellation request accepted and will be processed asynchronously"},"400":{"description":"","content":{"application/json":{"schema":{"type":"object","description":"# Error description response\n\nError details of the response","required":["message"],"properties":{"message":{"type":"string"},"restate_code":{"type":["string","null"],"description":"# Restate code\n\nRestate error code describing this error"}}}}}},"404":{"description":"","content":{"application/json":{"schema":{"type":"object","description":"# Error description response\n\nError details of the response","required":["message"],"properties":{"message":{"type":"string"},"restate_code":{"type":["string","null"],"description":"# Restate code\n\nRestate error code describing this error"}}}}}},"409":{"description":"The invocation was already completed, so it cannot be cancelled nor killed. You can instead purge the invocation, in order for restate to forget it.","content":{"application/json":{"schema":{"type":"object","description":"# Error description response\n\nError details of the response","required":["message"],"properties":{"message":{"type":"string"},"restate_code":{"type":["string","null"],"description":"# Restate code\n\nRestate error code describing this error"}}}}}},"503":{"description":"Error when routing the request within restate.","content":{"application/json":{"schema":{"type":"object","description":"# Error description response\n\nError details of the response","required":["message"],"properties":{"message":{"type":"string"},"restate_code":{"type":["string","null"],"description":"# Restate code\n\nRestate error code describing this error"}}}}}}}}},"/invocations/{invocation_id}/kill":{"patch":{"tags":["invocation"],"summary":"Kill an invocation","description":"Forcefully terminates an invocation. **Warning**: This operation does not guarantee consistency for virtual object instance state,\nin-flight invocations to other services, or other side effects. Use with caution.\nFor more information, see the [cancellation documentation](https://docs.restate.dev/services/invocation/managing-invocations#kill).","operationId":"kill_invocation","parameters":[{"name":"invocation_id","in":"path","description":"Invocation identifier.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Invocation killed successfully"},"400":{"description":"","content":{"application/json":{"schema":{"type":"object","description":"# Error description response\n\nError details of the response","required":["message"],"properties":{"message":{"type":"string"},"restate_code":{"type":["string","null"],"description":"# Restate code\n\nRestate error code describing this error"}}}}}},"404":{"description":"","content":{"application/json":{"schema":{"type":"object","description":"# Error description response\n\nError details of the response","required":["message"],"properties":{"message":{"type":"string"},"restate_code":{"type":["string","null"],"description":"# Restate code\n\nRestate error code describing this error"}}}}}},"409":{"description":"The invocation was already completed, so it cannot be cancelled nor killed. You can instead purge the invocation, in order for restate to forget it.","content":{"application/json":{"schema":{"type":"object","description":"# Error description response\n\nError details of the response","required":["message"],"properties":{"message":{"type":"string"},"restate_code":{"type":["string","null"],"description":"# Restate code\n\nRestate error code describing this error"}}}}}},"503":{"description":"Error when routing the request within restate.","content":{"application/json":{"schema":{"type":"object","description":"# Error description response\n\nError details of the response","required":["message"],"properties":{"message":{"type":"string"},"restate_code":{"type":["string","null"],"description":"# Restate code\n\nRestate error code describing this error"}}}}}}}}},"/invocations/{invocation_id}/pause":{"patch":{"tags":["invocation"],"summary":"Pause an invocation","operationId":"pause_invocation","parameters":[{"name":"invocation_id","in":"path","description":"Invocation identifier.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Invocation is already paused"},"202":{"description":"Pausing invocation"},"400":{"description":"","content":{"application/json":{"schema":{"type":"object","description":"# Error description response\n\nError details of the response","required":["message"],"properties":{"message":{"type":"string"},"restate_code":{"type":["string","null"],"description":"# Restate code\n\nRestate error code describing this error"}}}}}},"404":{"description":"","content":{"application/json":{"schema":{"type":"object","description":"# Error description response\n\nError details of the response","required":["message"],"properties":{"message":{"type":"string"},"restate_code":{"type":["string","null"],"description":"# Restate code\n\nRestate error code describing this error"}}}}}},"409":{"description":"The invocation is not running. An invocation can be paused only when running.","content":{"application/json":{"schema":{"type":"object","description":"# Error description response\n\nError details of the response","required":["message"],"properties":{"message":{"type":"string"},"restate_code":{"type":["string","null"],"description":"# Restate code\n\nRestate error code describing this error"}}}}}},"503":{"description":"Error when routing the request within restate.","content":{"application/json":{"schema":{"type":"object","description":"# Error description response\n\nError details of the response","required":["message"],"properties":{"message":{"type":"string"},"restate_code":{"type":["string","null"],"description":"# Restate code\n\nRestate error code describing this error"}}}}}}}}},"/invocations/{invocation_id}/purge":{"patch":{"tags":["invocation"],"summary":"Purge a completed invocation","description":"Deletes all state associated with a completed invocation, including its journal and metadata.\nThis operation only applies to invocations that have already completed. For more information,\nsee the [purging documentation](https://docs.restate.dev/services/invocation/managing-invocations#purge).","operationId":"purge_invocation","parameters":[{"name":"invocation_id","in":"path","description":"Invocation identifier.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Invocation purged successfully"},"400":{"description":"","content":{"application/json":{"schema":{"type":"object","description":"# Error description response\n\nError details of the response","required":["message"],"properties":{"message":{"type":"string"},"restate_code":{"type":["string","null"],"description":"# Restate code\n\nRestate error code describing this error"}}}}}},"404":{"description":"","content":{"application/json":{"schema":{"type":"object","description":"# Error description response\n\nError details of the response","required":["message"],"properties":{"message":{"type":"string"},"restate_code":{"type":["string","null"],"description":"# Restate code\n\nRestate error code describing this error"}}}}}},"409":{"description":"The invocation is not yet completed. An invocation can be purged only when completed.","content":{"application/json":{"schema":{"type":"object","description":"# Error description response\n\nError details of the response","required":["message"],"properties":{"message":{"type":"string"},"restate_code":{"type":["string","null"],"description":"# Restate code\n\nRestate error code describing this error"}}}}}},"503":{"description":"Error when routing the request within restate.","content":{"application/json":{"schema":{"type":"object","description":"# Error description response\n\nError details of the response","required":["message"],"properties":{"message":{"type":"string"},"restate_code":{"type":["string","null"],"description":"# Restate code\n\nRestate error code describing this error"}}}}}}}}},"/invocations/{invocation_id}/purge-journal":{"patch":{"tags":["invocation"],"summary":"Purge invocation journal","description":"Deletes only the journal entries for a completed invocation, while retaining its metadata.\nThis operation only applies to invocations that have already completed.","operationId":"purge_journal","parameters":[{"name":"invocation_id","in":"path","description":"Invocation identifier.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Invocation journal purged successfully, metadata retained"},"400":{"description":"","content":{"application/json":{"schema":{"type":"object","description":"# Error description response\n\nError details of the response","required":["message"],"properties":{"message":{"type":"string"},"restate_code":{"type":["string","null"],"description":"# Restate code\n\nRestate error code describing this error"}}}}}},"404":{"description":"","content":{"application/json":{"schema":{"type":"object","description":"# Error description response\n\nError details of the response","required":["message"],"properties":{"message":{"type":"string"},"restate_code":{"type":["string","null"],"description":"# Restate code\n\nRestate error code describing this error"}}}}}},"409":{"description":"The invocation is not yet completed. An invocation can be purged only when completed.","content":{"application/json":{"schema":{"type":"object","description":"# Error description response\n\nError details of the response","required":["message"],"properties":{"message":{"type":"string"},"restate_code":{"type":["string","null"],"description":"# Restate code\n\nRestate error code describing this error"}}}}}},"503":{"description":"Error when routing the request within restate.","content":{"application/json":{"schema":{"type":"object","description":"# Error description response\n\nError details of the response","required":["message"],"properties":{"message":{"type":"string"},"restate_code":{"type":["string","null"],"description":"# Restate code\n\nRestate error code describing this error"}}}}}}}}},"/invocations/{invocation_id}/restart-as-new":{"patch":{"tags":["invocation"],"summary":"Restart invocation as new","description":"Creates a new invocation from a completed invocation, optionally copying partial progress from the original invocation's journal.\nThe new invocation will have a different invocation ID. Use the `from` parameter to specify how much of the original journal to preserve.","operationId":"restart_as_new_invocation","parameters":[{"name":"invocation_id","in":"path","description":"Invocation identifier.","required":true,"schema":{"type":"string"}},{"name":"from","in":"query","description":"From which entry index the invocation should restart from.\nBy default the invocation restarts from the beginning (equivalent to 'from = 0'), retaining only the input of the original invocation.\nWhen greater than 0, the new invocation will copy the old journal prefix up to 'from' included, plus eventual completions for commands in the given prefix.\nIf the journal prefix contains commands that have not been completed, this operation will fail.","required":false,"schema":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/u32"}]}},{"name":"deployment","in":"query","description":"When restarting from journal prefix, provide a deployment id to use to replace the currently pinned deployment id.\nIf 'latest', use the latest deployment id. If 'keep', keeps the pinned deployment id.\nWhen not provided, the invocation will resume on latest.\nNote: this parameter can be used only in combination with 'from'.","required":false,"schema":{"oneOf":[{"type":"null"},{"oneOf":[{"type":"string","description":"Keep the currently pinned deployment","enum":["Keep"]},{"type":"string","description":"Use the latest deployment","enum":["Latest"]},{"type":"object","description":"Use a specific deployment ID","required":["Id"],"properties":{"Id":{"type":"string","description":"Use a specific deployment ID"}}}],"description":"Specifies which deployment to use when resuming or restarting an invocation."}]}}],"responses":{"200":{"description":"Invocation restarted successfully with a new invocation ID","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RestartAsNewInvocationResponse"}}}},"400":{"description":"The selected deployment id to restart as new the invocation doesn't support the currently pinned service protocol version.","content":{"application/json":{"schema":{"type":"object","description":"# Error description response\n\nError details of the response","required":["message"],"properties":{"message":{"type":"string"},"restate_code":{"type":["string","null"],"description":"# Restate code\n\nRestate error code describing this error"}}}}}},"404":{"description":"","content":{"application/json":{"schema":{"type":"object","description":"# Error description response\n\nError details of the response","required":["message"],"properties":{"message":{"type":"string"},"restate_code":{"type":["string","null"],"description":"# Restate code\n\nRestate error code describing this error"}}}}}},"409":{"description":"The invocation is still running or the deployment id is not pinned yet, deployment id cannot be changed. The deployment id can be changed only if the invocation is paused or suspended, and a deployment id is already pinned.","content":{"application/json":{"schema":{"type":"object","description":"# Error description response\n\nError details of the response","required":["message"],"properties":{"message":{"type":"string"},"restate_code":{"type":["string","null"],"description":"# Restate code\n\nRestate error code describing this error"}}}}}},"410":{"description":"The invocation cannot be restarted because the input is not available. In order to restart an invocation, the journal must be available in order to read the input again. Journal can be retained after completion by enabling journal retention.","content":{"application/json":{"schema":{"type":"object","description":"# Error description response\n\nError details of the response","required":["message"],"properties":{"message":{"type":"string"},"restate_code":{"type":["string","null"],"description":"# Restate code\n\nRestate error code describing this error"}}}}}},"422":{"description":"Restarting the invocation is not supported. Restarting workflows is not supported, and restarting invocations created using the old service protocol.","content":{"application/json":{"schema":{"type":"object","description":"# Error description response\n\nError details of the response","required":["message"],"properties":{"message":{"type":"string"},"restate_code":{"type":["string","null"],"description":"# Restate code\n\nRestate error code describing this error"}}}}}},"425":{"description":"The invocation cannot be restarted because it's not running yet, meaning it might have been scheduled or inboxed.","content":{"application/json":{"schema":{"type":"object","description":"# Error description response\n\nError details of the response","required":["message"],"properties":{"message":{"type":"string"},"restate_code":{"type":["string","null"],"description":"# Restate code\n\nRestate error code describing this error"}}}}}},"503":{"description":"Error when routing the request within restate.","content":{"application/json":{"schema":{"type":"object","description":"# Error description response\n\nError details of the response","required":["message"],"properties":{"message":{"type":"string"},"restate_code":{"type":["string","null"],"description":"# Restate code\n\nRestate error code describing this error"}}}}}}}}},"/invocations/{invocation_id}/resume":{"patch":{"tags":["invocation"],"summary":"Resume an invocation","description":"Resumes a paused or suspended invocation. If the invocation is backing off due to a retry, this will immediately trigger the retry.\nOptionally, you can change the deployment ID that will be used when the invocation resumes. For more information see [resume documentation](https://docs.restate.dev/services/invocation/managing-invocations#resume)","operationId":"resume_invocation","parameters":[{"name":"invocation_id","in":"path","description":"Invocation identifier.","required":true,"schema":{"type":"string"}},{"name":"deployment","in":"query","description":"When resuming from paused/suspended, provide a deployment id to use to replace the currently pinned deployment id.\nIf 'latest', use the latest deployment id. If 'keep', keeps the pinned deployment id.\nWhen not provided, the invocation will resume on the pinned deployment id.\nWhen provided and the invocation is either running, or no deployment is pinned, this operation will fail.","required":false,"schema":{"oneOf":[{"type":"null"},{"oneOf":[{"type":"string","description":"Keep the currently pinned deployment","enum":["Keep"]},{"type":"string","description":"Use the latest deployment","enum":["Latest"]},{"type":"object","description":"Use a specific deployment ID","required":["Id"],"properties":{"Id":{"type":"string","description":"Use a specific deployment ID"}}}],"description":"Specifies which deployment to use when resuming or restarting an invocation."}]}}],"responses":{"200":{"description":"Invocation resumed successfully"},"400":{"description":"The selected deployment id to resume the invocation doesn't support the currently pinned service protocol version.","content":{"application/json":{"schema":{"type":"object","description":"# Error description response\n\nError details of the response","required":["message"],"properties":{"message":{"type":"string"},"restate_code":{"type":["string","null"],"description":"# Restate code\n\nRestate error code describing this error"}}}}}},"404":{"description":"","content":{"application/json":{"schema":{"type":"object","description":"# Error description response\n\nError details of the response","required":["message"],"properties":{"message":{"type":"string"},"restate_code":{"type":["string","null"],"description":"# Restate code\n\nRestate error code describing this error"}}}}}},"409":{"description":"The invocation is still running or the deployment id is not pinned yet, deployment id cannot be changed. The deployment id can be changed only if the invocation is paused or suspended, and a deployment id is already pinned.","content":{"application/json":{"schema":{"type":"object","description":"# Error description response\n\nError details of the response","required":["message"],"properties":{"message":{"type":"string"},"restate_code":{"type":["string","null"],"description":"# Restate code\n\nRestate error code describing this error"}}}}}},"425":{"description":"The invocation is either inboxed or scheduled. An invocation can be resumed only when running, paused or suspended.","content":{"application/json":{"schema":{"type":"object","description":"# Error description response\n\nError details of the response","required":["message"],"properties":{"message":{"type":"string"},"restate_code":{"type":["string","null"],"description":"# Restate code\n\nRestate error code describing this error"}}}}}},"503":{"description":"Error when routing the request within restate.","content":{"application/json":{"schema":{"type":"object","description":"# Error description response\n\nError details of the response","required":["message"],"properties":{"message":{"type":"string"},"restate_code":{"type":["string","null"],"description":"# Restate code\n\nRestate error code describing this error"}}}}}}}}},"/kafka-clusters":{"get":{"tags":["kafka_cluster"],"summary":"List Kafka clusters","description":"Returns a list of all registered Kafka clusters.","operationId":"list_kafka_clusters","responses":{"200":{"description":"List of all Kafka clusters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListKafkaClustersResponse"}}}}}},"post":{"tags":["kafka_cluster"],"summary":"Create Kafka cluster","description":"Registers a new Kafka cluster configuration that can be referenced by subscriptions.\nThe cluster configuration is validated to ensure required broker properties are present.","operationId":"create_kafka_cluster","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateKafkaClusterRequest"}}},"required":true},"responses":{"201":{"description":"Kafka cluster created successfully","headers":{"Location":{"schema":{"type":"string"},"description":"URI of the created Kafka cluster"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleKafkaClusterResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/kafka-clusters/{cluster_name}":{"get":{"tags":["kafka_cluster"],"summary":"Get Kafka cluster","description":"Returns the details of a specific Kafka cluster, including its configuration properties.\nSensitive properties (passwords, secrets, etc.) are automatically redacted in the response.","operationId":"get_kafka_cluster","parameters":[{"name":"cluster_name","in":"path","description":"Kafka cluster name","required":true,"schema":{"type":"string"}},{"name":"include_subscriptions","in":"query","description":"If true, includes the list of subscriptions using this cluster.","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Kafka cluster details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KafkaClusterResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalServerError"}}},"delete":{"tags":["kafka_cluster"],"summary":"Delete Kafka cluster","description":"Deletes a Kafka cluster. By default, deletion is prevented if subscriptions reference the cluster.\nUse the force parameter to allow deletion with orphaned subscriptions.","operationId":"delete_kafka_cluster","parameters":[{"name":"cluster_name","in":"path","description":"Kafka cluster name","required":true,"schema":{"type":"string"}},{"name":"force","in":"query","description":"If true, allows deletion of the cluster even if it would orphan subscriptions.","required":false,"schema":{"type":["boolean","null"]}}],"responses":{"202":{"description":"Kafka cluster deletion accepted and will be processed asynchronously"},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalServerError"}}},"patch":{"tags":["kafka_cluster"],"summary":"Update Kafka cluster","description":"Updates the configuration properties of an existing Kafka cluster.\nSensitive properties (passwords, secrets, etc.) are automatically redacted in the response.","operationId":"update_kafka_cluster","parameters":[{"name":"cluster_name","in":"path","description":"Kafka cluster name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateKafkaClusterRequest"}}},"required":true},"responses":{"200":{"description":"Kafka cluster updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleKafkaClusterResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/limits/rules":{"put":{"tags":["rule"],"summary":"Upsert a batch of rules.","description":"Each entry carries an optional [`Precondition`]. Setting it to\n`DoesNotExist` makes the entry a strict insert; `Matches(v)` rejects\nthe batch unless the rule's current version is `v`; omitting it\n(`None`) is unconditional. The whole batch is atomic: any failed\nprecondition or cap-exceeded condition rolls back the rest.","operationId":"upsert_rules","requestBody":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UpsertRuleRequest"}}}},"required":true},"responses":{"200":{"description":"Rules upserted","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RuleResponse"}}}}},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/UnprocessableEntity"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/limits/rules/bulk-delete":{"post":{"tags":["rule"],"summary":"Delete a batch of rules by pattern.","description":"Each entry may carry an `expected_version`; if present the rule\nmust exist at that exact version, otherwise the batch fails.\nWithout `expected_version` the delete is unconditional and\nidempotent: a pattern that's already absent is silently skipped.\nReturns the patterns that this batch actually removed.","operationId":"bulk_delete_rules","requestBody":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DeleteRuleRequest"}}}},"required":true},"responses":{"200":{"description":"Patterns that were actually removed","content":{"application/json":{"schema":{"type":"array","items":{"type":"string"}}}}},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/UnprocessableEntity"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/query":{"post":{"tags":["introspection"],"summary":"Query the system and service state by using SQL.","operationId":"query","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryRequest"}}},"required":true},"responses":{"200":{"description":"Query results","content":{"application/vnd.apache.arrow.stream":{},"application/json":{"example":{"rows":[]}}}},"500":{"description":"Datafusion error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryErrorBody"}}}},"503":{"description":"Query service not available","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryErrorBody"}}}}}}},"/services":{"get":{"tags":["service"],"summary":"List services","description":"Returns a list of all registered services, including their metadata and configuration.","operationId":"list_services","responses":{"200":{"description":"List of all registered services with their metadata","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListServicesResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/services/{service}":{"get":{"tags":["service"],"summary":"Get service","description":"Returns detailed metadata about a specific service, including its type, handlers, and configuration settings.","operationId":"get_service","parameters":[{"name":"service","in":"path","description":"Fully qualified service name.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Service metadata including type, revision, handlers, and configuration","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceMetadata"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalServerError"}}},"patch":{"tags":["service"],"summary":"Modify service configuration","description":"Updates the configuration of a registered service, such as public visibility, retention policies, and timeout settings.\nNote: Service re-discovery will update these settings based on the service endpoint configuration.","operationId":"modify_service","parameters":[{"name":"service","in":"path","description":"Fully qualified service name.","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModifyServiceRequest"}}},"required":true},"responses":{"200":{"description":"Service configuration updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceMetadata"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/services/{service}/handlers":{"get":{"tags":["service_handler"],"summary":"List service handlers","description":"Returns a list of all handlers (methods) available in the specified service.","operationId":"list_service_handlers","parameters":[{"name":"service","in":"path","description":"Fully qualified service name.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"List of handlers available in the service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListServiceHandlersResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/services/{service}/handlers/{handler}":{"get":{"tags":["service_handler"],"summary":"Get service handler","description":"Returns detailed metadata about a specific handler within a service, including its input/output types and handler type.","operationId":"get_service_handler","parameters":[{"name":"service","in":"path","description":"Fully qualified service name.","required":true,"schema":{"type":"string"}},{"name":"handler","in":"path","description":"Handler name.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Handler metadata including input/output types and configuration","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HandlerMetadata"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/services/{service}/openapi":{"get":{"tags":["service"],"summary":"Get service OpenAPI definition","description":"Returns the OpenAPI 3.1 specification for the service, describing all handlers and their request/response schemas.","operationId":"get_service_openapi","parameters":[{"name":"service","in":"path","description":"Fully qualified service name.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OpenAPI 3.1 specification document describing the service's API","content":{"application/json":{"schema":{}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/services/{service}/state":{"post":{"tags":["service"],"summary":"Modify service state","description":"Modifies the K/V state of a Virtual Object. For a detailed description of this API and how to use it, see the [state documentation](https://docs.restate.dev/operate/invocation#modifying-service-state).","operationId":"modify_service_state","parameters":[{"name":"service","in":"path","description":"Fully qualified service name.","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModifyServiceStateRequest"}}},"required":true},"responses":{"202":{"description":"State modification request accepted and will be applied asynchronously"},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/subscriptions":{"get":{"tags":["subscription"],"summary":"List subscriptions","description":"Returns a list of all registered subscriptions, optionally filtered by source or sink.","operationId":"list_subscriptions","parameters":[{"name":"sink","in":"query","description":"Filter by the exact specified sink.","required":false,"schema":{"type":["string","null"]}},{"name":"source","in":"query","description":"Filter by the exact specified source.","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"List of subscriptions matching the filter criteria","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListSubscriptionsResponse"}}}}}},"post":{"tags":["subscription"],"summary":"Create subscription","description":"Creates a new subscription that connects an event source (e.g., a Kafka topic) to a Restate service handler.\nFor more information, see the [subscription documentation](https://docs.restate.dev/operate/invocation#managing-kafka-subscriptions).","operationId":"create_subscription","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSubscriptionRequest"}}},"required":true},"responses":{"201":{"description":"Subscription created successfully","headers":{"Location":{"schema":{"type":"string"},"description":"URI of the created subscription"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/subscriptions/{subscription}":{"get":{"tags":["subscription"],"summary":"Get subscription","description":"Returns the details of a specific subscription, including its source, sink, and configuration options.","operationId":"get_subscription","parameters":[{"name":"subscription","in":"path","description":"Subscription identifier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Subscription details including source, sink, and options","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalServerError"}}},"delete":{"tags":["subscription"],"summary":"Delete subscription","description":"Deletes a subscription. This will stop events from the source from being forwarded to the sink.","operationId":"delete_subscription","parameters":[{"name":"subscription","in":"path","description":"Subscription identifier","required":true,"schema":{"type":"string"}}],"responses":{"202":{"description":"Subscription deletion accepted and will be processed asynchronously"},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/version":{"get":{"tags":["version"],"summary":"Get version information","description":"Returns the server version, supported Admin API versions, and the advertised ingress endpoint.","operationId":"version","responses":{"200":{"description":"Server version information including supported API versions and ingress endpoint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionInformation"}}}}}}}},"components":{"schemas":{"AdvertisedAddress-http-ingress-server_HttpIngressPort":{"type":"string","title":"advertised address","description":"An externally accessible URI address for http-ingress-server. This can be set to unix:restate-data/ingress.sock to advertise the automatically created unix-socket instead of using tcp if needed","examples":["http//127.0.0.1:8080/","https://my-host/","unix:/data/restate-data/ingress.sock"]},"ClusterHealthResponse":{"type":"object","description":"Cluster health information","required":["cluster_name"],"properties":{"cluster_name":{"type":"string","description":"Cluster name"},"metadata_cluster_health":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/EmbeddedMetadataClusterHealth","description":"Embedded metadata cluster health if it was enabled"}]}}},"CreateKafkaClusterRequest":{"type":"object","description":"Create Kafka cluster request","required":["name","properties"],"properties":{"name":{"$ref":"#/components/schemas/KafkaClusterName","description":"# Cluster Name\n\nName for the Kafka cluster, used to identify this Kafka cluster configuration in subscriptions. Must be a valid hostname format."},"properties":{"type":"object","description":"# Properties\n\nKafka cluster configuration properties. Must contain either\n'bootstrap.servers' or 'metadata.broker.list'.\n\nFor a full list of configuration properties, check the [librdkafka documentation](https://github.com/confluentinc/librdkafka/blob/master/CONFIGURATION.md).","additionalProperties":{"type":"string"},"propertyNames":{"type":"string"}}}},"CreateSubscriptionRequest":{"type":"object","required":["source","sink"],"properties":{"options":{"type":["object","null"],"description":"# Options\n\nAdditional options to apply to the subscription.","additionalProperties":{"type":"string"},"propertyNames":{"type":"string"}},"sink":{"type":"string","format":"uri","description":"# Sink\n\nSink uri. Accepted forms:\n\n* `service:///`, e.g. `service://Counter/count`"},"source":{"type":"string","format":"uri","description":"# Source\n\nSource uri. Accepted forms:\n\n* `kafka:///`, e.g. `kafka://my-cluster/my-topic`"}}},"DeleteRuleRequest":{"type":"object","description":"One entry in the body of `POST /limits/rules/bulk-delete`.","required":["pattern"],"properties":{"expected_version":{"type":["integer","null"],"format":"int32","description":"Optimistic-concurrency match. Absent → unconditional delete\n(idempotent: deleting an already-absent rule succeeds as a\nno-op). Present → reject unless the rule's current version is\nthe supplied value.","minimum":0},"pattern":{"type":"string"}}},"DeploymentId":{"type":"string"},"DeploymentResponse":{"oneOf":[{"type":"object","title":"HttpDeploymentResponse","description":"Deployment response for HTTP deployments","required":["id","uri","protocol_type","http_version","created_at","min_protocol_version","max_protocol_version","services"],"properties":{"additional_headers":{"$ref":"#/components/schemas/SerdeableHeaderHashMap","description":"# Additional headers\n\nAdditional headers used to invoke this service deployment."},"auth":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/HttpAuth","description":"# Authentication\n\nPer-deployment authentication, if configured."}]},"created_at":{"type":"string"},"http_version":{"type":"string","description":"# HTTP Version\n\nHTTP Version used to invoke this service deployment."},"id":{"$ref":"#/components/schemas/DeploymentId","description":"# Deployment ID"},"info":{"type":"array","items":{"$ref":"#/components/schemas/SchemaInfo"},"description":"# Info\n\nList of configuration/deprecation information related to this deployment."},"max_protocol_version":{"type":"integer","format":"int32","description":"# Maximum Service Protocol version\n\nDuring registration, the SDKs declare a range from minimum (included) to maximum (included) Service Protocol supported version."},"metadata":{"type":"object","description":"# Metadata\n\nDeployment metadata.","additionalProperties":{"type":"string"},"propertyNames":{"type":"string"}},"min_protocol_version":{"type":"integer","format":"int32","description":"# Minimum Service Protocol version\n\nDuring registration, the SDKs declare a range from minimum (included) to maximum (included) Service Protocol supported version."},"protocol_type":{"$ref":"#/components/schemas/ProtocolType","description":"# Protocol Type\n\nProtocol type used to invoke this service deployment."},"sdk_version":{"type":["string","null"],"description":"# SDK version\n\nSDK library and version declared during registration."},"services":{"type":"array","items":{"$ref":"#/components/schemas/ServiceNameRevPair"},"description":"# Services\n\nList of services exposed by this deployment."},"uri":{"type":"string","format":"uri","description":"# Deployment URI\n\nURI used to invoke this service deployment."}}},{"type":"object","title":"LambdaDeploymentResponse","description":"Deployment response for Lambda deployments","required":["id","arn","created_at","min_protocol_version","max_protocol_version","services"],"properties":{"additional_headers":{"$ref":"#/components/schemas/SerdeableHeaderHashMap","description":"# Additional headers\n\nAdditional headers used to invoke this service deployment."},"arn":{"$ref":"#/components/schemas/LambdaARN","description":"# Lambda ARN\n\nLambda ARN used to invoke this service deployment."},"assume_role_arn":{"type":["string","null"],"description":"# Assume role ARN\n\nAssume role ARN used to invoke this deployment. Check https://docs.restate.dev/category/aws-lambda for more details."},"compression":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/EndpointLambdaCompression","description":"# Compression\n\nCompression algorithm used for invoking Lambda."}]},"created_at":{"type":"string"},"id":{"$ref":"#/components/schemas/DeploymentId","description":"# Deployment ID"},"info":{"type":"array","items":{"$ref":"#/components/schemas/SchemaInfo"},"description":"# Info\n\nList of configuration/deprecation information related to this deployment."},"max_protocol_version":{"type":"integer","format":"int32","description":"# Maximum Service Protocol version\n\nDuring registration, the SDKs declare a range from minimum (included) to maximum (included) Service Protocol supported version."},"metadata":{"type":"object","description":"# Metadata\n\nDeployment metadata.","additionalProperties":{"type":"string"},"propertyNames":{"type":"string"}},"min_protocol_version":{"type":"integer","format":"int32","description":"# Minimum Service Protocol version\n\nDuring registration, the SDKs declare a range from minimum (included) to maximum (included) Service Protocol supported version."},"sdk_version":{"type":["string","null"],"description":"# SDK version\n\nSDK library and version declared during registration."},"services":{"type":"array","items":{"$ref":"#/components/schemas/ServiceNameRevPair"},"description":"# Services\n\nList of services exposed by this deployment."}}}]},"DetailedDeploymentResponse":{"oneOf":[{"type":"object","title":"HttpDetailedDeploymentResponse","description":"Detailed deployment response for HTTP deployments","required":["id","uri","protocol_type","http_version","created_at","min_protocol_version","max_protocol_version","services"],"properties":{"additional_headers":{"$ref":"#/components/schemas/SerdeableHeaderHashMap","description":"# Additional headers\n\nAdditional headers used to invoke this service deployment."},"auth":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/HttpAuth","description":"# Authentication\n\nPer-deployment authentication, if configured."}]},"created_at":{"type":"string"},"http_version":{"type":"string","description":"# HTTP Version\n\nHTTP Version used to invoke this service deployment."},"id":{"$ref":"#/components/schemas/DeploymentId","description":"# Deployment ID"},"info":{"type":"array","items":{"$ref":"#/components/schemas/SchemaInfo"},"description":"# Info\n\nList of configuration/deprecation information related to this deployment."},"max_protocol_version":{"type":"integer","format":"int32","description":"# Maximum Service Protocol version\n\nDuring registration, the SDKs declare a range from minimum (included) to maximum (included) Service Protocol supported version."},"metadata":{"type":"object","description":"# Metadata\n\nDeployment metadata.","additionalProperties":{"type":"string"},"propertyNames":{"type":"string"}},"min_protocol_version":{"type":"integer","format":"int32","description":"# Minimum Service Protocol version\n\nDuring registration, the SDKs declare a range from minimum (included) to maximum (included) Service Protocol supported version."},"protocol_type":{"$ref":"#/components/schemas/ProtocolType","description":"# Protocol Type\n\nProtocol type used to invoke this service deployment."},"sdk_version":{"type":["string","null"],"description":"# SDK version\n\nSDK library and version declared during registration."},"services":{"type":"array","items":{"$ref":"#/components/schemas/ServiceMetadata"},"description":"# Services\n\nList of services exposed by this deployment."},"uri":{"type":"string","format":"uri","description":"# Deployment URI\n\nURI used to invoke this service deployment."}}},{"type":"object","title":"LambdaDetailedDeploymentResponse","description":"Detailed deployment response for Lambda deployments","required":["id","arn","created_at","min_protocol_version","max_protocol_version","services"],"properties":{"additional_headers":{"$ref":"#/components/schemas/SerdeableHeaderHashMap","description":"# Additional headers\n\nAdditional headers used to invoke this service deployment."},"arn":{"$ref":"#/components/schemas/LambdaARN","description":"# Lambda ARN\n\nLambda ARN used to invoke this service deployment."},"assume_role_arn":{"type":["string","null"],"description":"# Assume role ARN\n\nAssume role ARN used to invoke this deployment. Check https://docs.restate.dev/category/aws-lambda for more details."},"compression":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/EndpointLambdaCompression","description":"# Compression\n\nCompression algorithm used for invoking Lambda."}]},"created_at":{"type":"string"},"id":{"$ref":"#/components/schemas/DeploymentId","description":"# Deployment ID"},"info":{"type":"array","items":{"$ref":"#/components/schemas/SchemaInfo"},"description":"# Info\n\nList of configuration/deprecation information related to this deployment."},"max_protocol_version":{"type":"integer","format":"int32","description":"# Maximum Service Protocol version\n\nDuring registration, the SDKs declare a range from minimum (included) to maximum (included) Service Protocol supported version."},"metadata":{"type":"object","description":"# Metadata\n\nDeployment metadata.","additionalProperties":{"type":"string"},"propertyNames":{"type":"string"}},"min_protocol_version":{"type":"integer","format":"int32","description":"# Minimum Service Protocol version\n\nDuring registration, the SDKs declare a range from minimum (included) to maximum (included) Service Protocol supported version."},"sdk_version":{"type":["string","null"],"description":"# SDK version\n\nSDK library and version declared during registration."},"services":{"type":"array","items":{"$ref":"#/components/schemas/ServiceMetadata"},"description":"# Services\n\nList of services exposed by this deployment."}}}],"description":"Detailed information about Restate deployments"},"EmbeddedMetadataClusterHealth":{"type":"object","required":["members"],"properties":{"members":{"type":"array","items":{"$ref":"#/components/schemas/PlainNodeId"},"description":"Current members of the embedded metadata cluster"}}},"EndpointLambdaCompression":{"type":"string","description":"Lambda compression","enum":["Zstd"]},"ErrorDescriptionResponse":{"type":"object","description":"# Error description response\n\nError details of the response","required":["message"],"properties":{"message":{"type":"string"},"restate_code":{"type":["string","null"],"description":"# Restate code\n\nRestate error code describing this error"}}},"GoogleIdTokenAuth":{"type":"object","properties":{"audience":{"type":["string","null"],"description":"Explicit OIDC `aud` claim. Leave unset to automatically derive from the deployment URL."},"impersonate_service_account":{"type":["string","null"],"description":"Service account email to impersonate via `iamcredentials:generateIdToken`. Leave unset to\nuse the ambient ADC identity."}}},"HandlerMetadata":{"type":"object","description":"Handler metadata","required":["name","input_description","output_description"],"properties":{"abort_timeout":{"type":["string","null"],"description":"# Abort timeout\n\nThis timer guards against stalled service/handler invocations that are supposed to\nterminate. The abort timeout is started after the 'inactivity timeout' has expired\nand the service/handler invocation has been asked to gracefully terminate. Once the\ntimer expires, it will abort the service/handler invocation.\n\nThis timer potentially **interrupts** user code. If the user code needs longer to\ngracefully terminate, then this value needs to be set accordingly.\n\nCan be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.\n\nIf set, it overrides the value set in the service."},"documentation":{"type":["string","null"],"description":"# Documentation\n\nDocumentation of the handler, as propagated by the SDKs."},"enable_lazy_state":{"type":["boolean","null"],"description":"# Enable lazy state\n\nIf true, lazy state will be enabled for all invocations to this service.\nThis is relevant only for Workflows and Virtual Objects.\n\nIf set, it overrides the value set in the service."},"idempotency_retention":{"type":["string","null"],"description":"# Idempotency retention\n\nThe retention duration of idempotent requests for this handler. If set, it overrides the value set in the service.\n\nCan be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`."},"inactivity_timeout":{"type":["string","null"],"description":"# Inactivity timeout\n\nThis timer guards against stalled service/handler invocations. Once it expires,\nRestate triggers a graceful termination by asking the service invocation to\nsuspend (which preserves intermediate progress).\n\nThe 'abort timeout' is used to abort the invocation, in case it doesn't react to\nthe request to suspend.\n\nCan be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.\n\nIf set, it overrides the value set in the service."},"info":{"type":"array","items":{"$ref":"#/components/schemas/SchemaInfo"},"description":"# Info\n\nList of configuration/deprecation information related to this handler."},"input_description":{"type":"string","description":"# Human readable input description\n\nIf empty, no schema was provided by the user at discovery time."},"input_json_schema":{"description":"# Input JSON Schema\n\nJSON Schema of the handler input"},"journal_retention":{"type":["string","null"],"description":"# Journal retention\n\nThe journal retention. When set, this applies to all requests to this handler.\n\nIn case the invocation has an idempotency key, the `idempotency_retention` caps the maximum `journal_retention` time.\nIn case this handler is a workflow handler, the `workflow_completion_retention` caps the maximum `journal_retention` time.\n\nCan be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.\n\nIf set, it overrides the value set in the service."},"metadata":{"type":"object","description":"# Metadata\n\nAdditional handler metadata, as propagated by the SDKs.","additionalProperties":{"type":"string"},"propertyNames":{"type":"string"}},"name":{"type":"string","description":"# Name\n\nThe handler name."},"output_description":{"type":"string","description":"# Human readable output description\n\nIf empty, no schema was provided by the user at discovery time."},"output_json_schema":{"description":"# Output JSON Schema\n\nJSON Schema of the handler output"},"public":{"type":"boolean","description":"# Public\n\nIf true, this handler can be invoked through the ingress.\nIf false, this handler can be invoked only from another Restate service."},"retry_policy":{"$ref":"#/components/schemas/HandlerRetryPolicyMetadata","description":"# Retry policy\n\nRetry policy overrides applied for this handler."},"ty":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/HandlerMetadataType","description":"# Type\n\nThe handler type."}]}}},"HandlerMetadataType":{"type":"string","enum":["Exclusive","Shared","Workflow"]},"HandlerRetryPolicyMetadata":{"type":"object","description":"# Handler retry policy overrides","properties":{"exponentiation_factor":{"type":["number","null"],"format":"float","description":"# Factor\n\nThe factor to use to compute the next retry attempt."},"initial_interval":{"type":["string","null"],"description":"# Initial Interval\n\nInitial interval for the first retry attempt.\n\nCan be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`."},"max_attempts":{"type":["integer","null"],"description":"# Max attempts\n\nNumber of maximum attempts (including the initial) before giving up. Infinite retries if unset. No retries if set to 1.","minimum":1},"max_interval":{"type":["string","null"],"description":"# Max interval\n\nMaximum interval between retries.\n\nCan be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`."},"on_max_attempts":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/OnMaxAttempts","description":"# On max attempts\n\nBehavior when max attempts are reached."}]}}},"HttpAuth":{"oneOf":[{"type":"object","required":["GoogleIdToken"],"properties":{"GoogleIdToken":{"$ref":"#/components/schemas/GoogleIdTokenAuth"}}}],"description":"HTTP authentication details."},"KafkaClusterName":{"type":"string","format":"hostname","description":"# Kafka cluster name\n\nValid name to use as a kafka cluster identifier. MUST conform a valid hostname format."},"KafkaClusterResponse":{"type":"object","description":"Kafka cluster details with subscriptions.","required":["name","properties","created_at","subscriptions"],"properties":{"created_at":{"type":"string","description":"# Created at\n\nWhen the Kafka cluster configuration was created."},"info":{"type":"array","items":{"$ref":"#/components/schemas/SchemaInfo"},"description":"# Info\n\nList of configuration/deprecation information related to this deployment."},"name":{"$ref":"#/components/schemas/KafkaClusterName","description":"# Cluster Name\n\nName for the Kafka cluster, used to identify this Kafka cluster configuration in subscriptions. Must be a valid hostname format."},"properties":{"type":"object","description":"# Properties\n\nProperties for connecting to the kafka cluster.\n\nFor a full list of configuration properties, check the [librdkafka documentation](https://github.com/confluentinc/librdkafka/blob/master/CONFIGURATION.md).","additionalProperties":{"type":"string"},"propertyNames":{"type":"string"}},"subscriptions":{"type":"array","items":{"$ref":"#/components/schemas/SubscriptionResponse"},"description":"# Subscriptions\n\nSubscriptions to this Kafka cluster, returned only when `include_subscriptions` is enabled."}}},"LambdaARN":{"type":"string"},"ListDeploymentsResponse":{"type":"object","description":"List of all registered deployments","required":["deployments"],"properties":{"deployments":{"type":"array","items":{"$ref":"#/components/schemas/DeploymentResponse"}}}},"ListKafkaClustersResponse":{"type":"object","description":"List of all Kafka clusters.","required":["clusters"],"properties":{"clusters":{"type":"array","items":{"$ref":"#/components/schemas/SimpleKafkaClusterResponse"}}}},"ListServiceHandlersResponse":{"type":"object","description":"List of all the handlers of a service","required":["handlers"],"properties":{"handlers":{"type":"array","items":{"$ref":"#/components/schemas/HandlerMetadata"}}}},"ListServicesResponse":{"type":"object","description":"List of all registered services.","required":["services"],"properties":{"services":{"type":"array","items":{"$ref":"#/components/schemas/ServiceMetadata"}}}},"ListSubscriptionsResponse":{"type":"object","description":"List of all subscriptions.","required":["subscriptions"],"properties":{"subscriptions":{"type":"array","items":{"$ref":"#/components/schemas/SubscriptionResponse"}}}},"ModifyServiceRequest":{"type":"object","properties":{"abort_timeout":{"type":["string","null"],"description":"# Abort timeout\n\nThis timer guards against stalled service/handler invocations that are supposed to\nterminate. The abort timeout is started after the 'inactivity timeout' has expired\nand the service/handler invocation has been asked to gracefully terminate. Once the\ntimer expires, it will abort the service/handler invocation.\n\nThis timer potentially **interrupts** user code. If the user code needs longer to\ngracefully terminate, then this value needs to be set accordingly.\n\nCan be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.\n\nThis overrides the default abort timeout set in invoker options."},"idempotency_retention":{"type":["string","null"],"description":"# Idempotency retention\n\nModify the retention of idempotent requests for this service.\n\nCan be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`."},"inactivity_timeout":{"type":["string","null"],"description":"# Inactivity timeout\n\nThis timer guards against stalled service/handler invocations. Once it expires,\nRestate triggers a graceful termination by asking the service invocation to\nsuspend (which preserves intermediate progress).\n\nThe 'abort timeout' is used to abort the invocation, in case it doesn't react to\nthe request to suspend.\n\nCan be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.\n\nThis overrides the default inactivity timeout set in invoker options."},"journal_retention":{"type":["string","null"],"description":"# Journal retention\n\nModify the journal retention for this service. When set, this applies to all requests to all handlers of this service.\n\nIn case the invocation has an idempotency key, the `idempotency_retention` caps the maximum `journal_retention` time.\nIn case the invocation targets a workflow handler, the `workflow_completion_retention` caps the maximum `journal_retention` time.\n\nCan be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`."},"public":{"type":["boolean","null"],"description":"# Public\n\nIf true, the service can be invoked through the ingress.\nIf false, the service can be invoked only from another Restate service."},"workflow_completion_retention":{"type":["string","null"],"description":"# Workflow completion retention\n\nModify the retention of the workflow completion. This can be modified only for workflow services!\n\nCan be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`."}}},"ModifyServiceStateRequest":{"type":"object","required":["object_key","new_state"],"properties":{"new_state":{"type":"object","description":"# New State\n\nThe new state to replace the previous state with","additionalProperties":{"type":"array","items":{"type":"integer","format":"int32","minimum":0}},"propertyNames":{"type":"string"}},"object_key":{"type":"string","description":"# Service key\n\nTo what virtual object key to apply this change"},"scope":{"type":["string","null"],"description":"# Scope\n\nOptional scope for the virtual object instance. When set, targets the scoped\ninstance instead of the unscoped one. Since v1.7.0."},"version":{"type":["string","null"],"description":"# Version\n\nIf set, the latest version of the state is compared with this value and the operation will fail\nwhen the versions differ."}}},"OnMaxAttempts":{"type":"string","enum":["Pause","Kill"]},"PlainNodeId":{"type":"integer","format":"int32","minimum":0},"Precondition":{"oneOf":[{"type":"object","required":["type"],"properties":{"type":{"type":"string","enum":["none"]}}},{"type":"object","required":["version","type"],"properties":{"type":{"type":"string","enum":["matches"]},"version":{"$ref":"#/components/schemas/Version"}}},{"type":"object","required":["type"],"properties":{"type":{"type":"string","enum":["does_not_exist"]}}}],"description":"Optimistic-concurrency guard for a [`RuleChange`].\n\n- [`Precondition::None`] applies the change unconditionally.\n- [`Precondition::Matches`] requires the rule to be present at the\n given version; otherwise the change is rejected with\n [`RuleBookError::PreconditionFailed`].\n- [`Precondition::DoesNotExist`] requires the rule to be absent.\n Combined with `Upsert` this is a pure insert."},"ProtocolType":{"type":"string","enum":["RequestResponse","BidiStream"]},"QueryErrorBody":{"type":"object","description":"Error response for query endpoint.","required":["message"],"properties":{"message":{"type":"string"}}},"QueryRequest":{"type":"object","required":["query"],"properties":{"query":{"type":"string","description":"SQL query to run against the storage"}}},"RegisterDeploymentRequest":{"oneOf":[{"type":"object","title":"RegisterHttpDeploymentRequest","description":"Register HTTP deployment request","required":["uri"],"properties":{"additional_headers":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/SerdeableHeaderHashMap","description":"# Additional headers\n\nAdditional headers added to every discover/invoke request to the deployment.\n\nYou typically want to include here API keys and other tokens required to send requests to deployments."}]},"auth":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/HttpAuth","description":"# Authentication\n\nOptional per-deployment authentication configuration. When set to `GoogleIdToken`,\nRestate mints a Google-signed OIDC ID token for each request and attaches it as\n`X-Serverless-Authorization: Bearer `. Cloud Run validates this header in\nprecedence over `Authorization` and strips it before forwarding to the container, so any\n`Authorization` placed in `additional_headers` passes through to the workload unchanged."}]},"breaking":{"type":"boolean","description":"# Breaking\n\nIf `true`, it allows registering new service revisions with\nschemas incompatible with previous service revisions, such as changing the service type.\n\nSee the [versioning documentation](https://docs.restate.dev/operate/versioning) for more information."},"dry_run":{"type":"boolean","description":"# Dry-run mode\n\nIf `true`, discovery will run but the deployment will not be registered.\nThis is useful to see the impact of a new deployment before registering it.\n`force` and `breaking` will be respected."},"force":{"type":["boolean","null"],"description":"# Force\n\nIf `true`, it overrides, if existing, any deployment using the same `uri`.\nBeware that this can lead inflight invocations to an unrecoverable error state.\n\nWhen set to `true`, it implies `breaking = true`.\n\nSee the [versioning documentation](https://docs.restate.dev/operate/versioning) for more information.","default":true},"metadata":{"type":"object","description":"# Metadata\n\nDeployment metadata.","additionalProperties":{"type":"string"},"propertyNames":{"type":"string"}},"uri":{"type":"string","format":"uri","description":"# Uri\n\nUri to use to discover/invoke the http deployment."},"use_http_11":{"type":"boolean","description":"# Use http1.1\n\nIf `true`, discovery will be attempted using a client that defaults to HTTP1.1\ninstead of a prior-knowledge HTTP2 client. HTTP2 may still be used for TLS servers\nthat advertise HTTP2 support via ALPN. HTTP1.1 deployments will only work in\nrequest-response mode.\n"}}},{"type":"object","title":"RegisterLambdaDeploymentRequest","description":"Register Lambda deployment request","required":["arn"],"properties":{"additional_headers":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/SerdeableHeaderHashMap","description":"# Additional headers\n\nAdditional headers added to every discover/invoke request to the deployment."}]},"arn":{"type":"string","description":"# ARN\n\nARN to use to discover/invoke the lambda deployment."},"assume_role_arn":{"type":["string","null"],"description":"# Assume role ARN\n\nOptional ARN of a role to assume when invoking the addressed Lambda, to support role chaining"},"breaking":{"type":"boolean","description":"# Breaking\n\nIf `true`, it allows registering new service revisions with\nschemas incompatible with previous service revisions, such as changing the service type.\n\nSee the [versioning documentation](https://docs.restate.dev/operate/versioning) for more information."},"dry_run":{"type":"boolean","description":"# Dry-run mode\n\nIf `true`, discovery will run but the deployment will not be registered.\nThis is useful to see the impact of a new deployment before registering it.\n`force` and `breaking` will be respected."},"force":{"type":["boolean","null"],"description":"# Force\n\nIf `true`, it overrides, if existing, any deployment using the same `uri`.\nBeware that this can lead inflight invocations to an unrecoverable error state.\n\nThis implies `breaking = true`.\n\nSee the [versioning documentation](https://docs.restate.dev/operate/versioning) for more information.","default":true},"metadata":{"type":"object","description":"# Metadata\n\nDeployment metadata.","additionalProperties":{"type":"string"},"propertyNames":{"type":"string"}}}}]},"RegisterDeploymentResponse":{"type":"object","required":["id","services"],"properties":{"id":{"$ref":"#/components/schemas/DeploymentId"},"info":{"type":"array","items":{"$ref":"#/components/schemas/SchemaInfo"},"description":"# Info\n\nList of configuration/deprecation information related to this deployment."},"max_protocol_version":{"type":"integer","format":"int32","description":"# Maximum Service Protocol version\n\nDuring registration, the SDKs declare a range from minimum (included) to maximum (included) Service Protocol supported version."},"min_protocol_version":{"type":"integer","format":"int32","description":"# Minimum Service Protocol version\n\nDuring registration, the SDKs declare a range from minimum (included) to maximum (included) Service Protocol supported version."},"sdk_version":{"type":["string","null"],"description":"# SDK version\n\nSDK library and version declared during registration."},"services":{"type":"array","items":{"$ref":"#/components/schemas/ServiceMetadata"}}}},"RestartAsNewInvocationResponse":{"type":"object","description":"The invocation was restarted as new.","required":["new_invocation_id"],"properties":{"new_invocation_id":{"$ref":"#/components/schemas/String","description":"The invocation id of the new invocation."}}},"RuleResponse":{"type":"object","required":["pattern","limits","disabled","version","last_modified_millis_since_epoch"],"properties":{"description":{"type":["string","null"]},"disabled":{"type":"boolean"},"last_modified_millis_since_epoch":{"type":"integer","format":"int64","description":"Millis since UNIX epoch.","minimum":0},"limits":{"$ref":"#/components/schemas/UserLimits"},"pattern":{"type":"string"},"version":{"type":"integer","format":"int32","description":"Per-rule version: bumped on runtime-relevant changes.","minimum":0}}},"SchemaInfo":{"type":"object","required":["message"],"properties":{"code":{"type":["string","null"]},"message":{"type":"string"}}},"SerdeableHeaderHashMap":{"type":"object","description":"Proxy type to implement HashMap ser/de\nUse it directly or with `#[serde(with = \"serde_with::As::>\")]`.","additionalProperties":{"type":"string"},"propertyNames":{"type":"string"}},"ServiceMetadata":{"type":"object","description":"Metadata of a registered service.","required":["name","ty","handlers","deployment_id","revision"],"properties":{"abort_timeout":{"type":"string","description":"# Abort timeout\n\nThis timer guards against stalled service/handler invocations that are supposed to\nterminate. The abort timeout is started after the 'inactivity timeout' has expired\nand the service/handler invocation has been asked to gracefully terminate. Once the\ntimer expires, it will abort the service/handler invocation.\n\nThis timer potentially **interrupts** user code. If the user code needs longer to\ngracefully terminate, then this value needs to be set accordingly.\n\nCan be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.\n\nIf unset, this returns the default abort timeout configured in invoker options."},"deployment_id":{"$ref":"#/components/schemas/DeploymentId","description":"# Deployment Id\n\nDeployment exposing the latest revision of the service."},"documentation":{"type":["string","null"],"description":"# Documentation\n\nDocumentation of the service, as propagated by the SDKs."},"enable_lazy_state":{"type":"boolean","description":"# Enable lazy state\n\nIf true, lazy state will be enabled for all invocations to this service.\nThis is relevant only for Workflows and Virtual Objects."},"handlers":{"type":"array","items":{"$ref":"#/components/schemas/HandlerMetadata"},"description":"# Handlers\n\nHandlers for this service."},"idempotency_retention":{"type":"string","description":"# Idempotency retention\n\nThe retention duration of idempotent requests for this service.\n\nIf not configured, this returns the default idempotency retention.\n\nCan be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`."},"inactivity_timeout":{"type":"string","description":"# Inactivity timeout\n\nThis timer guards against stalled service/handler invocations. Once it expires,\nRestate triggers a graceful termination by asking the service invocation to\nsuspend (which preserves intermediate progress).\n\nThe 'abort timeout' is used to abort the invocation, in case it doesn't react to\nthe request to suspend.\n\nCan be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`.\n\nIf unset, this returns the default inactivity timeout configured in invoker options."},"info":{"type":"array","items":{"$ref":"#/components/schemas/SchemaInfo"},"description":"# Info\n\nList of configuration/deprecation information related to this service."},"journal_retention":{"type":["string","null"],"description":"# Journal retention\n\nThe journal retention. When set, this applies to all requests to all handlers of this service.\n\nIn case the invocation has an idempotency key, the `idempotency_retention` caps the maximum `journal_retention` time.\nIn case the invocation targets a workflow handler, the `workflow_completion_retention` caps the maximum `journal_retention` time.\n\nCan be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`."},"metadata":{"type":"object","description":"# Metadata\n\nAdditional service metadata, as propagated by the SDKs.","additionalProperties":{"type":"string"},"propertyNames":{"type":"string"}},"name":{"type":"string","description":"# Name\n\nFully qualified name of the service"},"public":{"type":"boolean","description":"# Public\n\nIf true, the service can be invoked through the ingress.\nIf false, the service can be invoked only from another Restate service."},"retry_policy":{"$ref":"#/components/schemas/ServiceRetryPolicyMetadata","description":"# Retry policy\n\nRetry policy applied to invocations of this service.\n\nIf unset, it returns the default values configured in the Restate configuration."},"revision":{"$ref":"#/components/schemas/u32","description":"# Revision\n\nLatest revision of the service."},"ty":{"$ref":"#/components/schemas/ServiceType","description":"# Type\n\nService type"},"workflow_completion_retention":{"type":["string","null"],"description":"# Workflow completion retention\n\nThe retention duration of workflows. Only available on workflow services.\n\nCan be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`."}}},"ServiceNameRevPair":{"type":"object","required":["name","revision"],"properties":{"name":{"type":"string"},"revision":{"$ref":"#/components/schemas/u32"}}},"ServiceRetryPolicyMetadata":{"type":"object","description":"# Service retry policy","properties":{"exponentiation_factor":{"type":"number","format":"float","description":"# Factor\n\nThe factor to use to compute the next retry attempt. Default: `2.0`."},"initial_interval":{"type":"string","description":"# Initial Interval\n\nInitial interval for the first retry attempt.\n\nCan be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`."},"max_attempts":{"type":["integer","null"],"description":"# Max attempts\n\nNumber of maximum attempts (including the initial) before giving up. Infinite retries if unset. No retries if set to 1.","minimum":1},"max_interval":{"type":["string","null"],"description":"# Max interval\n\nMaximum interval between retries.\n\nCan be configured using the [`jiff::fmt::friendly`](https://docs.rs/jiff/latest/jiff/fmt/friendly/index.html) format or ISO8601, for example `5 hours`."},"on_max_attempts":{"$ref":"#/components/schemas/OnMaxAttempts","description":"# On max attempts\n\nBehavior when max attempts are reached."}}},"ServiceType":{"type":"string","enum":["Service","VirtualObject","Workflow"]},"SimpleKafkaClusterResponse":{"type":"object","description":"Kafka cluster simple response.","required":["name","properties","created_at"],"properties":{"created_at":{"type":"string","description":"# Created at\n\nWhen the Kafka cluster configuration was created."},"info":{"type":"array","items":{"$ref":"#/components/schemas/SchemaInfo"},"description":"# Info\n\nList of configuration/deprecation information related to this deployment."},"name":{"$ref":"#/components/schemas/KafkaClusterName","description":"# Cluster Name\n\nName for the Kafka cluster, used to identify this Kafka cluster configuration in subscriptions. Must be a valid hostname format."},"properties":{"type":"object","description":"# Properties\n\nProperties for connecting to the kafka cluster.\n\nFor a full list of configuration properties, check the [librdkafka documentation](https://github.com/confluentinc/librdkafka/blob/master/CONFIGURATION.md).","additionalProperties":{"type":"string"},"propertyNames":{"type":"string"}}}},"String":{"type":"string"},"SubscriptionId":{"type":"string"},"SubscriptionResponse":{"type":"object","description":"Subscription details.","required":["id","source","sink","options"],"properties":{"id":{"$ref":"#/components/schemas/SubscriptionId"},"options":{"type":"object","additionalProperties":{"type":"string"},"propertyNames":{"type":"string"}},"sink":{"type":"string"},"source":{"type":"string"}}},"UpdateDeploymentRequest":{"oneOf":[{"type":"object","title":"UpdateHttpDeploymentRequest","description":"Update HTTP deployment request","properties":{"additional_headers":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/SerdeableHeaderHashMap","description":"# Additional headers\n\nAdditional headers added to the discover/invoke requests to the deployment.\nWhen provided, this will overwrite all the headers previously configured for this deployment."}]},"dry_run":{"type":"boolean","description":"# Dry-run mode\n\nIf `true`, discovery will run but the deployment will not be registered.\nThis is useful to see the impact of a new deployment before registering it."},"overwrite":{"type":"boolean","description":"# Overwrite\n\nIf `true`, the update will overwrite the schema information, including the exposed service and handlers and service configuration, allowing **breaking changes** too. Use with caution."},"uri":{"type":["string","null"],"format":"uri","description":"# Uri\n\nUri to use to discover/invoke the http deployment."},"use_http_11":{"type":["boolean","null"],"description":"# Use http1.1\n\nIf `true`, discovery will be attempted using a client that defaults to HTTP1.1\ninstead of a prior-knowledge HTTP2 client. HTTP2 may still be used for TLS servers\nthat advertise HTTP2 support via ALPN. HTTP1.1 deployments will only work in\nrequest-response mode."}}},{"type":"object","title":"UpdateLambdaDeploymentRequest","description":"Update Lambda deployment request","properties":{"additional_headers":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/SerdeableHeaderHashMap","description":"# Additional headers\n\nAdditional headers added to the discover/invoke requests to the deployment.\nWhen provided, this will overwrite all the headers previously configured for this deployment."}]},"arn":{"type":["string","null"],"description":"# ARN\n\nARN to use to discover/invoke the lambda deployment."},"assume_role_arn":{"type":["string","null"],"description":"# Assume role ARN\n\nOptional ARN of a role to assume when invoking the addressed Lambda, to support role chaining."},"dry_run":{"type":"boolean","description":"# Dry-run mode\n\nIf `true`, discovery will run but the deployment will not be registered.\nThis is useful to see the impact of a new deployment before registering it."},"overwrite":{"type":"boolean","description":"# Overwrite\n\nIf `true`, the update will overwrite the schema information, including the exposed service and handlers and service configuration, allowing **breaking changes** too. Use with caution."}}}]},"UpdateKafkaClusterRequest":{"type":"object","description":"Update Kafka cluster request","required":["properties"],"properties":{"properties":{"type":"object","description":"# Properties\n\nUpdated Kafka cluster configuration properties. Must contain either\n'bootstrap.servers' or 'metadata.broker.list'.\n\nFor a full list of configuration properties, check the [librdkafka documentation](https://github.com/confluentinc/librdkafka/blob/master/CONFIGURATION.md).","additionalProperties":{"type":"string"},"propertyNames":{"type":"string"}}}},"UpsertRuleRequest":{"type":"object","description":"One entry in the body of `PUT /limits/rules`.\n\nEach entry carries a fully-specified rule body plus an optional\n[`Precondition`]. Omitting the `precondition` field defaults to\n`Precondition::None` (unconditional upsert).","required":["pattern"],"properties":{"description":{"type":["string","null"],"description":"Free-form description shown in the rule book; not consulted at\nruntime."},"disabled":{"type":"boolean","description":"Soft-tombstone toggle. `true` parks the rule (the runtime treats\nit as absent) without removing it."},"limits":{"$ref":"#/components/schemas/UserLimits"},"pattern":{"type":"string","description":"The pattern that selects which scope/limit-key combinations the\nrule applies to. Examples: `\"*\"`, `\"scope1/*\"`, `\"scope1/foo/bar\"`."},"precondition":{"$ref":"#/components/schemas/Precondition","description":"Optimistic-concurrency guard. `{ \"type\": \"matches\", \"version\": v }`\nrequires the rule's current version to be `v`;\n`{ \"type\": \"does_not_exist\" }` requires the rule to be absent\n(strict insert); `{ \"type\": \"none\" }` (or omitted) is\nunconditional."}}},"UserLimits":{"type":"object","description":"Per-rule effective limits.\n\n`None` on a field means \"unlimited\" (no rule constrains this dimension).\nUnder the `bilrost` feature this type is also the wire shape persisted\ninside [`crate::PersistedRule`]; under `serde` it's the JSON wire shape\nfor the admin REST model — adding a new limit kind here means allocating\na fresh `bilrost(tag(...))` next to the new field.","properties":{"concurrency":{"type":["integer","null"],"format":"int32","description":"Maximum concurrent running invocations. `None` means unlimited.","minimum":1}}},"Version":{"type":"integer","format":"int32","description":"A type used for versioned metadata.","minimum":0},"VersionInformation":{"type":"object","description":"Admin API version information","required":["version","min_admin_api_version","max_admin_api_version","features"],"properties":{"features":{"type":"object","description":"# Restate experimental features\n\nList experimental features with their\nenabled state.","additionalProperties":{"type":"boolean"},"propertyNames":{"type":"string"}},"ingress_endpoint":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AdvertisedAddress-http-ingress-server_HttpIngressPort","description":"# Ingress endpoint\n\nIngress endpoint that the Web UI should use to interact with."}]},"max_admin_api_version":{"type":"integer","format":"int32","description":"# Max admin API version\n\nMaximum supported admin API version by the admin server","minimum":0},"min_admin_api_version":{"type":"integer","format":"int32","description":"# Min admin API version\n\nMinimum supported admin API version by the admin server","minimum":0},"version":{"type":"string","description":"# Admin server version\n\nVersion of the admin server"}}},"u32":{"type":"integer","format":"int32","minimum":0}},"responses":{"BadRequest":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDescriptionResponse"}}}},"Conflict":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDescriptionResponse"}}}},"InternalServerError":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDescriptionResponse"}}}},"MethodNotAllowed":{"description":"Method not allowed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDescriptionResponse"}}}},"NotFound":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDescriptionResponse"}}}},"UnprocessableEntity":{"description":"Unprocessable entity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDescriptionResponse"}}}}}},"tags":[{"name":"deployment","description":"Service Deployment management"},{"name":"invocation","description":"Invocation management","externalDocs":{"url":"https://docs.restate.dev/operate/invocation","description":"Invocations documentation"}},{"name":"subscription","description":"Subscription management","externalDocs":{"url":"https://docs.restate.dev/operate/invocation#managing-kafka-subscriptions","description":"Kafka subscriptions documentation"}},{"name":"kafka_cluster","description":"Kafka cluster management"},{"name":"service","description":"Service management"},{"name":"service_handler","description":"Service handlers metadata"},{"name":"cluster_health","description":"Cluster health"},{"name":"health","description":"Admin API health"},{"name":"version","description":"API Version"},{"name":"introspection","description":"System introspection"},{"name":"rule","description":"Limiter rule book management"}],"externalDocs":{"url":"https://docs.restate.dev/operate/","description":"Restate operations documentation"}}