Apps API

Create, list, update, and check the status of your apps. All endpoints require authentication.

GET /api/v1/apps

List all apps belonging to the authenticated user, ordered newest first.

bash
curl -H "Authorization: Bearer kpr_..." https://kyper.shop/api/v1/apps
json
[
  {
    "slug": "invoice-hero",
    "title": "Invoice Hero",
    "tagline": "Generate professional PDF invoices in seconds",
    "status": "listed",
    "pricing_type": "both",
    "one_time_price_cents": 4900,
    "subscription_price_cents": 1200,
    "tech_stack": ["rails", "postgres", "redis"],
    "versions_count": 3
  }
]

POST /api/v1/apps

Create a new app. title generates an immutable slug. Prices in cents (USD). At least one of one_time_price_cents or subscription_price_cents is required.

FieldTypeRequiredDescription
app.title stringYes Display name (max 100 chars). Immutable after creation.
app.tagline stringYes Short description for search results (max 160 chars)
app.description stringYes Full marketplace listing description
app.category stringYes developer_tools, productivity, finance, health, media, education, business_operations, data_analytics, gaming
app.pricing_type stringYes one_time, subscription, or both
app.one_time_price_cents integerConditional Required when pricing_type is one_time or both
app.subscription_price_cents integerConditional Required when pricing_type is subscription or both
app.tech_stack arrayNo Technology tags (e.g. ["rails", "postgres"])
bash
curl -X POST https://kyper.shop/api/v1/apps \
  -H "Authorization: Bearer kpr_..." \
  -H "Content-Type: application/json" \
  -d '{"app": {"title": "Invoice Hero", "tagline": "...", "description": "...", "category": "finance", "pricing_type": "both", "one_time_price_cents": 4900, "subscription_price_cents": 1200}}'

Returns 201 Created with the app object. Returns 422 with {"errors": [...]} on validation failure.

GET /api/v1/apps/:slug

Get full details for a single app. Only returns apps owned by the authenticated user.

bash
curl -H "Authorization: Bearer kpr_..." https://kyper.shop/api/v1/apps/invoice-hero

Returns 200 OK with the app object, or 404 if not found / not owned by you.

PATCH /api/v1/apps/:slug

Update app metadata. title and slug are immutable. All fields from POST /apps except title can be updated.

bash
curl -X PATCH https://kyper.shop/api/v1/apps/invoice-hero \
  -H "Authorization: Bearer kpr_..." \
  -H "Content-Type: application/json" \
  -d '{"app": {"tagline": "The fastest way to send invoices", "subscription_price_cents": 1500}}'

Returns 200 OK with the updated app object. Returns 404 or 422 on error.

GET /api/v1/apps/:slug/status

Returns the app's current status and its latest version's build/review state. Used by kyper push status.

bash
curl -H "Authorization: Bearer kpr_..." https://kyper.shop/api/v1/apps/invoice-hero/status
json
{
  "app": "invoice-hero",
  "status": "listed",
  "latest_version": {
    "id": 17,
    "version": "1.2.0",
    "status": "published",
    "review_notes": "Looks great — approved!"
  }
}
FieldValues
status draft · submitted · in_review · approved · rejected · listed · unlisted
latest_version.status pending · building · build_failed · in_review · published · rejected
latest_version null if no versions have been pushed. id is used by build_log, retry, cancel, withdraw endpoints.

GET /api/v1/apps/:slug/env

Returns the required env var keys declared in the app's latest kyper.yml — the keys consumers must supply before deploying.

bash
curl -H "Authorization: Bearer kpr_..." https://kyper.shop/api/v1/apps/invoice-hero/env
json
{"app": "invoice-hero", "env": ["OPENAI_API_KEY", "STRIPE_SECRET_KEY"]}

Returns an empty env array if no versions have been pushed or no env: block is declared.