{"openapi":"3.1.0","info":{"title":"FoodPhoto.AI API","version":"1.0.0"},"paths":{"/api/mobile/private-assets/{filename}":{"get":{"summary":"Mobile Private Asset","operationId":"mobile_private_asset_api_mobile_private_assets__filename__get","parameters":[{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}},{"name":"exp","in":"query","required":true,"schema":{"type":"integer","title":"Exp"}},{"name":"sig","in":"query","required":true,"schema":{"type":"string","title":"Sig"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mobile/download":{"get":{"summary":"Mobile Download","operationId":"mobile_download_api_mobile_download_get","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","title":"Url"}},{"name":"filename","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"summary":"Health Check","description":"Health check endpoint","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/health":{"get":{"summary":"Health Check Api","description":"Health check endpoint (proxied via /api/* in production).","operationId":"health_check_api_api_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/mobile/caption-copy":{"post":{"summary":"Mobile Caption Copy","description":"Generate bounded restaurant copy without exposing image URLs to the model.","operationId":"mobile_caption_copy_api_mobile_caption_copy_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/newsletter":{"post":{"summary":"Newsletter Subscribe","description":"Newsletter signup endpoint (used by blog + popups).","operationId":"newsletter_subscribe_api_newsletter_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/contact":{"post":{"summary":"Contact Form","description":"Contact form endpoint (used by /contact).","operationId":"contact_form_api_contact_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/resource-download":{"post":{"summary":"Resource Download","description":"Resource download lead capture (used by /resources pages).","operationId":"resource_download_api_resource_download_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/guide-download":{"post":{"summary":"Guide Download","description":"Free guide lead capture (used by /free-guide).","operationId":"guide_download_api_guide_download_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/audit-request":{"post":{"summary":"Audit Request","description":"Free menu photo audit lead capture (used by /free-audit).","operationId":"audit_request_api_audit_request_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/unsubscribe":{"get":{"summary":"Marketing Unsubscribe","description":"One-click unsubscribe for marketing emails.","operationId":"marketing_unsubscribe_api_unsubscribe_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"head":{"summary":"Marketing Unsubscribe Head","operationId":"marketing_unsubscribe_head_api_unsubscribe_head","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/google/config":{"get":{"summary":"Google Auth Config","description":"Expose whether mobile Google sign-in can be started without leaking secrets.","operationId":"google_auth_config_api_auth_google_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/google/mobile/start":{"get":{"summary":"Google Mobile Start","description":"Start a Google OAuth browser redirect for mobile/web clients.","operationId":"google_mobile_start_api_auth_google_mobile_start_get","parameters":[{"name":"next","in":"query","required":false,"schema":{"type":"string","default":"/m","title":"Next"}},{"name":"native","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Native"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/google/callback":{"get":{"summary":"Google Auth Callback","description":"Complete Google OAuth and return the mobile app to its callback page.","operationId":"google_auth_callback_api_auth_google_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"type":"string","default":"","title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"","title":"State"}},{"name":"error","in":"query","required":false,"schema":{"type":"string","default":"","title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/signup":{"post":{"summary":"Signup","description":"Register a new user","operationId":"signup_api_auth_signup_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/login":{"post":{"summary":"Login","description":"Login user","operationId":"login_api_auth_login_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/logout":{"post":{"summary":"Logout","description":"Logout user","operationId":"logout_api_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/me":{"get":{"summary":"Get Me","description":"Get current user info","operationId":"get_me_api_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/auth/session":{"get":{"summary":"Check Session","description":"Check if session is valid","operationId":"check_session_api_auth_session_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/auth/status":{"get":{"summary":"Auth Status","description":"Check authentication status (alias for /session)","operationId":"auth_status_api_auth_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/upload":{"post":{"summary":"Admin Upload","operationId":"admin_upload_api_admin_upload_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_admin_upload_api_admin_upload_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/enrich":{"post":{"summary":"Enrich Prompt","description":"Create a bounded Luna/Codex food-photography brief.","operationId":"enrich_prompt_api_enrich_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/upscale":{"post":{"summary":"Upscale","description":"Upscale image 2x or 4x","operationId":"upscale_api_upscale_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/process":{"post":{"summary":"Process Images","description":"Batch process uploaded images with REAL AI enhancements\nSupports: upscaling, background removal, color enhancement, relighting","operationId":"process_images_api_process_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/remove-background":{"post":{"summary":"Remove Bg","description":"Remove background from food photo","operationId":"remove_bg_api_remove_background_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/relight":{"post":{"summary":"Relight","description":"Relight image with AI-controlled lighting","operationId":"relight_api_relight_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/ai-enhance":{"post":{"summary":"Ai Enhance","description":"Apply AI-powered lighting enhancement to food photos","operationId":"ai_enhance_api_ai_enhance_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/enhance-colors":{"post":{"summary":"Enhance Image Colors","description":"Enhance colors and brightness","operationId":"enhance_image_colors_api_enhance_colors_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/fix-blur":{"post":{"summary":"Fix Image Blur","description":"Fix blurry images","operationId":"fix_image_blur_api_fix_blur_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/inpaint":{"post":{"summary":"Inpaint","description":"Inpaint/edit specific areas of the image","operationId":"inpaint_api_inpaint_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/batch-process":{"post":{"summary":"Batch Process","description":"Batch process multiple images (up to 100)","operationId":"batch_process_api_batch_process_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/styles":{"get":{"summary":"Get Styles","description":"Get available style presets","operationId":"get_styles_api_styles_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/validate-email":{"post":{"summary":"Validate Email","description":"Validate email format (utility endpoint)","operationId":"validate_email_api_auth_validate_email_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/resend-verification":{"post":{"summary":"Resend Verification Email","description":"Rotate and deliver a fresh one-time verification link.","operationId":"resend_verification_email_api_auth_resend_verification_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/auth/verify-email":{"get":{"summary":"Verify Email","description":"Verify email address for a newly created account.\nCalled when user clicks the verification link in their email.","operationId":"verify_email_api_auth_verify_email_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}},{"name":"source","in":"query","required":false,"schema":{"type":"string","default":"","title":"Source"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/conversions":{"get":{"summary":"Get Conversions","description":"Get user conversions (placeholder)","operationId":"get_conversions_api_conversions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/auth/forgot-password":{"post":{"summary":"Forgot Password","description":"Send password reset email","operationId":"forgot_password_api_auth_forgot_password_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/reset-password":{"post":{"summary":"Reset Password","description":"Reset password with token","operationId":"reset_password_api_auth_reset_password_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/pricing":{"get":{"summary":"Get Pricing","description":"Retired duplicate pricing table; WordPress owns the canonical catalog.","operationId":"get_pricing_api_pricing_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/billing/create-checkout-session":{"post":{"summary":"Create Checkout","description":"Stripe sale creation is retired; historical webhooks remain read/write.","operationId":"create_checkout_api_billing_create_checkout_session_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/billing/create-portal-session":{"post":{"summary":"Create Portal Session","description":"Create a Stripe Customer Portal session and return a redirect URL.","operationId":"create_portal_session_api_billing_create_portal_session_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/billing/portal":{"get":{"summary":"Billing Portal Redirect","description":"Convenience redirect to the Stripe Customer Portal (used by dashboard links).","operationId":"billing_portal_redirect_api_billing_portal_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/payment/create-intent":{"post":{"summary":"Create Payment","description":"Direct Stripe PaymentIntent sales are retired.","operationId":"create_payment_api_payment_create_intent_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/payment/create-subscription":{"post":{"summary":"Create Sub","description":"Direct Stripe subscription creation is retired.","operationId":"create_sub_api_payment_create_subscription_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/payment/cancel-subscription":{"post":{"summary":"Cancel Sub","description":"Direct Stripe cancellation is retired; legacy users use their portal.","operationId":"cancel_sub_api_payment_cancel_subscription_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/billing/claim-checkout-session":{"get":{"summary":"Claim Checkout Session","description":"Stripe checkout claiming is retired with public Stripe sales.","operationId":"claim_checkout_session_api_billing_claim_checkout_session_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/webhooks/stripe":{"post":{"summary":"Stripe Webhook","description":"Handle Stripe webhooks","operationId":"stripe_webhook_api_webhooks_stripe_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/mobile/growth/consent":{"post":{"summary":"Mobile Growth Consent","description":"Synchronize the optional anonymous funnel link without recording an event.","operationId":"mobile_growth_consent_api_mobile_growth_consent_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/mobile/growth/events":{"post":{"summary":"Mobile Growth Event","description":"Queue one consented, client-observable native funnel event.","operationId":"mobile_growth_event_api_mobile_growth_events_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/mobile/guest-session":{"post":{"summary":"Mobile Guest Session","description":"Resume a legacy guest User without ever creating another one.","operationId":"mobile_guest_session_api_mobile_guest_session_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/mobile/anonymous-session":{"post":{"summary":"Mobile Anonymous Session","description":"Issue or resume an opaque, non-user project session for 24 hours.","operationId":"mobile_anonymous_session_api_mobile_anonymous_session_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/mobile/anonymous-project":{"post":{"summary":"Mobile Anonymous Project","description":"Save a private 24-hour project before account capture; never generate.","operationId":"mobile_anonymous_project_api_mobile_anonymous_project_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_mobile_anonymous_project_api_mobile_anonymous_project_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mobile/claim-guest-session":{"post":{"summary":"Mobile Claim Guest Session","description":"Atomically attach one native guest session to a real account.\n\nThe real account is authenticated by the Authorization bearer token.  The\nguest JWT is supplied in the JSON body and is retained by iOS until this\nendpoint confirms the idempotent migration.","operationId":"mobile_claim_guest_session_api_mobile_claim_guest_session_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/demo/enhance":{"post":{"summary":"Demo Enhance Image","description":"Run a native, verified-account complimentary preview.","operationId":"demo_enhance_image_api_demo_enhance_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_demo_enhance_image_api_demo_enhance_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/mobile/create":{"post":{"summary":"Mobile Create Image","description":"Create a food photo from a prompt for the native iOS app.","operationId":"mobile_create_image_api_mobile_create_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/mobile/assets":{"post":{"summary":"Mobile Create Asset","description":"Create restaurant marketing assets (menus, flyers, posts, posters, banners).\n\nAccepts 1-4 reference dish images plus an optional menu PDF/text and\nstructured copy fields. The exact copy is injected into the GPT Image 2\nprompt with \"render this text exactly\" instructions so the model renders\nlegible, correctly-spelled typography.","operationId":"mobile_create_asset_api_mobile_assets_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_mobile_create_asset_api_mobile_assets_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/mobile/reels":{"post":{"summary":"Mobile Create Reel","description":"Compatibility alias for the durable Reels job endpoint.","operationId":"mobile_create_reel_api_mobile_reels_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_mobile_create_reel_api_mobile_reels_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/mobile/enhance":{"post":{"summary":"Mobile Enhance Image","description":"Enhance an uploaded food photo for the native iOS app.","operationId":"mobile_enhance_image_api_mobile_enhance_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_mobile_enhance_image_api_mobile_enhance_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/mobile/chat-edit":{"post":{"summary":"Mobile Chat Edit","description":"Iteratively edit an image by URL using a natural-language instruction (chat editing).","operationId":"mobile_chat_edit_api_mobile_chat_edit_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/mobile/jobs/create":{"post":{"summary":"Mobile Job Create","description":"Submit a text->image generation as a background job. Poll GET /api/mobile/jobs/{id}.","operationId":"mobile_job_create_api_mobile_jobs_create_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/mobile/jobs/enhance":{"post":{"summary":"Mobile Job Enhance","description":"Submit an uploaded-photo enhancement as a background job. Poll GET /api/mobile/jobs/{id}.","operationId":"mobile_job_enhance_api_mobile_jobs_enhance_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_mobile_job_enhance_api_mobile_jobs_enhance_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/mobile/jobs/chat-edit":{"post":{"summary":"Mobile Job Chat Edit","description":"Submit an iterative chat edit (image by URL + instruction) as a background job.","operationId":"mobile_job_chat_edit_api_mobile_jobs_chat_edit_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/mobile/smart-layers":{"get":{"summary":"Mobile Smart Layers","description":"The semantic layers supported by the FoodPhoto editor.","operationId":"mobile_smart_layers_api_mobile_smart_layers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/mobile/uploads":{"post":{"summary":"Mobile Upload Source","description":"Store an authenticated source photo for multi-step Smart Layers editing.","operationId":"mobile_upload_source_api_mobile_uploads_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_mobile_upload_source_api_mobile_uploads_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/mobile/jobs/layer-edit":{"post":{"summary":"Mobile Job Layer Edit","description":"Submit one precise semantic-layer edit.","operationId":"mobile_job_layer_edit_api_mobile_jobs_layer_edit_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/mobile/jobs/{job_id}":{"get":{"summary":"Mobile Job Status","description":"Poll a background generation job. Returns processing / completed (with result) / failed.","operationId":"mobile_job_status_api_mobile_jobs__job_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mobile/jobs/assets":{"post":{"summary":"Mobile Job Assets","description":"Submit a marketing asset (flyer/poster/menu/post) as a background job.","operationId":"mobile_job_assets_api_mobile_jobs_assets_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_mobile_job_assets_api_mobile_jobs_assets_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/mobile/jobs/reels":{"post":{"summary":"Mobile Job Reels","description":"Submit a short food reel through the restart-safe provider ledger.","operationId":"mobile_job_reels_api_mobile_jobs_reels_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_mobile_job_reels_api_mobile_jobs_reels_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/jobs/generate":{"post":{"summary":"Web Job Generate","description":"Submit a web (foodphoto.ai) text->image generation as a background job.\nPoll GET /api/mobile/jobs/{id} for the result.","operationId":"web_job_generate_api_jobs_generate_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/jobs/compose":{"post":{"summary":"Web Job Compose","description":"Submit an authenticated multi-image composition as a durable broker job.","operationId":"web_job_compose_api_jobs_compose_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_web_job_compose_api_jobs_compose_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/mobile/apple/products":{"get":{"summary":"Apple Products","description":"Return the canonical server-side mapping used for iOS StoreKit products.","operationId":"apple_products_api_mobile_apple_products_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/mobile/apple/verify-transaction":{"post":{"summary":"Verify Apple Transaction","description":"Verify a StoreKit 2 transaction and grant credits idempotently.","operationId":"verify_apple_transaction_api_mobile_apple_verify_transaction_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/mobile/apple/restore":{"post":{"summary":"Restore Apple Transactions","description":"Verify restored StoreKit transactions for the signed-in user.","operationId":"restore_apple_transactions_api_mobile_apple_restore_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/webhooks/apple":{"post":{"summary":"Apple Server Notifications","description":"Handle App Store Server Notifications v2.","operationId":"apple_server_notifications_api_webhooks_apple_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/mobile/google/products":{"get":{"summary":"Google Play Products","description":"Google Play product sales are retired.","operationId":"google_play_products_api_mobile_google_products_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/mobile/google/verify-purchase":{"post":{"summary":"Verify Google Play Purchase","description":"Google Play purchase verification is retired.","operationId":"verify_google_play_purchase_api_mobile_google_verify_purchase_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/mobile/revenuecat/config":{"get":{"summary":"Revenuecat Config","description":"Compatibility metadata for the published RevenueCat-based iOS app.\n\nProduct identifiers and credit grants always come from the canonical\nWordPress commerce catalog. RevenueCat public SDK keys remain embedded in\nthe legacy binary and are intentionally not re-exported here.","operationId":"revenuecat_config_api_mobile_revenuecat_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/mobile/revenuecat/sync":{"post":{"summary":"Sync Revenuecat Purchases","description":"Idempotently reconcile a published v1.4 RevenueCat subscriber.","operationId":"sync_revenuecat_purchases_api_mobile_revenuecat_sync_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/webhooks/revenuecat":{"post":{"summary":"Revenuecat Webhook","description":"Handle RevenueCat webhook events by syncing the matching subscriber.","operationId":"revenuecat_webhook_api_webhooks_revenuecat_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/billing/create-mercadopago-session":{"post":{"summary":"Create Mercadopago Checkout","description":"MercadoPago checkout creation is retired.","operationId":"create_mercadopago_checkout_api_billing_create_mercadopago_session_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/billing/mercadopago-pricing":{"get":{"summary":"Get Mercadopago Pricing","description":"The duplicate MercadoPago price table is retired.","operationId":"get_mercadopago_pricing_api_billing_mercadopago_pricing_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/webhooks/mercadopago":{"post":{"summary":"Mercadopago Webhook","description":"Handle MercadoPago IPN (Instant Payment Notification) webhooks.","operationId":"mercadopago_webhook_api_webhooks_mercadopago_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/account":{"delete":{"summary":"Remove Account","description":"Permanently revoke the account and erase customer-created artifacts.\n\nApple subscriptions are controlled by Apple and are therefore not silently\ncancelled here. The response states that explicitly for the native UI.","operationId":"remove_account_api_account_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/account/credits":{"get":{"summary":"Get Credits","description":"Get user credits","operationId":"get_credits_api_account_credits_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/account/transactions":{"get":{"summary":"Get Transactions","description":"Get user transaction history","operationId":"get_transactions_api_account_transactions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/account/generations":{"get":{"summary":"Get User Generations","description":"Get user generation history","operationId":"get_user_generations_api_account_generations_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/presets":{"get":{"summary":"Get Presets","description":"Get enhancement presets with full metadata","operationId":"get_presets_api_presets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/presets/v3":{"get":{"summary":"Get Preset Catalog V3","description":"Complete established + expanded preset library for web and native clients.","operationId":"get_preset_catalog_v3_api_presets_v3_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/me/images":{"get":{"summary":"Get User Images","description":"Get user images/generations","operationId":"get_user_images_api_me_images_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/images/{image_id}":{"delete":{"summary":"Delete User Image","description":"Delete a user image","operationId":"delete_user_image_api_me_images__image_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"image_id","in":"path","required":true,"schema":{"type":"integer","title":"Image Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/jobs":{"get":{"summary":"Get User Jobs","description":"Get user processing jobs","operationId":"get_user_jobs_api_me_jobs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/videos":{"get":{"summary":"Get User Videos","description":"Get user videos (placeholder for future video feature)","operationId":"get_user_videos_api_me_videos_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/settings":{"get":{"summary":"Get User Settings","description":"Get user settings","operationId":"get_user_settings_api_me_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"put":{"summary":"Update User Settings","description":"Update user settings","operationId":"update_user_settings_api_me_settings_put","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/email/preferences":{"get":{"summary":"Get Email Preferences","description":"Get user email preferences","operationId":"get_email_preferences_api_email_preferences_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"summary":"Update Email Preferences","description":"Update user email preferences","operationId":"update_email_preferences_api_email_preferences_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/email/trigger-welcome":{"post":{"summary":"Trigger Welcome Endpoint","description":"Retired legacy welcome-series endpoint.","operationId":"trigger_welcome_endpoint_api_email_trigger_welcome_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/brand/profile":{"get":{"summary":"Get Brand Profile","description":"Get brand profile (placeholder)","operationId":"get_brand_profile_api_brand_profile_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/brand/upload":{"post":{"summary":"Upload Brand Assets","description":"Upload brand assets (placeholder)","operationId":"upload_brand_assets_api_brand_upload_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/brand/clear":{"post":{"summary":"Clear Brand Profile","description":"Clear brand profile (placeholder)","operationId":"clear_brand_profile_api_brand_clear_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/keys":{"get":{"summary":"Get Api Keys","description":"Get user API keys","operationId":"get_api_keys_api_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/keys/create":{"post":{"summary":"Create Api Key","description":"Create a new API key","operationId":"create_api_key_api_keys_create_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/export/platform":{"post":{"summary":"Export For Platform","description":"Export image optimized for specific platform (placeholder)","operationId":"export_for_platform_api_export_platform_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/generate-v2":{"post":{"summary":"Generate Image V2","description":"Generate AI food photo using GPT Image 2.\n\nRequest body:\n{\n    \"prompt\": \"description of food photo\",\n    \"style\": \"professional\" | \"uber_eats\" | \"dark_moody\" | ...,\n    \"num_outputs\": 1-4,\n    \"aspect_ratio\": \"4:3\" | \"16:9\" | \"1:1\" | \"3:4\" | \"9:16\",\n    \"resolution\": \"1K\" | \"2K\" | \"4K\",\n    \"reference_images\": [\"url1\", \"url2\", ...] (optional, up to 14),\n    \"enable_web_search\": false\n}","operationId":"generate_image_v2_api_generate_v2_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/compose":{"post":{"summary":"Compose Images","description":"Multi-image composition using SeedDream v4.5 Edit\n\nCombine up to 10 food images into a single composed image.\nPerfect for creating menu layouts, composite dishes, or complex scenes.\n\nRequest body:\n{\n    \"image_urls\": [\"url1\", \"url2\", ...] (1-10 images),\n    \"prompt\": \"description of desired composition\",\n    \"weights\": [0.5, 0.3, 0.2, ...] (optional, must sum to 1.0),\n    \"aspect_ratio\": \"4:3\" | \"16:9\" | \"1:1\" | \"3:4\" | \"9:16\",\n    \"num_outputs\": 1-4\n}","operationId":"compose_images_api_compose_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/models":{"get":{"summary":"Get Models","description":"Get all available AI models with metadata\n\nReturns complete model information including:\n- Name, provider, endpoint\n- Cost per image\n- Speed and quality ratings\n- Features and best use cases\n- Maximum resolution and capabilities","operationId":"get_models_api_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/edit":{"post":{"summary":"Edit Image","description":"Edit food photos using GPT Image 2 Edit — natural language editing.\n\nRequest body:\n{\n    \"image_urls\": [\"url1\"] (required, up to 14 reference images),\n    \"prompt\": \"change the background to dark marble\",\n    \"num_outputs\": 1-4,\n    \"resolution\": \"1K\" | \"2K\" | \"4K\",\n    \"aspect_ratio\": \"4:3\" | \"1:1\" | ...\n}","operationId":"edit_image_api_edit_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/smart-edit":{"post":{"summary":"Smart Edit Image","description":"Smart edit — auto-enhance a food photo using GPT Image 2 Edit.","operationId":"smart_edit_image_api_smart_edit_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/platform-optimize":{"post":{"summary":"Optimize For Platform","description":"Optimize food photo for a specific delivery platform using NB2 Edit.","operationId":"optimize_for_platform_api_platform_optimize_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/hero-shot":{"post":{"summary":"Hero Shot","description":"Generate a professional hero shot using GPT Image 2.","operationId":"hero_shot_api_hero_shot_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/food-styles":{"get":{"summary":"List Food Styles","description":"List all available food photography styles.","operationId":"list_food_styles_api_food_styles_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/resolutions":{"get":{"summary":"List Resolutions","description":"List available resolution options with credit costs.","operationId":"list_resolutions_api_resolutions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/generate":{"post":{"summary":"Generate Image","description":"Generate AI food photo (legacy endpoint — routes to GPT Image 2).","operationId":"generate_image_api_generate_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/jobs/submit":{"post":{"summary":"Submit Async Job","description":"Submit an async job to Celery queue\n\nRequest body:\n{\n    \"job_type\": \"process_image\" | \"generate_image\" | \"upscale\" | \"compose\" | \"batch_process\",\n    \"params\": {\n        // Job-specific parameters\n    }\n}\n\nReturns:\n{\n    \"job_id\": \"celery-task-id\",\n    \"status\": \"pending\",\n    \"job_type\": \"process_image\"\n}","operationId":"submit_async_job_api_jobs_submit_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/jobs/{job_id}/status":{"get":{"summary":"Get Job Status","description":"Get status of a Celery job\n\nReturns:\n{\n    \"job_id\": \"task-id\",\n    \"status\": \"PENDING\" | \"PROGRESS\" | \"SUCCESS\" | \"FAILURE\",\n    \"progress\": {\n        \"current\": 50,\n        \"total\": 100,\n        \"percent\": 50,\n        \"status\": \"Processing...\"\n    },\n    \"result\": {...} // Only present if SUCCESS\n    \"error\": \"error message\" // Only present if FAILURE\n}","operationId":"get_job_status_api_jobs__job_id__status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/jobs/{job_id}":{"delete":{"summary":"Cancel Job","description":"Cancel/revoke a running Celery job\n\nReturns:\n{\n    \"job_id\": \"task-id\",\n    \"status\": \"revoked\",\n    \"message\": \"Job cancelled successfully\"\n}","operationId":"cancel_job_api_jobs__job_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/jobs/queue/status":{"get":{"summary":"Get Queue Status","description":"Get overall queue status (for admin/monitoring)\n\nReturns queue statistics and worker status","operationId":"get_queue_status_api_jobs_queue_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}}},"components":{"schemas":{"Body_admin_upload_api_admin_upload_post":{"properties":{"dir":{"type":"string","title":"Dir","default":"admin-uploads"},"filename":{"type":"string","title":"Filename","default":""},"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_admin_upload_api_admin_upload_post"},"Body_demo_enhance_image_api_demo_enhance_post":{"properties":{"image":{"type":"string","format":"binary","title":"Image"},"style":{"type":"string","title":"Style","default":"natural_light"},"goal":{"type":"string","title":"Goal","default":"menu"},"format":{"type":"string","title":"Format","default":"landscape"},"locale":{"type":"string","title":"Locale","default":"en"},"configuration":{"type":"string","title":"Configuration","default":"{}"}},"type":"object","required":["image"],"title":"Body_demo_enhance_image_api_demo_enhance_post"},"Body_mobile_anonymous_project_api_mobile_anonymous_project_post":{"properties":{"image":{"type":"string","format":"binary","title":"Image"},"preset":{"type":"string","title":"Preset","default":"natural_light"},"goal":{"type":"string","title":"Goal","default":"menu"},"format":{"type":"string","title":"Format","default":"landscape"},"locale":{"type":"string","title":"Locale","default":"en"},"configuration":{"type":"string","title":"Configuration","default":"{}"}},"type":"object","required":["image"],"title":"Body_mobile_anonymous_project_api_mobile_anonymous_project_post"},"Body_mobile_create_asset_api_mobile_assets_post":{"properties":{"reference_images":{"items":{"type":"string","format":"binary"},"type":"array","title":"Reference Images","default":[]},"logo_image":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"Logo Image"},"pdf":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"Pdf"},"asset_type":{"type":"string","title":"Asset Type","default":"poster"},"preset":{"type":"string","title":"Preset","default":"daily_special"},"resolution":{"type":"string","title":"Resolution","default":"2K"},"business_name":{"type":"string","title":"Business Name","default":""},"headline":{"type":"string","title":"Headline","default":""},"offer":{"type":"string","title":"Offer","default":""},"items_json":{"type":"string","title":"Items Json","default":"[]"},"source_text":{"type":"string","title":"Source Text","default":""},"prompt":{"type":"string","title":"Prompt","default":""}},"type":"object","title":"Body_mobile_create_asset_api_mobile_assets_post"},"Body_mobile_create_reel_api_mobile_reels_post":{"properties":{"image":{"type":"string","format":"binary","title":"Image"},"motion":{"type":"string","title":"Motion","default":"push_in"},"motion_details":{"type":"string","title":"Motion Details","default":""},"duration":{"type":"string","title":"Duration","default":"5"}},"type":"object","required":["image"],"title":"Body_mobile_create_reel_api_mobile_reels_post"},"Body_mobile_enhance_image_api_mobile_enhance_post":{"properties":{"image":{"type":"string","format":"binary","title":"Image"},"style":{"type":"string","title":"Style","default":"professional"},"size":{"type":"string","title":"Size","default":"landscape"},"resolution":{"type":"string","title":"Resolution","default":"1K"},"enhancements":{"type":"string","title":"Enhancements","default":"[]"},"angle":{"type":"string","title":"Angle","default":""},"customPrompt":{"type":"string","title":"Customprompt","default":""},"editArea":{"type":"string","title":"Editarea","default":"entire_image"},"editAreaDetails":{"type":"string","title":"Editareadetails","default":""}},"type":"object","required":["image"],"title":"Body_mobile_enhance_image_api_mobile_enhance_post"},"Body_mobile_job_assets_api_mobile_jobs_assets_post":{"properties":{"reference_images":{"items":{"type":"string","format":"binary"},"type":"array","title":"Reference Images","default":[]},"logo_image":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"Logo Image"},"pdf":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"Pdf"},"asset_type":{"type":"string","title":"Asset Type","default":"poster"},"preset":{"type":"string","title":"Preset","default":"daily_special"},"resolution":{"type":"string","title":"Resolution","default":"2K"},"business_name":{"type":"string","title":"Business Name","default":""},"headline":{"type":"string","title":"Headline","default":""},"offer":{"type":"string","title":"Offer","default":""},"items_json":{"type":"string","title":"Items Json","default":"[]"},"source_text":{"type":"string","title":"Source Text","default":""},"prompt":{"type":"string","title":"Prompt","default":""}},"type":"object","title":"Body_mobile_job_assets_api_mobile_jobs_assets_post"},"Body_mobile_job_enhance_api_mobile_jobs_enhance_post":{"properties":{"image":{"type":"string","format":"binary","title":"Image"},"style":{"type":"string","title":"Style","default":"professional"},"size":{"type":"string","title":"Size","default":"landscape"},"goal":{"type":"string","title":"Goal","default":"menu"},"locale":{"type":"string","title":"Locale","default":"en"},"resolution":{"type":"string","title":"Resolution","default":"1K"},"enhancements":{"type":"string","title":"Enhancements","default":"[]"},"angle":{"type":"string","title":"Angle","default":""},"customPrompt":{"type":"string","title":"Customprompt","default":""},"editArea":{"type":"string","title":"Editarea","default":"entire_image"},"editAreaDetails":{"type":"string","title":"Editareadetails","default":""}},"type":"object","required":["image"],"title":"Body_mobile_job_enhance_api_mobile_jobs_enhance_post"},"Body_mobile_job_reels_api_mobile_jobs_reels_post":{"properties":{"image":{"type":"string","format":"binary","title":"Image"},"motion":{"type":"string","title":"Motion","default":"push_in"},"motion_details":{"type":"string","title":"Motion Details","default":""},"duration":{"type":"string","title":"Duration","default":"5"}},"type":"object","required":["image"],"title":"Body_mobile_job_reels_api_mobile_jobs_reels_post"},"Body_mobile_upload_source_api_mobile_uploads_post":{"properties":{"image":{"type":"string","format":"binary","title":"Image"}},"type":"object","required":["image"],"title":"Body_mobile_upload_source_api_mobile_uploads_post"},"Body_web_job_compose_api_jobs_compose_post":{"properties":{"references":{"items":{"type":"string","format":"binary"},"type":"array","title":"References"},"instruction":{"type":"string","title":"Instruction"},"aspect":{"type":"string","title":"Aspect","default":"4:3"}},"type":"object","required":["references","instruction"],"title":"Body_web_job_compose_api_jobs_compose_post"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}