Oore CI

Releases

Store releases — staged rollout records with pause, halt, resume, complete and approval. Release environments on a project, such as internal, beta and production, and promotion of a build between them without a new build.

GET
/v1/projects/{project_id}/environments

Environments in promotion order, each with its newest release, plus pending promotions and the most recent decided ones.

Authorization

bearer_auth
AuthorizationBearer <token>

In: header

Path Parameters

project_id*string

Project ID

Response Body

application/json

application/json

curl -X GET "https://example.com/v1/projects/string/environments"
{  "environments": [    {      "approval_required": true,      "approvers": {        "role": null,        "users": [          {            "email": "string",            "user_id": "string"          }        ]      },      "created_at": 0,      "id": "string",      "key": "string",      "latest_release": null,      "name": "string",      "position": 0,      "project_id": "string",      "promotable": true,      "rollout_policy": {        "approval": "none",        "crash_rate_threshold": 0,        "interval_hours": 0.1,        "steps": [          0.1        ]      },      "store": "google_play",      "submit_for_review": true,      "track": "string",      "updated_at": 0    }  ],  "promotions": [    {      "build_id": "string",      "build_number": 0,      "can_decide": true,      "created_at": 0,      "decided_at": 0,      "decided_by_email": "string",      "decision_reason": "string",      "environment_id": "string",      "environment_name": "string",      "error": "string",      "id": "string",      "project_id": "string",      "reason": "string",      "release_id": "string",      "requested_by_email": "string",      "source_environment_name": "string",      "source_release_id": "string",      "source_track": "string",      "state": "pending",      "updated_at": 0,      "version_code": 0,      "version_name": "string"    }  ]}
POST
/v1/projects/{project_id}/environments

Adds an environment at the end of the promotion path. Requires the project maintainer role. A release recorded on the environment's store and track belongs to it.

Authorization

bearer_auth
AuthorizationBearer <token>

In: header

Path Parameters

project_id*string

Project ID

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/v1/projects/string/environments" \  -H "Content-Type: application/json" \  -d '{    "key": "string",    "name": "string",    "store": "google_play",    "track": "string"  }'
{  "approval_required": true,  "approvers": {    "role": null,    "users": [      {        "email": "string",        "user_id": "string"      }    ]  },  "created_at": 0,  "id": "string",  "key": "string",  "latest_release": null,  "name": "string",  "position": 0,  "project_id": "string",  "promotable": true,  "rollout_policy": {    "approval": "none",    "crash_rate_threshold": 0,    "interval_hours": 0.1,    "steps": [      0.1    ]  },  "store": "google_play",  "submit_for_review": true,  "track": "string",  "updated_at": 0}
PATCH
/v1/projects/{project_id}/environments/{environment_id}

Changes the name, track, approval rule, rollout policy or position. Requires the project maintainer role.

Authorization

bearer_auth
AuthorizationBearer <token>

In: header

Path Parameters

project_id*string

Project ID

environment_id*string

Environment ID

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Changes to an environment. The key and store are fixed once created.

Response Body

application/json

application/json

application/json

application/json

application/json

curl -X PATCH "https://example.com/v1/projects/string/environments/string" \  -H "Content-Type: application/json" \  -d '{}'
{  "approval_required": true,  "approvers": {    "role": null,    "users": [      {        "email": "string",        "user_id": "string"      }    ]  },  "created_at": 0,  "id": "string",  "key": "string",  "latest_release": null,  "name": "string",  "position": 0,  "project_id": "string",  "promotable": true,  "rollout_policy": {    "approval": "none",    "crash_rate_threshold": 0,    "interval_hours": 0.1,    "steps": [      0.1    ]  },  "store": "google_play",  "submit_for_review": true,  "track": "string",  "updated_at": 0}
DELETE
/v1/projects/{project_id}/environments/{environment_id}

Its releases stay without an environment; its promotions are removed. Requires the project maintainer role.

Authorization

bearer_auth
AuthorizationBearer <token>

In: header

Path Parameters

project_id*string

Project ID

environment_id*string

Environment ID

Response Body

application/json

application/json

application/json

application/json

curl -X DELETE "https://example.com/v1/projects/string/environments/string"
{  "ok": true}
POST
/v1/projects/{project_id}/promotions

