The REST API

Patchwork provides a REST API. This API can be used to retrieve and modify information about patches, projects and more.

This guide provides an overview of how one can interact with the REST API. For detailed information on type and response format of the various resources exposed by the API, refer to the auto-generated OpenAPI documentation at:

https://patchwork.example.com/api/docs

where patchwork.example.com refers to the URL of your Patchwork instance.

Changed in version 4.0: The OpenAPI schema is now auto-generated at runtime and served at /api/docs. Static schema files are no longer shipped.

Changed in version 4.0: The XML-RPC API has been removed. Use the REST API with clients like git-pw instead.

Getting Started

The easiest way to start experimenting with the API is to visit the auto-generated documentation at /api/docs.

REST APIs run over plain HTTP(S), thus, the API can be interfaced using applications or libraries that support this widespread protocol. One such application is curl, which can be used to both retrieve and send information to the REST API. For example, to get the version of the REST API for a Patchwork instance hosted at patchwork.example.com, run:

$ curl -s 'https://patchwork.example.com/api/1.4/' | python -m json.tool
{
    "bundles": "https://patchwork.example.com/api/1.4/bundles/",
    "covers": "https://patchwork.example.com/api/1.4/covers/",
    "events": "https://patchwork.example.com/api/1.4/events/",
    "patches": "https://patchwork.example.com/api/1.4/patches/",
    "people": "https://patchwork.example.com/api/1.4/people/",
    "projects": "https://patchwork.example.com/api/1.4/projects/",
    "series": "https://patchwork.example.com/api/1.4/series/",
    "users": "https://patchwork.example.com/api/1.4/users/"
}

Tools like curl and libraries like requests can be used to build anything from small utilities to full-fledged clients targeting the REST API. For an overview of existing API clients, refer to Clients.

Versioning

By default, all requests will receive the latest version of the API: currently 1.4:

GET /api HTTP/1.1

You should explicitly request this version through the URL to prevent API changes breaking your application:

GET /api/1.4 HTTP/1.1

Older API versions will be deprecated and removed over time.

API Version

Supported?

1.0

yes

1.1

yes

1.2

yes

1.3

yes

1.4

yes

Schema

Responses are returned as JSON. Blank fields are returned as null, rather than being omitted. Timestamps use the ISO 8601 format, times are in UTC:

YYYY-MM-DDTHH:MM:SSZ

Requests should use either query parameters or form-data, depending on the method.

The auto-generated OpenAPI schema is available at /api/docs and describes all endpoints, parameters, and response formats.

Parameters

For GET requests, parameters should be passed as HTTP query string parameters:

$ curl 'https://patchwork.example.com/api/patches?state=under-review'

For POST and PATCH requests, parameters should be encoded as JSON with a Content-Type of application/json:

$ curl -X PATCH \
  --header "Content-Type: application/json" \
  --data '{"state":"under-review"}' \
  'https://patchwork.example.com/api/patches/123/'

Authentication

Patchwork supports authentication using basic authentication (username and password) or token authentication (recommended).

To authenticate with a token, first obtain one from your profile page, then:

$ curl -H "Authorization: Token ${token}" \
    'https://patchwork.example.com/api/'

Not all resources require authentication. Those that do will return 404 (Not Found) if authentication is not provided.

Pagination

Requests that return multiple items are paginated by 30 items by default. You can change page using the ?page parameter and set custom page sizes up to 250 using the ?per_page parameter:

$ curl 'https://patchwork.example.com/api/patches?page=2&per_page=100'

The Link header includes pagination information:

Link: <https://patchwork.example.com/api/patches?page=3&per_page=100>; rel="next",
  <https://patchwork.example.com/api/patches?page=50&per_page=100>; rel="last"