{"openapi":"3.1.0","info":{"title":"Blueprint Studio API","version":"1.0.0","description":"AI-powered brand asset generation API. Generate illustrations, manage styles, organize brands, and more.","contact":{"name":"Blueprint Studio","url":"https://tools.blueprintstudio.ai"}},"servers":[{"url":"https://tools.blueprintstudio.ai","description":"Production"}],"security":[{"bearerAuth":[]}],"tags":[{"name":"Generation","description":"Generate brand assets, get prompt suggestions, and brainstorm ideas using AI."},{"name":"Assets","description":"List, retrieve, delete, favorite, share, and remove backgrounds from generated assets."},{"name":"Styles","description":"Manage visual styles — list, create, update, delete custom styles, analyze images for style extraction, and manage reference images."},{"name":"Brands","description":"Manage brands (organizations) — create, update, delete, manage settings, upload logos, and analyze websites for brand identity."},{"name":"Auth","description":"Register a new account. No authentication required."},{"name":"API Keys","description":"Manage API keys — list active keys, create new ones, and revoke existing keys."},{"name":"Settings","description":"Get and update user-level settings like default style and prompt template."},{"name":"Usage","description":"Check current usage, rate limits, and remaining quotas."}],"paths":{"/api/v1/generate":{"post":{"operationId":"generateAsset","summary":"Generate a brand asset","description":"Generate a new brand asset image using AI. Uses the same generation pipeline as the web app — supports styles (with org/parent inheritance), multiple reference images, aspect ratio selection, and iterative refinement via parent assets with full thread history.","tags":["Generation"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"What to generate (e.g., \"a coffee cup icon\")"},"styleId":{"type":"string","description":"Style ID to apply. Omit for org/user default. Use \"freestyle\" for no style."},"aspectRatio":{"type":"string","description":"Output aspect ratio.","enum":["1:1","16:9","9:16","4:3","3:4","3:2","2:3","4:5","5:4","21:9"],"default":"1:1"},"highQuality":{"type":"boolean","description":"Use higher quality model.","default":false},"parentAssetId":{"type":"string","description":"Parent asset ID for iterative refinement. Thread history and style are inherited automatically."},"referenceImages":{"type":"array","items":{"type":"string"},"description":"Array of reference image URLs or base64 data URLs (max 5). Preferred over referenceImage."},"referenceImage":{"type":"string","description":"Single reference image — base64 data URL or HTTP URL. Legacy; prefer referenceImages[]."},"temperature":{"type":"number","description":"Generation temperature. Lower = more consistent.","default":0.4},"imageSize":{"type":"string","description":"Output image resolution.","enum":["1K","2K","4K"],"default":"2K"}},"required":["prompt"]}}}},"responses":{"200":{"description":"Generated asset details with a public image URL (no expiry).","content":{"application/json":{"schema":{"type":"object"},"example":{"assetId":"uuid","imageUrl":"https://...","prompt":"a coffee cup icon","styleId":"uuid","aspectRatio":"1:1","threadId":"uuid","versionNumber":1}}}},"401":{"description":"Invalid or missing API key"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearerAuth":[]}]}},"/api/v1/generate/suggest":{"post":{"operationId":"suggestPrompts","summary":"Get prompt suggestions","description":"Generate AI-powered prompt suggestions for a given style. Useful for inspiring users or populating prompt libraries.","tags":["Generation"],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"styleId":{"type":"string","description":"Style to base suggestions on. Omit for generic suggestions."},"count":{"type":"number","description":"Number of suggestions to return (1–10).","default":5}}}}}},"responses":{"200":{"description":"Array of prompt suggestion strings.","content":{"application/json":{"schema":{"type":"object"},"example":{"suggestions":["a minimalist coffee cup icon","an abstract mountain landscape","a geometric pattern with warm tones"]}}}},"401":{"description":"Invalid or missing API key"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearerAuth":[]}]}},"/api/v1/generate/ideas":{"post":{"operationId":"generateIdeas","summary":"Generate asset ideas","description":"Generate creative asset concept ideas for a given topic. Returns an array of idea descriptions.","tags":["Generation"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"topic":{"type":"string","description":"Topic to brainstorm ideas for."}},"required":["topic"]}}}},"responses":{"200":{"description":"Array of idea strings.","content":{"application/json":{"schema":{"type":"object"},"example":{"ideas":["A series of icons representing different coffee brewing methods","Illustrated scenes of a cozy coffee shop atmosphere"]}}}},"401":{"description":"Invalid or missing API key"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearerAuth":[]}]}},"/api/v1/assets":{"get":{"operationId":"listAssets","summary":"List assets","description":"List generated assets with pagination. Results are scoped to the authenticated user or brand.","tags":["Assets"],"parameters":[{"name":"styleId","in":"query","required":false,"description":"Filter by style ID.","schema":{"type":"string","description":"Filter by style ID."}},{"name":"limit","in":"query","required":false,"description":"Max results per page (max 100).","schema":{"type":"number","description":"Max results per page (max 100).","default":50}},{"name":"offset","in":"query","required":false,"description":"Pagination offset.","schema":{"type":"number","description":"Pagination offset.","default":0}}],"responses":{"200":{"description":"Paginated asset list with public image URLs (no expiry).","content":{"application/json":{"schema":{"type":"object"},"example":{"assets":[{"id":"uuid","prompt":"a coffee cup icon","imageUrl":"https://...","aspectRatio":"1:1","highQuality":false,"fileSizeBytes":245000,"createdAt":"2025-01-01T00:00:00Z","styleId":"uuid","threadId":"uuid","versionNumber":1}],"total":42,"limit":50,"offset":0}}}},"401":{"description":"Invalid or missing API key"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearerAuth":[]}]}},"/api/v1/assets/{id}":{"get":{"operationId":"getAsset","summary":"Get an asset","description":"Get a single asset by ID, including both view and download URLs.","tags":["Assets"],"parameters":[{"name":"id","in":"path","required":true,"description":"Asset UUID.","schema":{"type":"string","description":"Asset UUID."}}],"responses":{"200":{"description":"Full asset details with public image URL and download URL (no expiry).","content":{"application/json":{"schema":{"type":"object"},"example":{"id":"uuid","prompt":"a coffee cup icon","enhancedPrompt":"...","imageUrl":"https://...","downloadUrl":"https://...","aspectRatio":"1:1","highQuality":false,"fileSizeBytes":245000,"createdAt":"2025-01-01T00:00:00Z","styleId":"uuid","threadId":"uuid","versionNumber":1,"brandId":null}}}},"401":{"description":"Invalid or missing API key"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearerAuth":[]}]},"delete":{"operationId":"deleteAsset","summary":"Delete an asset","description":"Soft-delete an asset (sets is_deleted: true). The image file remains in storage.","tags":["Assets"],"parameters":[{"name":"id","in":"path","required":true,"description":"Asset UUID.","schema":{"type":"string","description":"Asset UUID."}}],"responses":{"200":{"description":"Deletion confirmation.","content":{"application/json":{"schema":{"type":"object"},"example":{"deleted":true}}}},"401":{"description":"Invalid or missing API key"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearerAuth":[]}]}},"/api/v1/assets/{id}/favorite":{"post":{"operationId":"favoriteAsset","summary":"Toggle favorite","description":"Toggle or explicitly set the favorite status of an asset.","tags":["Assets"],"parameters":[{"name":"id","in":"path","required":true,"description":"Asset UUID.","schema":{"type":"string","description":"Asset UUID."}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"favorite":{"type":"boolean","description":"Set explicitly, or omit to toggle."}}}}}},"responses":{"200":{"description":"Updated favorite state.","content":{"application/json":{"schema":{"type":"object"},"example":{"id":"uuid","isFavorite":true}}}},"401":{"description":"Invalid or missing API key"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearerAuth":[]}]}},"/api/v1/assets/{id}/share":{"post":{"operationId":"shareAsset","summary":"Share an asset","description":"Generate a public share URL for an asset. If a share token already exists, returns the existing URL.","tags":["Assets"],"parameters":[{"name":"id","in":"path","required":true,"description":"Asset UUID.","schema":{"type":"string","description":"Asset UUID."}}],"responses":{"200":{"description":"Share URL and token.","content":{"application/json":{"schema":{"type":"object"},"example":{"shareUrl":"https://tools.blueprintstudio.ai/s/abc123","token":"abc123"}}}},"401":{"description":"Invalid or missing API key"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearerAuth":[]}]}},"/api/v1/assets/{id}/remove-bg":{"post":{"operationId":"removeBackground","summary":"Remove background","description":"Remove the background from an asset image and save the result as a new asset. Processing may take up to 60 seconds.","tags":["Assets"],"parameters":[{"name":"id","in":"path","required":true,"description":"Source asset UUID.","schema":{"type":"string","description":"Source asset UUID."}}],"responses":{"200":{"description":"New asset with transparent background.","content":{"application/json":{"schema":{"type":"object"},"example":{"imageUrl":"https://...","assetId":"uuid"}}}},"401":{"description":"Invalid or missing API key"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearerAuth":[]}]}},"/api/v1/styles":{"get":{"operationId":"listStyles","summary":"List styles","description":"List available styles including system defaults and user/brand custom styles.","tags":["Styles"],"responses":{"200":{"description":"Array of styles with full details.","content":{"application/json":{"schema":{"type":"object"},"example":{"styles":[{"id":"uuid","name":"Minimalist","description":"Clean, minimal design","stylePrompt":"...","colorPalette":[{"hex":"#000","name":"Black","role":"primary"}],"styleDescriptors":["clean","modern"],"mood":"professional","isSystem":true,"isDefault":false,"brandId":null,"createdAt":"2025-01-01T00:00:00Z"}]}}}},"401":{"description":"Invalid or missing API key"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearerAuth":[]}]},"post":{"operationId":"createStyle","summary":"Create a style","description":"Create a new custom style with an AI generation prompt, optional color palette, and reference images.","tags":["Styles"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Style name."},"stylePrompt":{"type":"string","description":"AI generation prompt for this style."},"description":{"type":"string","description":"Human-readable description."},"colorPalette":{"type":"array","items":{"type":"string"},"description":"Array of { hex, name, role } color objects."},"styleDescriptors":{"type":"array","items":{"type":"string"},"description":"Array of descriptor strings (e.g., [\"clean\", \"modern\"])."},"mood":{"type":"string","description":"Style mood (e.g., \"playful\", \"professional\")."},"brandId":{"type":"string","description":"Assign to a brand. Overrides API key's brandId."},"referenceImages":{"type":"array","items":{"type":"string"},"description":"Array of { data (base64), mimeType, filename } objects. Max 5."}},"required":["name","stylePrompt"]}}}},"responses":{"201":{"description":"Created style details.","content":{"application/json":{"schema":{"type":"object"},"example":"{\n  \"id\": \"uuid\",\n  \"name\": \"My Custom Style\",\n  \"description\": \"...\",\n  \"stylePrompt\": \"...\",\n  \"colorPalette\": [...],\n  \"styleDescriptors\": [...],\n  \"mood\": \"playful\",\n  \"brandId\": null,\n  \"createdAt\": \"2025-01-01T00:00:00Z\"\n}"}}},"401":{"description":"Invalid or missing API key"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearerAuth":[]}]}},"/api/v1/styles/{id}":{"get":{"operationId":"getStyle","summary":"Get a style","description":"Get a single style by ID with all details.","tags":["Styles"],"parameters":[{"name":"id","in":"path","required":true,"description":"Style UUID.","schema":{"type":"string","description":"Style UUID."}}],"responses":{"200":{"description":"Full style details.","content":{"application/json":{"schema":{"type":"object"},"example":"{\n  \"id\": \"uuid\",\n  \"name\": \"Minimalist\",\n  \"description\": \"Clean, minimal design\",\n  \"stylePrompt\": \"...\",\n  \"colorPalette\": [...],\n  \"styleDescriptors\": [\"clean\", \"modern\"],\n  \"mood\": \"professional\",\n  \"isSystem\": true,\n  \"isDefault\": false,\n  \"brandId\": null,\n  \"createdAt\": \"2025-01-01T00:00:00Z\"\n}"}}},"401":{"description":"Invalid or missing API key"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearerAuth":[]}]},"put":{"operationId":"updateStyle","summary":"Update a style","description":"Update a custom style. System styles cannot be modified.","tags":["Styles"],"parameters":[{"name":"id","in":"path","required":true,"description":"Style UUID.","schema":{"type":"string","description":"Style UUID."}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"New name."},"stylePrompt":{"type":"string","description":"New AI generation prompt."},"description":{"type":"string","description":"New description."},"colorPalette":{"type":"array","items":{"type":"string"},"description":"New color palette."},"styleDescriptors":{"type":"array","items":{"type":"string"},"description":"Keywords describing the style."},"mood":{"type":"string","description":"New mood."}}}}}},"responses":{"200":{"description":"Updated style details.","content":{"application/json":{"schema":{"type":"object"},"example":"{\n  \"id\": \"uuid\",\n  \"name\": \"Updated Style\",\n  \"description\": \"...\",\n  \"stylePrompt\": \"...\",\n  \"colorPalette\": [...],\n  \"mood\": \"bold\",\n  \"updatedAt\": \"2025-01-01T00:00:00Z\"\n}"}}},"401":{"description":"Invalid or missing API key"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearerAuth":[]}]},"delete":{"operationId":"deleteStyle","summary":"Delete a style","description":"Delete a custom style. System styles cannot be deleted.","tags":["Styles"],"parameters":[{"name":"id","in":"path","required":true,"description":"Style UUID.","schema":{"type":"string","description":"Style UUID."}}],"responses":{"200":{"description":"Deletion confirmation.","content":{"application/json":{"schema":{"type":"object"},"example":{"deleted":true}}}},"401":{"description":"Invalid or missing API key"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearerAuth":[]}]}},"/api/v1/styles/analyze":{"post":{"operationId":"analyzeStyleImages","summary":"Analyze images for style","description":"Upload images to extract a style guide using AI vision. Returns colors, descriptors, typography analysis, mood, and a generated prompt.","tags":["Styles"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"files":{"type":"array","items":{"type":"string"},"description":"Array of { data (base64), mimeType, filename } objects. Max 5 images."}},"required":["files"]}}}},"responses":{"200":{"description":"Extracted style analysis.","content":{"application/json":{"schema":{"type":"object"},"example":{"analysis":{"colors":["#FF5733","#333333"],"styleDescriptors":["bold","modern"],"typographyStyle":"sans-serif, clean","mood":"energetic","backgroundSuggestion":"white","visualTechnique":"flat illustration","generatedPrompt":"..."}}}}},"401":{"description":"Invalid or missing API key"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearerAuth":[]}]}},"/api/v1/styles/{id}/references":{"post":{"operationId":"manageStyleReferences","summary":"Manage reference images","description":"Add or remove reference images from a custom style. System styles cannot be modified.","tags":["Styles"],"parameters":[{"name":"id","in":"path","required":true,"description":"Style UUID.","schema":{"type":"string","description":"Style UUID."}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"add":{"type":"array","items":{"type":"string"},"description":"Array of { data (base64), mimeType, filename } objects to add. Max 5."},"remove":{"type":"array","items":{"type":"string"},"description":"Array of storage paths to remove."}}}}}},"responses":{"200":{"description":"Updated style with current reference files.","content":{"application/json":{"schema":{"type":"object"},"example":{"style":{"id":"uuid","name":"My Style","sourceFiles":[{"storage_path":"...","filename":"ref.png","type":"image/png"}],"...":"..."}}}}},"401":{"description":"Invalid or missing API key"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearerAuth":[]}]}},"/api/v1/brands":{"get":{"operationId":"listBrands","summary":"List brands","description":"List all brands the authenticated user is a member of.","tags":["Brands"],"responses":{"200":{"description":"Array of brands with role and member count.","content":{"application/json":{"schema":{"type":"object"},"example":{"brands":[{"id":"uuid","name":"Acme Corp","slug":"acme-corp","role":"owner","memberCount":3,"createdAt":"2025-01-01T00:00:00Z","updatedAt":"2025-01-01T00:00:00Z"}]}}}},"401":{"description":"Invalid or missing API key"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearerAuth":[]}]},"post":{"operationId":"createBrand","summary":"Create a brand","description":"Create a new brand. The authenticated user becomes the owner.","tags":["Brands"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Brand name."}},"required":["name"]}}}},"responses":{"201":{"description":"Created brand details.","content":{"application/json":{"schema":{"type":"object"},"example":{"brand":{"id":"uuid","name":"Acme Corp","slug":"acme-corp","role":"owner","createdAt":"2025-01-01T00:00:00Z"}}}}},"401":{"description":"Invalid or missing API key"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearerAuth":[]}]}},"/api/v1/brands/{id}":{"get":{"operationId":"getBrand","summary":"Get a brand","description":"Get a single brand with optional member list and settings includes.","tags":["Brands"],"parameters":[{"name":"id","in":"path","required":true,"description":"Brand UUID.","schema":{"type":"string","description":"Brand UUID."}},{"name":"members","in":"query","required":false,"description":"Set to \"true\" to include member list.","schema":{"type":"string","description":"Set to \"true\" to include member list.","enum":["true"]}},{"name":"settings","in":"query","required":false,"description":"Set to \"true\" to include brand settings.","schema":{"type":"string","description":"Set to \"true\" to include brand settings.","enum":["true"]}}],"responses":{"200":{"description":"Brand details with optional members and settings.","content":{"application/json":{"schema":{"type":"object"},"example":{"brand":{"id":"uuid","name":"Acme Corp","slug":"acme-corp","role":"owner","permissions":["write"],"createdAt":"2025-01-01T00:00:00Z","members":[{"id":"uuid","userId":"uuid","role":"owner","joinedAt":"...","user":{"email":"...","display_name":"..."}}],"settings":{"defaultStyleId":"uuid","promptTemplate":"..."}}}}}},"401":{"description":"Invalid or missing API key"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearerAuth":[]}]},"put":{"operationId":"updateBrand","summary":"Update a brand","description":"Update a brand's name. Requires admin or owner role.","tags":["Brands"],"parameters":[{"name":"id","in":"path","required":true,"description":"Brand UUID.","schema":{"type":"string","description":"Brand UUID."}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"New brand name."}}}}}},"responses":{"200":{"description":"Updated brand details.","content":{"application/json":{"schema":{"type":"object"},"example":{"brand":{"id":"uuid","name":"New Name","slug":"acme-corp","updatedAt":"2025-01-01T00:00:00Z"}}}}},"401":{"description":"Invalid or missing API key"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearerAuth":[]}]},"delete":{"operationId":"deleteBrand","summary":"Delete a brand","description":"Permanently delete a brand. Only the owner can delete.","tags":["Brands"],"parameters":[{"name":"id","in":"path","required":true,"description":"Brand UUID.","schema":{"type":"string","description":"Brand UUID."}}],"responses":{"200":{"description":"Deletion confirmation.","content":{"application/json":{"schema":{"type":"object"},"example":{"deleted":true}}}},"401":{"description":"Invalid or missing API key"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearerAuth":[]}]}},"/api/v1/brands/{id}/settings":{"get":{"operationId":"getBrandSettings","summary":"Get brand settings","description":"Get a brand's default style and prompt template settings.","tags":["Brands"],"parameters":[{"name":"id","in":"path","required":true,"description":"Brand UUID.","schema":{"type":"string","description":"Brand UUID."}}],"responses":{"200":{"description":"Brand settings.","content":{"application/json":{"schema":{"type":"object"},"example":{"settings":{"defaultStyleId":"uuid","promptTemplate":"Create a {prompt} in our brand style","createdAt":"2025-01-01T00:00:00Z","updatedAt":"2025-01-01T00:00:00Z"}}}}},"401":{"description":"Invalid or missing API key"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearerAuth":[]}]},"put":{"operationId":"updateBrandSettings","summary":"Update brand settings","description":"Update a brand's default style and prompt template. Requires admin or owner role.","tags":["Brands"],"parameters":[{"name":"id","in":"path","required":true,"description":"Brand UUID.","schema":{"type":"string","description":"Brand UUID."}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"defaultStyleId":{"type":"string","description":"Default style ID for generation, or null to clear.","nullable":true},"promptTemplate":{"type":"string","description":"Prompt template with {prompt} placeholder, or null to clear.","nullable":true}}}}}},"responses":{"200":{"description":"Updated brand settings.","content":{"application/json":{"schema":{"type":"object"},"example":{"settings":{"defaultStyleId":"uuid","promptTemplate":"Create a {prompt} in our brand style","createdAt":"2025-01-01T00:00:00Z","updatedAt":"2025-01-01T00:00:00Z"}}}}},"401":{"description":"Invalid or missing API key"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearerAuth":[]}]}},"/api/v1/brands/{id}/logo":{"put":{"operationId":"uploadBrandLogo","summary":"Upload brand logo","description":"Upload or replace a brand's logo image. Requires admin or owner role.","tags":["Brands"],"parameters":[{"name":"id","in":"path","required":true,"description":"Brand UUID.","schema":{"type":"string","description":"Brand UUID."}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"string","description":"Base64-encoded image data."},"mimeType":{"type":"string","description":"Image MIME type (e.g., \"image/png\")."}},"required":["data","mimeType"]}}}},"responses":{"200":{"description":"Public logo URL (no expiry).","content":{"application/json":{"schema":{"type":"object"},"example":{"logoUrl":"https://..."}}}},"401":{"description":"Invalid or missing API key"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearerAuth":[]}]}},"/api/v1/brands/analyze":{"post":{"operationId":"analyzeBrand","summary":"Analyze brand website","description":"Analyze a website to extract brand visual identity using an AI agent. Returns an NDJSON stream with status updates, insights, and a final style guide with 1–3 recommended styles.","tags":["Brands"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"Website URL to analyze."}},"required":["url"]}}}},"responses":{"200":{"description":"NDJSON stream of events: { type: \"status\" | \"insight\" | \"result\" | \"error\", ... }","content":{"application/x-ndjson":{"schema":{"type":"object"},"example":"{\"type\":\"status\",\"message\":\"Starting brand analysis...\"}\n{\"type\":\"status\",\"message\":\"Extracting color palette...\"}\n{\"type\":\"result\",\"styles\":[{\"id\":\"style-1\",\"name\":\"Brand Style\",\"stylePrompt\":\"...\",\"colors\":[\"#FF5733\"]}],\"orgType\":\"saas\",\"brandName\":\"Acme\"}"}}},"401":{"description":"Invalid or missing API key"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearerAuth":[]}]}},"/api/v1/brands/{id}/members/{userId}":{"patch":{"operationId":"updateBrandMember","summary":"Update member role","description":"Update a team member's role in the brand.","tags":["Brands"],"parameters":[{"name":"id","in":"path","required":true,"description":"Brand UUID.","schema":{"type":"string","description":"Brand UUID."}},{"name":"userId","in":"path","required":true,"description":"Member user ID.","schema":{"type":"string","description":"Member user ID."}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"role":{"type":"string","description":"New role for the member.","enum":["admin","member"]}},"required":["role"]}}}},"responses":{"200":{"description":"Updated member details.","content":{"application/json":{"schema":{"type":"object"},"example":{"member":{"userId":"uuid","role":"admin","updatedAt":"2025-01-01T00:00:00Z"}}}}},"401":{"description":"Invalid or missing API key"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearerAuth":[]}]},"delete":{"operationId":"removeBrandMember","summary":"Remove a member","description":"Remove a team member from the brand.","tags":["Brands"],"parameters":[{"name":"id","in":"path","required":true,"description":"Brand UUID.","schema":{"type":"string","description":"Brand UUID."}},{"name":"userId","in":"path","required":true,"description":"Member user ID.","schema":{"type":"string","description":"Member user ID."}}],"responses":{"200":{"description":"Removal confirmation.","content":{"application/json":{"schema":{"type":"object"},"example":{"removed":true}}}},"401":{"description":"Invalid or missing API key"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearerAuth":[]}]}},"/api/v1/brands/{id}/members/invite":{"post":{"operationId":"inviteBrandMember","summary":"Invite a member","description":"Invite a new member to the brand by email.","tags":["Brands"],"parameters":[{"name":"id","in":"path","required":true,"description":"Brand UUID.","schema":{"type":"string","description":"Brand UUID."}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","description":"Email address of the person to invite."},"role":{"type":"string","description":"Role to assign the invited member.","enum":["admin","member"],"default":"member"}},"required":["email"]}}}},"responses":{"200":{"description":"Invite details including the invite URL.","content":{"application/json":{"schema":{"type":"object"},"example":{"invite":{"id":"uuid","email":"user@example.com","role":"member","inviteUrl":"https://tools.blueprintstudio.ai/invite/abc123","expiresAt":"2025-01-08T00:00:00Z"}}}}},"401":{"description":"Invalid or missing API key"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearerAuth":[]}]}},"/api/v1/auth/register":{"post":{"operationId":"register","summary":"Create an account","description":"Public endpoint — no authentication required. Creates a new user account and returns an API key in a single request. Intended for AI agents to self-serve access.","tags":["Auth"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","description":"Email address for the new account."}},"required":["email"]}}}},"responses":{"201":{"description":"Account created with an API key (shown only once).","content":{"application/json":{"schema":{"type":"object"},"example":{"apiKey":"bp_live_abc123...","prefix":"bp_live_abc...","userId":"uuid","tier":"free","message":"Account created. Save this API key — it will not be shown again."}}}},"401":{"description":"Invalid or missing API key"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearerAuth":[]}]}},"/api/v1/api-keys":{"get":{"operationId":"listApiKeys","summary":"List API keys","description":"List all active (non-revoked) API keys for the authenticated user.","tags":["API Keys"],"responses":{"200":{"description":"Array of API key metadata (keys are never returned after creation).","content":{"application/json":{"schema":{"type":"object"},"example":{"keys":[{"id":"uuid","name":"Production","prefix":"bp_live_abc","tier":"pro","lastUsedAt":"2025-01-01T00:00:00Z","requestsToday":42,"createdAt":"2025-01-01T00:00:00Z","expiresAt":null,"brandId":null}]}}}},"401":{"description":"Invalid or missing API key"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearerAuth":[]}]},"post":{"operationId":"createApiKey","summary":"Create an API key","description":"Create a new API key. Accepts either a Bearer token or session cookie auth (for logged-in users bootstrapping their first key). The full key is only returned once — save it immediately.","tags":["API Keys"],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Key name for identification.","default":"Default"},"brandId":{"type":"string","description":"Associate the key with a brand."}}}}}},"responses":{"201":{"description":"Full API key (shown only once) with metadata.","content":{"application/json":{"schema":{"type":"object"},"example":{"key":"bp_live_abc123...","prefix":"bp_live_abc","name":"Production","tier":"pro","message":"Save this key — it will not be shown again."}}}},"401":{"description":"Invalid or missing API key"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearerAuth":[]}]}},"/api/v1/api-keys/{id}":{"delete":{"operationId":"revokeApiKey","summary":"Revoke an API key","description":"Revoke an API key. You cannot revoke the key currently being used for authentication.","tags":["API Keys"],"parameters":[{"name":"id","in":"path","required":true,"description":"API key UUID.","schema":{"type":"string","description":"API key UUID."}}],"responses":{"200":{"description":"Revocation confirmation.","content":{"application/json":{"schema":{"type":"object"},"example":{"revoked":true}}}},"401":{"description":"Invalid or missing API key"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearerAuth":[]}]}},"/api/v1/settings":{"get":{"operationId":"getSettings","summary":"Get user settings","description":"Get the authenticated user's default style and prompt template settings.","tags":["Settings"],"responses":{"200":{"description":"User settings.","content":{"application/json":{"schema":{"type":"object"},"example":{"settings":{"defaultStyleId":"uuid","promptTemplate":null}}}}},"401":{"description":"Invalid or missing API key"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearerAuth":[]}]},"put":{"operationId":"updateSettings","summary":"Update user settings","description":"Update the authenticated user's default style and prompt template.","tags":["Settings"],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"defaultStyleId":{"type":"string","description":"Default style ID, or null to clear.","nullable":true},"promptTemplate":{"type":"string","description":"Prompt template with {prompt} placeholder, or null to clear.","nullable":true}}}}}},"responses":{"200":{"description":"Updated settings.","content":{"application/json":{"schema":{"type":"object"},"example":{"settings":{"defaultStyleId":"uuid","promptTemplate":"Create a {prompt} in minimalist style"}}}}},"401":{"description":"Invalid or missing API key"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearerAuth":[]}]}},"/api/v1/usage":{"get":{"operationId":"getUsage","summary":"Get usage & limits","description":"Get current usage statistics including generation counts, API request counts, and remaining quotas for the current billing period.","tags":["Usage"],"responses":{"200":{"description":"Current usage and limits.","content":{"application/json":{"schema":{"type":"object"},"example":{"tier":"pro","generationsUsed":150,"generationsLimit":1000,"generationsRemaining":850,"apiRequestsToday":42,"apiRequestsLimit":5000}}}},"401":{"description":"Invalid or missing API key"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearerAuth":[]}]}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"API Key","description":"API key prefixed with bp_live_ or bp_test_"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string","description":"Error message"}},"required":["error"]}},"responses":{"Error400":{"description":"Bad request — check parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Error401":{"description":"Invalid or missing API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Error403":{"description":"Forbidden — insufficient permissions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Error404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Error429":{"description":"Rate limit exceeded — check Retry-After header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Error500":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Error503":{"description":"Service unavailable (e.g., AI service not configured)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}