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.
curl -H "Authorization: Bearer kpr_..." https://kyper.shop/api/v1/apps
[
{
"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.
| Field | Type | Required | Description |
|---|---|---|---|
| app.title | string | Yes | Display name (max 100 chars). Immutable after creation. |
| app.tagline | string | Yes | Short description for search results (max 160 chars) |
| app.description | string | Yes | Full marketplace listing description |
| app.category | string | Yes | developer_tools, productivity, finance, health, media, education, business_operations, data_analytics, gaming |
| app.pricing_type | string | Yes | one_time, subscription, or both |
| app.one_time_price_cents | integer | Conditional | Required when pricing_type is one_time or both |
| app.subscription_price_cents | integer | Conditional | Required when pricing_type is subscription or both |
| app.tech_stack | array | No | Technology tags (e.g. ["rails", "postgres"]) |
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.
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.
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.
curl -H "Authorization: Bearer kpr_..." https://kyper.shop/api/v1/apps/invoice-hero/status
{
"app": "invoice-hero",
"status": "listed",
"latest_version": {
"id": 17,
"version": "1.2.0",
"status": "published",
"review_notes": "Looks great — approved!"
}
}
| Field | Values |
|---|---|
| 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.
curl -H "Authorization: Bearer kpr_..." https://kyper.shop/api/v1/apps/invoice-hero/env
{"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.