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}/apps

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 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 template
  • replacement_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}/deployments

Description

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}/images

Description

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}/lifecycle

Description

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}/lifecycle

Description

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-url

Path 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-rc

No 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-rc

Body: {"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-rc

Body: 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-stable

No 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-rejected

No 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-stable

Body: 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-stable

Body: 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-policies

Description

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-secret

Description

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}