Apps API
Manage essesseff apps, deployments, images, and retention policies
GET /accounts/{account_slug}/organizations/{organization_login}/apps
List essesseff apps
GET /api/v1/accounts/{account_slug}/organizations/{organization_login}/appsPath Parameters
account_slug (required)
The team account slug (name) associated with the API key. The API key must belong to this account.
organization_login (required)
GitHub organization login to list apps for
Description
Lists essesseff apps for a team account. Supports filtering by organization and app name. Returns app details including repository URLs, template information, and creation timestamps.
Query Parameters
app_name (optional)
Filter by app name (exact match). For single app operations, use the full path endpoint instead.
limit (optional)
Maximum number of results to return (default: 50)
offset (optional)
Number of results to skip for pagination (default: 0)
Request Example
curl -X GET \ "https://www.essesseff.com/api/v1/accounts/my-team/organizations/my-apps-org/apps" \ -H "X-API-Key: ess_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
With optional app_name filter:
curl -X GET \ "https://www.essesseff.com/api/v1/accounts/my-team/organizations/my-apps-org/apps?app_name=my-app" \ -H "X-API-Key: ess_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Response Example
{
"success": true,
"data": [
{
"app_name": "my-app",
"organization_login": "my-apps-org",
"description": "My essesseff app",
"programming_language": "go",
"repository_visibility": "private",
"template": {
"name": "essesseff-hello-world-go-template",
"language": "go",
"is_global_template": true
},
"created_at": "2025-01-01T00:00:00Z",
"repository_urls": {
"source_repo": "https://github.com/my-apps-org/my-app",
"config_dev_repo": "https://github.com/my-apps-org/my-app-config-dev",
"config_qa_repo": "https://github.com/my-apps-org/my-app-config-qa",
"config_staging_repo": "https://github.com/my-apps-org/my-app-config-staging",
"config_prod_repo": "https://github.com/my-apps-org/my-app-config-prod",
"argocd_dev_repo": "https://github.com/my-apps-org/my-app-argocd-dev",
"argocd_qa_repo": "https://github.com/my-apps-org/my-app-argocd-qa",
"argocd_staging_repo": "https://github.com/my-apps-org/my-app-argocd-staging",
"argocd_prod_repo": "https://github.com/my-apps-org/my-app-argocd-prod"
}
}
],
"pagination": {
"total": 1,
"limit": 50,
"offset": 0,
"has_more": false
}
}POST /accounts/{account_slug}/organizations/{organization_login}/apps
Create a new essesseff app
POST /api/v1/accounts/{account_slug}/organizations/{organization_login}/apps?app_name={app_name}Path Parameters
account_slug (required)
The team account slug (name) associated with the API key. The API key must belong to this account.
organization_login (required)
GitHub organization login where the app will be created (e.g., "my-apps-org")
Query Parameters
app_name (required)
Name of the essesseff app to create (must be URL-compliant: lowercase letters, numbers, and hyphens only)
Description
Creates a new essesseff app with the specified configuration. The app creation process includes creating 9 GitHub repositories (1 source + 4 config + 4 Argo CD), setting up webhooks, assigning teams, and configuring retention policies.
Request Body
Note: account_slug, organization_login, and app_name are now provided in the path and query parameters, not in the request body.
template (required)
Template configuration object:
template_org_login- Template organization login (e.g., "essesseff-hello-world-go-template")source_template_repo- Source template repository name (e.g., "hello-world")is_global_template- Boolean indicating if this is a global templatereplacement_string- String to replace in templates (always "hello-world" for global templates)
description (optional)
Description of the app
programming_language (optional)
Programming language (e.g., "go", "java", "node", "python")
repository_visibility (optional)
Repository visibility: "private" or "public" (default: "private")
Request Examples
Below are examples for each available global template:
Java Spring Boot Template
curl -X POST \
"https://www.essesseff.com/api/v1/accounts/my-team/organizations/my-apps-org/apps?app_name=my-java-app" \
-H "X-API-Key: ess_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"description": "My Java Spring Boot application",
"programming_language": "java",
"template": {
"template_org_login": "essesseff-helloworld-springboot-templat",
"source_template_repo": "helloworld",
"is_global_template": true,
"replacement_string": "helloworld"
},
"repository_visibility": "private"
}'Go Template
curl -X POST \
"https://www.essesseff.com/api/v1/accounts/my-team/organizations/my-apps-org/apps?app_name=my-go-app" \
-H "X-API-Key: ess_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"description": "My Go application",
"programming_language": "go",
"template": {
"template_org_login": "essesseff-hello-world-go-template",
"source_template_repo": "hello-world",
"is_global_template": true,
"replacement_string": "hello-world"
},
"repository_visibility": "private"
}'Node.js Template
curl -X POST \
"https://www.essesseff.com/api/v1/accounts/my-team/organizations/my-apps-org/apps?app_name=my-nodejs-app" \
-H "X-API-Key: ess_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"description": "My Node.js application",
"programming_language": "node",
"template": {
"template_org_login": "essesseff-hello-world-nodejs-template",
"source_template_repo": "hello-world",
"is_global_template": true,
"replacement_string": "hello-world"
},
"repository_visibility": "private"
}'Python Flask Template
curl -X POST \
"https://www.essesseff.com/api/v1/accounts/my-team/organizations/my-apps-org/apps?app_name=my-python-app" \
-H "X-API-Key: ess_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"description": "My Python Flask application",
"programming_language": "python",
"template": {
"template_org_login": "essesseff-hello-world-flask-template",
"source_template_repo": "hello-world",
"is_global_template": true,
"replacement_string": "hello-world"
},
"repository_visibility": "private"
}'Response Example
{
"success": true,
"data": {
"account_slug": "my-team",
"app_name": "my-app",
"organization_login": "my-apps-org",
"description": "My essesseff app",
"programming_language": "go",
"resultant_repos": {
"source_repo": "my-app",
"config_dev_repo": "my-app-config-dev",
"config_qa_repo": "my-app-config-qa",
"config_staging_repo": "my-app-config-staging",
"config_prod_repo": "my-app-config-prod",
"argocd_dev_repo": "my-app-argocd-dev",
"argocd_qa_repo": "my-app-argocd-qa",
"argocd_staging_repo": "my-app-argocd-staging",
"argocd_prod_repo": "my-app-argocd-prod",
"template_org_login": "essesseff-hello-world-go-template",
"is_global_template": true,
"replacement_string": "hello-world"
},
"repository_visibility": "private"
}
}Template Notes
For global templates, the replacement_string is always "hello-world" (or "helloworld" for Java Spring Boot template). The system will automatically replace "hello-world" and/or "helloworld" with the specified app_name when cloning repository content from the templates.
GET /accounts/{account_slug}/organizations/{organization_login}/apps/{app_name}
Get app details
GET /api/v1/accounts/{account_slug}/organizations/{organization_login}/apps/{app_name}Description
Gets app details including all repository IDs and URLs. Returns 404 if app doesn't exist.
Path Parameters
account_slug (required)
The team account slug (name) associated with the API key
organization_login (required)
GitHub organization login where the app exists
app_name (required)
Name of the essesseff app
Request Example
curl -X GET \ "https://www.essesseff.com/api/v1/accounts/my-team/organizations/my-apps-org/apps/my-app" \ -H "X-API-Key: ess_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Response Example
{
"success": true,
"data": {
"app_name": "my-app",
"organization_login": "my-apps-org",
"description": "My essesseff app",
"programming_language": "go",
"repository_visibility": "private",
"template": {
"name": "essesseff-hello-world-go-template",
"language": "go",
"is_global_template": true
},
"created_at": "2025-01-01T00:00:00Z",
"updated_at": "2025-01-01T00:00:00Z",
"repository_urls": {
"source_repo": "https://github.com/my-apps-org/my-app",
"config_dev_repo": "https://github.com/my-apps-org/my-app-config-dev",
"config_qa_repo": "https://github.com/my-apps-org/my-app-config-qa",
"config_staging_repo": "https://github.com/my-apps-org/my-app-config-staging",
"config_prod_repo": "https://github.com/my-apps-org/my-app-config-prod",
"argocd_dev_repo": "https://github.com/my-apps-org/my-app-argocd-dev",
"argocd_qa_repo": "https://github.com/my-apps-org/my-app-argocd-qa",
"argocd_staging_repo": "https://github.com/my-apps-org/my-app-argocd-staging",
"argocd_prod_repo": "https://github.com/my-apps-org/my-app-argocd-prod"
},
"repository_ids": {
"source_repo": 12345678,
"config_dev_repo": 12345679,
"config_qa_repo": 12345680,
"config_staging_repo": 12345681,
"config_prod_repo": 12345682,
"argocd_dev_repo": 12345683,
"argocd_qa_repo": 12345684,
"argocd_staging_repo": 12345685,
"argocd_prod_repo": 12345686
}
}
}PATCH /accounts/{account_slug}/organizations/{organization_login}/apps/{app_name}
Update an existing essesseff app
PATCH /api/v1/accounts/{account_slug}/organizations/{organization_login}/apps/{app_name}Description
Updates an existing essesseff app. Currently supports updating description and repository visibility (private/public). When repository visibility is updated, all repositories associated with the app are updated in both the database and GitHub.
Path Parameters
account_slug (required)
The team account slug (name) associated with the API key
organization_login (required)
GitHub organization login where the app exists
app_name (required)
Name of the essesseff app to update
Request Body
description (optional)
Updated app description
repository_visibility (optional)
Repository visibility: "private" or "public"
At least one of description or repository_visibility must be provided.
Request Example
curl -X PATCH \
"https://www.essesseff.com/api/v1/accounts/my-team/organizations/my-apps-org/apps/my-app" \
-H "X-API-Key: ess_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"description": "Updated description",
"repository_visibility": "public"
}'Response Example
{
"success": true,
"data": {
"app_name": "my-app",
"description": "Updated description",
"repository_visibility": "public",
"updated_at": "2025-01-02T00:00:00Z"
}
}GET /accounts/{account_slug}/organizations/{organization_login}/apps/{app_name}/deployments
List deployments for an app
GET /api/v1/accounts/{account_slug}/organizations/{organization_login}/apps/{app_name}/deploymentsDescription
Lists deployments for a specific essesseff app. Supports filtering by environment (dev, qa, staging, prod) and status (pending, in_progress, succeeded, failed). Returns deployment details including image tags, GitHub commit information, and deployment timestamps.
Path Parameters
app_name (required)
Name of the essesseff app
Query Parameters
account_slug (required)
The team account slug (name) associated with the API key
organization_login (required)
GitHub organization login where the app exists
environment (optional)
Filter by environment: dev, qa, staging, prod
status (optional)
Filter by status: pending, in_progress, succeeded, failed
limit (optional)
Maximum number of results (default: 50, max: 1000)
offset (optional)
Number of results to skip for pagination (default: 0)
Request Example
curl -X GET \ "https://www.essesseff.com/api/v1/accounts/my-team/organizations/my-apps-org/apps/my-app/deployments?environment=prod&status=succeeded" \ -H "X-API-Key: ess_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Response Example
{
"success": true,
"data": [
{
"app_name": "my-app",
"environment": "prod",
"status": "succeeded",
"image_tag": "v1.2.3",
"github_sha": "abc123def456",
"github_ref": "refs/heads/main",
"deployed_at": "2025-01-01T12:00:00Z",
"completed_at": "2025-01-01T12:05:00Z",
"metadata": {
"github_repository": "my-apps-org/my-app",
"github_workflow_run_id": 12345678,
"deployment_method": "manual_promote",
"deployment_conclusion": "success",
"health_status": "Healthy"
}
}
],
"pagination": {
"total": 10,
"limit": 50,
"offset": 0,
"has_more": false
}
}GET /accounts/{account_slug}/organizations/{organization_login}/apps/{app_name}/images
List container images for an app
GET /api/v1/accounts/{account_slug}/organizations/{organization_login}/apps/{app_name}/imagesDescription
Lists container images for a specific essesseff app. Supports filtering by repository name, image tag, and status (active, expired, all). Returns image metadata including GitHub package version IDs.
Path Parameters
app_name (required)
Name of the essesseff app
Query Parameters
account_slug (required)
The team account slug (name) associated with the API key
organization_login (required)
GitHub organization login where the app exists
repository_name (optional)
Filter by GitHub repository name
image_tag (optional)
Filter by image tag
status (optional)
Filter by status: active, expired, all (default: all)
limit (optional)
Maximum number of results (default: 100, max: 1000)
offset (optional)
Number of results to skip for pagination (default: 0)
Request Example
curl -X GET \ "https://www.essesseff.com/api/v1/accounts/my-team/organizations/my-apps-org/apps/my-app/images?status=active" \ -H "X-API-Key: ess_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Response Example
{
"success": true,
"data": [
{
"app_name": "my-app",
"repository_name": "my-app",
"image_name": "my-app",
"image_tag": "v1.2.3",
"status": "active",
"github_package_version_id": 12345678,
"created_at": "2025-01-01T00:00:00Z",
"expired_at": null,
"metadata": {
"github_organization": "my-apps-org",
"package_type": "container"
}
}
],
"pagination": {
"total": 50,
"limit": 100,
"offset": 0,
"has_more": false
}
}GET /accounts/{account_slug}/organizations/{organization_login}/apps/{app_name}/images/{image_tag}
Get image details by tag
GET /api/v1/accounts/{account_slug}/organizations/{organization_login}/apps/{app_name}/images/{image_tag}Description
Retrieves detailed information about a specific container image by tag. If multiple repositories have the same image tag, use the repository_name query parameter to disambiguate.
Path Parameters
account_slug (required)
The team account slug (name) associated with the API key
organization_login (required)
GitHub organization login where the app exists
app_name (required)
Name of the essesseff app
image_tag (required)
Image tag (e.g., "v1.2.3")
Query Parameters
repository_name (optional)
GitHub repository name (required if multiple repos have same tag)
Request Example
curl -X GET \ "https://www.essesseff.com/api/v1/accounts/my-team/organizations/my-apps-org/apps/my-app/images/v1.2.3" \ -H "X-API-Key: ess_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Response Example
{
"success": true,
"data": {
"app_name": "my-app",
"repository_name": "my-app",
"image_name": "my-app",
"image_tag": "v1.2.3",
"status": "active",
"github_package_version_id": 12345678,
"created_at": "2025-01-01T00:00:00Z",
"expired_at": null,
"metadata": {
"github_organization": "my-apps-org",
"package_type": "container",
"github_package_url": "https://github.com/my-apps-org/my-app/pkgs/container/my-app"
}
}
}GET /accounts/{account_slug}/organizations/{organization_login}/apps/{app_name}/images/{image_tag}/lifecycle
Get image lifecycle state; optional history
GET /api/v1/accounts/{account_slug}/organizations/{organization_login}/apps/{app_name}/images/{image_tag}/lifecycleDescription
Returns current lifecycle state and timestamp for the image. Query history=true to include state history (no UUIDs). Response includes account_slug, organization, app, image_name, image_tag, current_state (e.g. "QA" for QA_TESTING), state_timestamp.
Query Parameters
history (optional): set totrue or1 to include state history in the response.
Request Example
curl -X GET \ "https://www.essesseff.com/api/v1/accounts/my-team/organizations/my-apps-org/apps/my-app/images/v1.2.3/lifecycle?history=true" \ -H "X-API-Key: ess_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Response Example (200, no history)
{
"account_slug": "my-team",
"organization": "my-apps-org",
"app": "my-app",
"image_name": "my-app",
"image_tag": "v1.2.3",
"current_state": "RC",
"state_timestamp": "2025-09-30T12:00:00Z"
}Response Example (200, with history=true)
{
"account_slug": "my-team",
"organization": "my-apps-org",
"app": "my-app",
"image_name": "my-app",
"image_tag": "v1.2.3",
"current_state": "RC",
"state_timestamp": "2025-09-30T12:00:00Z",
"history": [
{ "state": "BUILD", "state_timestamp": "2025-09-30T10:00:00Z", "is_active": false },
{ "state": "DEV", "state_timestamp": "2025-09-30T11:00:00Z", "is_active": false },
{ "state": "RC", "state_timestamp": "2025-09-30T12:00:00Z", "is_active": true }
]
}POST /accounts/{account_slug}/organizations/{organization_login}/apps/{app_name}/images/{image_tag}/lifecycle
Update image lifecycle state; can trigger environment deployment
POST /api/v1/accounts/{account_slug}/organizations/{organization_login}/apps/{app_name}/images/{image_tag}/lifecycleDescription
Transition the image to a new lifecycle state. Body:state (required; use "QA" for QA_TESTING); optional deployment_note when state is PROD. Only allowed transitions (per lifecycle table) are accepted; same-state or backwards transitions return 400. When state is DEV, QA, STAGING, or PROD, the API also performs the corresponding environment deployment (config repo promotion and deployment record). PROD via API does not require OTP.
Request Example
curl -X POST \
"https://www.essesseff.com/api/v1/accounts/my-team/organizations/my-apps-org/apps/my-app/images/v1.2.3/lifecycle" \
-H "X-API-Key: ess_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"state": "QA"}'Response Example (200)
{
"account_slug": "my-team",
"organization": "my-apps-org",
"app": "my-app",
"image_name": "my-app",
"image_tag": "v1.2.3",
"state": "QA",
"state_timestamp": "2025-09-30T12:00:00Z"
}GET /accounts/{account_slug}/organizations/{organization_login}/apps/{app_name}/environments/{env}
Get current deployment for an environment
GET /api/v1/accounts/{account_slug}/organizations/{organization_login}/apps/{app_name}/environments/{env}Path Parameters
env must be one of: DEV, QA, STAGING, PROD.
Description
Returns the image currently deployed to the given environment. Response includes account_slug, organization, app, environment, image_name, image_tag, state_timestamp, and argocd_application_url (optional URL to the Argo CD application for this environment, if set in app settings). If no deployment exists, image_name, image_tag, and state_timestamp are null.
Request Example
curl -X GET \ "https://www.essesseff.com/api/v1/accounts/my-team/organizations/my-apps-org/apps/my-app/environments/QA" \ -H "X-API-Key: ess_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Response Example (200, with deployment)
{
"account_slug": "my-team",
"organization": "my-apps-org",
"app": "my-app",
"environment": "QA",
"image_name": "my-app",
"image_tag": "v1.2.3",
"state_timestamp": "2025-09-30T11:00:00Z",
"argocd_application_url": "https://argocd.example.com/applications/argocd/my-app-qa"
}Response Example (200, no deployment)
When no image is deployed to the environment:
{
"account_slug": "my-team",
"organization": "my-apps-org",
"app": "my-app",
"environment": "QA",
"image_name": null,
"image_tag": null,
"state_timestamp": null,
"argocd_application_url": null
}POST /accounts/.../apps/{app_name}/environments/{env}/set-argocd-application-url
Set Argo CD application URL for an environment
POST /api/v1/accounts/{account_slug}/organizations/{organization_login}/apps/{app_name}/environments/{env}/set-argocd-application-urlPath Parameters
env must be one of: DEV, QA, STAGING, PROD.
Description
Sets the optional Argo CD application URL for the given environment. The URL is stored in app settings and shown in the essesseff UI (deployment cards, app settings). The URL is validated and normalized (trailing slash removed). Send null or empty to clear. Returns 204 on success.
Request Body
url (optional): string or null. Full URL to the Argo CD application for this environment (e.g. https://argocd.example.com/applications/argocd/my-app-qa). Max 1000 characters. Omit or set to null to clear.
Request Example
curl -X POST \
"https://www.essesseff.com/api/v1/accounts/my-team/organizations/my-apps-org/apps/my-app/environments/QA/set-argocd-application-url" \
-H "X-API-Key: ess_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"url": "https://argocd.example.com/applications/argocd/my-app-qa"}'Response
Returns 204 No Content on success. Returns 400 for invalid env or invalid URL format.
POST /accounts/.../apps/{app_name}/environments/DEV/declare-rc
Set current DEV deployment image lifecycle to RC
POST /api/v1/accounts/{account_slug}/organizations/{organization_login}/apps/{app_name}/environments/DEV/declare-rcNo body. Sets the current DEV deployment image's lifecycle state to RC.
Request Example
curl -X POST \
"https://www.essesseff.com/api/v1/accounts/my-team/organizations/my-apps-org/apps/my-app/environments/DEV/declare-rc" \
-H "X-API-Key: ess_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{}'Response Example (200)
{
"account_slug": "my-team",
"organization": "my-apps-org",
"app": "my-app",
"environment": "DEV",
"image_name": "my-app",
"image_tag": "v1.2.3",
"state": "RC",
"state_timestamp": "2025-09-30T12:00:00Z"
}POST /accounts/.../apps/{app_name}/environments/QA/accept-rc
Accept release candidate and deploy to QA
POST /api/v1/accounts/{account_slug}/organizations/{organization_login}/apps/{app_name}/environments/QA/accept-rcBody: {"image_tag": "v1.2.3"}. Sets image lifecycle to QA_TESTING, promotes config_qa, and creates a deployment record.
Request Example
curl -X POST \
"https://www.essesseff.com/api/v1/accounts/my-team/organizations/my-apps-org/apps/my-app/environments/QA/accept-rc" \
-H "X-API-Key: ess_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"image_tag": "v1.2.3"}'Response Example (200)
{
"account_slug": "my-team",
"organization": "my-apps-org",
"app": "my-app",
"environment": "QA",
"image_name": "my-app",
"image_tag": "v1.2.3",
"state": "QA",
"state_timestamp": "2025-09-30T12:00:00Z"
}POST /accounts/.../apps/{app_name}/environments/QA/reject-rc
Reject a release candidate
POST /api/v1/accounts/{account_slug}/organizations/{organization_login}/apps/{app_name}/environments/QA/reject-rcBody: image_tag. Sets image lifecycle to REJECTED.
Request Example
curl -X POST \
"https://www.essesseff.com/api/v1/accounts/my-team/organizations/my-apps-org/apps/my-app/environments/QA/reject-rc" \
-H "X-API-Key: ess_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"image_tag": "v1.2.3"}'Response Example (200)
{
"account_slug": "my-team",
"organization": "my-apps-org",
"app": "my-app",
"environment": "QA",
"image_name": "my-app",
"image_tag": "v1.2.3",
"state": "REJECTED",
"state_timestamp": "2025-09-30T12:00:00Z"
}POST /accounts/.../apps/{app_name}/environments/QA/declare-stable
Set current QA deployment image to STABLE
POST /api/v1/accounts/{account_slug}/organizations/{organization_login}/apps/{app_name}/environments/QA/declare-stableNo body. Sets the current QA deployment image's lifecycle state to STABLE.
Request Example
curl -X POST \
"https://www.essesseff.com/api/v1/accounts/my-team/organizations/my-apps-org/apps/my-app/environments/QA/declare-stable" \
-H "X-API-Key: ess_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{}'Response Example (200)
{
"account_slug": "my-team",
"organization": "my-apps-org",
"app": "my-app",
"environment": "QA",
"image_name": "my-app",
"image_tag": "v1.2.3",
"state": "STABLE",
"state_timestamp": "2025-09-30T12:00:00Z"
}POST /accounts/.../apps/{app_name}/environments/QA/declare-rejected
Set current QA deployment image to REJECTED
POST /api/v1/accounts/{account_slug}/organizations/{organization_login}/apps/{app_name}/environments/QA/declare-rejectedNo body. Sets the current QA deployment image's lifecycle state to REJECTED.
Request Example
curl -X POST \
"https://www.essesseff.com/api/v1/accounts/my-team/organizations/my-apps-org/apps/my-app/environments/QA/declare-rejected" \
-H "X-API-Key: ess_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{}'Response Example (200)
{
"account_slug": "my-team",
"organization": "my-apps-org",
"app": "my-app",
"environment": "QA",
"image_name": "my-app",
"image_tag": "v1.2.3",
"state": "REJECTED",
"state_timestamp": "2025-09-30T12:00:00Z"
}POST /accounts/.../apps/{app_name}/environments/STAGING/deploy-stable
Deploy STABLE image to STAGING
POST /api/v1/accounts/{account_slug}/organizations/{organization_login}/apps/{app_name}/environments/STAGING/deploy-stableBody: image_tag. Deploys the given STABLE image to STAGING (lifecycle STAGING, config_staging promotion, deployment record).
Request Example
curl -X POST \
"https://www.essesseff.com/api/v1/accounts/my-team/organizations/my-apps-org/apps/my-app/environments/STAGING/deploy-stable" \
-H "X-API-Key: ess_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"image_tag": "v1.2.3"}'Response Example (200)
{
"account_slug": "my-team",
"organization": "my-apps-org",
"app": "my-app",
"environment": "STAGING",
"image_name": "my-app",
"image_tag": "v1.2.3",
"state": "STAGING",
"state_timestamp": "2025-09-30T12:00:00Z"
}POST /accounts/.../apps/{app_name}/environments/PROD/deploy-stable
Deploy STABLE image to PROD (no OTP required via API)
POST /api/v1/accounts/{account_slug}/organizations/{organization_login}/apps/{app_name}/environments/PROD/deploy-stableBody: image_tag, optional deployment_note. Same as STAGING but for PROD. No OTP required when using the API.
Request Example
curl -X POST \
"https://www.essesseff.com/api/v1/accounts/my-team/organizations/my-apps-org/apps/my-app/environments/PROD/deploy-stable" \
-H "X-API-Key: ess_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"image_tag": "v1.2.3", "deployment_note": "CR#12345"}'Response Example (200)
{
"account_slug": "my-team",
"organization": "my-apps-org",
"app": "my-app",
"environment": "PROD",
"image_name": "my-app",
"image_tag": "v1.2.3",
"state": "PROD",
"state_timestamp": "2025-09-30T12:00:00Z",
"deployment_note": "CR#12345"
}Response includes deployment_note (the value sent in the request body, or null if omitted).
GET /accounts/{account_slug}/organizations/{organization_login}/apps/{app_name}/retention-policies
List retention policies for an app
GET /api/v1/accounts/{account_slug}/organizations/{organization_login}/apps/{app_name}/retention-policiesDescription
Lists retention policies for a specific essesseff app. Retention policies are mapped to environments (dev, qa, staging, prod) based on lifecycle states (DEV, QA, STAGING, PROD). Returns retention days and timestamps for each policy.
Path Parameters
app_name (required)
Name of the essesseff app
Query Parameters
account_slug (required)
The team account slug (name) associated with the API key
organization_login (required)
GitHub organization login where the app exists
repository_name (optional)
Filter by GitHub repository name (must match app's source repository)
environment (optional)
Filter by environment: dev, qa, staging, prod
Request Example
curl -X GET \ "https://www.essesseff.com/api/v1/accounts/my-team/organizations/my-apps-org/apps/my-app/retention-policies?environment=prod" \ -H "X-API-Key: ess_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Response Example
{
"success": true,
"data": [
{
"app_name": "my-app",
"repository_name": "my-app",
"environment": "prod",
"retention_days": 30,
"created_at": "2025-01-01T00:00:00Z",
"updated_at": "2025-01-01T00:00:00Z"
}
]
}PATCH /accounts/{account_slug}/organizations/{organization_login}/apps/{app_name}/retention-policies
Update a retention policy
PATCH /api/v1/accounts/{account_slug}/organizations/{organization_login}/apps/{app_name}/retention-policies?repository_name={repository_name}&environment={environment}Description
Updates an existing retention policy for a specific app, repository, and environment. Allows modifying retention_days for image lifecycle states. Retention policies are app-scoped (source repository scoped).
Path Parameters
account_slug (required)
The team account slug (name) associated with the API key
organization_login (required)
GitHub organization login where the app exists
app_name (required)
Name of the essesseff app
Query Parameters
repository_name (required)
GitHub repository name (must match app's source repository)
environment (required)
Environment: dev, qa, staging, prod
Request Body
retention_days (required)
Number of days to retain images in this lifecycle state (non-negative integer)
Request Example
curl -X PATCH \
"https://www.essesseff.com/api/v1/accounts/my-team/organizations/my-apps-org/apps/my-app/retention-policies?repository_name=my-app&environment=prod" \
-H "X-API-Key: ess_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"retention_days": 60
}'Response Example
{
"success": true,
"data": {
"app_name": "my-app",
"repository_name": "my-app",
"environment": "prod",
"retention_days": 60,
"updated_at": "2025-01-02T00:00:00Z"
}
}GET /accounts/{account_slug}/organizations/{organization_login}/apps/{app_name}/notifications-secret
Get notifications-secret.yaml for Argo CD setup
GET /api/v1/accounts/{account_slug}/organizations/{organization_login}/apps/{app_name}/notifications-secretDescription
Retrieves the notifications-secret.yaml file content for Argo CD setup. Returns YAML content with Content-Type: application/x-yaml. This file contains Argo CD Notifications Event Processor API keys and environment-specific app secrets.
Note: Secrets are automatically issued from the database when this file is generated if they don't already exist.
Path Parameters
account_slug (required)
The team account slug (name) associated with the API key
organization_login (required)
GitHub organization login where the app exists
app_name (required)
Name of the essesseff app
Request Example
curl -X GET \ "https://www.essesseff.com/api/v1/accounts/my-team/organizations/my-apps-org/apps/my-app/notifications-secret" \ -H "X-API-Key: ess_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \ -o notifications-secret.yaml
Response
Returns YAML content with Content-Type: application/x-yaml:
# notifications-secret.yaml # Store Argo CD Notifications Event Processor API key and environment-specific app secrets # ***DELETE THIS FILE AFTER APPLYING - DO NOT COMMIT SECRETS TO GITHUB*** apiVersion: v1 kind: Secret metadata: name: argocd-notifications-secret namespace: argocd type: Opaque stringData: argocd-webhook-url: "https://api.essesseff.com/api/v1/argocd/webhook" aws-api-gateway-key-my-apps-org: "ess_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" app-secret-12345678: "abc123def456..." app-secret-12345679: "xyz789uvw012..." app-secret-12345680: "mno345pqr678..." app-secret-12345681: "ghi901jkl234..."
The response includes secrets for all environments (dev, qa, staging, prod) that have config repositories. Secret keys are environment-specific: app-secret-{config-env-repository-id}