🔍⌘K

Start typing to search docs.

API Reference

1.0.0

REST reference generated from ops/forge-api/openapi.yaml.

Overview

Public API for accessing App Factory Forge configuration data.

This API provides read-only access to organization and application configuration, including app metadata, product pricing, and store configurations.

## Authentication All requests require an API key provided in the `X-API-Key` header.

## Rate Limiting Rate limits are enforced per API key. Check response headers for current limits: - `X-RateLimit-Limit`: Maximum requests per window - `X-RateLimit-Remaining`: Requests remaining in current window - `X-RateLimit-Reset`: Unix timestamp when the window resets

Servers

  • https://api.app-factory.com/v1

    Production server

  • https://staging-api.app-factory.com/v1

    Staging server

  • http://localhost:3000/v1

    Local development server

Apps

Application configuration and metadata

GET

/apps/{appId}/config

Get app configuration

Retrieve complete configuration for a specific application

Parameters

NameInRequiredDescription
Ref: #/components/parameters/AppId

Responses

200

Successfully retrieved app configuration

Headers

{
  "X-RateLimit-Limit": {
    "$ref": "#/components/headers/X-RateLimit-Limit"
  },
  "X-RateLimit-Remaining": {
    "$ref": "#/components/headers/X-RateLimit-Remaining"
  },
  "X-RateLimit-Reset": {
    "$ref": "#/components/headers/X-RateLimit-Reset"
  }
}

Content-Type: application/json

{
  "$ref": "#/components/schemas/AppConfig"
}
401Ref

#/components/responses/Unauthorized

403Ref

#/components/responses/Forbidden

404Ref

#/components/responses/NotFound

429Ref

#/components/responses/RateLimitExceeded

500Ref

#/components/responses/InternalServerError

Health

Service health and monitoring

GET

/health

Health check

Basic health check endpoint

Responses

200

Service is healthy

Content-Type: application/json

{
  "$ref": "#/components/schemas/HealthStatus"
}
503

Service is unhealthy

Content-Type: application/json

{
  "$ref": "#/components/schemas/HealthStatus"
}
GET

/health/ready

Readiness check

Check if service is ready to accept traffic (includes database connectivity)

Responses

200

Service is ready

Content-Type: application/json

{
  "$ref": "#/components/schemas/HealthStatus"
}
503

Service is not ready

Content-Type: application/json

{
  "$ref": "#/components/schemas/HealthStatus"
}
GET

/metrics

Prometheus metrics

Get service metrics in Prometheus format

Responses

200

Metrics data

Content-Type: text/plain

{
  "type": "string",
  "example": "# HELP api_requests_total Total number of API requests\n# TYPE api_requests_total counter\napi_requests_total{method=\"GET\",endpoint=\"/apps/:id/config\",status=\"200\"} 1234\n"
}

Organizations

Organization-level operations

GET

/orgs/{orgId}/apps

List organization apps

Get a paginated list of all apps belonging to an organization

Parameters

NameInRequiredDescription
Ref: #/components/parameters/OrgId
Ref: #/components/parameters/Page
Ref: #/components/parameters/PerPage

Responses

200

Successfully retrieved apps

Headers

{
  "X-RateLimit-Limit": {
    "$ref": "#/components/headers/X-RateLimit-Limit"
  },
  "X-RateLimit-Remaining": {
    "$ref": "#/components/headers/X-RateLimit-Remaining"
  },
  "X-RateLimit-Reset": {
    "$ref": "#/components/headers/X-RateLimit-Reset"
  }
}

Content-Type: application/json

{
  "type": "object",
  "properties": {
    "apps": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/AppSummary"
      }
    },
    "pagination": {
      "$ref": "#/components/schemas/Pagination"
    }
  }
}
401Ref

#/components/responses/Unauthorized

403Ref

#/components/responses/Forbidden

404Ref

#/components/responses/NotFound

429Ref

#/components/responses/RateLimitExceeded

500Ref

#/components/responses/InternalServerError

Products

Pricing and subscription products

GET

/apps/{appId}/products

Get app products

Retrieve pricing and subscription products for an application

Parameters

NameInRequiredDescription
Ref: #/components/parameters/AppId

Responses

200

Successfully retrieved products

Headers

{
  "X-RateLimit-Limit": {
    "$ref": "#/components/headers/X-RateLimit-Limit"
  },
  "X-RateLimit-Remaining": {
    "$ref": "#/components/headers/X-RateLimit-Remaining"
  },
  "X-RateLimit-Reset": {
    "$ref": "#/components/headers/X-RateLimit-Reset"
  }
}

Content-Type: application/json

{
  "type": "object",
  "properties": {
    "products": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/Product"
      }
    }
  }
}
401Ref

#/components/responses/Unauthorized

403Ref

#/components/responses/Forbidden

404Ref

#/components/responses/NotFound

429Ref

#/components/responses/RateLimitExceeded

500Ref

#/components/responses/InternalServerError

Store

App store configurations

GET

/apps/{appId}/store

Get app store configuration

Retrieve App Store and Google Play store configurations

Parameters

NameInRequiredDescription
Ref: #/components/parameters/AppId

Responses

200

Successfully retrieved store configuration

Headers

{
  "X-RateLimit-Limit": {
    "$ref": "#/components/headers/X-RateLimit-Limit"
  },
  "X-RateLimit-Remaining": {
    "$ref": "#/components/headers/X-RateLimit-Remaining"
  },
  "X-RateLimit-Reset": {
    "$ref": "#/components/headers/X-RateLimit-Reset"
  }
}

Content-Type: application/json

{
  "$ref": "#/components/schemas/StoreConfig"
}
401Ref

#/components/responses/Unauthorized

403Ref

#/components/responses/Forbidden

404Ref

#/components/responses/NotFound

429Ref

#/components/responses/RateLimitExceeded

500Ref

#/components/responses/InternalServerError