Puts the version a build's live Google Play release already uploaded on the environment's track and records a release with the environment's rollout policy. Nothing is rebuilt. Promoting straight in requires the maintainer role; when the environment requires approval, a developer may ask and the promotion waits as pending without touching the store. Writes an audit log entry.

Authorization

bearer_auth
AuthorizationBearer <token>

In: header

Path Parameters

project_id*string

Project ID

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/v1/projects/string/promotions" \  -H "Content-Type: application/json" \  -d '{    "build_id": "string",    "environment_id": "string"  }'
{  "build_id": "string",  "build_number": 0,  "can_decide": true,  "created_at": 0,  "decided_at": 0,  "decided_by_email": "string",  "decision_reason": "string",  "environment_id": "string",  "environment_name": "string",  "error": "string",  "id": "string",  "project_id": "string",  "reason": "string",  "release_id": "string",  "requested_by_email": "string",  "source_environment_name": "string",  "source_release_id": "string",  "source_track": "string",  "state": "pending",  "updated_at": 0,  "version_code": 0,  "version_name": "string"}
POST
/v1/projects/{project_id}/promotions/{promotion_id}/approve

Approves a pending promotion and makes the store change as the approver. Requires one of the environment's approvers (by default any maintainer). API tokens cannot decide promotions. Writes an audit log entry.

Authorization

bearer_auth
AuthorizationBearer <token>

In: header

Path Parameters

project_id*string

Project ID

promotion_id*string

Promotion ID

Request Body

application/json

Optional reason

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/v1/projects/string/promotions/string/approve"
{  "build_id": "string",  "build_number": 0,  "can_decide": true,  "created_at": 0,  "decided_at": 0,  "decided_by_email": "string",  "decision_reason": "string",  "environment_id": "string",  "environment_name": "string",  "error": "string",  "id": "string",  "project_id": "string",  "reason": "string",  "release_id": "string",  "requested_by_email": "string",  "source_environment_name": "string",  "source_release_id": "string",  "source_track": "string",  "state": "pending",  "updated_at": 0,  "version_code": 0,  "version_name": "string"}
POST
/v1/projects/{project_id}/promotions/{promotion_id}/reject

Rejects a pending promotion; nothing changes at the store. Requires one of the environment's approvers (by default any maintainer). API tokens cannot decide promotions. Writes an audit log entry.

Authorization

bearer_auth
AuthorizationBearer <token>

In: header

Path Parameters

project_id*string

Project ID

promotion_id*string

Promotion ID

Request Body

application/json

Optional reason

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/v1/projects/string/promotions/string/reject"
{  "build_id": "string",  "build_number": 0,  "can_decide": true,  "created_at": 0,  "decided_at": 0,  "decided_by_email": "string",  "decision_reason": "string",  "environment_id": "string",  "environment_name": "string",  "error": "string",  "id": "string",  "project_id": "string",  "reason": "string",  "release_id": "string",  "requested_by_email": "string",  "source_environment_name": "string",  "source_release_id": "string",  "source_track": "string",  "state": "pending",  "updated_at": 0,  "version_code": 0,  "version_name": "string"}
GET
/v1/release-events

Recent release history entries across projects the caller can read, newest first.

Authorization

bearer_auth
AuthorizationBearer <token>

In: header

Query Parameters

project_id?string

Filter by project

limit?integer

Page size, 1 to 200 (default 50)

Formatint64

Response Body

application/json

application/json

curl -X GET "https://example.com/v1/release-events"
{  "events": [    {      "actor_email": "string",      "actor_id": "string",      "at": 0,      "from_fraction": 0,      "from_state": null,      "id": "string",      "reason": "string",      "to_fraction": 0,      "to_state": "uploading",      "build_id": "string",      "project_id": "string",      "project_name": "string",      "release_id": "string",      "store": "google_play",      "track": "string",      "version_name": "string"    }  ]}
GET
/v1/releases

Releases in projects the caller can read, newest first.

Authorization

bearer_auth
AuthorizationBearer <token>

In: header

Query Parameters

project_id?string

Filter by project

build_id?string

Filter by build

state?string

Filter by one state or comma-separated states

limit?integer

Page size, 1 to 200 (default 50)

Formatint64
offset?integer

Page offset (default 0)

Formatint64

Response Body

application/json

application/json

