Prefect REST API Overview
Both Prefect Cloud and locally run Prefect servers host a REST API that gives you access to many observability, coordination, and account management functions of the platform.
Prefect Cloud REST API documentation is available at https://app.prefect.cloud/api/docs.
The Prefect REST API documentation for locally run open-source Prefect servers is available in the Prefect REST API Reference.
Prefect REST API interactive documentation
If you are running a local instance of the Prefect server with prefect server start, the Prefect REST API documentation for your instance is available at http://localhost:4200/docs or the /docs endpoint of the PREFECT_API_URL you have configured to access the server.
REST Guidelines¶
The Prefect REST API adheres to the following guidelines:
- Collection names are pluralized (for example,
/flowsor/runs). - We indicate variable placeholders with colons:
GET /flows/:id. - We use snake case for route names:
GET /task_runs. - We avoid nested resources unless there is no possibility of accessing the child resource outside the parent context. For example, we query
/task_runswith a flow run filter instead of accessing/flow_runs/:id/task_runs. - The API is hosted with an
/api/:versionprefix that (optionally) allows versioning in the future. By convention, we treat that as part of the base URL and do not include that in API examples. - Filtering, sorting, and pagination parameters are provided in the request body of
POSTrequests where applicable.- Pagination parameters are
limitandoffset. - Sorting is specified with a single
sortparameter. - See more information on filtering below.
- Pagination parameters are
HTTP verbs¶
GET,PUTandDELETErequests are always idempotent.POSTandPATCHare not guaranteed to be idempotent.GETrequests cannot receive information from the request body.POSTrequests can receive information from the request body.POST /collectioncreates a new member of the collection.GET /collectionlists all members of the collection.GET /collection/:idgets a specific member of the collection by ID.DELETE /collection/:iddeletes a specific member of the collection.PUT /collection/:idcreates or replaces a specific member of the collection.PATCH /collection/:idpartially updates a specific member of the collection.POST /collection/actionis how we implement non-CRUD actions. For example, to set a flow run's state, we usePOST /flow_runs/:id/set_state.POST /collection/actionmay also be used for read-only queries. This is to allow us to send complex arguments as body arguments (which often cannot be done viaGET). Examples includePOST /flow_runs/filter,POST /flow_runs/count, andPOST /flow_runs/history.
Filtering¶
Objects can be filtered by providing filter criteria in the body of a POST request. When multiple criteria are specified, logical AND will be applied to the criteria.
Filter criteria are structured as follows:
{
"objects": {
"object_field": {
"field_operator_": <field_value>
}
}
}
In this example, objects is the name of the collection to filter over (for example, flows). The collection can be either the object being queried for (flows for POST /flows/filter) or a related object (flow_runs for POST /flows/filter).
object_field is the name of the field over which to filter (name for flows). Note that some objects may have nested object fields, such as {flow_run: {state: {type: {any_: []}}}}.
field_operator_ is the operator to apply to a field when filtering. Common examples include:
any_: return objects where this field matches any of the following values.is_null_: return objects where this field is or is not null.eq_: return objects where this field is equal to the following value.all_: return objects where this field matches all of the following values.before_: return objects where this datetime field is less than or equal to the following value.after_: return objects where this datetime field is greater than or equal to the following value.
For example, to query for flows with the tag "database" and failed flow runs, POST /flows/filter with the following request body:
{
"flows": {
"tags": {
"all_": ["database"]
}
},
"flow_runs": {
"state": {
"type": {
"any_": ["FAILED"]
}
}
}
}
OpenAPI¶
The Prefect REST API can be fully described with an OpenAPI 3.0 compliant document. OpenAPI is a standard specification for describing REST APIs.
To generate Prefect's complete OpenAPI document, run the following commands in an interactive Python session:
from prefect.server.api.server import create_app
app = create_app()
openapi_doc = app.openapi()
This document allows you to generate your own API client, explore the API using an API inspection tool, or write tests to ensure API compliance.