REST API endpoints for artifact metadata

Use these endpoints to retrieve and manage metadata for artifacts in your organization. Artifact metadata provides information about build artifacts, their provenance, and related details.

You can use these endpoints to upload storage and deployment records for software that your organization builds with GitHub Actions. The records are displayed on the organization's linked artifacts page. See About linked artifacts.

Note

Most endpoints use Authorization: Bearer <YOUR-TOKEN> and Accept: application/vnd.github+json headers, plus X-GitHub-Api-Version: 2026-03-10. Curl examples below omit these standard headers for brevity.

Create an artifact deployment record

POST /orgs/{org}/artifacts/metadata/deployment-record

Create or update deployment records for an artifact associated
with an organization.
This endpoint allows you to record information about a specific
artifact, such as its name, digest, environments, cluster, and
deployment.
The deployment name has to be uniqe within a cluster (i.e a
combination of logical, physical environment and cluster) as it
identifies unique deployment.
Multiple requests for the same combination of logical, physical
environment, cluster and deployment name will only create one
record, successive request will update the existing record.
This allows for a stable tracking of a deployment where the actual
deployed artifact can change over time.

Parameters

Headers

Path and query parameters

Body parameters

HTTP response status codes

Code examples

Example

Request:

curl -L \
  -X POST \
  https://api.github.com/orgs/ORG/artifacts/metadata/deployment-record \
  -d '{
  "name": "awesome-image",
  "digest": "sha256:1bb1e949e55dcefc6353e7b36c8897d2a107d8e8dca49d4e3c0ea8493fc0bc72",
  "status": "deployed",
  "logical_environment": "prod",
  "physical_environment": "pacific-east",
  "cluster": "moda-1",
  "deployment_name": "deployment-pod",
  "tags": {
    "data-access": "sensitive"
  }
}'

Response schema (Status: 200):

Set cluster deployment records

POST /orgs/{org}/artifacts/metadata/deployment-record/cluster/{cluster}

Set deployment records for a given cluster.
If proposed records in the 'deployments' field have identical 'cluster', 'logical_environment',
'physical_environment', and 'deployment_name' values as existing records, the existing records will be updated.
If no existing records match, new records will be created.
Note: Artifacts are uniquely identified by the combination of their repository and digest fields. If two entries in the deployments
array resolve to the same repository and have identical digest fields but differing name and version fields, the endpoint will use
the artifact name and version from the record processed first, since a single artifact (identified by repository and digest) can
only have one name and version.

Parameters

Headers

Path and query parameters

Body parameters

HTTP response status codes

Code examples

Example 1: Status Code 200

Request:

curl -L \
  -X POST \
  https://api.github.com/orgs/ORG/artifacts/metadata/deployment-record/cluster/CLUSTER \
  -d '{
  "logical_environment": "prod",
  "physical_environment": "pacific-east",
  "deployments": [
    {
      "name": "awesome-image",
      "digest": "sha256:1bb1e949e55dcefc6353e7b36c8897d2a107d8e8dca49d4e3c0ea8493fc0bc72",
      "version": "2.1.0",
      "status": "deployed",
      "deployment_name": "deployment-pod",
      "tags": {
        "owning-team": "platform"
      },
      "runtime_risks": [
        "sensitive-data"
      ]
    }
  ]
}'

Response schema (Status: 200):

Same response schema as Create an artifact deployment record.

Example 2: Status Code 207

Request:

curl -L \
  -X POST \
  https://api.github.com/orgs/ORG/artifacts/metadata/deployment-record/cluster/CLUSTER \
  -d '{
  "logical_environment": "prod",
  "physical_environment": "pacific-east",
  "deployments": [
    {
      "name": "awesome-image",
      "digest": "sha256:1bb1e949e55dcefc6353e7b36c8897d2a107d8e8dca49d4e3c0ea8493fc0bc72",
      "version": "2.1.0",
      "status": "deployed",
      "deployment_name": "deployment-pod",
      "tags": {
        "owning-team": "platform"
      },
      "runtime_risks": [
        "sensitive-data"
      ]
    }
  ]
}'

