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://essesseff.com/api/v1/accounts/my-team/organizations/my-apps-org/apps" \ -H "Authorization: Bearer ess_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
With optional app_name filter:
curl -X GET \ "https://essesseff.com/api/v1/accounts/my-team/organizations/my-apps-org/apps?app_name=my-app" \ -H "Authorization: Bearer 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://essesseff.com/api/v1/accounts/my-team/organizations/my-apps-org/apps?app_name=my-java-app" \
-H "Authorization: Bearer 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://essesseff.com/api/v1/accounts/my-team/organizations/my-apps-org/apps?app_name=my-go-app" \
-H "Authorization: Bearer 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://essesseff.com/api/v1/accounts/my-team/organizations/my-apps-org/apps?app_name=my-nodejs-app" \
-H "Authorization: Bearer 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://essesseff.com/api/v1/accounts/my-team/organizations/my-apps-org/apps?app_name=my-python-app" \
-H "Authorization: Bearer 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://essesseff.com/api/v1/accounts/my-team/organizations/my-apps-org/apps/my-app" \ -H "Authorization: Bearer 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://essesseff.com/api/v1/accounts/my-team/organizations/my-apps-org/apps/my-app" \
-H "Authorization: Bearer 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://essesseff.com/api/v1/accounts/my-team/organizations/my-apps-org/apps/my-app/deployments?environment=prod&status=succeeded" \ -H "Authorization: Bearer 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://essesseff.com/api/v1/accounts/my-team/organizations/my-apps-org/apps/my-app/images?status=active" \ -H "Authorization: Bearer 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://essesseff.com/api/v1/accounts/my-team/organizations/my-apps-org/apps/my-app/images/v1.2.3" \ -H "Authorization: Bearer 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}/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://essesseff.com/api/v1/accounts/my-team/organizations/my-apps-org/apps/my-app/retention-policies?environment=prod" \ -H "Authorization: Bearer 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://essesseff.com/api/v1/accounts/my-team/organizations/my-apps-org/apps/my-app/retention-policies?repository_name=my-app&environment=prod" \
-H "Authorization: Bearer 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://essesseff.com/api/v1/accounts/my-team/organizations/my-apps-org/apps/my-app/notifications-secret" \ -H "Authorization: Bearer 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}