API Guide

Learn how to build on AppCruiser. For the complete endpoint reference with schemas and try-it-out forms, see the API Reference.

Authentication

Every API request requires an API key. Generate yours from Dashboard → Settings → API Keys in seconds. Keys use scoped permissions so you control exactly what each integration can access.

Include your key in every request header:

Authorization: Bearer ak_your_api_key_here

Scopes

ScopeAccess
ideas:readList and view ideas
ideas:writeCreate, update, delete ideas
mockups:readList, view, preview, download mockups
mockups:writeCreate, update, delete, upload thumbnails
feedback:readList feedback
feedback:writeCreate, delete feedback
generations:writeTrigger AI mockup generation
generations:readPoll mockup generation job status
videos:readList videos, voices, gallery, and poll video job status
videos:writeGenerate, iterate, feature, publish & manage videos
profile:readView account info and credits

Rate Limits

API requests are rate-limited per user using a sliding window. If you exceed the limit, you'll receive a 429 Too Many Requests response with Retry-After and X-RateLimit-* headers.

OperationLimitWindow
Read requests (GET)100 requestsPer minute
Write requests (POST, PATCH, DELETE)30 requestsPer minute
File uploads5 uploadsPer day
AI generations (Pro)5 generationsPer hour
AI generations (Business)20 generationsPer hour
Donations10 donationsPer hour

Enter API Key for Testing

Paste your full API key to use the interactive MCP tool forms below. Create an API key first.

Create an Idea

Ideas are the starting point for everything on AppCruiser. Post an app concept, let the community vote on it, and build a working prototype.

curl

curl -X POST https://appcruiser.com/api/v1/ideas \
  -H "Authorization: Bearer ak_your_key" \
  -H "Content-Type: application/json" \
  -d '{"title":"My Idea","description":"A productivity app","category":"Productivity","tags":["ai"]}'

TypeScript (SDK)

import { AppCruiserClient } from "@appcruiser/sdk";

const client = new AppCruiserClient({ apiKey: "ak_your_key" });
const idea = await client.createIdea({
  title: "My Idea",
  description: "A productivity app",
  category: "Productivity",
  tags: ["ai"],
});
console.log(idea.id);

Python

import requests

resp = requests.post("https://appcruiser.com/api/v1/ideas",
    headers={"Authorization": "Bearer ak_your_key"},
    json={
        "title": "My Idea",
        "description": "A productivity app",
        "category": "Productivity",
        "tags": ["ai"],
    })
idea = resp.json()
print(idea["id"])

Upload a Mockup

Mockups are working HTML prototypes. Upload single-file HTML apps or ZIP archives for WebContainer execution. The upload flow is three steps:

# Step 1: Get a presigned upload URL
curl -X POST https://appcruiser.com/api/v1/mockups/upload-url \
  -H "Authorization: Bearer ak_your_key" \
  -d '{"fileName":"index.html","contentType":"text/html"}'
# Returns: { "uploadUrl": "https://s3...", "s3Key": "mockups/..." }

# Step 2: Upload your file to the presigned URL
curl -X PUT "PRESIGNED_URL" -H "Content-Type: text/html" --data-binary @index.html

# Step 3: Create the mockup record with the s3Key from Step 1
curl -X POST https://appcruiser.com/api/v1/mockups \
  -H "Authorization: Bearer ak_your_key" \
  -d '{"name":"My App","description":"A prototype","category":"Gaming","s3Key":"S3_KEY"}'

For WebContainer mockups (multi-file projects), upload a .zip file and set type: "webcontainer" with a startScript (e.g., "start").

AI Generation

Let AI build the prototype. Trigger Claude-powered mockup generation from any idea. Choose your model, set token limits, and get a working HTML prototype in minutes. Requires a Pro or Business plan and costs 1 AI credit.

curl

# Trigger generation
curl -X POST https://appcruiser.com/api/v1/generations \
  -H "Authorization: Bearer ak_your_key" \
  -d '{"ideaId":"IDEA_ID","model":"claude-sonnet-4-6","maxTokens":16000}'
# Returns: { "jobId": "..." }

# Poll until complete (status: queued → processing → completed/failed)
curl https://appcruiser.com/api/v1/generations/JOB_ID \
  -H "Authorization: Bearer ak_your_key"