Response schema (Status: 207):

Create a cluster deployment records job

POST /orgs/{org}/artifacts/metadata/deployment-record/cluster/{cluster}/jobs

Create a background job to set deployment records for a given cluster.
Performs validation and permission checks synchronously, returning rejected
deployments immediately, then enqueues a background job for the actual
deployment updates. Use the companion GET endpoint to poll for job status.

Parameters

Headers

Path and query parameters

Body parameters

HTTP response status codes

Code examples

Example

Request:

curl -L \
  -X POST \
  https://api.github.com/orgs/ORG/artifacts/metadata/deployment-record/cluster/CLUSTER/jobs \
  -d '{
  "logical_environment": "prod",
  "physical_environment": "pacific-east",
  "deployments": [
    {
      "name": "awesome-image",
      "digest": "sha256:1bb1e949e55dcefc6353e7b36c8897d2a107d8e8dca49d4e3c0ea8493fc0bc72",
      "version": "2.1.0",
      "status": "deployed",
      "deployment_name": "deployment-pod",
      "tags": {
        "owning-team": "platform"
      },
      "runtime_risks": [
        "sensitive-data"
      ]
    }
  ]
}'

Response schema (Status: 202):

Get cluster deployment records job status

GET /orgs/{org}/artifacts/metadata/deployment-record/cluster/{cluster}/jobs/{job_id}

Get the status and results of a previously created cluster deployment records job.

Parameters

Headers

Path and query parameters

HTTP response status codes

Code examples

Example

Request:

curl -L \
  -X GET \
  https://api.github.com/orgs/ORG/artifacts/metadata/deployment-record/cluster/CLUSTER/jobs/JOB_ID

Response schema (Status: 200):

Create artifact metadata storage record

POST /orgs/{org}/artifacts/metadata/storage-record

Create metadata storage records for artifacts associated with an organization.
This endpoint will create a new artifact storage record on behalf of any artifact matching the provided digest and
associated with a repository owned by the organization.

Parameters

Headers

Path and query parameters

Body parameters

HTTP response status codes

Code examples

Example

Request:

curl -L \
  -X POST \
  https://api.github.com/orgs/ORG/artifacts/metadata/storage-record \
  -d '{
  "name": "libfoo",
  "version": "1.2.3",
  "digest": "sha256:1bb1e949e55dcefc6353e7b36c8897d2a107d8e8dca49d4e3c0ea8493fc0bc72",
  "artifact_url": "https://reg.example.com/artifactory/bar/libfoo-1.2.3",
  "registry_url": "https://reg.example.com/artifactory/",
  "repository": "bar",
  "status": "active"
}'

Response schema (Status: 200):

List artifact deployment records

GET /orgs/{org}/artifacts/{subject_digest}/metadata/deployment-records

List deployment records for an artifact metadata associated with an organization.

Parameters

Headers

Path and query parameters

HTTP response status codes

Code examples

Example

Request:

curl -L \
  -X GET \
  https://api.github.com/orgs/ORG/artifacts/SUBJECT_DIGEST/metadata/deployment-records

Response schema (Status: 200):

List artifact storage records

GET /orgs/{org}/artifacts/{subject_digest}/metadata/storage-records

List artifact storage records with a given subject digest for repositories owned by an organization.
Results are filtered by the authenticated user's permissions; records for repositories the user cannot read are omitted. Fine-grained access tokens require the artifact-metadata:read permission.

Parameters

Headers

Path and query parameters

HTTP response status codes

Code examples

Example

Request:

curl -L \
  -X GET \
  https://api.github.com/orgs/ORG/artifacts/SUBJECT_DIGEST/metadata/storage-records

Response schema (Status: 200):