curl -X GET "https://example.com/v1/releases"
{  "releases": [    {      "allowed_actions": [        "raise"      ],      "approved_at": 0,      "approved_by_email": "string",      "artifact_id": "string",      "awaiting_approval": true,      "build_id": "string",      "build_number": 0,      "crash_rate": 0,      "crash_rate_threshold": 0,      "created_at": 0,      "environment_id": "string",      "environment_name": "string",      "health": "unknown",      "id": "string",      "next_fraction": 0,      "next_step_at": 0,      "package_name": "string",      "platform": "string",      "policy": {        "approval": "none",        "crash_rate_threshold": 0,        "interval_hours": 0.1,        "steps": [          0.1        ]      },      "project_id": "string",      "project_name": "string",      "promoted_from_release_id": "string",      "rollout_fraction": 0.1,      "state": "uploading",      "store": "google_play",      "track": "string",      "updated_at": 0,      "version_code": 0,      "version_name": "string"    }  ],  "total": 0}
POST
/v1/releases

Records a release for a succeeded build. Requires the project maintainer role.

Authorization

bearer_auth
AuthorizationBearer <token>

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/v1/releases" \  -H "Content-Type: application/json" \  -d '{    "build_id": "string",    "store": "google_play",    "track": "string"  }'
{  "allowed_actions": [    "raise"  ],  "approved_at": 0,  "approved_by_email": "string",  "artifact_id": "string",  "awaiting_approval": true,  "build_id": "string",  "build_number": 0,  "crash_rate": 0,  "crash_rate_threshold": 0,  "created_at": 0,  "environment_id": "string",  "environment_name": "string",  "health": "unknown",  "id": "string",  "next_fraction": 0,  "next_step_at": 0,  "package_name": "string",  "platform": "string",  "policy": {    "approval": "none",    "crash_rate_threshold": 0,    "interval_hours": 0.1,    "steps": [      0.1    ]  },  "project_id": "string",  "project_name": "string",  "promoted_from_release_id": "string",  "rollout_fraction": 0.1,  "state": "uploading",  "store": "google_play",  "track": "string",  "updated_at": 0,  "version_code": 0,  "version_name": "string"}
GET
/v1/releases/{release_id}

Release detail with its full state history, oldest first.

Authorization

bearer_auth
AuthorizationBearer <token>

In: header

Path Parameters

release_id*string

Release ID

Response Body

application/json

application/json

curl -X GET "https://example.com/v1/releases/string"
{  "history": [    {      "actor_email": "string",      "actor_id": "string",      "at": 0,      "from_fraction": 0,      "from_state": null,      "id": "string",      "reason": "string",      "to_fraction": 0,      "to_state": "uploading"    }  ],  "release": {    "allowed_actions": [      "raise"    ],    "approved_at": 0,    "approved_by_email": "string",    "artifact_id": "string",    "awaiting_approval": true,    "build_id": "string",    "build_number": 0,    "crash_rate": 0,    "crash_rate_threshold": 0,    "created_at": 0,    "environment_id": "string",    "environment_name": "string",    "health": "unknown",    "id": "string",    "next_fraction": 0,    "next_step_at": 0,    "package_name": "string",    "platform": "string",    "policy": {      "approval": "none",      "crash_rate_threshold": 0,      "interval_hours": 0.1,      "steps": [        0.1      ]    },    "project_id": "string",    "project_name": "string",    "promoted_from_release_id": "string",    "rollout_fraction": 0.1,    "state": "uploading",    "store": "google_play",    "track": "string",    "updated_at": 0,    "version_code": 0,    "version_name": "string"  }}
POST
/v1/releases/{release_id}/approve

Records the maintainer approval required by the release policy. Writes history, an audit log entry, and a release event.

Authorization

bearer_auth
AuthorizationBearer <token>

In: header

Path Parameters

release_id*string

Release ID

Request Body

application/json

Optional reason; fraction is accepted by raise only

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/v1/releases/string/approve"
{  "allowed_actions": [    "raise"  ],  "approved_at": 0,  "approved_by_email": "string",  "artifact_id": "string",  "awaiting_approval": true,  "build_id": "string",  "build_number": 0,  "crash_rate": 0,  "crash_rate_threshold": 0,  "created_at": 0,  "environment_id": "string",  "environment_name": "string",  "health": "unknown",  "id": "string",  "next_fraction": 0,  "next_step_at": 0,  "package_name": "string",  "platform": "string",  "policy": {    "approval": "none",    "crash_rate_threshold": 0,    "interval_hours": 0.1,    "steps": [      0.1    ]  },  "project_id": "string",  "project_name": "string",  "promoted_from_release_id": "string",  "rollout_fraction": 0.1,  "state": "uploading",  "store": "google_play",  "track": "string",  "updated_at": 0,  "version_code": 0,  "version_name": "string"}
POST
/v1/releases/{release_id}/complete