TypeScript (SDK)

const { jobId } = await client.generateMockup({ ideaId: "IDEA_ID" });
// Poll until complete (built-in helper)
const job = await client.waitForGeneration(jobId);
console.log("Mockup ready:", job.mockupId);

Python

import requests, time

resp = requests.post("https://appcruiser.com/api/v1/generations",
    headers={"Authorization": "Bearer ak_your_key"},
    json={"ideaId": "IDEA_ID"})
job_id = resp.json()["jobId"]

# Poll until complete
while True:
    status = requests.get(f"https://appcruiser.com/api/v1/generations/{job_id}",
        headers={"Authorization": "Bearer ak_your_key"}).json()
    if status["status"] in ("completed", "failed"):
        break
    time.sleep(3)
print("Mockup ready:", status.get("mockupId"))

Models: claude-sonnet-4-6 (fast, 1cr), claude-opus-4-6 (quality, 1cr), claude-opus-4-7 (smartest, 1.5cr batch / 2.5cr streaming). Tokens: 16K, 32K, 64K, 128K.

Create a Video

Generate a narrated promo/CTA video for any idea or prototype. A thumbnailtier (6–10s, silent loop) or a ctatier (15–60s, voiceover) is produced by the AI pipeline (architect → voiceover → compile → render). Like AI generation it returns ajobIdto poll. Costs credits (5 for thumbnail; 10–50 for CTA by duration) and is plan-gated for voices (Free uses a system default; Pro unlocks the voice catalog; Business accepts raw ElevenLabs voice IDs).

curl

# Kick off a CTA video for an idea (or POST /api/v1/mockups/MOCKUP_ID/generate-video)
curl -X POST https://appcruiser.com/api/v1/ideas/IDEA_ID/generate-video \
  -H "Authorization: Bearer ak_your_key" \
  -d '{"tier":"cta","duration":30,"brief":"Energetic 30s promo","language":"en-US"}'
# Returns: { "jobId": "..." }

# Poll until complete (queued → planning → voicing → compiling → rendering → completed)
curl https://appcruiser.com/api/v1/videos/JOB_ID \
  -H "Authorization: Bearer ak_your_key"

# List the voices available to your plan (optional, before generating)
curl "https://appcruiser.com/api/v1/videos/voices?locale=en-US" \
  -H "Authorization: Bearer ak_your_key"

MCP (agents)

list_video_voices    { "locale": "en-US" }
generate_video       { "tier": "cta", "duration": 30, "targetType": "idea",
                       "targetId": "IDEA_ID", "brief": "Energetic 30s promo", "voiceName": "Roger" }
get_video_status     { "jobId": "..." }
list_videos          { "targetType": "idea", "targetId": "IDEA_ID" }
manage_video         { "videoId": "...", "action": "feature" }
expand_video         { "videoId": "...", "mode": "translate", "languages": ["es-MX","ja-JP"] }
download_video_source{ "jobId": "..." }   # optional — edit the Remotion project locally

