openapi: 3.0.3 info: title: Turborepo Remote Cache analytics artifacts API description: 'The Turborepo Remote Cache API specification defines the HTTP interface that any remote cache server must implement to be compatible with Turborepo. This spec enables self-hosted remote caching, allowing teams to run their own cache servers. The remote cache stores build artifacts (outputs from tasks like `build`, `lint`, `test`) identified by content-addressable hashes. When Turborepo encounters a task that matches a previously cached result, it can download the artifact instead of re-executing the task.' version: 1.0.0 license: name: MIT url: https://opensource.org/licenses/MIT contact: name: Turborepo url: https://turbo.build servers: - url: '{protocol}://{host}' description: Self-hosted Remote Cache Server variables: protocol: default: https enum: - http - https description: Protocol to use for the remote cache server host: default: localhost:3000 description: Hostname and port of the remote cache server - url: https://api.vercel.com description: 'Vercel Remote Cache (reference implementation) (spec: https://openapi.vercel.com)' tags: - name: artifacts description: Operations for managing cache artifacts paths: /artifacts/status: get: operationId: getArtifactStatus summary: Get remote caching status description: 'Check the status of Remote Caching for the authenticated user or team. Returns a JSON-encoded status indicating if Remote Caching is enabled, disabled, or disabled due to usage limits. Implementers should return `enabled` if the authenticated principal is allowed to use the cache, or `disabled` if not. The `over_limit` and `paused` statuses are optional and can be used to indicate usage limits or temporary suspension.' tags: - artifacts security: - bearerToken: [] parameters: - $ref: '#/components/parameters/TeamId' - $ref: '#/components/parameters/Slug' responses: '200': description: Remote caching status retrieved successfully content: application/json: schema: $ref: '#/components/schemas/CachingStatusResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' /artifacts/{hash}: parameters: - $ref: '#/components/parameters/ArtifactHash' - $ref: '#/components/parameters/TeamId' - $ref: '#/components/parameters/Slug' head: operationId: artifactExists summary: Check if artifact exists description: 'Check that a cache artifact with the given `hash` exists. This request returns response headers only and is equivalent to a `GET` request to this endpoint where the response contains no body. Implementers should return 200 if the artifact exists, or 404 if it does not.' tags: - artifacts security: - bearerToken: [] responses: '200': description: Artifact exists headers: Content-Length: description: The size of the artifact in bytes schema: type: integer x-artifact-duration: description: The time taken to generate the artifact in milliseconds (if stored) schema: type: integer x-artifact-sha: description: The git SHA of the commit that produced this artifact (if stored) schema: type: string x-artifact-dirty-hash: description: A hash summarizing uncommitted changes in the working tree when this artifact was produced (if stored) schema: type: string '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/ArtifactNotFound' get: operationId: downloadArtifact summary: Download a cache artifact description: 'Downloads a cache artifact identified by its `hash` specified on the request path. The artifact is downloaded as an octet-stream (binary data). The artifact data is a gzip-compressed tarball containing the cached task outputs. The client will verify the content-length header against the response body size.' tags: - artifacts security: - bearerToken: [] parameters: - $ref: '#/components/parameters/ArtifactClientCI' - $ref: '#/components/parameters/ArtifactClientInteractive' responses: '200': description: Artifact downloaded successfully headers: Content-Length: description: The size of the artifact in bytes schema: type: integer x-artifact-duration: description: The time taken to generate the artifact in milliseconds schema: type: integer x-artifact-tag: description: The signature/tag of the artifact for verification. This value was provided during upload and can be used by the client to verify artifact integrity. schema: type: string x-artifact-sha: description: The git SHA of the commit that produced this artifact. This value was provided during upload. schema: type: string x-artifact-dirty-hash: description: A hash summarizing uncommitted changes in the working tree when this artifact was produced. This value was provided during upload. schema: type: string content: application/octet-stream: schema: type: string format: binary description: Gzip-compressed tarball containing the cached task outputs '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/ArtifactNotFound' put: operationId: uploadArtifact summary: Upload a cache artifact description: 'Uploads a cache artifact identified by the `hash` specified on the path. The cache artifact can then be downloaded with the provided `hash`. The request body should contain a gzip-compressed tarball of the task outputs. The server should store this data and make it available for subsequent downloads.' tags: - artifacts security: - bearerToken: [] parameters: - name: Content-Length in: header required: true description: The artifact size in bytes schema: type: integer minimum: 0 - name: x-artifact-duration in: header required: false description: The time taken to generate the artifact in milliseconds. This value is stored and returned when the artifact is downloaded. schema: type: integer minimum: 0 - name: x-artifact-tag in: header required: false description: A base64-encoded tag for this artifact, typically used for verification. This value is stored and returned when the artifact is downloaded via the `x-artifact-tag` response header. schema: type: string maxLength: 600 - name: x-artifact-sha in: header required: false description: The git SHA of the HEAD commit at the time this artifact was produced. This value is stored and returned when the artifact is downloaded or checked via the `x-artifact-sha` response header. schema: type: string - name: x-artifact-dirty-hash in: header required: false description: A hash summarizing all uncommitted changes (staged, unstaged, and untracked files) in the working tree when this artifact was produced. This value is stored and returned when the artifact is downloaded or checked via the `x-artifact-dirty-hash` response header. schema: type: string - $ref: '#/components/parameters/ArtifactClientCI' - $ref: '#/components/parameters/ArtifactClientInteractive' requestBody: required: true description: The artifact data as a gzip-compressed tarball content: application/octet-stream: schema: type: string format: binary responses: '200': description: Artifact uploaded successfully (alternative success response) content: application/json: schema: $ref: '#/components/schemas/ArtifactUploadResponse' '202': description: Artifact accepted for storage content: application/json: schema: $ref: '#/components/schemas/ArtifactUploadResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' /artifacts: post: operationId: queryArtifacts summary: Query artifact information description: 'Query information about multiple artifacts by their hashes. Returns metadata about each artifact including size, task duration, and tag. This endpoint is optional for basic cache functionality but enables optimized cache fetching by allowing the client to query multiple artifacts in a single request.' tags: - artifacts security: - bearerToken: [] parameters: - $ref: '#/components/parameters/TeamId' - $ref: '#/components/parameters/Slug' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ArtifactQueryRequest' responses: '200': description: Artifact information retrieved successfully content: application/json: schema: $ref: '#/components/schemas/ArtifactQueryResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' components: schemas: CachingStatusResponse: type: object required: - status properties: status: $ref: '#/components/schemas/CachingStatus' ArtifactError: type: object required: - error properties: error: type: object required: - message properties: message: type: string description: Error message describing why the artifact information could not be retrieved CachingStatus: type: string enum: - disabled - enabled - over_limit - paused description: 'The status of remote caching for the authenticated principal. - `enabled`: Remote caching is enabled and available - `disabled`: Remote caching is disabled - `over_limit`: Remote caching is disabled due to usage limits (optional) - `paused`: Remote caching is temporarily paused (optional)' ArtifactInfo: type: object required: - size - taskDurationMs properties: size: type: integer description: The size of the artifact in bytes taskDurationMs: type: integer description: The time taken to generate the artifact in milliseconds tag: type: string description: The artifact tag/signature for verification ArtifactQueryResponse: type: object additionalProperties: nullable: true oneOf: - $ref: '#/components/schemas/ArtifactInfo' - $ref: '#/components/schemas/ArtifactError' description: A map of artifact hashes to their information. The value is `null` if the artifact was not found. Error: type: object required: - code - message properties: code: type: string description: A machine-readable error code message: type: string description: A human-readable error message ArtifactUploadResponse: type: object required: - urls properties: urls: type: array items: type: string format: uri description: Array of URLs where the artifact was stored. Implementers can return the storage location(s) for debugging purposes. ArtifactQueryRequest: type: object required: - hashes properties: hashes: type: array items: type: string description: Array of artifact hashes to query parameters: ArtifactClientInteractive: name: x-artifact-client-interactive in: header required: false description: Indicates whether the client is running in an interactive shell. `1` for interactive, `0` for non-interactive (CI/scripts). schema: type: integer enum: - 0 - 1 TeamId: name: teamId in: query required: false description: The team identifier to perform the request on behalf of. Used for multi-tenant cache implementations where artifacts are scoped to teams. schema: type: string Slug: name: slug in: query required: false description: The team slug to perform the request on behalf of. Alternative to `teamId` for identifying the team. schema: type: string ArtifactClientCI: name: x-artifact-client-ci in: header required: false description: 'The continuous integration or delivery environment where this artifact operation is being performed. Examples: `github-actions`, `circleci`, `jenkins`.' schema: type: string maxLength: 50 ArtifactHash: name: hash in: path required: true description: The artifact hash. This is a content-addressable hash that uniquely identifies the cached artifact based on task inputs. schema: type: string pattern: ^[a-fA-F0-9]+$ minLength: 1 responses: Forbidden: description: Forbidden. The authenticated user does not have permission to access this resource. content: application/json: schema: $ref: '#/components/schemas/Error' ArtifactNotFound: description: Artifact not found. No artifact with the specified hash exists. content: application/json: schema: $ref: '#/components/schemas/Error' Unauthorized: description: Unauthorized. The request is missing a valid authentication token or the token is invalid. content: application/json: schema: $ref: '#/components/schemas/Error' BadRequest: description: Bad request. One or more of the provided values in the request query, headers, or body is invalid. content: application/json: schema: $ref: '#/components/schemas/Error' securitySchemes: bearerToken: type: http scheme: bearer description: 'Bearer token authentication. Pass your authentication token in the `Authorization` header as `Bearer `. For self-hosted implementations, the token format and validation logic is up to the implementer. Common approaches include: - Static tokens for simple setups - JWT tokens for stateless authentication - OAuth2 tokens for integration with identity providers'