Rolls out to 100%. Requires maintainer. Writes history, an audit log entry, and a release event.

Authorization

bearer_auth
AuthorizationBearer <token>

In: header

Path Parameters

release_id*string

Release ID

Request Body

application/json

Optional reason; fraction is accepted by raise only

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/v1/releases/string/complete"
{  "allowed_actions": [    "raise"  ],  "approved_at": 0,  "approved_by_email": "string",  "artifact_id": "string",  "awaiting_approval": true,  "build_id": "string",  "build_number": 0,  "crash_rate": 0,  "crash_rate_threshold": 0,  "created_at": 0,  "environment_id": "string",  "environment_name": "string",  "health": "unknown",  "id": "string",  "next_fraction": 0,  "next_step_at": 0,  "package_name": "string",  "platform": "string",  "policy": {    "approval": "none",    "crash_rate_threshold": 0,    "interval_hours": 0.1,    "steps": [      0.1    ]  },  "project_id": "string",  "project_name": "string",  "promoted_from_release_id": "string",  "rollout_fraction": 0.1,  "state": "uploading",  "store": "google_play",  "track": "string",  "updated_at": 0,  "version_code": 0,  "version_name": "string"}
POST
/v1/releases/{release_id}/halt

Halts the rollout at the store. A halted release never advances until resumed. Requires developer or maintainer. Writes history, an audit log entry, and a release event.

Authorization

bearer_auth
AuthorizationBearer <token>

In: header

Path Parameters

release_id*string

Release ID

Request Body

application/json

Optional reason; fraction is accepted by raise only

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/v1/releases/string/halt"
{  "allowed_actions": [    "raise"  ],  "approved_at": 0,  "approved_by_email": "string",  "artifact_id": "string",  "awaiting_approval": true,  "build_id": "string",  "build_number": 0,  "crash_rate": 0,  "crash_rate_threshold": 0,  "created_at": 0,  "environment_id": "string",  "environment_name": "string",  "health": "unknown",  "id": "string",  "next_fraction": 0,  "next_step_at": 0,  "package_name": "string",  "platform": "string",  "policy": {    "approval": "none",    "crash_rate_threshold": 0,    "interval_hours": 0.1,    "steps": [      0.1    ]  },  "project_id": "string",  "project_name": "string",  "promoted_from_release_id": "string",  "rollout_fraction": 0.1,  "state": "uploading",  "store": "google_play",  "track": "string",  "updated_at": 0,  "version_code": 0,  "version_name": "string"}
POST
/v1/releases/{release_id}/pause

Stops scheduled steps. Requires developer or maintainer. Writes history, an audit log entry, and a release event.

Authorization

bearer_auth
AuthorizationBearer <token>

In: header

Path Parameters

release_id*string

Release ID

Request Body

application/json

Optional reason; fraction is accepted by raise only

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/v1/releases/string/pause"
{  "allowed_actions": [    "raise"  ],  "approved_at": 0,  "approved_by_email": "string",  "artifact_id": "string",  "awaiting_approval": true,  "build_id": "string",  "build_number": 0,  "crash_rate": 0,  "crash_rate_threshold": 0,  "created_at": 0,  "environment_id": "string",  "environment_name": "string",  "health": "unknown",  "id": "string",  "next_fraction": 0,  "next_step_at": 0,  "package_name": "string",  "platform": "string",  "policy": {    "approval": "none",    "crash_rate_threshold": 0,    "interval_hours": 0.1,    "steps": [      0.1    ]  },  "project_id": "string",  "project_name": "string",  "promoted_from_release_id": "string",  "rollout_fraction": 0.1,  "state": "uploading",  "store": "google_play",  "track": "string",  "updated_at": 0,  "version_code": 0,  "version_name": "string"}
POST
/v1/releases/{release_id}/raise

Raises the rollout to fraction, or to the next policy step. Raising to 1 completes the release. Requires maintainer. Writes history, an audit log entry, and a release event.