Refine a finished video without re-recording narration via iterate_video (orPOST /api/v1/videos/JOB_ID/iterate). Once a video is ready, manage_videofeatures it (the entity's preview), publishes it to the gallery, archives, or renames it. Video tools use the videos:read / videos:write scopes (a key with generations:* also works, for back-compat).

MCP Service

The AppCruiser MCP (Model Context Protocol) service gives AI agents like Claude direct access to your AppCruiser workspace. Create ideas, manage mockups, trigger AI generation, and read feedback — all through natural language in Claude Desktop, VS Code, or any MCP-compatible client.

Endpoint

POST https://6n262kz00l.execute-api.us-east-2.amazonaws.com/mcp

Configure in Claude Code

claude mcp add --transport http appcruiser \
  https://6n262kz00l.execute-api.us-east-2.amazonaws.com/mcp \
  --header "Authorization: Bearer ak_your_api_key"

Configure in Claude Desktop

{
  "mcpServers": {
    "appcruiser": {
      "url": "https://6n262kz00l.execute-api.us-east-2.amazonaws.com/mcp",
      "transport": { "type": "streamableHttp" },
      "headers": { "Authorization": "Bearer ak_your_api_key" }
    }
  }
}

Try MCP Tools

MCP Tools Reference

Key tools across 9 categories. Each tool maps to an AppCruiser API operation with scope-based access control. Pass ?profile=creator (or consumer, account) on the MCP URL to load a scoped subset.

Ideas

ToolDescriptionScope
list_ideasSearch/list ideas with paginationideas:read
get_ideaGet idea by IDideas:read
create_ideaCreate a new ideaideas:write
update_ideaUpdate own ideaideas:write
delete_ideaSoft-delete ideaideas:write
restore_ideaRestore deleted ideaideas:write

Mockups

ToolDescriptionScope
list_mockupsSearch/list mockupsmockups:read
get_mockupGet mockup by IDmockups:read
get_upload_urlGet presigned upload URLmockups:write
create_mockupCreate mockup recordmockups:write
update_mockupUpdate metadata or replace file (auto-creates revision)mockups:write
delete_mockupSoft-delete mockupmockups:write
restore_mockupRestore deleted mockupmockups:write
upload_thumbnailUpload base64 PNG thumbnailmockups:write
get_mockup_previewGet HTML contentmockups:read
download_mockupGet download URLmockups:read
add_variantAdd alternative format (HTML/WebContainer)mockups:write
list_variantsList all variants for a mockupmockups:read
remove_variantRemove a variantmockups:write

Revisions

ToolDescriptionScope
list_revisionsList all revisions with current flagmockups:read
rate_revisionThumbs up/down a revision (owner)mockups:write
set_current_revisionActivate a revision as the preview (owner)mockups:write
delete_revisionPermanently delete a non-active revision (owner)mockups:write

Iterations

ToolDescriptionScope
iterate_mockupChat-based iteration (batch 1cr / streaming 2cr)mockups:write
list_conversationList chat iteration historymockups:read

Video

ToolDescriptionScope
generate_videoGenerate a thumbnail or CTA video for an idea/prototype (5–50cr)videos:write
iterate_videoVisual/pacing edit without re-recording narration (10cr)videos:write
list_videosList videos for an idea/prototype (languages, featured + gallery flags)videos:read
manage_videoFeature, publish-to-gallery, archive, rename (one tool, an action enum)videos:write
expand_videoTranslate into more languages, or fan out creative variants (estimateOnly supported)videos:write
get_video_statusPoll a video jobvideos:read
list_video_voicesList voices available to your plan (locale-filtered)videos:read
download_video_sourcePresigned URL for the Remotion source zipvideos:read

Feedback, Generations & Account

ToolDescriptionScope
list_feedbackList feedback for mockupfeedback:read
create_feedbackPost feedback with ratingfeedback:write
delete_feedbackDelete own feedbackfeedback:write
generate_mockupAI generation (batch 1cr / streaming 2cr)generations:write
get_generation_statusPoll job statusgenerations:read
get_profileUser profile, plan, creditsprofile:read
list_categoriesList valid categoriesprofile:read
get_mockup_guidelinesUpload guidelines and best practicesprofile:read

Categories

Use one of these values for the category field:

Productivity, Creative, Social, Gaming, Developer Tools,
Finance, Education, Other

Or fetch programmatically: GET /api/v1/categories (no auth required).

Error Handling

All API errors return a JSON object with standardized fields:

{
  "error": "Human-readable message",
  "code": "MACHINE_READABLE_CODE",
  "requestId": "uuid-for-debugging"
}
StatusMeaning
200Success
201Created
400Bad request — INVALID_INPUT, MISSING_FIELD, INVALID_CATEGORY
401Unauthorized — UNAUTHORIZED, INVALID_API_KEY
403Forbidden — NOT_OWNER, PLAN_REQUIRED, INSUFFICIENT_CREDITS
404Not found — IDEA_NOT_FOUND, MOCKUP_NOT_FOUND
429Rate limit exceeded — RATE_LIMITED (check Retry-After header)
500Server error — INTERNAL_ERROR, STRIPE_ERROR

OpenAPI Spec

The full OpenAPI 3.1 specification is available at /openapi.json. Use it to generate client SDKs, import into Postman, or explore every endpoint in the API Reference.