Authorization

bearer_auth
AuthorizationBearer <token>

In: header

Path Parameters

release_id*string

Release ID

Request Body

application/json

Optional reason; fraction is accepted by raise only

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/v1/releases/string/raise"
{  "allowed_actions": [    "raise"  ],  "approved_at": 0,  "approved_by_email": "string",  "artifact_id": "string",  "awaiting_approval": true,  "build_id": "string",  "build_number": 0,  "crash_rate": 0,  "crash_rate_threshold": 0,  "created_at": 0,  "environment_id": "string",  "environment_name": "string",  "health": "unknown",  "id": "string",  "next_fraction": 0,  "next_step_at": 0,  "package_name": "string",  "platform": "string",  "policy": {    "approval": "none",    "crash_rate_threshold": 0,    "interval_hours": 0.1,    "steps": [      0.1    ]  },  "project_id": "string",  "project_name": "string",  "promoted_from_release_id": "string",  "rollout_fraction": 0.1,  "state": "uploading",  "store": "google_play",  "track": "string",  "updated_at": 0,  "version_code": 0,  "version_name": "string"}
POST
/v1/releases/{release_id}/resume

Resumes a paused or halted release; the next step is one interval away. Requires maintainer. Writes history, an audit log entry, and a release event.

Authorization

bearer_auth
AuthorizationBearer <token>

In: header

Path Parameters

release_id*string

Release ID

Request Body

application/json

Optional reason; fraction is accepted by raise only

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/v1/releases/string/resume"
{  "allowed_actions": [    "raise"  ],  "approved_at": 0,  "approved_by_email": "string",  "artifact_id": "string",  "awaiting_approval": true,  "build_id": "string",  "build_number": 0,  "crash_rate": 0,  "crash_rate_threshold": 0,  "created_at": 0,  "environment_id": "string",  "environment_name": "string",  "health": "unknown",  "id": "string",  "next_fraction": 0,  "next_step_at": 0,  "package_name": "string",  "platform": "string",  "policy": {    "approval": "none",    "crash_rate_threshold": 0,    "interval_hours": 0.1,    "steps": [      0.1    ]  },  "project_id": "string",  "project_name": "string",  "promoted_from_release_id": "string",  "rollout_fraction": 0.1,  "state": "uploading",  "store": "google_play",  "track": "string",  "updated_at": 0,  "version_code": 0,  "version_name": "string"}
GET
/v1/store-vitals

Google Play crash and ANR rates with top issues, and App Store hang rate and launch time, for every app the caller's projects released to a store. The daemon reads the stores every few hours with the projects' publishing credentials and serves its latest copy.

Authorization

bearer_auth
AuthorizationBearer <token>

In: header

Response Body

application/json

curl -X GET "https://example.com/v1/store-vitals"
{  "apps": [    {      "app_identifier": "string",      "error": "string",      "issues": [        {          "cause": "string",          "kind": "string",          "last_reported_at": 0,          "location": "string",          "reports": 0,          "url": "string",          "users": 0        }      ],      "project_id": "string",      "project_name": "string",      "refreshed_at": 0,      "store": "google_play",      "vitals": [        {          "kind": "crash_rate",          "points": [            {              "label": "string",              "value": 0            }          ],          "threshold": 0,          "unit": "string",          "value": 0        }      ]    }  ]}
POST
/v1/store-vitals/refresh

Asks the daemon to read the stores now for the caller's apps, for example right after granting a missing permission. Waits up to 20 seconds for the reads and returns what has been read by then. Apps read in the last 30 seconds are not read again.

Authorization

bearer_auth
AuthorizationBearer <token>

In: header

Response Body

application/json

curl -X POST "https://example.com/v1/store-vitals/refresh"
{  "apps": [    {      "app_identifier": "string",      "error": "string",      "issues": [        {          "cause": "string",          "kind": "string",          "last_reported_at": 0,          "location": "string",          "reports": 0,          "url": "string",          "users": 0        }      ],      "project_id": "string",      "project_name": "string",      "refreshed_at": 0,      "store": "google_play",      "vitals": [        {          "kind": "crash_rate",          "points": [            {              "label": "string",              "value": 0            }          ],          "threshold": 0,          "unit": "string",          "value": 0        }      ]    }  ]}