openapi: 3.0.3 info: title: aox-django-backend API version: 1.0.0 paths: /accounts/login/: post: operationId: accounts_login_create tags: - accounts requestBody: content: application/json: schema: $ref: '#/components/schemas/LoginRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/LoginRequest' multipart/form-data: schema: $ref: '#/components/schemas/LoginRequest' required: true security: - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/LoginResponse' description: '' /accounts/logout/: post: operationId: accounts_logout_create tags: - accounts security: - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/DetailResponse' description: '' /accounts/me/: get: operationId: accounts_me_retrieve tags: - accounts responses: '200': content: application/json: schema: $ref: '#/components/schemas/MeResponse' description: '' delete: operationId: accounts_me_destroy tags: - accounts responses: '204': description: No response body /accounts/me/force-password-change/: post: operationId: accounts_me_force_password_change_create description: |- must_change_password=True 계정 전용 강제 비밀번호 변경. old-password 검증을 생략하는 대신, must_change_password 플래그가 켜진 계정만 허용하는 것으로 보안을 대체한다. tags: - accounts requestBody: content: application/json: schema: $ref: '#/components/schemas/UserForcePasswordChange' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/UserForcePasswordChange' multipart/form-data: schema: $ref: '#/components/schemas/UserForcePasswordChange' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/DetailResponse' description: '' /accounts/me/password-change/: put: operationId: accounts_me_password_change_update tags: - accounts requestBody: content: application/json: schema: $ref: '#/components/schemas/UserPasswordChange' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/UserPasswordChange' multipart/form-data: schema: $ref: '#/components/schemas/UserPasswordChange' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/DetailResponse' description: '' /accounts/me/password-verify/: post: operationId: accounts_me_password_verify_create tags: - accounts requestBody: content: application/json: schema: $ref: '#/components/schemas/UserPasswordVerify' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/UserPasswordVerify' multipart/form-data: schema: $ref: '#/components/schemas/UserPasswordVerify' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/UserPasswordVerify' description: '' /accounts/me/usage/: get: operationId: accounts_me_usage_retrieve parameters: - in: query name: team_id schema: type: integer tags: - accounts responses: '200': content: application/json: schema: $ref: '#/components/schemas/UserMeUsage' description: '' /accounts/password-reset/: post: operationId: accounts_password_reset_create tags: - accounts requestBody: content: application/json: schema: $ref: '#/components/schemas/UserPasswordReset' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/UserPasswordReset' multipart/form-data: schema: $ref: '#/components/schemas/UserPasswordReset' required: true security: - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/DetailResponse' description: '' /accounts/password-reset-confirm/: post: operationId: accounts_password_reset_confirm_create tags: - accounts requestBody: content: application/json: schema: $ref: '#/components/schemas/UserPasswordResetConfirm' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/UserPasswordResetConfirm' multipart/form-data: schema: $ref: '#/components/schemas/UserPasswordResetConfirm' required: true security: - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/DetailResponse' description: '' /accounts/password_change/: put: operationId: accounts_password_change_update tags: - accounts requestBody: content: application/json: schema: $ref: '#/components/schemas/UserPasswordChange' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/UserPasswordChange' multipart/form-data: schema: $ref: '#/components/schemas/UserPasswordChange' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/DetailResponse' description: '' /accounts/password_verify/: post: operationId: accounts_password_verify_create tags: - accounts requestBody: content: application/json: schema: $ref: '#/components/schemas/UserPasswordVerify' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/UserPasswordVerify' multipart/form-data: schema: $ref: '#/components/schemas/UserPasswordVerify' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/UserPasswordVerify' description: '' /accounts/search/: get: operationId: accounts_search_list tags: - accounts responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/UserSearchResult' description: '' /accounts/signup/: post: operationId: accounts_signup_create tags: - accounts requestBody: content: application/json: schema: $ref: '#/components/schemas/Signup' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/Signup' multipart/form-data: schema: $ref: '#/components/schemas/Signup' required: true security: - {} responses: '201': content: application/json: schema: $ref: '#/components/schemas/SignupResponse' description: '' /accounts/social-login/: post: operationId: accounts_social_login_create tags: - accounts requestBody: content: application/json: schema: $ref: '#/components/schemas/UserSocialLogin' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/UserSocialLogin' multipart/form-data: schema: $ref: '#/components/schemas/UserSocialLogin' required: true security: - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/UserSocialLogin' description: '' /accounts/social-register/: post: operationId: accounts_social_register_create description: 소셜 신규 가입 — register_token 으로 계정 생성 후 쿠키 세팅. tags: - accounts security: - {} responses: '200': description: No response body /accounts/team-switch/: post: operationId: accounts_team_switch_create tags: - accounts requestBody: content: application/json: schema: $ref: '#/components/schemas/TeamSwitchRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/TeamSwitchRequest' multipart/form-data: schema: $ref: '#/components/schemas/TeamSwitchRequest' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/DetailResponse' description: '' /accounts/teams/: get: operationId: accounts_teams_retrieve tags: - accounts responses: '200': content: application/json: schema: $ref: '#/components/schemas/TeamsResponse' description: '' /accounts/token/refresh/: post: operationId: accounts_token_refresh_create tags: - accounts security: - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/DetailResponse' description: '' /ai/projects/{project_uid}/chat/: post: operationId: ai_projects_chat_create parameters: - in: path name: project_uid schema: type: string required: true tags: - Ai requestBody: content: application/json: schema: $ref: '#/components/schemas/AiChatRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/AiChatRequest' multipart/form-data: schema: $ref: '#/components/schemas/AiChatRequest' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/AiChatResponse' description: '' /ai/projects/{project_uid}/diagnose/: post: operationId: ai_projects_diagnose_create parameters: - in: path name: project_uid schema: type: string required: true tags: - Ai requestBody: content: application/json: schema: $ref: '#/components/schemas/DiagnoseRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/DiagnoseRequest' multipart/form-data: schema: $ref: '#/components/schemas/DiagnoseRequest' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/AiDiagnosisResponse' description: '' /ai/projects/{project_uid}/recommend/: post: operationId: ai_projects_recommend_create parameters: - in: path name: project_uid schema: type: string required: true tags: - Ai requestBody: content: application/json: schema: $ref: '#/components/schemas/AiAssistRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/AiAssistRequest' multipart/form-data: schema: $ref: '#/components/schemas/AiAssistRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/AiRecommendationResponse' description: '' /ai/usage/: get: operationId: ai_usage_retrieve description: 현재 창의 AI Assist 사용량 — 패널이 열릴 때 표시용으로 읽는다. tags: - Ai responses: '200': content: application/json: schema: $ref: '#/components/schemas/AiUsageResponse' description: '' /announcements/: get: operationId: announcements_retrieve tags: - announcements responses: '200': description: No response body /artifacts/: get: operationId: artifacts_list parameters: - name: limit required: false in: query description: 페이지당 반환할 결과 수. schema: type: integer - name: offset required: false in: query description: 결과를 반환할 초기 인덱스. schema: type: integer tags: - artifacts responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedArtifactListList' description: '' post: operationId: artifacts_create tags: - artifacts requestBody: content: application/json: schema: $ref: '#/components/schemas/ArtifactCreate' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/ArtifactCreate' multipart/form-data: schema: $ref: '#/components/schemas/ArtifactCreate' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/ArtifactCreate' description: '' /artifacts/{artifact_id}/download/: get: operationId: artifacts_download_retrieve parameters: - in: path name: artifact_id schema: type: integer required: true tags: - artifacts responses: '200': description: No response body /artifacts/{id}/: get: operationId: artifacts_retrieve parameters: - in: path name: id schema: type: integer description: 아티팩트을 식별하는 고유한 정수 값. required: true tags: - artifacts responses: '200': content: application/json: schema: $ref: '#/components/schemas/Artifact' description: '' put: operationId: artifacts_update parameters: - in: path name: id schema: type: integer description: 아티팩트을 식별하는 고유한 정수 값. required: true tags: - artifacts requestBody: content: application/json: schema: $ref: '#/components/schemas/Artifact' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/Artifact' multipart/form-data: schema: $ref: '#/components/schemas/Artifact' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/Artifact' description: '' patch: operationId: artifacts_partial_update parameters: - in: path name: id schema: type: integer description: 아티팩트을 식별하는 고유한 정수 값. required: true tags: - artifacts requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedArtifact' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedArtifact' multipart/form-data: schema: $ref: '#/components/schemas/PatchedArtifact' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Artifact' description: '' delete: operationId: artifacts_destroy parameters: - in: path name: id schema: type: integer description: 아티팩트을 식별하는 고유한 정수 값. required: true tags: - artifacts responses: '204': description: No response body /artifacts/{id}/copy/: post: operationId: artifacts_copy_create parameters: - in: path name: id schema: type: integer description: 아티팩트을 식별하는 고유한 정수 값. required: true tags: - artifacts requestBody: content: application/json: schema: $ref: '#/components/schemas/Artifact' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/Artifact' multipart/form-data: schema: $ref: '#/components/schemas/Artifact' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/Artifact' description: '' /artifacts/{id}/download_url/: get: operationId: artifacts_download_url_retrieve parameters: - in: path name: id schema: type: integer description: 아티팩트을 식별하는 고유한 정수 값. required: true tags: - artifacts responses: '200': content: application/json: schema: $ref: '#/components/schemas/Artifact' description: '' /asset-notifications/{notification_id}/read/: post: operationId: asset_notifications_read_create parameters: - in: path name: notification_id schema: type: integer required: true tags: - asset-notifications responses: '200': description: No response body /assets/: get: operationId: assets_retrieve tags: - assets responses: '200': description: No response body /assets/{asset_uid}/: get: operationId: assets_retrieve_2 parameters: - in: path name: asset_uid schema: type: string required: true tags: - assets responses: '200': description: No response body /assets/{asset_uid}/acquire/: post: operationId: assets_acquire_create parameters: - in: path name: asset_uid schema: type: string required: true tags: - assets responses: '200': description: No response body /assets/{asset_uid}/approval/: post: operationId: assets_approval_create parameters: - in: path name: asset_uid schema: type: string required: true tags: - assets responses: '200': description: No response body /assets/{asset_uid}/projects/: post: operationId: assets_projects_create parameters: - in: path name: asset_uid schema: type: string required: true tags: - assets responses: '200': description: No response body /assets/{asset_uid}/retry-copy/: post: operationId: assets_retry_copy_create parameters: - in: path name: asset_uid schema: type: string required: true tags: - assets responses: '200': description: No response body /assets/{asset_uid}/save/: post: operationId: assets_save_create parameters: - in: path name: asset_uid schema: type: string required: true tags: - assets responses: '200': description: No response body delete: operationId: assets_save_destroy parameters: - in: path name: asset_uid schema: type: string required: true tags: - assets responses: '204': description: No response body /assets/{asset_uid}/stop-sale/: post: operationId: assets_stop_sale_create parameters: - in: path name: asset_uid schema: type: string required: true tags: - assets responses: '200': description: No response body /assets/mine/: get: operationId: assets_mine_retrieve tags: - assets responses: '200': description: No response body /assets/transactions/: get: operationId: assets_transactions_retrieve tags: - assets responses: '200': description: No response body /billing-keys/: post: operationId: billing_keys_create summary: 빌링키 등록 (프론트가 SDK 콜백에서 받은 billingKey 를 팀에 묶어 저장) tags: - payments requestBody: content: application/json: schema: $ref: '#/components/schemas/BillingKeyRegisterRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/BillingKeyRegisterRequest' multipart/form-data: schema: $ref: '#/components/schemas/BillingKeyRegisterRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/BillingKey' description: '' /billing-keys/bypass-hint/: get: operationId: billing_keys_bypass_hint_retrieve summary: 빌링키 발급 SDK 호출에 필요한 PG 별 bypass 페이로드 + channel_key. PG 별 추가 파라미터가 필요한 경우 프론트가 SDK 호출 전에 가져간다. parameters: - in: query name: provider schema: type: string enum: - galaxia - payletter - paypal description: '결제 PG provider. 예: paypal, payletter, galaxia' required: true tags: - payments responses: '200': content: application/json: schema: $ref: '#/components/schemas/BillingKeyBypassResponse' description: '' /billing-keys/current/: get: operationId: billing_keys_current_retrieve description: |- 팀의 현재 활성 결제수단 1건 (표시용 메타만). list/ 는 배열 + DELETED 이력 + billing_key 까지 포함하는 관리/디버그 용도. 운영 FE 의 "현재 등록된 결제수단" 표시·구독 버튼 분기에는 본 엔드포인트가 적합. ISSUED 상태 중 최신 1건만 반환 (정책상 최대 1건). 없으면 200 + null. 보안: raw billing_key 는 결제 호출용 credential 이라 응답에 포함하지 않는다. 구독/결제/교체는 서버가 팀의 활성 빌링키를 직접 resolve 하므로 FE 는 불필요. summary: 현재 활성(ISSUED) 결제수단 1건 조회. 결제 PG사 + 카드 표시 메타만 반환 (raw billing_key 는 보안상 미노출). 한 팀 = 활성 빌링키 1개 정책이라 단일 객체로 응답하며, 없으면 null. parameters: - in: query name: team_id schema: type: integer tags: - payments responses: '200': content: application/json: schema: $ref: '#/components/schemas/CurrentBillingMethod' description: '' /billing-keys/payletter/register-and-charge/: post: operationId: billing_keys_payletter_register_and_charge_create summary: PayLetter requestIssueBillingKeyAndPay 콜백 처리 (빌링키 발급 + 첫결제 동시). 프론트가 SDK 콜백에서 받은 billingKey + paymentId 전달. tags: - payments requestBody: content: application/json: schema: $ref: '#/components/schemas/BillingKeyRegisterAndChargePayletterRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/BillingKeyRegisterAndChargePayletterRequest' multipart/form-data: schema: $ref: '#/components/schemas/BillingKeyRegisterAndChargePayletterRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/BillingKey' description: '' /billing-keys/swap/: post: operationId: billing_keys_swap_create summary: PG 인증 성공 뒤, 서버 트랜잭션에서 청구 프로필과 새 빌링키를 함께 등록한다. 진행 중 구독은 현재 결제주기를 유지하고 다음 갱신부터 새 키를 사용한다. tags: - payments requestBody: content: application/json: schema: $ref: '#/components/schemas/BillingKeySwapRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/BillingKeySwapRequest' multipart/form-data: schema: $ref: '#/components/schemas/BillingKeySwapRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/BillingMethodSwap' description: '' /board/: get: operationId: board_retrieve tags: - board security: - {} responses: '200': description: No response body /board/{id}/: get: operationId: board_retrieve_2 parameters: - in: path name: id schema: type: integer required: true tags: - board security: - {} responses: '200': description: No response body /book_demo/: post: operationId: book_demo_create summary: 데모 예약 신청 tags: - book_demo requestBody: content: application/json: schema: $ref: '#/components/schemas/BookDemoCreate' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/BookDemoCreate' multipart/form-data: schema: $ref: '#/components/schemas/BookDemoCreate' required: true security: - {} responses: '201': content: application/json: schema: $ref: '#/components/schemas/BookDemoCreate' description: '' /credits/buckets/: get: operationId: credits_buckets_list summary: bucket 목록 (active 우선) parameters: - in: query name: include_inactive schema: type: boolean - in: query name: team_id schema: type: integer required: true tags: - credits responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/CreditBucket' description: '' /credits/bundles/: get: operationId: credits_bundles_list summary: 크레딧 번들 목록 parameters: - in: query name: currency schema: type: string - in: query name: include_inactive schema: type: boolean description: true 면 비활성 번들도 함께 (admin 화면용) tags: - credits security: - {} responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/CreditBundle' description: '' /credits/bundles/{bundle_id}/: get: operationId: credits_bundles_retrieve summary: 크레딧 번들 단건 조회 parameters: - in: path name: bundle_id schema: type: integer required: true - in: query name: currency schema: type: string tags: - credits security: - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/CreditBundle' description: '' /credits/bundles/{bundle_id}/purchase/: post: operationId: credits_bundles_purchase_create summary: 번들 구매 시작 (단건결제 paymentId 채번) parameters: - in: path name: bundle_id schema: type: integer required: true tags: - credits requestBody: content: application/json: schema: $ref: '#/components/schemas/BundlePurchaseStartRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/BundlePurchaseStartRequest' multipart/form-data: schema: $ref: '#/components/schemas/BundlePurchaseStartRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/OneTimePrepareResponse' description: '' /credits/estimate/: get: operationId: credits_estimate_retrieve summary: 예상 소모 크레딧 계산 parameters: - in: query name: project_id schema: type: integer required: true tags: - credits responses: '200': content: application/json: schema: $ref: '#/components/schemas/CreditEstimateResponse' description: '' /credits/operations/: get: operationId: credits_operations_list summary: 크레딧 operation 목록 (idempotency 단위, 최신순) parameters: - in: query name: limit schema: type: integer - in: query name: team_id schema: type: integer required: true tags: - credits responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/CreditOperation' description: '' /credits/purchases/: get: operationId: credits_purchases_list summary: 번들 구매 이력 parameters: - in: query name: limit schema: type: integer - in: query name: team_id schema: type: integer required: true tags: - credits responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/BundlePurchase' description: '' /credits/transactions/: get: operationId: credits_transactions_list summary: 크레딧 거래 내역 (bucket 단위 row, 최신순) parameters: - in: query name: limit schema: type: integer - in: query name: team_id schema: type: integer required: true tags: - credits responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/CreditTransaction' description: '' /credits/usage/jobs/: get: operationId: credits_usage_jobs_retrieve summary: 팀 Job 목록 + 크레딧 소모 요약 (SQS 실시간 차감 검증용) parameters: - in: query name: limit schema: type: integer - in: query name: team_id schema: type: integer required: true tags: - credits responses: '200': description: No response body /credits/usage/jobs/{job_uid}/: get: operationId: credits_usage_jobs_retrieve_2 summary: Job 단건 크레딧 소모 상세 — attempt 요약 + 최근 UsageEvent 스트림 parameters: - in: query name: events_limit schema: type: integer - in: path name: job_uid schema: type: string required: true - in: query name: team_id schema: type: integer required: true tags: - credits responses: '200': description: No response body /credits/wallet/: get: operationId: credits_wallet_retrieve summary: 팀 크레딧 지갑 — balance (active buckets 합) + source 별 breakdown parameters: - in: query name: team_id schema: type: integer required: true tags: - credits responses: '200': content: application/json: schema: $ref: '#/components/schemas/CreditWallet' description: '' /deletion-executions/{execution_uid}/: get: operationId: deletion_executions_retrieve description: Return safe progress to a member of the execution's actual Team only. summary: 영구 삭제 실행 상태 조회 parameters: - in: path name: execution_uid schema: type: string format: uuid required: true tags: - deletion-executions responses: '200': content: application/json: schema: $ref: '#/components/schemas/DeletionExecutionStatus' description: '' /error-feedback/: post: operationId: error_feedback_create tags: - error-feedback responses: '200': description: No response body /feature-feedback/: get: operationId: feature_feedback_retrieve tags: - feature-feedback responses: '200': description: No response body /feature-feedback/{feature_key}/: put: operationId: feature_feedback_update parameters: - in: path name: feature_key schema: type: string required: true tags: - feature-feedback responses: '200': description: No response body /health/: get: operationId: health_retrieve tags: - health security: - {} responses: '200': description: No response body /improvement-requests/: post: operationId: improvement_requests_create summary: Submit an improvement request tags: - improvement_requests requestBody: content: application/json: schema: $ref: '#/components/schemas/ImprovementRequestCreate' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/ImprovementRequestCreate' multipart/form-data: schema: $ref: '#/components/schemas/ImprovementRequestCreate' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/ImprovementRequest' description: '' /job-notifications/: get: operationId: job_notifications_retrieve tags: - job-notifications responses: '200': description: No response body /job-notifications/{notification_id}/read/: post: operationId: job_notifications_read_create parameters: - in: path name: notification_id schema: type: integer required: true tags: - job-notifications responses: '200': description: No response body /job-notifications/read-all/: post: operationId: job_notifications_read_all_create tags: - job-notifications responses: '200': description: No response body /job/{id}/: get: operationId: job_retrieve description: |- Job 상세, 취소, 모니터링, Result Viewer 엔드포인트. 엔드포인트: GET /job// — Job 상세 조회 GET /job/by-uid// — Job UID 상세 조회 POST /job//cancel/ — Job 취소 POST /job//delete/ — Job 소프트 삭제 (실행 중이면 취소 후 삭제) GET /job//monitor/ — 대기화면 모니터링 (프론트 5~10초 폴링) GET /job//valid-dsns/ — Result Viewer: 유효 DSN 목록 GET /job//result-mesh/ — Result Viewer: DSN별 mesh presigned URL GET /job//streamlines/ — Result Viewer: DSN별 flow streamlines presigned URL GET /job//history/ — Result Viewer: 최적화 history CSV GET /job//execution-logs/ — Result Viewer: 실행 console 로그 summary: Job 상세 조회 parameters: - in: path name: id schema: type: integer description: 작업을 식별하는 고유한 정수 값. required: true tags: - jobs responses: '200': content: application/json: schema: $ref: '#/components/schemas/Job' description: '' /job/{id}/cancel/: post: operationId: job_cancel_create description: POST /job/{id}/cancel/ — request body 불필요. summary: Job 취소 parameters: - in: path name: id schema: type: integer description: 작업을 식별하는 고유한 정수 값. required: true tags: - jobs responses: '200': content: application/json: schema: $ref: '#/components/schemas/Job' description: '' /job/{id}/delete/: post: operationId: job_delete_create description: |- POST /job/{id}/delete/ — Job 소프트 삭제. - 실행 중(QUEUED / RUNNING)이면 먼저 취소(cancel) 후 소프트 삭제. - 삭제된 Job은 API 응답에서 제외됨 (is_deleted=True 필터링). - 어드민에서 is_deleted=False로 되돌려 복구 가능. - request body 불필요. summary: Job 삭제 (소프트) parameters: - in: path name: id schema: type: integer description: 작업을 식별하는 고유한 정수 값. required: true tags: - jobs responses: '200': content: application/json: schema: $ref: '#/components/schemas/Job' description: '' /job/{id}/deletion-preview/: get: operationId: job_deletion_preview_retrieve description: |- Job 상세, 취소, 모니터링, Result Viewer 엔드포인트. 엔드포인트: GET /job// — Job 상세 조회 GET /job/by-uid// — Job UID 상세 조회 POST /job//cancel/ — Job 취소 POST /job//delete/ — Job 소프트 삭제 (실행 중이면 취소 후 삭제) GET /job//monitor/ — 대기화면 모니터링 (프론트 5~10초 폴링) GET /job//valid-dsns/ — Result Viewer: 유효 DSN 목록 GET /job//result-mesh/ — Result Viewer: DSN별 mesh presigned URL GET /job//streamlines/ — Result Viewer: DSN별 flow streamlines presigned URL GET /job//history/ — Result Viewer: 최적화 history CSV GET /job//execution-logs/ — Result Viewer: 실행 console 로그 summary: Job 삭제 예정일 미리보기 parameters: - in: path name: id schema: type: integer description: 작업을 식별하는 고유한 정수 값. required: true tags: - jobs responses: '200': content: application/json: schema: $ref: '#/components/schemas/Job' description: '' /job/{id}/execution-logs/: get: operationId: job_execution_logs_retrieve description: |- GET /job/{id}/execution-logs/ execution.metadata["console_logs"] 를 monitor 응답과 동일 포맷으로 반환. summary: Result Viewer — 실행 console 로그 parameters: - in: path name: id schema: type: integer description: 작업을 식별하는 고유한 정수 값. required: true tags: - jobs responses: '200': content: application/json: schema: $ref: '#/components/schemas/Job' description: '' /job/{id}/export-step/: get: operationId: job_export_step_retrieve description: |- GET /job/{id}/export-step Morphed-CAD export for STEP-imported projects: bakes the optimization result back into the ORIGINAL STEP assembly (moving parts' NURBS poles displaced by the job's own baseline→morphed mesh delta) plus per-part STEP/STL files. Results are cached under {output}/export/ in S3; the first call bakes (may take 1–3 minutes on large assemblies). Response: {available, reason?, assembly?: {filename,url}, parts?: [{name, step:{filename,url}, stl:{filename,url}}]} parameters: - in: path name: id schema: type: integer description: 작업을 식별하는 고유한 정수 값. required: true tags: - job responses: '200': content: application/json: schema: $ref: '#/components/schemas/Job' description: '' /job/{id}/flowfield/: get: operationId: job_flowfield_retrieve description: |- GET /job/{id}/flowfield Presigned URL for {output}/flowfield.bin — the compact quantized velocity volume (VFLD) the viewer integrates streamlines from CLIENT-side, so dragging the seed rake costs no server round trip at all. The flow artifact task bakes this alongside streamlines.bin; this endpoint only serves the generated artifact, or submits the task when missing/rebaking. parameters: - in: path name: id schema: type: integer description: 작업을 식별하는 고유한 정수 값. required: true tags: - job responses: '200': content: application/json: schema: $ref: '#/components/schemas/Job' description: '' /job/{id}/history/: get: operationId: job_history_retrieve description: |- GET /job/{id}/history S3 {s3_output_prefix}/history_project.csv 를 파싱하여 최근 200 row 반환. summary: Result Viewer — 최적화 history CSV parameters: - in: path name: id schema: type: integer description: 작업을 식별하는 고유한 정수 값. required: true tags: - jobs responses: '200': content: application/json: schema: $ref: '#/components/schemas/Job' description: '' /job/{id}/monitor/: get: operationId: job_monitor_retrieve description: |- 대기화면용 모니터링 API. Celery beat가 30초마다 로그 수집/파싱 → execution.metadata["monitor_state"]에 monitoring_log.json의 요약(active_stage/progress/elapsed_time/metrics)을 execution.metadata["monitor_state"]에 캐싱. 현재 status/stage/progress는 Job 스냅샷이 기준이다. 프론트는 5~10초 폴링으로 DB 캐싱된 값만 조회 (매 요청마다 SSH/CloudWatch 호출 없음). Response: - metrics: iter, residual, runtime, cd, cl - console_logs: [{seq, timestamp, tag, message}] summary: Job 모니터링 (대기화면용) parameters: - in: path name: id schema: type: integer description: 작업을 식별하는 고유한 정수 값. required: true tags: - jobs responses: '200': content: application/json: schema: $ref: '#/components/schemas/JobMonitorResponse' description: '' /job/{id}/optimized-stl/: get: operationId: job_optimized_stl_retrieve description: |- GET /job/{id}/optimized-stl Presigned download URL(s) for this run's optimized STL output(s) (JobOutputArtifact role OPTIMIZED_STL — e.g. *_morphed.stl). Used to seed a new project from an optimized shape. available=false when none exist. summary: Optimized STL presigned URL(s) — seed a new project parameters: - in: path name: id schema: type: integer description: 작업을 식별하는 고유한 정수 값. required: true tags: - jobs responses: '200': content: application/json: schema: $ref: '#/components/schemas/Job' description: '' /job/{id}/parameters/: get: operationId: job_parameters_retrieve description: Return one display-ready parameter shape for G1, G2, and G4. summary: Job view parameters parameters: - in: path name: id schema: type: integer description: 작업을 식별하는 고유한 정수 값. required: true tags: - jobs responses: '200': content: application/json: schema: $ref: '#/components/schemas/JobParametersResponse' description: '' /job/{id}/purge-now/: post: operationId: job_purge_now_create description: |- Job 상세, 취소, 모니터링, Result Viewer 엔드포인트. 엔드포인트: GET /job// — Job 상세 조회 GET /job/by-uid// — Job UID 상세 조회 POST /job//cancel/ — Job 취소 POST /job//delete/ — Job 소프트 삭제 (실행 중이면 취소 후 삭제) GET /job//monitor/ — 대기화면 모니터링 (프론트 5~10초 폴링) GET /job//valid-dsns/ — Result Viewer: 유효 DSN 목록 GET /job//result-mesh/ — Result Viewer: DSN별 mesh presigned URL GET /job//streamlines/ — Result Viewer: DSN별 flow streamlines presigned URL GET /job//history/ — Result Viewer: 최적화 history CSV GET /job//execution-logs/ — Result Viewer: 실행 console 로그 summary: Job 즉시 영구 삭제 접수 parameters: - in: path name: id schema: type: integer description: 작업을 식별하는 고유한 정수 값. required: true tags: - jobs requestBody: content: application/json: schema: $ref: '#/components/schemas/Job' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/Job' multipart/form-data: schema: $ref: '#/components/schemas/Job' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/Job' description: '' /job/{id}/rename/: post: operationId: job_rename_create description: 'POST /job/{id}/rename/ — body: {"name": "..."}.' summary: Run(Job) 이름 변경 parameters: - in: path name: id schema: type: integer description: 작업을 식별하는 고유한 정수 값. required: true tags: - jobs requestBody: content: application/json: schema: $ref: '#/components/schemas/JobRename' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/JobRename' multipart/form-data: schema: $ref: '#/components/schemas/JobRename' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/Job' description: '' /job/{id}/restart/: post: operationId: job_restart_create description: |- POST /job/{id}/restart/ — 원본 Job 의 mesh/CFD 체크포인트를 재사용해 선택한 단계부터 재실행한다. body: - restart_stage: "scratch" | "mesh" | "cfd" | "opt" - run_config: (선택) override (예: {"opt_iter": 5}) summary: G2 Job 단계 재시작 (restart) parameters: - in: path name: id schema: type: integer description: 작업을 식별하는 고유한 정수 값. required: true tags: - jobs requestBody: content: application/json: schema: $ref: '#/components/schemas/G2JobRestart' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/G2JobRestart' multipart/form-data: schema: $ref: '#/components/schemas/G2JobRestart' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/Job' description: '' /job/{id}/restart-options/: get: operationId: job_restart_options_retrieve description: |- GET /job/{id}/restart-options/ — 이 Job 에서 선택 가능한 restart 단계 목록. checkpoint 가 필요한 단계(cfd/opt)는 원본이 종료(성공/halt)된 경우에만 available. cost_ratio 는 프론트 비용 표시용(전체 실행 대비 비율). summary: G2 Job restart 단계 옵션 parameters: - in: path name: id schema: type: integer description: 작업을 식별하는 고유한 정수 값. required: true tags: - jobs responses: '200': content: application/json: schema: $ref: '#/components/schemas/Job' description: '' /job/{id}/restore/: post: operationId: job_restore_create description: |- Job 상세, 취소, 모니터링, Result Viewer 엔드포인트. 엔드포인트: GET /job// — Job 상세 조회 GET /job/by-uid// — Job UID 상세 조회 POST /job//cancel/ — Job 취소 POST /job//delete/ — Job 소프트 삭제 (실행 중이면 취소 후 삭제) GET /job//monitor/ — 대기화면 모니터링 (프론트 5~10초 폴링) GET /job//valid-dsns/ — Result Viewer: 유효 DSN 목록 GET /job//result-mesh/ — Result Viewer: DSN별 mesh presigned URL GET /job//streamlines/ — Result Viewer: DSN별 flow streamlines presigned URL GET /job//history/ — Result Viewer: 최적화 history CSV GET /job//execution-logs/ — Result Viewer: 실행 console 로그 summary: 삭제 예정 Job 복구 parameters: - in: path name: id schema: type: integer description: 작업을 식별하는 고유한 정수 값. required: true tags: - jobs responses: '200': content: application/json: schema: $ref: '#/components/schemas/Job' description: '' /job/{id}/result-mesh/: get: operationId: job_result_mesh_retrieve description: |- GET /job/{id}/result-mesh?dsn=N Stored RESULT_MESH artifact에 대한 presigned GET URL 반환 (3600초). summary: Result Viewer — DSN별 mesh presigned URL parameters: - in: path name: id schema: type: integer description: 작업을 식별하는 고유한 정수 값. required: true tags: - jobs responses: '200': content: application/json: schema: $ref: '#/components/schemas/Job' description: '' /job/{id}/streamlines/: get: operationId: job_streamlines_retrieve description: |- GET /job/{id}/streamlines Presigned GET URL (3600s) for the flow streamlines at the output root: {output}/streamlines.bin (STRM compact binary). Backend flow artifact tasks bake streamlines.bin and flowfield.bin after result proxy bounds are ready. This endpoint only serves the generated artifact, or submits the task when the artifact is missing. Returns available=false (200) when a job has neither, so the viewer just hides the layer. summary: Result Viewer — DSN별 flow streamlines presigned URL parameters: - in: path name: id schema: type: integer description: 작업을 식별하는 고유한 정수 값. required: true tags: - jobs responses: '200': content: application/json: schema: $ref: '#/components/schemas/Job' description: '' /job/{id}/usage/: get: operationId: job_usage_retrieve description: |- SQS usage-event 소비로 실시간 차감되는 Job 의 소모 크레딧. 실시간 로그(monitor) 와 동일한 id 기반 detail 라우트·권한·팀 스코핑 (get_object → get_queryset + check_object_permissions)을 거친다. 진행 중 Job 도 현재까지 누적치를 반환한다. summary: Job 실시간 소모 크레딧 parameters: - in: path name: id schema: type: integer description: 작업을 식별하는 고유한 정수 값. required: true tags: - jobs responses: '200': content: application/json: schema: $ref: '#/components/schemas/JobUsageSummary' description: '' /job/{id}/valid-dsns/: get: operationId: job_valid_dsns_retrieve description: |- GET /job/{id}/valid-dsns Stored RESULT_MESH artifacts에서 존재하는 DSN 번호를 오름차순으로 반환. summary: Result Viewer — 유효 DSN 목록 parameters: - in: path name: id schema: type: integer description: 작업을 식별하는 고유한 정수 값. required: true tags: - jobs responses: '200': content: application/json: schema: $ref: '#/components/schemas/Job' description: '' /job/by-uid/{uid}/: get: operationId: job_by_uid_retrieve description: |- Job 상세, 취소, 모니터링, Result Viewer 엔드포인트. 엔드포인트: GET /job// — Job 상세 조회 GET /job/by-uid// — Job UID 상세 조회 POST /job//cancel/ — Job 취소 POST /job//delete/ — Job 소프트 삭제 (실행 중이면 취소 후 삭제) GET /job//monitor/ — 대기화면 모니터링 (프론트 5~10초 폴링) GET /job//valid-dsns/ — Result Viewer: 유효 DSN 목록 GET /job//result-mesh/ — Result Viewer: DSN별 mesh presigned URL GET /job//streamlines/ — Result Viewer: DSN별 flow streamlines presigned URL GET /job//history/ — Result Viewer: 최적화 history CSV GET /job//execution-logs/ — Result Viewer: 실행 console 로그 summary: Job UID 상세 조회 parameters: - in: path name: uid schema: type: string required: true tags: - job responses: '200': content: application/json: schema: $ref: '#/components/schemas/Job' description: '' /job/unified/: post: operationId: job_unified_create description: |- POST /job/unified/ — the canonical job submission endpoint. (§0.1-1 / §3.2) 이 엔드포인트의 유일한 인가 수단인 팀 멤버십 게이트를 뷰 서두에서 건다. 멤버십은 반드시 대상 리소스가 실제 속한 팀 (`project.team_id`) 기준으로 해석한다 — JWT team_id 를 쓰면 팀 A JWT 로 팀 B 프로젝트에 제출하는 크로스팀 우회가 뚫린다. project_id 부재/미존재는 role 체크 이전에 즉시 400, 멤버십 None(비멤버/비활성/soft-delete)이면 403(fail-closed). tags: - job responses: '200': description: No response body /jobs/{job_uid}/asset-publish-candidate/: get: operationId: jobs_asset_publish_candidate_retrieve parameters: - in: path name: job_uid schema: type: string required: true tags: - jobs responses: '200': description: No response body /jobs/{job_uid}/asset-submissions/: post: operationId: jobs_asset_submissions_create parameters: - in: path name: job_uid schema: type: string required: true tags: - jobs responses: '200': description: No response body /les/autoconfig/: post: operationId: les_autoconfig_create description: |- STL 을 한 번 올려 자동설정 제안을 요청한다. 형상 분석(trimesh)은 500MB 입력에서 수십 초가 걸리므로 여기서는 S3 스테이징만 하고 Celery 로 넘긴다. 프론트는 uid 로 폴링한다. tags: - les responses: '200': description: No response body /les/autoconfig/{uid}/: get: operationId: les_autoconfig_retrieve parameters: - in: path name: uid schema: type: string required: true tags: - les responses: '200': description: No response body /les/autoconfig/{uid}/upload/abort/: post: operationId: les_autoconfig_upload_abort_create description: 중단된 업로드의 파트를 지운다 — 두면 스토리지 비용으로 남는다. parameters: - in: path name: uid schema: type: string required: true tags: - les responses: '200': description: No response body /les/autoconfig/{uid}/upload/complete/: post: operationId: les_autoconfig_upload_complete_create description: 파트 업로드가 끝나면 객체를 확정하고 분석을 큐에 넣는다. parameters: - in: path name: uid schema: type: string required: true tags: - les requestBody: content: application/json: schema: $ref: '#/components/schemas/LesAutoconfigUploadComplete' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/LesAutoconfigUploadComplete' multipart/form-data: schema: $ref: '#/components/schemas/LesAutoconfigUploadComplete' required: true responses: '202': content: application/json: schema: $ref: '#/components/schemas/LesAutoconfig' description: '' /les/autoconfig/upload/init/: post: operationId: les_autoconfig_upload_init_create description: |- 자동설정 STL 의 멀티파트 업로드를 연다. 파일은 Django 를 통과하지 않는다 — 브라우저가 프리사인 URL 로 S3 에 직접 병렬 전송한다. 500MB STL 이 앱 서버를 통째로 지나가면 업로드 하나에 수 분이 걸리고, 그 동안 워커는 아무것도 할 수 없다. tags: - les responses: '200': description: No response body /les/runs/: get: operationId: les_runs_retrieve tags: - les responses: '200': description: No response body post: operationId: les_runs_create tags: - les responses: '200': description: No response body /les/runs/{uid}/: get: operationId: les_runs_retrieve_2 parameters: - in: path name: uid schema: type: string required: true tags: - les responses: '200': description: No response body /les/runs/{uid}/cancel/: post: operationId: les_runs_cancel_create parameters: - in: path name: uid schema: type: string required: true tags: - les responses: '200': description: No response body /les/runs/{uid}/delete/: post: operationId: les_runs_delete_create parameters: - in: path name: uid schema: type: string required: true tags: - les responses: '200': description: No response body /les/runs/{uid}/deletion-preview/: get: operationId: les_runs_deletion_preview_retrieve parameters: - in: path name: uid schema: type: string required: true tags: - les responses: '200': description: No response body /les/runs/{uid}/figures/{name}/: get: operationId: les_runs_figures_retrieve parameters: - in: path name: name schema: type: string required: true - in: path name: uid schema: type: string required: true tags: - les responses: '200': description: No response body /les/runs/{uid}/files/{kind}/: get: operationId: les_runs_files_retrieve parameters: - in: path name: kind schema: type: string required: true - in: path name: uid schema: type: string required: true tags: - les responses: '200': description: No response body /les/runs/{uid}/flow-visualization/: get: operationId: les_runs_flow_visualization_retrieve parameters: - in: path name: uid schema: type: string required: true tags: - les responses: '200': description: No response body post: operationId: les_runs_flow_visualization_create parameters: - in: path name: uid schema: type: string required: true tags: - les responses: '200': description: No response body /les/runs/{uid}/flow-visualization/image/: get: operationId: les_runs_flow_visualization_image_retrieve parameters: - in: path name: uid schema: type: string required: true tags: - les responses: '200': description: No response body /les/runs/{uid}/flow-visualization/image/{view_id}/: get: operationId: les_runs_flow_visualization_image_retrieve_2 parameters: - in: path name: uid schema: type: string required: true - in: path name: view_id schema: type: string required: true tags: - les responses: '200': description: No response body /les/runs/{uid}/purge-now/: post: operationId: les_runs_purge_now_create parameters: - in: path name: uid schema: type: string required: true tags: - les responses: '200': description: No response body /les/runs/{uid}/restore/: post: operationId: les_runs_restore_create parameters: - in: path name: uid schema: type: string required: true tags: - les responses: '200': description: No response body /les/runs/{uid}/viewer/: get: operationId: les_runs_viewer_retrieve parameters: - in: path name: uid schema: type: string required: true tags: - les responses: '200': description: No response body /les/uploads/{uid}/abort/: post: operationId: les_uploads_abort_create parameters: - in: path name: uid schema: type: string required: true tags: - les responses: '200': description: No response body /les/uploads/{uid}/complete/: post: operationId: les_uploads_complete_create parameters: - in: path name: uid schema: type: string required: true tags: - les requestBody: content: application/json: schema: $ref: '#/components/schemas/LesInputUploadComplete' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/LesInputUploadComplete' multipart/form-data: schema: $ref: '#/components/schemas/LesInputUploadComplete' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/LesInputUpload' description: '' /les/uploads/init/: post: operationId: les_uploads_init_create description: Open an ordinary LES input upload without proxying STL bytes. tags: - les responses: '200': description: No response body /patches/{id}/: put: operationId: patches_update summary: Patch 수정 parameters: - in: path name: id schema: type: integer description: 패치을 식별하는 고유한 정수 값. required: true tags: - patches requestBody: content: application/json: schema: $ref: '#/components/schemas/Patch' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/Patch' multipart/form-data: schema: $ref: '#/components/schemas/Patch' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Patch' description: '' delete: operationId: patches_destroy summary: Patch 삭제 parameters: - in: path name: id schema: type: integer description: 패치을 식별하는 고유한 정수 값. required: true tags: - patches responses: '204': description: No response body /patches/{id}/artifact-download-url/: get: operationId: patches_artifact_download_url_retrieve summary: Patch artifact download URL 발급 parameters: - in: path name: id schema: type: integer description: 패치을 식별하는 고유한 정수 값. required: true - in: query name: kind schema: type: string enum: - atlas - input_preview_points - input_preview_voxels - proxy_layout - proxy_mesh - proxy_mesh_mask - source description: source | input_preview_points | input_preview_voxels | proxy_mesh | proxy_layout | proxy_mesh_mask | atlas required: true tags: - patches responses: '200': content: application/json: schema: type: object additionalProperties: {} description: '' /patches/{id}/atlas-key/: post: operationId: patches_atlas_key_create summary: Atlas sidecar key 저장 parameters: - in: path name: id schema: type: integer description: 패치을 식별하는 고유한 정수 값. required: true tags: - patches requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchProxyArtifact' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchProxyArtifact' multipart/form-data: schema: $ref: '#/components/schemas/PatchProxyArtifact' responses: '200': content: application/json: schema: type: object additionalProperties: {} description: '' /patches/{id}/proxy-artifacts/: post: operationId: patches_proxy_artifacts_create summary: Proxy worker 산출물 메타데이터 갱신 parameters: - in: path name: id schema: type: integer description: 패치을 식별하는 고유한 정수 값. required: true tags: - patches requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchProxyArtifact' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchProxyArtifact' multipart/form-data: schema: $ref: '#/components/schemas/PatchProxyArtifact' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Patch' description: '' /patches/{id}/proxy-artifacts/presign/: post: operationId: patches_proxy_artifacts_presign_create summary: Source proxy artifact upload URL 발급 parameters: - in: path name: id schema: type: integer description: 패치을 식별하는 고유한 정수 값. required: true tags: - patches requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchProxyArtifactPresign' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchProxyArtifactPresign' multipart/form-data: schema: $ref: '#/components/schemas/PatchProxyArtifactPresign' required: true responses: '200': content: application/json: schema: type: object additionalProperties: {} description: '' /patches/{id}/proxy-layout-key/: post: operationId: patches_proxy_layout_key_create summary: Proxy layout sidecar key 저장 parameters: - in: path name: id schema: type: integer description: 패치을 식별하는 고유한 정수 값. required: true tags: - patches requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchProxyArtifact' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchProxyArtifact' multipart/form-data: schema: $ref: '#/components/schemas/PatchProxyArtifact' responses: '200': content: application/json: schema: type: object additionalProperties: {} description: '' /patches/{id}/proxy-mask/finalize/: post: operationId: patches_proxy_mask_finalize_create summary: Proxy mask upload completion parameters: - in: path name: id schema: type: integer description: 패치을 식별하는 고유한 정수 값. required: true tags: - patches requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchProxyMaskFinalize' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchProxyMaskFinalize' multipart/form-data: schema: $ref: '#/components/schemas/PatchProxyMaskFinalize' required: true responses: '200': content: application/json: schema: type: object additionalProperties: {} description: '' /patches/{id}/proxy-mesh-key/: post: operationId: patches_proxy_mesh_key_create summary: Proxy mesh sidecar key 저장 parameters: - in: path name: id schema: type: integer description: 패치을 식별하는 고유한 정수 값. required: true tags: - patches requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchProxyArtifact' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchProxyArtifact' multipart/form-data: schema: $ref: '#/components/schemas/PatchProxyArtifact' responses: '200': content: application/json: schema: type: object additionalProperties: {} description: '' /patches/{id}/source-artifacts/: post: operationId: patches_source_artifacts_create summary: Source proxy artifact set finalize parameters: - in: path name: id schema: type: integer description: 패치을 식별하는 고유한 정수 값. required: true tags: - patches requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchProxyArtifact' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchProxyArtifact' multipart/form-data: schema: $ref: '#/components/schemas/PatchProxyArtifact' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Patch' description: '' /patches/{id}/unmerge/: post: operationId: patches_unmerge_create summary: Source patch 병합 해제 parameters: - in: path name: id schema: type: integer description: 패치을 식별하는 고유한 정수 값. required: true tags: - patches requestBody: content: application/json: schema: $ref: '#/components/schemas/Patch' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/Patch' multipart/form-data: schema: $ref: '#/components/schemas/Patch' responses: '200': content: application/json: schema: $ref: '#/components/schemas/PatchUnmergeResponse' description: '' /patches/merge/: post: operationId: patches_merge_create summary: Source patch 병합 tags: - patches requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchMerge' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchMerge' multipart/form-data: schema: $ref: '#/components/schemas/PatchMerge' required: true responses: '202': content: application/json: schema: $ref: '#/components/schemas/PatchMergeResponse' description: '' /payments/: get: operationId: payments_retrieve tags: - payments responses: '200': description: No response body /payments/{payment_id}/: get: operationId: payments_retrieve_2 parameters: - in: path name: payment_id schema: type: string required: true tags: - payments responses: '200': description: No response body /payments/{payment_id}/checkout-cancel/: post: operationId: payments_checkout_cancel_create summary: 결제창 취소/실패 마킹. FE SDK 의 취소·실패 콜백에서 호출. READY/PAY_PENDING → FAILED(CHECKOUT_CANCELED). 환불(cancel) 과 다른 액션. parameters: - in: path name: payment_id schema: type: string required: true tags: - payments requestBody: content: application/json: schema: $ref: '#/components/schemas/CheckoutCancelRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/CheckoutCancelRequest' multipart/form-data: schema: $ref: '#/components/schemas/CheckoutCancelRequest' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Payment' description: '' /payments/{payment_id}/verify/: post: operationId: payments_verify_create summary: 결제 검증 (포트원 GET /payments 로 재조회 후 동기화) parameters: - in: path name: payment_id schema: type: string required: true tags: - payments responses: '200': content: application/json: schema: $ref: '#/components/schemas/Payment' description: '' /payments/billing-profile/: get: operationId: payments_billing_profile_retrieve summary: Read or update the Team billing profile. parameters: - in: query name: team_id schema: type: integer required: true tags: - payments responses: '200': content: application/json: schema: $ref: '#/components/schemas/TeamBillingProfile' description: '' put: operationId: payments_billing_profile_update summary: Read or update the Team billing profile. parameters: - in: query name: team_id schema: type: integer required: true tags: - payments requestBody: content: application/json: schema: $ref: '#/components/schemas/TeamBillingProfile' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/TeamBillingProfile' multipart/form-data: schema: $ref: '#/components/schemas/TeamBillingProfile' responses: '200': content: application/json: schema: $ref: '#/components/schemas/TeamBillingProfile' description: '' /payments/checkout-options/: get: operationId: payments_checkout_options_retrieve summary: Team checkout options derived from a saved or temporary billing country. parameters: - in: query name: billing_country schema: type: string - in: query name: team_id schema: type: integer tags: - payments responses: '200': content: application/json: schema: $ref: '#/components/schemas/CheckoutOptions' description: '' /payments/prepare/: post: operationId: payments_prepare_create summary: 단건결제 준비 (paymentId 채번). 팀 단위 결제. tags: - payments requestBody: content: application/json: schema: $ref: '#/components/schemas/OneTimePrepareRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/OneTimePrepareRequest' multipart/form-data: schema: $ref: '#/components/schemas/OneTimePrepareRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/OneTimePrepareResponse' description: '' /plans/: get: operationId: plans_list summary: 플랜 목록 parameters: - in: query name: currency schema: type: string - in: query name: include_inactive schema: type: boolean tags: - plans security: - {} responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/Plan' description: '' /plans/{code}/: get: operationId: plans_retrieve summary: 플랜 단건 조회 parameters: - in: path name: code schema: type: string required: true - in: query name: currency schema: type: string tags: - plans security: - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/Plan' description: '' /plans/{code}/downgrade/: post: operationId: plans_downgrade_create summary: 플랜 다운그레이드 예약 — 사이클 종료 시 적용 parameters: - in: path name: code schema: type: string required: true tags: - plans requestBody: content: application/json: schema: $ref: '#/components/schemas/PlanChangeRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PlanChangeRequest' multipart/form-data: schema: $ref: '#/components/schemas/PlanChangeRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/Subscription' description: '' /plans/{code}/subscribe/: post: operationId: plans_subscribe_create summary: 구독 시작 — 빌링키 첫 결제 후 ACTIVE 전환 + SUBSCRIPTION credit 발급 parameters: - in: path name: code schema: type: string required: true tags: - plans requestBody: content: application/json: schema: $ref: '#/components/schemas/SubscribeRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/SubscribeRequest' multipart/form-data: schema: $ref: '#/components/schemas/SubscribeRequest' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/Subscription' description: '' /plans/{code}/upgrade/: post: operationId: plans_upgrade_create summary: 플랜 업그레이드 — 즉시 권한 + 차액 결제 + 실제 청구 견적 반환 parameters: - in: path name: code schema: type: string required: true tags: - plans requestBody: content: application/json: schema: $ref: '#/components/schemas/PlanChangeRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PlanChangeRequest' multipart/form-data: schema: $ref: '#/components/schemas/PlanChangeRequest' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/UpgradeResponse' description: '' /plans/{code}/upgrade-quote/: get: operationId: plans_upgrade_quote_retrieve summary: 플랜 업그레이드 사전 견적 — 백엔드 일할 계산/부가세/청구액 SOT parameters: - in: path name: code schema: type: string required: true - in: query name: currency schema: type: string - in: query name: team_id schema: type: integer required: true tags: - plans responses: '200': content: application/json: schema: $ref: '#/components/schemas/UpgradeQuoteResponse' description: '' /presigned_url/: post: operationId: presigned_url_create description: |2 프로젝트 thumbnail 및 사용자 profile image 업로드용 presigned URL을 발급합니다. 프로젝트 source 파일은 `/projects/{project_id}/source-uploads/init/` multipart API를 사용해야 합니다. ```json { "field_choice": "app.Model.field", "file_name": "image.png", "is_download": false } ``` 응답: `{ url, fields }` summary: 미리 서명된 URL 발급 tags: - presigned_url requestBody: content: application/json: schema: $ref: '#/components/schemas/Presigned' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/Presigned' multipart/form-data: schema: $ref: '#/components/schemas/Presigned' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/Presigned' description: '' /presigned_url/download/: get: operationId: presigned_url_download_retrieve description: S3에 저장된 파일의 다운로드용 presigned GET URL을 발급합니다. summary: 다운로드용 미리 서명된 URL 발급 parameters: - in: query name: s3_key schema: type: string description: S3 파일 경로 required: true tags: - presigned_url responses: '200': description: No response body /projects/: get: operationId: projects_list description: 프로젝트 목록을 조회합니다. mode(G1/G2), include_archived 필터를 지원합니다. summary: 프로젝트 목록 조회 parameters: - in: query name: cursor schema: type: string description: Cursor for pagination - in: query name: include_archived schema: type: boolean description: '아카이브된 프로젝트 포함 여부 (default: false)' - in: query name: mode schema: type: string enum: - G1 - G2 - G3 - G4 - S2 description: Project mode filter (G1 또는 G2) - name: page_size required: false in: query description: 페이지당 반환할 결과 수. schema: type: integer tags: - projects responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedProjectListList' description: '' post: operationId: projects_create tags: - projects requestBody: content: application/json: schema: $ref: '#/components/schemas/ProjectCreate' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/ProjectCreate' multipart/form-data: schema: $ref: '#/components/schemas/ProjectCreate' responses: '201': content: application/json: schema: $ref: '#/components/schemas/ProjectCreate' description: '' /projects/{id}/: get: operationId: projects_retrieve parameters: - in: path name: id schema: type: integer description: 프로젝트을 식별하는 고유한 정수 값. required: true tags: - projects responses: '200': content: application/json: schema: $ref: '#/components/schemas/Project' description: '' put: operationId: projects_update parameters: - in: path name: id schema: type: integer description: 프로젝트을 식별하는 고유한 정수 값. required: true tags: - projects requestBody: content: application/json: schema: $ref: '#/components/schemas/Project' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/Project' multipart/form-data: schema: $ref: '#/components/schemas/Project' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Project' description: '' delete: operationId: projects_destroy parameters: - in: path name: id schema: type: integer description: 프로젝트을 식별하는 고유한 정수 값. required: true tags: - projects responses: '204': description: No response body /projects/{id}/activate/: post: operationId: projects_activate_create description: Uploads create projects as draft. This endpoint stores source files and promotes the project to active. summary: Activate draft project parameters: - in: path name: id schema: type: integer description: 프로젝트을 식별하는 고유한 정수 값. required: true tags: - projects requestBody: content: application/json: schema: $ref: '#/components/schemas/Project' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/Project' multipart/form-data: schema: $ref: '#/components/schemas/Project' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Project' description: '' /projects/{id}/artifacts/{artifact_id}/: delete: operationId: projects_artifacts_destroy parameters: - in: path name: artifact_id schema: type: string required: true - in: path name: id schema: type: integer description: 프로젝트을 식별하는 고유한 정수 값. required: true tags: - projects responses: '204': description: No response body /projects/{id}/deletion-preview/: get: operationId: projects_deletion_preview_retrieve summary: 프로젝트 삭제 영향 미리보기 parameters: - in: path name: id schema: type: integer description: 프로젝트을 식별하는 고유한 정수 값. required: true tags: - projects responses: '200': content: application/json: schema: $ref: '#/components/schemas/Project' description: '' /projects/{id}/geometry-rotation/: post: operationId: projects_geometry_rotation_create description: 저장된 unified_config.geometry.transform을 전체 source-patch group에 한 번 적용해 proxy mesh 기반 patch bbox, union bbox, viewer translate를 반환합니다. summary: 저장된 group transform의 proxy mesh geometry 계산 parameters: - in: path name: id schema: type: integer description: 프로젝트을 식별하는 고유한 정수 값. required: true tags: - projects requestBody: content: application/json: schema: $ref: '#/components/schemas/Project' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/Project' multipart/form-data: schema: $ref: '#/components/schemas/Project' responses: '200': content: application/json: schema: $ref: '#/components/schemas/GeometryRotationResponse' description: '' /projects/{id}/jobs/: get: operationId: projects_jobs_list description: 특정 프로젝트의 Job 목록을 조회합니다. Pagination과 filtering을 지원합니다. summary: 프로젝트의 Job 목록 조회 parameters: - in: query name: cursor schema: type: string description: Cursor for pagination - in: path name: id schema: type: integer description: 프로젝트을 식별하는 고유한 정수 값. required: true - in: query name: mode schema: type: string x-spec-enum-id: b6373ee318bc60a4 enum: - G1 - G2 - G3 - G4 - S2 description: |- * `G1` - G1 * `G2` - G2 * `G3` - G3 * `G4` - G4 * `S2` - Sketch 2D - name: page_size required: false in: query description: 페이지당 반환할 결과 수. schema: type: integer - in: query name: project_mode schema: type: string enum: - G1 - G2 - G3 - G4 - S2 description: Project mode filter - in: query name: status schema: type: string enum: - aborted - cancellation_failed - cancelled - cancelling - failed - queued - running - succeeded description: Job status filter - in: query name: view schema: type: string enum: - sidebar description: Compact response shape for the RUNS sidebar tags: - projects responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedJobListList' description: '' /projects/{id}/mesh-predict/: get: operationId: projects_mesh_predict_retrieve description: Source Patch metadata와 solver mesh settings를 사용해 최종 mesh cell 수를 예측합니다. summary: 프로젝트 mesh cell 예측 parameters: - in: path name: id schema: type: integer description: 프로젝트을 식별하는 고유한 정수 값. required: true tags: - projects responses: '200': content: application/json: schema: $ref: '#/components/schemas/MeshPredictResponse' description: '' /projects/{id}/patches/ref/: post: operationId: projects_patches_ref_create description: 'Creates a ref patch for a source patch. The server assigns its immutable-at-creation label as `Patch #N` from the project''s monotonic ref-patch label sequence. `label` is not part of the request schema and is ignored for older clients.' summary: Create ref patch parameters: - in: path name: id schema: type: integer description: 프로젝트을 식별하는 고유한 정수 값. required: true tags: - projects requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchCreate' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchCreate' multipart/form-data: schema: $ref: '#/components/schemas/PatchCreate' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/Patch' description: '' /projects/{id}/purge-now/: post: operationId: projects_purge_now_create summary: 프로젝트 즉시 영구 삭제 접수 parameters: - in: path name: id schema: type: integer description: 프로젝트을 식별하는 고유한 정수 값. required: true tags: - projects requestBody: content: application/json: schema: $ref: '#/components/schemas/Project' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/Project' multipart/form-data: schema: $ref: '#/components/schemas/Project' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Project' description: '' /projects/{id}/restore/: post: operationId: projects_restore_create summary: 삭제 예정 프로젝트 복구 parameters: - in: path name: id schema: type: integer description: 프로젝트을 식별하는 고유한 정수 값. required: true tags: - projects requestBody: content: application/json: schema: $ref: '#/components/schemas/Project' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/Project' multipart/form-data: schema: $ref: '#/components/schemas/Project' responses: '200': content: application/json: schema: $ref: '#/components/schemas/Project' description: '' /projects/{id}/thumbnail/: post: operationId: projects_thumbnail_create description: Registers an uploaded WebP thumbnail S3 object as a PROJECT_THUMBNAIL_IMAGE artifact. summary: Register project thumbnail parameters: - in: path name: id schema: type: integer description: 프로젝트을 식별하는 고유한 정수 값. required: true tags: - projects requestBody: content: application/json: schema: $ref: '#/components/schemas/ProjectThumbnailRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/ProjectThumbnailRequest' multipart/form-data: schema: $ref: '#/components/schemas/ProjectThumbnailRequest' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/ProjectThumbnail' description: '' /projects/{id}/workbench-runtime/: get: operationId: projects_workbench_runtime_retrieve description: Patch DB 상태에서 계산한 geometry, scene unit scale, processing state를 반환합니다. summary: 프로젝트 워크벤치 runtime 조회 parameters: - in: path name: id schema: type: integer description: 프로젝트을 식별하는 고유한 정수 값. required: true tags: - projects responses: '200': content: application/json: schema: $ref: '#/components/schemas/WorkbenchRuntime' description: '' /projects/{id}/workbench-state/: get: operationId: projects_workbench_state_retrieve description: GET은 저장된 unified config와 revision을 반환합니다. PUT은 expected_revision이 현재 revision과 일치할 때만 unified_config를 덮어씁니다. summary: 프로젝트 워크벤치 state 조회/저장 parameters: - in: path name: id schema: type: integer description: 프로젝트을 식별하는 고유한 정수 값. required: true tags: - projects responses: '200': content: application/json: schema: $ref: '#/components/schemas/WorkbenchState' description: '' put: operationId: projects_workbench_state_update description: GET은 저장된 unified config와 revision을 반환합니다. PUT은 expected_revision이 현재 revision과 일치할 때만 unified_config를 덮어씁니다. summary: 프로젝트 워크벤치 state 조회/저장 parameters: - in: path name: id schema: type: integer description: 프로젝트을 식별하는 고유한 정수 값. required: true tags: - projects requestBody: content: application/json: schema: $ref: '#/components/schemas/WorkbenchStateUpdate' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/WorkbenchStateUpdate' multipart/form-data: schema: $ref: '#/components/schemas/WorkbenchStateUpdate' responses: '200': content: application/json: schema: $ref: '#/components/schemas/WorkbenchState' description: '' /projects/{project_id}/register-stl/: post: operationId: projects_register_stl_create description: S3에 이미 업로드된 STL 파일을 Artifact로 등록합니다. summary: STL Artifact 등록 parameters: - in: path name: project_id schema: type: integer required: true tags: - projects requestBody: content: application/json: schema: $ref: '#/components/schemas/STLArtifactRegister' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/STLArtifactRegister' multipart/form-data: schema: $ref: '#/components/schemas/STLArtifactRegister' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/Artifact' description: '' '400': content: application/json: schema: type: object additionalProperties: {} description: '' '404': content: application/json: schema: type: object additionalProperties: {} description: '' /projects/{project_id}/source-uploads/abort/: post: operationId: projects_source_uploads_abort_create parameters: - in: path name: project_id schema: type: integer required: true tags: - projects requestBody: content: application/json: schema: $ref: '#/components/schemas/SourceUploadAbort' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/SourceUploadAbort' multipart/form-data: schema: $ref: '#/components/schemas/SourceUploadAbort' required: true responses: '200': content: application/json: schema: type: object additionalProperties: {} description: '' /projects/{project_id}/source-uploads/complete/: post: operationId: projects_source_uploads_complete_create parameters: - in: path name: project_id schema: type: integer required: true tags: - projects requestBody: content: application/json: schema: $ref: '#/components/schemas/SourceUploadComplete' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/SourceUploadComplete' multipart/form-data: schema: $ref: '#/components/schemas/SourceUploadComplete' required: true responses: '201': content: application/json: schema: type: object additionalProperties: {} description: '' /projects/{project_id}/source-uploads/init/: post: operationId: projects_source_uploads_init_create parameters: - in: path name: project_id schema: type: integer required: true tags: - projects requestBody: content: application/json: schema: $ref: '#/components/schemas/SourceUploadInit' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/SourceUploadInit' multipart/form-data: schema: $ref: '#/components/schemas/SourceUploadInit' required: true responses: '201': content: application/json: schema: type: object additionalProperties: {} description: '' /projects/{project_uid}/download-quota/: get: operationId: projects_download_quota_retrieve summary: 프로젝트 공유 다운로드 잔여 횟수 parameters: - in: path name: project_uid schema: type: string required: true tags: - projects responses: '200': content: application/json: schema: $ref: '#/components/schemas/DownloadQuota' description: '' /projects/{project_uid}/downloads/: post: operationId: projects_downloads_create summary: 프로젝트 결과 다운로드 ticket 발급 parameters: - in: path name: project_uid schema: type: string required: true tags: - projects requestBody: content: application/json: schema: $ref: '#/components/schemas/ProjectDownloadTicketRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/ProjectDownloadTicketRequest' multipart/form-data: schema: $ref: '#/components/schemas/ProjectDownloadTicketRequest' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/ProjectDownloadTicket' description: '' /projects/by-uid/{uid}/: get: operationId: projects_by_uid_retrieve summary: 프로젝트 UID 상세 조회 parameters: - in: path name: uid schema: type: string required: true tags: - projects responses: '200': content: application/json: schema: $ref: '#/components/schemas/Project' description: '' /racing/executions/{execution_uid}/: post: operationId: racing_executions_create parameters: - in: path name: execution_uid schema: type: string format: uuid required: true tags: - racing responses: '200': description: No response body /racing/jobs/: get: operationId: racing_jobs_retrieve tags: - racing responses: '200': content: application/json: schema: $ref: '#/components/schemas/RaceJobListResponse' description: '' /racing/sessions/: post: operationId: racing_sessions_create tags: - racing requestBody: content: application/json: schema: $ref: '#/components/schemas/RaceSessionCreate' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/RaceSessionCreate' multipart/form-data: schema: $ref: '#/components/schemas/RaceSessionCreate' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/RaceSessionResponse' description: '' '202': content: application/json: schema: $ref: '#/components/schemas/RaceSessionResponse' description: '' /racing/sessions/{session_uid}/: get: operationId: racing_sessions_retrieve parameters: - in: path name: session_uid schema: type: string required: true tags: - racing responses: '200': content: application/json: schema: $ref: '#/components/schemas/RaceSessionResponse' description: '' /racing/sessions/{session_uid}/feedback/: post: operationId: racing_sessions_feedback_create parameters: - in: path name: session_uid schema: type: string required: true tags: - racing requestBody: content: application/json: schema: $ref: '#/components/schemas/RaceFeedback' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/RaceFeedback' multipart/form-data: schema: $ref: '#/components/schemas/RaceFeedback' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/RaceSessionResponse' description: '' /racing/sessions/{session_uid}/laps/: post: operationId: racing_sessions_laps_create parameters: - in: path name: session_uid schema: type: string required: true tags: - racing requestBody: content: application/json: schema: $ref: '#/components/schemas/RaceLapCreate' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/RaceLapCreate' multipart/form-data: schema: $ref: '#/components/schemas/RaceLapCreate' required: true responses: '200': content: application/json: schema: type: object additionalProperties: {} description: '' '201': content: application/json: schema: type: object additionalProperties: {} description: '' /sample-stls/: get: operationId: sample_stls_list description: 현재 테넌트에서 노출 처리된 Sample STL 목록을 반환합니다. summary: Sample STL 목록 조회 tags: - sample-stls responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/SampleStl' description: '' /sample-stls/{sample_id}/download/: get: operationId: sample_stls_download_retrieve description: Sample STL id로 현재 테넌트의 노출된 샘플을 조회한 뒤 presigned GET URL을 발급합니다. summary: Sample STL 다운로드 URL 발급 parameters: - in: path name: sample_id schema: type: string required: true tags: - sample-stls responses: '200': content: application/json: schema: $ref: '#/components/schemas/SampleStlDownload' description: '' /sketch/projects/: post: operationId: sketch_projects_create summary: Create an editable Sketch 2D project tags: - sketch requestBody: content: application/json: schema: $ref: '#/components/schemas/SketchProjectCreate' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/SketchProjectCreate' multipart/form-data: schema: $ref: '#/components/schemas/SketchProjectCreate' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/SketchProjectState' description: '' /sketch/projects/{project_uid}/sessions/: get: operationId: sketch_projects_sessions_retrieve summary: List Sketch 2D sessions for a project parameters: - in: path name: project_uid schema: type: string required: true tags: - sketch responses: '200': content: application/json: schema: $ref: '#/components/schemas/SketchSessionList' description: '' /sketch/projects/{project_uid}/state/: get: operationId: sketch_projects_state_retrieve parameters: - in: path name: project_uid schema: type: string required: true tags: - sketch responses: '200': content: application/json: schema: $ref: '#/components/schemas/SketchProjectState' description: '' put: operationId: sketch_projects_state_update parameters: - in: path name: project_uid schema: type: string required: true tags: - sketch requestBody: content: application/json: schema: $ref: '#/components/schemas/SketchProjectStateUpdate' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/SketchProjectStateUpdate' multipart/form-data: schema: $ref: '#/components/schemas/SketchProjectStateUpdate' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/SketchProjectState' description: '' /sketch/renderings/: post: operationId: sketch_renderings_create description: |- 선화 한 장을 사실적 렌더로 바꿔 돌려준다. 형상은 클라이언트의 3D 차체가 이미 정했다. 여기서 생성 모델이 하는 일은 재질과 빛을 입히는 것뿐이고, 프롬프트가 실루엣·시점 보존을 강제한다 — 그래야 여러 시점의 렌더가 같은 차를 가리키고, 같은 차체에서 나온 공력 지표와도 어긋나지 않는다. tags: - sketch responses: '200': description: No response body /sketch/sessions/: post: operationId: sketch_sessions_create summary: Create a Sketch 2D session tags: - sketch requestBody: content: application/json: schema: $ref: '#/components/schemas/SketchSessionCreate' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/SketchSessionCreate' multipart/form-data: schema: $ref: '#/components/schemas/SketchSessionCreate' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/SketchSession' description: '' /sketch/sessions/{job_uid}/: get: operationId: sketch_sessions_retrieve summary: Get a Sketch 2D session parameters: - in: path name: job_uid schema: type: string required: true tags: - sketch responses: '200': content: application/json: schema: $ref: '#/components/schemas/SketchSession' description: '' /sketch/sessions/{job_uid}/cancel/: post: operationId: sketch_sessions_cancel_create parameters: - in: path name: job_uid schema: type: string required: true tags: - sketch responses: '200': content: application/json: schema: $ref: '#/components/schemas/SketchCancelResponse' description: '' /sketch/sessions/{job_uid}/conditions/: post: operationId: sketch_sessions_conditions_create summary: Create a new Sketch Job from a source Job with changed conditions parameters: - in: path name: job_uid schema: type: string required: true tags: - sketch requestBody: content: application/json: schema: $ref: '#/components/schemas/SketchConditions' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/SketchConditions' multipart/form-data: schema: $ref: '#/components/schemas/SketchConditions' required: true responses: '202': content: application/json: schema: $ref: '#/components/schemas/SketchSession' description: '' /sketch/sessions/{job_uid}/events/: get: operationId: sketch_sessions_events_retrieve description: SSE data is emitted directly, without the DRF camel-case renderer; event payload keys stay snake_case. summary: Stream Sketch 2D frames as SSE parameters: - in: query name: format schema: type: string enum: - json - sse - in: path name: job_uid schema: type: string required: true tags: - sketch responses: '200': content: application/json: schema: type: string text/event-stream: schema: type: string description: '' /sketch/sessions/{job_uid}/finish/: post: operationId: sketch_sessions_finish_create parameters: - in: path name: job_uid schema: type: string required: true tags: - sketch responses: '200': content: application/json: schema: $ref: '#/components/schemas/SketchFinishResponse' description: '' /sketch/sessions/{job_uid}/geometry/: post: operationId: sketch_sessions_geometry_create summary: Create a new Sketch Job from a source Job with changed geometry parameters: - in: path name: job_uid schema: type: string required: true tags: - sketch requestBody: content: application/json: schema: $ref: '#/components/schemas/SketchGeometry' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/SketchGeometry' multipart/form-data: schema: $ref: '#/components/schemas/SketchGeometry' required: true responses: '202': content: application/json: schema: $ref: '#/components/schemas/SketchSession' description: '' /sketch/sessions/{job_uid}/heartbeat/: post: operationId: sketch_sessions_heartbeat_create parameters: - in: path name: job_uid schema: type: string required: true tags: - sketch responses: '204': description: No response body /sketch/sessions/{job_uid}/stream-ticket/: post: operationId: sketch_sessions_stream_ticket_create description: Issue a short-lived, Job-scoped credential for the binary stream relay. parameters: - in: path name: job_uid schema: type: string required: true tags: - sketch responses: '200': description: No response body /stl/convert/: post: operationId: stl_convert_create description: |- Convert an uploaded STEP (.stp/.step) CAD file into a binary STL so the rest of the platform (precheck, repair, workbench, split-stl, meshing) keeps consuming plain STL. Units are preserved from the STEP file (mm for AP203/AP214 automotive exports). Input: multipart 'file' (STEP files are compact B-rep — a full rear wing is a few MB, so the request body stays small). Returns JSON: { stlBase64, fileName, solids, faces, triangles, watertight, bboxMm, durationMs }. The caller swaps its local File for the converted STL and proceeds through the normal STL upload flow. summary: STEP -> STL conversion — curvature-adaptive tessellation, returns STL + metrics tags: - jobs responses: '200': description: No response body /stl/convert-async/: post: operationId: stl_convert_async_create description: |- Start an async conversion of an ALREADY-UPLOADED .stp/.step S3 object. Request: {projectId, objectKey} — the .stp uploaded via the normal presigned flow (project input prefix). Returns {taskId}; poll convert_step_async_status. The result STL is written next to the source with a presign-style name, so downstream treats it exactly like a browser-uploaded STL. summary: 비동기 STEP -> STL 변환 시작 (S3 in → S3 out) tags: - jobs responses: '200': description: No response body /stl/convert-async/{task_uid}/: get: operationId: stl_convert_async_retrieve description: |- Poll an async conversion. On success the payload includes the result's S3 metadata + a presigned download URL so the client can pull the STL into its local cache (mesh stats / watertight precheck still run client-side). summary: 비동기 STEP 변환 상태 조회 parameters: - in: path name: task_uid schema: type: string required: true tags: - jobs responses: '200': description: No response body /stl/repair/: post: operationId: stl_repair_create description: |- Repair an STL so the solver's SDF treats it as a solid body. The watertight *detection* runs client-side (lib/stl-precheck); this performs the heavy repair (pymeshfix) that cannot run in the browser. Input (any one): * JSON {projectId, objectKey} — repair an already-uploaded S3 object. Preferred: the request stays tiny so large STLs don't hit DATA_UPLOAD_MAX_MEMORY_SIZE. * multipart file= OR JSON {stlBase64} — small meshes only (request body). Returns JSON: { repaired, before, after, volumeRatio, notes } plus EITHER: * objectKey path: the repaired mesh is written straight back to S3 at the SAME key (no base64, no caller re-upload) and `objectKey` is echoed; or * fallback path: `stlBase64` of the repaired mesh (caller uploads it). summary: STL watertight repair — weld/fill/pymeshfix, returns repaired STL + metrics tags: - jobs responses: '200': description: No response body /subscriptions/: get: operationId: subscriptions_list summary: 팀 구독 조회 — 활성/예약/만료 분리해 반환 parameters: - in: query name: team_id schema: type: integer required: true tags: - plans responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/Subscription' description: '' /subscriptions/cancel/: post: operationId: subscriptions_cancel_create summary: 구독 해지 예약 — 사이클 종료 시 EXPIRED tags: - plans requestBody: content: application/json: schema: $ref: '#/components/schemas/CancelRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/CancelRequest' multipart/form-data: schema: $ref: '#/components/schemas/CancelRequest' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/Subscription' description: '' /subscriptions/cycles/: get: operationId: subscriptions_cycles_list description: 'TENANT 모드(B2B)에서는 팀 레벨 사이클 이력이 없어 `{"billing_mode": "TENANT", "results": []}` 를 반환한다.' summary: 팀의 구독 사이클 이력 parameters: - in: query name: limit schema: type: integer - in: query name: team_id schema: type: integer required: true tags: - plans responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/SubscriptionCycle' description: '' /subscriptions/plan-gate/: get: operationId: subscriptions_plan_gate_retrieve description: 가격·견적 정보 없이 현재 팀의 실행 진입 플랜만 판정한다. summary: 팀의 실행 가능 플랜 여부 parameters: - in: query name: team_id schema: type: integer required: true tags: - plans responses: '200': content: application/json: schema: $ref: '#/components/schemas/PlanGateResponse' description: '' /subscriptions/resume/: post: operationId: subscriptions_resume_create summary: 구독 해지 예약 취소 — CANCELLED → ACTIVE tags: - plans requestBody: content: application/json: schema: $ref: '#/components/schemas/CancelRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/CancelRequest' multipart/form-data: schema: $ref: '#/components/schemas/CancelRequest' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/Subscription' description: '' /subscriptions/solver-access/: get: operationId: subscriptions_solver_access_retrieve summary: 팀의 현재 Solver 권한 (실시간 조회) parameters: - in: query name: team_id schema: type: integer required: true tags: - plans responses: '200': content: application/json: schema: $ref: '#/components/schemas/SolverAccessResponse' description: '' /subscriptions/storage-addon/: get: operationId: subscriptions_storage_addon_retrieve summary: 팀 스토리지 애드온 조회 parameters: - in: query name: team_id schema: type: integer required: true tags: - plans responses: '200': content: application/json: schema: $ref: '#/components/schemas/TeamStorageAddon' description: '' /subscriptions/storage-addon/change/: post: operationId: subscriptions_storage_addon_change_create summary: 팀 스토리지 애드온 감량 또는 해지 예약 (다음 결제 주기 적용) tags: - plans requestBody: content: application/json: schema: $ref: '#/components/schemas/StorageAddonChange' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/StorageAddonChange' multipart/form-data: schema: $ref: '#/components/schemas/StorageAddonChange' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/TeamStorageAddon' description: '' /subscriptions/storage-addon/purchase/: post: operationId: subscriptions_storage_addon_purchase_create summary: 팀 스토리지 애드온 즉시 구매 (현재 구독 주기 종료일까지 일할 청구) tags: - plans requestBody: content: application/json: schema: $ref: '#/components/schemas/StorageAddonPurchase' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/StorageAddonPurchase' multipart/form-data: schema: $ref: '#/components/schemas/StorageAddonPurchase' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/TeamStorageAddon' description: '' /subscriptions/storage-addon/quote/: get: operationId: subscriptions_storage_addon_quote_retrieve summary: 팀 스토리지 애드온 일할 견적 parameters: - in: query name: currency schema: type: string - in: query name: team_id schema: type: integer required: true - in: query name: unit_count schema: type: integer required: true tags: - plans responses: '200': content: application/json: schema: $ref: '#/components/schemas/StorageAddonQuote' description: '' /teams/: get: operationId: teams_retrieve tags: - teams responses: '200': description: No response body post: operationId: teams_create tags: - teams responses: '200': description: No response body /teams/{team_id}/: patch: operationId: teams_partial_update parameters: - in: path name: team_id schema: type: integer required: true tags: - teams responses: '200': description: No response body delete: operationId: teams_destroy parameters: - in: path name: team_id schema: type: integer required: true tags: - teams responses: '204': description: No response body /teams/{team_id}/invitations/: get: operationId: teams_invitations_retrieve description: |- 미가입 이메일을 팀에 초대. 가입된 유저는 TeamMemberListCreateView(members API)로 바로 추가하고, 이 API는 아직 계정이 없는 이메일에게 초대장 메일을 보내는 용도다. parameters: - in: path name: team_id schema: type: integer required: true tags: - teams responses: '200': description: No response body post: operationId: teams_invitations_create description: |- 미가입 이메일을 팀에 초대. 가입된 유저는 TeamMemberListCreateView(members API)로 바로 추가하고, 이 API는 아직 계정이 없는 이메일에게 초대장 메일을 보내는 용도다. parameters: - in: path name: team_id schema: type: integer required: true tags: - teams responses: '200': description: No response body /teams/{team_id}/invitations/{id}/: delete: operationId: teams_invitations_destroy parameters: - in: path name: id schema: type: integer required: true - in: path name: team_id schema: type: integer required: true tags: - teams responses: '204': description: No response body /teams/{team_id}/members/: get: operationId: teams_members_retrieve parameters: - in: path name: team_id schema: type: integer required: true tags: - teams responses: '200': description: No response body post: operationId: teams_members_create parameters: - in: path name: team_id schema: type: integer required: true tags: - teams responses: '200': description: No response body /teams/{team_id}/members/{id}/: patch: operationId: teams_members_partial_update parameters: - in: path name: id schema: type: integer required: true - in: path name: team_id schema: type: integer required: true tags: - teams responses: '200': description: No response body delete: operationId: teams_members_destroy parameters: - in: path name: id schema: type: integer required: true - in: path name: team_id schema: type: integer required: true tags: - teams responses: '204': description: No response body /teams/{team_uid}/retained-results/: get: operationId: teams_retained_results_retrieve summary: 구독 종료 팀의 결과 다운로드 목록 parameters: - in: path name: team_uid schema: type: string required: true tags: - subscriptions responses: '200': description: No response body /teams/{team_uid}/retained-results/{artifact_uid}/download-url/: post: operationId: teams_retained_results_download_url_create summary: 구독 종료 팀의 승인된 결과 Artifact 다운로드 URL parameters: - in: path name: artifact_uid schema: type: string required: true - in: path name: team_uid schema: type: string required: true tags: - subscriptions responses: '200': description: No response body /tenants/exists/: post: operationId: tenants_exists_create tags: - tenants security: - {} responses: '200': description: No response body /uploads/: get: operationId: uploads_list parameters: - name: limit required: false in: query description: 페이지당 반환할 결과 수. schema: type: integer - name: offset required: false in: query description: 결과를 반환할 초기 인덱스. schema: type: integer tags: - uploads responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedFileUploadTrackerList' description: '' post: operationId: uploads_create tags: - uploads requestBody: content: application/json: schema: $ref: '#/components/schemas/FileUploadTracker' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/FileUploadTracker' multipart/form-data: schema: $ref: '#/components/schemas/FileUploadTracker' required: true responses: '201': content: application/json: schema: $ref: '#/components/schemas/FileUploadTracker' description: '' /uploads/{id}/: get: operationId: uploads_retrieve parameters: - in: path name: id schema: type: integer description: 파일 업로드 추적을 식별하는 고유한 정수 값. required: true tags: - uploads responses: '200': content: application/json: schema: $ref: '#/components/schemas/FileUploadTracker' description: '' put: operationId: uploads_update parameters: - in: path name: id schema: type: integer description: 파일 업로드 추적을 식별하는 고유한 정수 값. required: true tags: - uploads requestBody: content: application/json: schema: $ref: '#/components/schemas/FileUploadTracker' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/FileUploadTracker' multipart/form-data: schema: $ref: '#/components/schemas/FileUploadTracker' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/FileUploadTracker' description: '' patch: operationId: uploads_partial_update parameters: - in: path name: id schema: type: integer description: 파일 업로드 추적을 식별하는 고유한 정수 값. required: true tags: - uploads requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedFileUploadTracker' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedFileUploadTracker' multipart/form-data: schema: $ref: '#/components/schemas/PatchedFileUploadTracker' responses: '200': content: application/json: schema: $ref: '#/components/schemas/FileUploadTracker' description: '' delete: operationId: uploads_destroy parameters: - in: path name: id schema: type: integer description: 파일 업로드 추적을 식별하는 고유한 정수 값. required: true tags: - uploads responses: '204': description: No response body /verifier/email_verifier/: post: operationId: verifier_email_verifier_create description: |- 이메일 인증 --- tags: - verifier requestBody: content: application/json: schema: $ref: '#/components/schemas/EmailVerifierCreate' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/EmailVerifierCreate' multipart/form-data: schema: $ref: '#/components/schemas/EmailVerifierCreate' required: true security: - {} responses: '201': content: application/json: schema: $ref: '#/components/schemas/EmailVerifierCreate' description: '' /verifier/email_verifier/confirm/: post: operationId: verifier_email_verifier_confirm_create description: |- 이메일 인증 확인 --- 응답값의 token값으로 회원가입의 emailToken으로 사용 tags: - verifier requestBody: content: application/json: schema: $ref: '#/components/schemas/EmailVerifierConfirm' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/EmailVerifierConfirm' multipart/form-data: schema: $ref: '#/components/schemas/EmailVerifierConfirm' required: true security: - {} responses: '201': content: application/json: schema: $ref: '#/components/schemas/EmailVerifierConfirm' description: '' components: schemas: AccountTeam: type: object properties: id: type: integer uid: type: string name: type: string slug: type: string role: type: string nullable: true displayNameOverride: type: string nullable: true tenantId: type: integer nullable: true tenantSchemaName: type: string capabilities: $ref: '#/components/schemas/TeamCapabilities' required: - id - name AiAssistRequest: type: object properties: locale: enum: - ko - en type: string description: |- * `ko` - ko * `en` - en x-spec-enum-id: 659d4ef1ad5b5558 default: ko AiChatHistoryItem: type: object properties: role: enum: - user - assistant type: string description: |- * `user` - user * `assistant` - assistant x-spec-enum-id: da623bca3e193af6 content: type: string maxLength: 3000 required: - content - role AiChatRequest: type: object properties: locale: enum: - ko - en type: string description: |- * `ko` - ko * `en` - en x-spec-enum-id: 659d4ef1ad5b5558 default: ko intent: enum: - setup_guide - parameter_help - recommendation - diagnosis - usage - support type: string description: |- * `setup_guide` - setup_guide * `parameter_help` - parameter_help * `recommendation` - recommendation * `diagnosis` - diagnosis * `usage` - usage * `support` - support x-spec-enum-id: 2d57c9fc7f22c92f message: type: string default: '' maxLength: 2000 jobUid: type: string default: '' maxLength: 36 parameterPath: type: string default: '' maxLength: 160 history: type: array items: $ref: '#/components/schemas/AiChatHistoryItem' required: - intent AiChatResponse: type: object properties: intent: type: string engine: type: string answer: type: string confidence: enum: - confirmed - likely - uncertain type: string description: |- * `confirmed` - confirmed * `likely` - likely * `uncertain` - uncertain x-spec-enum-id: ba956d2d6133366d findings: type: array items: $ref: '#/components/schemas/AiFinding' missingInformation: type: array items: type: string sources: type: array items: type: string parameters: type: array items: {} recommendation: nullable: true diagnosis: nullable: true needsHumanSupport: type: boolean supportSummary: type: string required: - answer - confidence - diagnosis - engine - findings - intent - missingInformation - needsHumanSupport - parameters - recommendation - sources - supportSummary AiDiagnosisResponse: type: object properties: summary: type: string findings: type: array items: $ref: '#/components/schemas/AiFinding' needsHumanSupport: type: boolean supportSummary: type: string required: - findings - needsHumanSupport - summary - supportSummary AiFinding: type: object properties: severity: enum: - blocker - warning - info type: string description: |- * `blocker` - blocker * `warning` - warning * `info` - info x-spec-enum-id: 89eaa3468c08a8fe title: type: string detail: type: string action: type: string required: - action - detail - severity - title AiRecommendationChange: type: object properties: path: type: string before: {} after: {} reason: type: string required: - after - before - path - reason AiRecommendationResponse: type: object properties: baseRevision: type: integer summary: type: string findings: type: array items: $ref: '#/components/schemas/AiFinding' changes: type: array items: $ref: '#/components/schemas/AiRecommendationChange' proposedUnifiedConfig: {} needsHumanSupport: type: boolean supportSummary: type: string required: - baseRevision - changes - findings - needsHumanSupport - proposedUnifiedConfig - summary - supportSummary AiUsageResponse: type: object properties: used: type: integer limit: type: integer resetsAt: type: string format: date-time required: - limit - resetsAt - used Artifact: type: object properties: id: type: integer readOnly: true uid: type: string readOnly: true artifactRole: enum: - PROJECT_THUMBNAIL_IMAGE - PROJECT_SOURCE_STL - OPTIMIZED_STL - G2_SUMMARY_IMAGE - G2_SHAPE_REPORT_IMAGE - G2_FIGS_ZIP - G1_INPUT_STL - G1_SUMMARY_GIF - G1_FIGS_ZIP - G1_NORMAL_DISPLACEMENT_VTP - RESULT_MESH - RESULT_HISTORY - RESULT_SUMMARY_JSON - RESULT_FLOW_VOLUME - RESULT_GEOMETRY_SCALE - RESULT_PREVIEW_POINTS - RESULT_PROXY_MESH - RESULT_PROXY_LAYOUT - RESULT_PROXY_ATLAS - STREAMLINES_BIN - FLOWFIELD_BIN - G4_SUMMARY_IMAGE - G4_FIGS_ZIP - STEP_EXPORT_ASSEMBLY - STEP_EXPORT_PART_STEP - STEP_EXPORT_PART_STL - ASSET_FLOW_VISUALIZATION_IMAGE - ASSET_RENDERED_IMAGE - S2_FINAL_FIELD_IMAGE - S2_REPLAY_FRAMES - RACING_BASELINE_GLB - RACING_OPTIMIZED_GLB - USER_PROFILE_IMAGE type: string description: |- * `PROJECT_THUMBNAIL_IMAGE` - Project Thumbnail Image * `PROJECT_SOURCE_STL` - Project Source STL * `OPTIMIZED_STL` - Optimized STL * `G2_SUMMARY_IMAGE` - G2 Summary Image * `G2_SHAPE_REPORT_IMAGE` - G2 Shape Report Image * `G2_FIGS_ZIP` - G2 Figs ZIP * `G1_INPUT_STL` - G1 Input STL * `G1_SUMMARY_GIF` - G1 Summary GIF * `G1_FIGS_ZIP` - G1 Figs ZIP * `G1_NORMAL_DISPLACEMENT_VTP` - G1 Normal Displacement VTP * `RESULT_MESH` - Result Mesh * `RESULT_HISTORY` - Result History * `RESULT_SUMMARY_JSON` - Result Summary JSON * `RESULT_FLOW_VOLUME` - Result Flow Volume * `RESULT_GEOMETRY_SCALE` - Result Geometry Scale * `RESULT_PREVIEW_POINTS` - Result Preview Points * `RESULT_PROXY_MESH` - Result Proxy Mesh * `RESULT_PROXY_LAYOUT` - Result Proxy Layout * `RESULT_PROXY_ATLAS` - Result Proxy Atlas * `STREAMLINES_BIN` - Streamlines Binary * `FLOWFIELD_BIN` - Flow Field Binary * `G4_SUMMARY_IMAGE` - G4 Summary Image * `G4_FIGS_ZIP` - G4 Figs ZIP * `STEP_EXPORT_ASSEMBLY` - STEP Export Assembly * `STEP_EXPORT_PART_STEP` - STEP Export Part STEP * `STEP_EXPORT_PART_STL` - STEP Export Part STL * `ASSET_FLOW_VISUALIZATION_IMAGE` - Asset Flow Visualization Image * `ASSET_RENDERED_IMAGE` - Asset Rendered Image * `S2_FINAL_FIELD_IMAGE` - Sketch 2D Final Field Image * `S2_REPLAY_FRAMES` - Sketch 2D Replay Frames * `RACING_BASELINE_GLB` - Racing Baseline GLB * `RACING_OPTIMIZED_GLB` - Racing Optimized GLB * `USER_PROFILE_IMAGE` - User Profile Image x-spec-enum-id: ef52df4c3b39155d storageProvider: enum: - S3 - GCS - AZURE type: string description: |- * `S3` - Amazon S3 * `GCS` - Google Cloud Storage * `AZURE` - Azure Blob Storage x-spec-enum-id: 3e1757d60d74052a s3Bucket: type: string maxLength: 255 s3Key: type: string maxLength: 1024 s3Url: type: string readOnly: true fileName: type: string readOnly: true contentType: type: string nullable: true maxLength: 255 sizeBytes: type: integer maximum: 9223372036854775807 minimum: -9223372036854775808 format: int64 nullable: true checksumSha256: type: string nullable: true maxLength: 128 createdAt: type: string format: date-time readOnly: true required: - artifactRole - createdAt - fileName - id - s3Bucket - s3Key - s3Url - uid ArtifactCreate: type: object properties: storageProvider: enum: - S3 - GCS - AZURE type: string description: |- * `S3` - Amazon S3 * `GCS` - Google Cloud Storage * `AZURE` - Azure Blob Storage x-spec-enum-id: 3e1757d60d74052a s3Bucket: type: string maxLength: 255 s3Key: type: string maxLength: 1024 artifactRole: enum: - PROJECT_THUMBNAIL_IMAGE - PROJECT_SOURCE_STL - OPTIMIZED_STL - G2_SUMMARY_IMAGE - G2_SHAPE_REPORT_IMAGE - G2_FIGS_ZIP - G1_INPUT_STL - G1_SUMMARY_GIF - G1_FIGS_ZIP - G1_NORMAL_DISPLACEMENT_VTP - RESULT_MESH - RESULT_HISTORY - RESULT_SUMMARY_JSON - RESULT_FLOW_VOLUME - RESULT_GEOMETRY_SCALE - RESULT_PREVIEW_POINTS - RESULT_PROXY_MESH - RESULT_PROXY_LAYOUT - RESULT_PROXY_ATLAS - STREAMLINES_BIN - FLOWFIELD_BIN - G4_SUMMARY_IMAGE - G4_FIGS_ZIP - STEP_EXPORT_ASSEMBLY - STEP_EXPORT_PART_STEP - STEP_EXPORT_PART_STL - ASSET_FLOW_VISUALIZATION_IMAGE - ASSET_RENDERED_IMAGE - S2_FINAL_FIELD_IMAGE - S2_REPLAY_FRAMES - RACING_BASELINE_GLB - RACING_OPTIMIZED_GLB - USER_PROFILE_IMAGE type: string description: |- * `PROJECT_THUMBNAIL_IMAGE` - Project Thumbnail Image * `PROJECT_SOURCE_STL` - Project Source STL * `OPTIMIZED_STL` - Optimized STL * `G2_SUMMARY_IMAGE` - G2 Summary Image * `G2_SHAPE_REPORT_IMAGE` - G2 Shape Report Image * `G2_FIGS_ZIP` - G2 Figs ZIP * `G1_INPUT_STL` - G1 Input STL * `G1_SUMMARY_GIF` - G1 Summary GIF * `G1_FIGS_ZIP` - G1 Figs ZIP * `G1_NORMAL_DISPLACEMENT_VTP` - G1 Normal Displacement VTP * `RESULT_MESH` - Result Mesh * `RESULT_HISTORY` - Result History * `RESULT_SUMMARY_JSON` - Result Summary JSON * `RESULT_FLOW_VOLUME` - Result Flow Volume * `RESULT_GEOMETRY_SCALE` - Result Geometry Scale * `RESULT_PREVIEW_POINTS` - Result Preview Points * `RESULT_PROXY_MESH` - Result Proxy Mesh * `RESULT_PROXY_LAYOUT` - Result Proxy Layout * `RESULT_PROXY_ATLAS` - Result Proxy Atlas * `STREAMLINES_BIN` - Streamlines Binary * `FLOWFIELD_BIN` - Flow Field Binary * `G4_SUMMARY_IMAGE` - G4 Summary Image * `G4_FIGS_ZIP` - G4 Figs ZIP * `STEP_EXPORT_ASSEMBLY` - STEP Export Assembly * `STEP_EXPORT_PART_STEP` - STEP Export Part STEP * `STEP_EXPORT_PART_STL` - STEP Export Part STL * `ASSET_FLOW_VISUALIZATION_IMAGE` - Asset Flow Visualization Image * `ASSET_RENDERED_IMAGE` - Asset Rendered Image * `S2_FINAL_FIELD_IMAGE` - Sketch 2D Final Field Image * `S2_REPLAY_FRAMES` - Sketch 2D Replay Frames * `RACING_BASELINE_GLB` - Racing Baseline GLB * `RACING_OPTIMIZED_GLB` - Racing Optimized GLB * `USER_PROFILE_IMAGE` - User Profile Image x-spec-enum-id: ef52df4c3b39155d contentType: type: string nullable: true maxLength: 255 sizeBytes: type: integer maximum: 9223372036854775807 minimum: -9223372036854775808 format: int64 nullable: true checksumSha256: type: string nullable: true maxLength: 128 required: - artifactRole - s3Bucket - s3Key ArtifactList: type: object properties: id: type: integer readOnly: true uid: type: string readOnly: true fileName: type: string readOnly: true artifactRole: enum: - PROJECT_THUMBNAIL_IMAGE - PROJECT_SOURCE_STL - OPTIMIZED_STL - G2_SUMMARY_IMAGE - G2_SHAPE_REPORT_IMAGE - G2_FIGS_ZIP - G1_INPUT_STL - G1_SUMMARY_GIF - G1_FIGS_ZIP - G1_NORMAL_DISPLACEMENT_VTP - RESULT_MESH - RESULT_HISTORY - RESULT_SUMMARY_JSON - RESULT_FLOW_VOLUME - RESULT_GEOMETRY_SCALE - RESULT_PREVIEW_POINTS - RESULT_PROXY_MESH - RESULT_PROXY_LAYOUT - RESULT_PROXY_ATLAS - STREAMLINES_BIN - FLOWFIELD_BIN - G4_SUMMARY_IMAGE - G4_FIGS_ZIP - STEP_EXPORT_ASSEMBLY - STEP_EXPORT_PART_STEP - STEP_EXPORT_PART_STL - ASSET_FLOW_VISUALIZATION_IMAGE - ASSET_RENDERED_IMAGE - S2_FINAL_FIELD_IMAGE - S2_REPLAY_FRAMES - RACING_BASELINE_GLB - RACING_OPTIMIZED_GLB - USER_PROFILE_IMAGE type: string description: |- * `PROJECT_THUMBNAIL_IMAGE` - Project Thumbnail Image * `PROJECT_SOURCE_STL` - Project Source STL * `OPTIMIZED_STL` - Optimized STL * `G2_SUMMARY_IMAGE` - G2 Summary Image * `G2_SHAPE_REPORT_IMAGE` - G2 Shape Report Image * `G2_FIGS_ZIP` - G2 Figs ZIP * `G1_INPUT_STL` - G1 Input STL * `G1_SUMMARY_GIF` - G1 Summary GIF * `G1_FIGS_ZIP` - G1 Figs ZIP * `G1_NORMAL_DISPLACEMENT_VTP` - G1 Normal Displacement VTP * `RESULT_MESH` - Result Mesh * `RESULT_HISTORY` - Result History * `RESULT_SUMMARY_JSON` - Result Summary JSON * `RESULT_FLOW_VOLUME` - Result Flow Volume * `RESULT_GEOMETRY_SCALE` - Result Geometry Scale * `RESULT_PREVIEW_POINTS` - Result Preview Points * `RESULT_PROXY_MESH` - Result Proxy Mesh * `RESULT_PROXY_LAYOUT` - Result Proxy Layout * `RESULT_PROXY_ATLAS` - Result Proxy Atlas * `STREAMLINES_BIN` - Streamlines Binary * `FLOWFIELD_BIN` - Flow Field Binary * `G4_SUMMARY_IMAGE` - G4 Summary Image * `G4_FIGS_ZIP` - G4 Figs ZIP * `STEP_EXPORT_ASSEMBLY` - STEP Export Assembly * `STEP_EXPORT_PART_STEP` - STEP Export Part STEP * `STEP_EXPORT_PART_STL` - STEP Export Part STL * `ASSET_FLOW_VISUALIZATION_IMAGE` - Asset Flow Visualization Image * `ASSET_RENDERED_IMAGE` - Asset Rendered Image * `S2_FINAL_FIELD_IMAGE` - Sketch 2D Final Field Image * `S2_REPLAY_FRAMES` - Sketch 2D Replay Frames * `RACING_BASELINE_GLB` - Racing Baseline GLB * `RACING_OPTIMIZED_GLB` - Racing Optimized GLB * `USER_PROFILE_IMAGE` - User Profile Image x-spec-enum-id: ef52df4c3b39155d readOnly: true contentType: type: string readOnly: true nullable: true sizeBytes: type: integer readOnly: true nullable: true createdAt: type: string format: date-time readOnly: true required: - artifactRole - contentType - createdAt - fileName - id - sizeBytes - uid BatchCompute: type: object properties: np: type: integer nullable: true npCfd: type: integer nullable: true npAdj: type: integer nullable: true ompThreadsMesh: type: integer nullable: true queue: type: string nullable: true jobDefinition: type: string nullable: true vcpus: type: integer nullable: true memoryMb: type: integer nullable: true gpu: type: integer nullable: true grid: type: object additionalProperties: {} nullable: true timeoutSeconds: type: integer nullable: true BillingKey: type: object properties: billingKey: type: string maxLength: 128 teamId: type: integer readOnly: true teamName: type: string readOnly: true createdByUserId: type: integer readOnly: true nullable: true provider: enum: - payletter - paypal - galaxia type: string description: |- * `payletter` - PayLetter * `paypal` - PayPal * `galaxia` - Galaxia x-spec-enum-id: 57f6d0e06595d82e channelKey: type: string maxLength: 128 method: type: string maxLength: 32 cardIssuer: type: string maxLength: 64 cardBrand: type: string maxLength: 32 cardName: type: string maxLength: 64 cardBin: type: string maxLength: 16 cardNumberMasked: type: string maxLength: 32 easyPayProvider: type: string maxLength: 64 status: enum: - ISSUED - DELETED type: string description: |- * `ISSUED` - 발급 완료 * `DELETED` - 삭제됨 x-spec-enum-id: d80d5ed15cf00039 issuedAt: type: string format: date-time nullable: true deletedAt: type: string format: date-time nullable: true required: - billingKey - channelKey - createdByUserId - teamId - teamName BillingKeyBypassResponse: type: object description: |- 빌링키 발급 SDK 호출 전 프론트가 가져갈 bypass 페이로드. 별도 prepare 단계가 없는 PG 가 SDK 호출에 추가 파라미터를 요구할 때 사용한다. properties: bypass: type: object additionalProperties: {} readOnly: true channelKey: type: string readOnly: true required: - bypass - channelKey BillingKeyRegisterAndChargePayletterRequest: type: object description: |- PayLetter `requestIssueBillingKeyAndPay` 콜백 처리용. 프론트는 사전에 `/payments/prepare/?provider=payletter` 로 paymentId 를 채번해 SDK 호출에 사용하고, 콜백에서 받은 billingKey + paymentId 를 본 엔드포인트에 전달. properties: billingKey: type: string maxLength: 128 paymentId: type: string maxLength: 64 teamId: type: integer required: - billingKey - paymentId - teamId BillingKeyRegisterRequest: type: object properties: billingKey: type: string maxLength: 128 teamId: type: integer provider: enum: - payletter - paypal - galaxia type: string description: |- * `payletter` - PayLetter * `paypal` - PayPal * `galaxia` - Galaxia x-spec-enum-id: 57f6d0e06595d82e default: paypal channelKey: type: string maxLength: 128 required: - billingKey - teamId BillingKeySwapRequest: type: object description: |- 결제수단 변경(swap) 요청. 프론트 흐름: - PayLetter : `/payments/prepare/?provider=payletter` 로 소액 paymentId 채번 → `requestIssueBillingKeyAndPay` 로 발급+소액결제 → 콜백 billingKey + paymentId 전달. - PayPal/Galaxia : `requestIssueBillingKey` 로 단독발급 → 콜백 billingKey 전달 (payment_id 불필요). properties: teamId: type: integer provider: enum: - payletter - paypal - galaxia type: string description: |- * `payletter` - PayLetter * `paypal` - PayPal * `galaxia` - Galaxia x-spec-enum-id: 57f6d0e06595d82e default: paypal billingKey: type: string maxLength: 128 paymentId: type: string maxLength: 64 channelKey: type: string maxLength: 128 reason: type: string maxLength: 200 billingCountry: type: string maxLength: 2 legalName: type: string maxLength: 255 billingEmail: type: string format: email required: - billingCountry - billingEmail - billingKey - legalName - teamId BillingMethodSwap: type: object description: |- 결제수단 변경(swap) 결과. 새 빌링키 + 후속(환불/폐기) 결과 플래그. refund_failed / old_delete_failed 가 true 면 발급은 성공했으나 후속이 일부 실패한 것 (status=COMPLETED_WITH_WARNINGS) — note 에 사유. CS/재시도 대상 식별용. properties: id: type: integer readOnly: true teamId: type: integer readOnly: true provider: enum: - payletter - paypal - galaxia type: string description: |- * `payletter` - PayLetter * `paypal` - PayPal * `galaxia` - Galaxia x-spec-enum-id: 57f6d0e06595d82e newBillingKey: allOf: - $ref: '#/components/schemas/BillingKey' readOnly: true oldBillingKey: type: string readOnly: true nullable: true microPaymentId: type: string readOnly: true nullable: true createdByUserId: type: integer readOnly: true nullable: true reason: type: string maxLength: 200 status: enum: - COMPLETED - COMPLETED_WITH_WARNINGS type: string description: |- * `COMPLETED` - 완료 (발급+환불+기존폐기 모두 성공) * `COMPLETED_WITH_WARNINGS` - 발급 성공 + 후속(환불/폐기) 일부 실패 x-spec-enum-id: 9713d5910cb6bc4a refundFailed: type: boolean oldDeleteFailed: type: boolean note: type: string createdAt: type: string format: date-time readOnly: true required: - createdAt - createdByUserId - id - microPaymentId - newBillingKey - oldBillingKey - provider - teamId BookDemoCreate: type: object properties: id: type: integer readOnly: true name: type: string maxLength: 100 firstName: type: string maxLength: 100 lastName: type: string maxLength: 100 company: type: string maxLength: 150 email: type: string format: email maxLength: 254 phoneNumber: type: string maxLength: 50 industry: enum: - Automotive - Motorsports - Aerospace & Aviation - Defense - Industrial Manufacturing - Consumer Electronics - Robotics - Transportation & Mobility - Marine & Shipbuilding - Software & IT - AI & Machine Learning - Simulation & Modeling - Research & Academia - Engineering Services - Startup - Consulting - Media & Marketing - Other type: string description: |- * `Automotive` - Automotive * `Motorsports` - Motorsports * `Aerospace & Aviation` - Aerospace & Aviation * `Defense` - Defense * `Industrial Manufacturing` - Industrial Manufacturing * `Consumer Electronics` - Consumer Electronics * `Robotics` - Robotics * `Transportation & Mobility` - Transportation & Mobility * `Marine & Shipbuilding` - Marine & Shipbuilding * `Software & IT` - Software & IT * `AI & Machine Learning` - AI & Machine Learning * `Simulation & Modeling` - Simulation & Modeling * `Research & Academia` - Research & Academia * `Engineering Services` - Engineering Services * `Startup` - Startup * `Consulting` - Consulting * `Media & Marketing` - Media & Marketing * `Other` - Other x-spec-enum-id: c7a630fa0a654937 jobRole: enum: - Exterior Designer - Interior Designer - Concept Designer - Product Designer - Modeler / 3D Artist - Aerodynamics Engineer - CFD Engineer - Mechanical Engineer - Performance Engineer - Product Manager - Founder / CEO - Research Scientist - Student / Intern - Consultant - Other type: string description: |- * `Exterior Designer` - Exterior Designer * `Interior Designer` - Interior Designer * `Concept Designer` - Concept Designer * `Product Designer` - Product Designer * `Modeler / 3D Artist` - Modeler / 3D Artist * `Aerodynamics Engineer` - Aerodynamics Engineer * `CFD Engineer` - CFD Engineer * `Mechanical Engineer` - Mechanical Engineer * `Performance Engineer` - Performance Engineer * `Product Manager` - Product Manager * `Founder / CEO` - Founder / CEO * `Research Scientist` - Research Scientist * `Student / Intern` - Student / Intern * `Consultant` - Consultant * `Other` - Other x-spec-enum-id: b1c4d7d3d3c29c96 privacyConsent: type: boolean marketingConsent: type: boolean required: - email - firstName - id - lastName - name - phoneNumber - privacyConsent BundlePurchase: type: object properties: paymentId: type: string readOnly: true paymentStatus: type: string readOnly: true teamId: type: integer readOnly: true bundleId: type: integer readOnly: true creditsSnapshot: type: integer maximum: 2147483647 minimum: 0 priceSnapshotMinor: type: integer readOnly: true currencySnapshot: type: string maxLength: 8 display: type: object additionalProperties: {} readOnly: true createdAt: type: string format: date-time readOnly: true required: - bundleId - createdAt - creditsSnapshot - currencySnapshot - display - paymentId - paymentStatus - priceSnapshotMinor - teamId BundlePurchaseStartRequest: type: object properties: teamId: type: integer channelKey: type: string maxLength: 128 orderName: type: string maxLength: 200 currency: type: string maxLength: 8 billingCountry: type: string maxLength: 2 provider: enum: - payletter - paypal - galaxia type: string description: |- * `payletter` - PayLetter * `paypal` - PayPal * `galaxia` - Galaxia x-spec-enum-id: 57f6d0e06595d82e required: - provider - teamId CancelRequest: type: object properties: teamId: type: integer required: - teamId CanonicalJobSpec: type: object description: |- Validates the ADAPTER-INPUT canonical submission dict (in-flight only). NOT applied to the Job.run_config envelope. The adapter pops operationMode -> Job column and stores the flattened result at run_config.native_config. properties: schemaVersion: type: string default: '1.0' engine: enum: - G1 - G2 - G4 type: string description: |- * `G1` - G1 * `G2` - G2 * `G4` - G4 x-spec-enum-id: d5df67bc8a34864a operationMode: enum: - BASIC - PRO type: string description: |- * `BASIC` - BASIC * `PRO` - PRO x-spec-enum-id: 7fea7e3fb58f4701 default: BASIC geometry: $ref: '#/components/schemas/GeometrySpec' objective: $ref: '#/components/schemas/ObjectiveSpec' constraints: $ref: '#/components/schemas/ConstraintsSpec' optimization: $ref: '#/components/schemas/OptimizationSpec' flow: $ref: '#/components/schemas/FlowSpec' domain: allOf: - $ref: '#/components/schemas/DomainSpec' nullable: true compute: $ref: '#/components/schemas/ComputeSpec' parameterization: $ref: '#/components/schemas/ParameterizationSpec' engineExtras: type: object additionalProperties: {} required: - compute - engine - flow - geometry - objective - optimization - parameterization CheckoutCancelRequest: type: object description: |- 결제창 취소/실패 마킹 요청. FE SDK 의 취소·실패 콜백에서 받은 메시지를 그대로 전달. PG/SDK 별 문구(Galaxia '[1111, 00] 사용자 결제취소', PayLetter/PayPal '사용자가 결제를 취소하였습니다.' 등)는 FE 가 원문을 그대로 넣고, 백엔드는 PG 별 분기 없이 저장한다. properties: failureMessage: type: string default: '' maxLength: 500 CheckoutOptions: type: object properties: teamId: type: integer billingProfileRequired: type: boolean billingProfile: allOf: - $ref: '#/components/schemas/TeamBillingProfile' nullable: true providers: type: array items: $ref: '#/components/schemas/ProviderCheckoutOption' required: - billingProfile - billingProfileRequired - providers - teamId ClientExportRequest: type: object properties: format: enum: - stl - zip type: string description: |- * `stl` - stl * `zip` - zip x-spec-enum-id: 0963a3e761963666 itemCount: type: integer maximum: 1000 minimum: 1 required: - format - itemCount ComputeSpec: type: object properties: backend: enum: - SHARED_HPC - AWS_BATCH - LOCAL - K8S type: string description: |- * `SHARED_HPC` - SHARED_HPC * `AWS_BATCH` - AWS_BATCH * `LOCAL` - LOCAL * `K8S` - K8S x-spec-enum-id: e6a90292d1b74a30 hpc: allOf: - $ref: '#/components/schemas/HpcCompute' nullable: true batch: allOf: - $ref: '#/components/schemas/BatchCompute' nullable: true required: - backend ConstraintsSpec: type: object properties: maxOutwardDisplacement: type: number format: double nullable: true maxInwardDisplacement: type: number format: double nullable: true maxInitChange: type: number format: double nullable: true regularizationRadius: type: number format: double nullable: true planeConstraints: type: array items: $ref: '#/components/schemas/PlaneConstraint' boundingSurfaces: type: array items: type: object additionalProperties: {} wheelDistance: type: object additionalProperties: {} nullable: true freeze: type: object additionalProperties: {} CreditBucket: type: object properties: id: type: integer readOnly: true source: enum: - SUBSCRIPTION - BONUS - PROMO - PAYG_BUNDLE type: string description: |- * `SUBSCRIPTION` - 구독 포함 * `BONUS` - 보상 * `PROMO` - 프로모션 * `PAYG_BUNDLE` - 추가구매 번들 x-spec-enum-id: 2aa13f9f58745ba9 grantedAmount: type: integer maximum: 2147483647 minimum: 0 remainingAmount: type: integer maximum: 2147483647 minimum: 0 grantedAt: type: string format: date-time expiresAt: type: string format: date-time referenceType: enum: - PAYMENT - SUBSCRIPTION_CYCLE - ADMIN - PROMO_CAMPAIGN - EXECUTION - ASSET_SALE - '' type: string description: |- * `PAYMENT` - 결제 * `SUBSCRIPTION_CYCLE` - 구독 결제주기 * `ADMIN` - 관리자 * `PROMO_CAMPAIGN` - 프로모션 * `EXECUTION` - 실행 * `ASSET_SALE` - 에셋 판매 x-spec-enum-id: 167958143e14f3a0 referenceId: type: string maxLength: 64 note: type: string maxLength: 200 isActive: type: boolean readOnly: true createdAt: type: string format: date-time readOnly: true required: - createdAt - expiresAt - grantedAmount - id - isActive - remainingAmount - source CreditBundle: type: object properties: id: type: integer readOnly: true name: type: string maxLength: 120 description: type: string itemCode: type: string maxLength: 10 price: allOf: - $ref: '#/components/schemas/PriceEntry' nullable: true readOnly: true credits: type: integer maximum: 2147483647 minimum: 0 isActive: type: boolean sortOrder: type: integer maximum: 2147483647 minimum: 0 createdAt: type: string format: date-time readOnly: true updatedAt: type: string format: date-time readOnly: true required: - createdAt - credits - id - name - price - updatedAt CreditEstimateResponse: type: object properties: variables: $ref: '#/components/schemas/CreditEstimateVariables' estimates: $ref: '#/components/schemas/CreditEstimateTotals' warnings: type: array items: $ref: '#/components/schemas/CreditEstimateWarning' required: - estimates - variables - warnings CreditEstimateTotals: type: object properties: total: type: integer required: - total CreditEstimateVariables: type: object properties: cpu: type: integer nullable: true gpu: type: integer nullable: true predSimulatingSeconds: type: integer projectModeMult: type: number format: double objectiveFuncMult: type: number format: double optSteps: type: integer creditPerOptStep: type: number format: double meshCells: type: integer nullable: true latticePoints: type: integer nullable: true optAreaMult: type: number format: double optTargetMult: type: number format: double required: - cpu - creditPerOptStep - gpu - latticePoints - meshCells - objectiveFuncMult - optAreaMult - optSteps - optTargetMult - predSimulatingSeconds - projectModeMult CreditEstimateWarning: type: object properties: code: type: string message: type: string predictedCells: type: integer cellLimit: type: integer required: - cellLimit - code - message - predictedCells CreditOperation: type: object properties: id: type: integer readOnly: true kind: enum: - GRANT - CONSUME - REFUND_REVERSAL - EXPIRE - COMPENSATION type: string description: |- * `GRANT` - 발급 * `CONSUME` - 차감(사용) * `REFUND_REVERSAL` - 환불 회수 * `EXPIRE` - 만료 소멸 * `COMPENSATION` - 오류 보상 지급 x-spec-enum-id: 9a773a70abb3a2bc totalDelta: type: integer maximum: 2147483647 minimum: -2147483648 walletBalanceAfter: type: integer maximum: 2147483647 minimum: 0 unmetAmount: type: integer maximum: 2147483647 minimum: 0 idempotencyKey: type: string maxLength: 128 note: type: string maxLength: 200 createdAt: type: string format: date-time readOnly: true required: - createdAt - id - idempotencyKey - kind - totalDelta - walletBalanceAfter CreditTransaction: type: object properties: id: type: integer readOnly: true operation: type: integer operationKind: type: string readOnly: true operationIdempotencyKey: type: string readOnly: true bucket: type: integer bucketSource: type: string readOnly: true sequence: type: integer maximum: 2147483647 minimum: 0 delta: type: integer maximum: 2147483647 minimum: -2147483648 bucketRemainingAfter: type: integer maximum: 2147483647 minimum: 0 createdAt: type: string format: date-time readOnly: true required: - bucket - bucketRemainingAfter - bucketSource - createdAt - delta - id - operation - operationIdempotencyKey - operationKind - sequence CreditWallet: type: object properties: id: type: integer readOnly: true teamId: type: integer readOnly: true teamName: type: string readOnly: true balance: type: integer readOnly: true bucketsBySource: type: object additionalProperties: type: integer readOnly: true billingMode: type: string description: 현재 테넌트의 실제 결제 모드 (TEAM/TENANT). FE 가 Add Credits 숨김에 사용. readOnly: true createdAt: type: string format: date-time readOnly: true updatedAt: type: string format: date-time readOnly: true required: - balance - billingMode - bucketsBySource - createdAt - id - teamId - teamName - updatedAt CurrentBillingMethod: type: object description: |- 현재 활성 결제수단 — 표시용 메타만 노출. 보안: raw `billing_key` 는 PortOne 결제 호출용 credential 이므로 브라우저에 절대 내려주지 않는다 (노출 시 결제 abuse 표면 증가). 구독/결제/교체 호출은 서버가 팀의 활성 빌링키를 직접 resolve 하므로 FE 는 billing_key 값을 알 필요가 없다. 채널키 등 내부 식별자도 제외하고 카드 표시 정보만 내려준다. properties: provider: enum: - payletter - paypal - galaxia type: string description: |- * `payletter` - PayLetter * `paypal` - PayPal * `galaxia` - Galaxia x-spec-enum-id: 57f6d0e06595d82e method: type: string maxLength: 32 cardIssuer: type: string maxLength: 64 cardBrand: type: string maxLength: 32 cardNumberMasked: type: string maxLength: 32 DeletionExecutionStatus: type: object description: Team-safe execution progress. Storage targets and errors stay private. properties: executionId: type: string format: uuid readOnly: true resourceType: type: string readOnly: true resourceUid: type: string readOnly: true status: enum: - scheduled - pending - running - retry - blocked - succeeded - failed - cancelled type: string description: |- * `scheduled` - Scheduled * `pending` - Pending * `running` - Running * `retry` - Retry * `blocked` - Blocked for manual review * `succeeded` - Succeeded * `failed` - Failed * `cancelled` - Cancelled x-spec-enum-id: 2ff34784721dc0e0 readOnly: true phase: enum: - s3_purge - db_finalize type: string description: |- * `s3_purge` - S3 purge * `db_finalize` - Database finalization x-spec-enum-id: eb377700a0ac201c readOnly: true scheduledFor: type: string format: date-time readOnly: true claimedAt: type: string format: date-time readOnly: true nullable: true nextRetryAt: type: string format: date-time readOnly: true nullable: true completedAt: type: string format: date-time readOnly: true nullable: true deletedObjectCount: type: integer readOnly: true deletedVersionCount: type: integer readOnly: true deletedBytes: type: integer readOnly: true isTerminal: type: string readOnly: true required: - claimedAt - completedAt - deletedBytes - deletedObjectCount - deletedVersionCount - executionId - isTerminal - nextRetryAt - phase - resourceType - resourceUid - scheduledFor - status DetailResponse: type: object properties: detail: type: string required: - detail DiagnoseRequest: type: object properties: locale: enum: - ko - en type: string description: |- * `ko` - ko * `en` - en x-spec-enum-id: 659d4ef1ad5b5558 default: ko jobUid: type: string maxLength: 36 required: - jobUid DomainGrid: type: object properties: x: type: integer minimum: 1 y: type: integer minimum: 1 z: type: integer minimum: 1 required: - x - y - z DomainSpec: type: object properties: grid: allOf: - $ref: '#/components/schemas/DomainGrid' nullable: true DownloadItemRequest: type: object properties: artifactUid: type: string maxLength: 36 fileId: type: string maxLength: 128 role: type: string maxLength: 40 DownloadQuota: type: object properties: limit: type: integer readOnly: true used: type: integer readOnly: true remaining: type: string readOnly: true canDownload: type: string readOnly: true updatedAt: type: string format: date-time readOnly: true required: - canDownload - limit - remaining - updatedAt - used EmailVerifierConfirm: type: object properties: email: type: string format: email writeOnly: true code: type: string writeOnly: true token: type: string readOnly: true required: - code - email - token EmailVerifierCreate: type: object description: |- 회원가입 이메일 인증 메일 발송 (6자리 인증번호 방식) request: email, purpose(email_verification 한정) flow: 1. 가입된 이메일 중복 체크 2. EmailVerifier 레코드 생성 + 인증번호 메일 발송 비밀번호 재설정(password_reset)은 이 공개 엔드포인트에서 허용하지 않는다 — 가입 여부를 먼저 검사하는 accounts 앱(PasswordReset)을 통해서만 발송한다. properties: email: type: string format: email title: 이메일 maxLength: 254 purpose: enum: - email_verification type: string description: '* `email_verification` - 회원가입 이메일 인증' x-spec-enum-id: eb09df945970aa2a required: - email - purpose FileUploadTracker: type: object properties: id: type: integer readOnly: true userId: type: integer readOnly: true uploadId: type: string maxLength: 255 fileName: type: string maxLength: 255 contentType: type: string nullable: true maxLength: 255 fileSize: type: integer maximum: 9223372036854775807 minimum: -9223372036854775808 format: int64 nullable: true status: enum: - pending - uploading - completed - failed - cancelled type: string description: |- * `pending` - Pending * `uploading` - Uploading * `completed` - Completed * `failed` - Failed * `cancelled` - Cancelled x-spec-enum-id: 09b6c2bacd3dd5f3 progressPercent: type: integer maximum: 2147483647 minimum: -2147483648 bytesUploaded: type: integer maximum: 9223372036854775807 minimum: -9223372036854775808 format: int64 s3Bucket: type: string maxLength: 255 s3Key: type: string maxLength: 1024 artifact: allOf: - $ref: '#/components/schemas/Artifact' readOnly: true errorMessage: type: string nullable: true completedAt: type: string format: date-time readOnly: true nullable: true createdAt: type: string format: date-time readOnly: true updatedAt: type: string format: date-time readOnly: true required: - artifact - completedAt - createdAt - fileName - id - s3Bucket - s3Key - updatedAt - uploadId - userId FlowSpec: type: object properties: freestreamVelocityMps: type: number format: double nullable: true latticeVelocity: type: number format: double nullable: true velocity: type: number format: double nullable: true mach: type: number format: double nullable: true aoa: type: number format: double nullable: true reynolds: type: number format: double nullable: true reynoldsLength: type: number format: double nullable: true flowDirection: type: array items: type: number format: double maxItems: 3 minItems: 3 turbIntensity: type: number format: double nullable: true turb2lamViscRatio: type: number format: double nullable: true smagorinsky: type: number format: double nullable: true precision: enum: - DP - SPDP type: string description: |- * `DP` - DP * `SPDP` - SPDP x-spec-enum-id: 9f9c00f0c36bcc5e default: DP mesh: type: object additionalProperties: {} G2JobRestart: type: object description: |- G2 Job 단계 재시작(restart) 시리얼라이저. 원본 Job 의 mesh/CFD 체크포인트를 재사용해 특정 단계부터 재실행한다. 원본 geometry/STL/patch 를 그대로 재사용하므로 입력은 단계 + 일부 run_config override 만 받는다 (예: opt 단계의 opt_iter/opt_step). source_job 은 뷰에서 URL pk 로 해석해 컨텍스트로 주입한다. properties: restartStage: enum: - scratch - mesh - cfd - opt type: string description: |- * `scratch` - scratch * `mesh` - mesh * `cfd` - cfd * `opt` - opt x-spec-enum-id: 8b4e6fcc5d65a612 runConfig: type: object additionalProperties: {} required: - restartStage GeometryRotationResponse: type: object properties: rotationEulerDeg: type: array items: type: number format: double rotationPivot: type: array items: type: number format: double patchBoundingBoxes: type: array items: type: object additionalProperties: {} projectInputUnionBoundingBox: {} projectInputViewerTranslate: type: array items: type: number format: double required: - patchBoundingBoxes - projectInputUnionBoundingBox - projectInputViewerTranslate - rotationEulerDeg - rotationPivot GeometrySpec: type: object properties: movingPatches: type: array items: type: string constantPatches: type: array items: type: string objectivePatches: type: array items: type: string frontWheelPatch: type: array items: type: string nullable: true rearWheelPatch: type: array items: type: string nullable: true scale: type: boolean default: true translate: type: boolean default: true symmetry: enum: - none - x - y - z type: string description: |- * `none` - none * `x` - x * `y` - y * `z` - z x-spec-enum-id: da516b8716586636 default: none normalizeLength: type: number format: double nullable: true maxStlTriangles: type: integer nullable: true groundClearance: type: number format: double nullable: true groundClearanceM: type: number format: double nullable: true transform: allOf: - $ref: '#/components/schemas/GeometryTransformSpec' nullable: true required: - movingPatches GeometryTransformSpec: type: object description: Workbench scene rotation, expressed with the Three.js XYZ convention. properties: rotationEulerDeg: type: array items: type: number format: double maxItems: 3 minItems: 3 rotationOrder: enum: - XYZ type: string description: '* `XYZ` - XYZ' x-spec-enum-id: d4e52030c47c5f9f default: XYZ HpcCompute: type: object properties: nProcs: type: integer minimum: 1 nProcsMesh: type: integer nullable: true nodes: type: integer nullable: true coresPerNode: type: integer nullable: true walltimeMinutes: type: integer nullable: true poolKey: type: string nullable: true paths: type: object additionalProperties: {} required: - nProcs ImprovementRequest: type: object properties: id: type: integer readOnly: true tenantSchema: type: string readOnly: true tenantName: type: string readOnly: true teamId: type: integer readOnly: true teamName: type: string readOnly: true userId: type: integer readOnly: true userEmail: type: string format: email readOnly: true title: type: string readOnly: true category: enum: - improvement - requirement - other type: string description: |- * `improvement` - Improvement * `requirement` - Additional requirement * `other` - Other x-spec-enum-id: a54dc59c6316068e readOnly: true categoryLabel: type: string readOnly: true content: type: string readOnly: true pagePath: type: string readOnly: true status: enum: - new - reviewing - resolved - closed type: string description: |- * `new` - New * `reviewing` - Reviewing * `resolved` - Resolved * `closed` - Closed x-spec-enum-id: f58cf3c567404c66 readOnly: true adminNote: type: string readOnly: true reviewedByEmail: type: string format: email readOnly: true createdAt: type: string format: date-time readOnly: true updatedAt: type: string format: date-time readOnly: true required: - adminNote - category - categoryLabel - content - createdAt - id - pagePath - reviewedByEmail - status - teamId - teamName - tenantName - tenantSchema - title - updatedAt - userEmail - userId ImprovementRequestCreate: type: object properties: title: type: string maxLength: 200 category: enum: - improvement - requirement - other type: string description: |- * `improvement` - improvement * `requirement` - requirement * `other` - other x-spec-enum-id: ab7ebfec83fab8bd content: type: string maxLength: 8000 pagePath: type: string default: '' maxLength: 2000 required: - category - content - title Job: type: object description: |- Job 상세 시리얼라이저. 응답 형태: - artifacts: {role: artifact_payload} 딕셔너리 (리스트가 아님) - canceled_at: 미국식 철자 (모델 필드는 cancelled_at — 영국식) - executions / events: 중첩 리스트 비즈니스 로직: - perform_cancel(): Job 취소 + AWS Batch 종료 + 상태 이벤트 기록 properties: id: type: integer readOnly: true uid: type: string readOnly: true name: type: string description: Runtime job name submitted to the execution backend. maxLength: 128 displayName: type: string description: Human-friendly run label (e.g. 'Run 3'); user-editable. Distinct from the batch runtime name. maxLength: 128 project: allOf: - $ref: '#/components/schemas/SimpleProject' nullable: true readOnly: true executionBackend: enum: - SHARED_HPC - AWS_BATCH - LOCAL - SSH_REMOTE type: string description: |- * `SHARED_HPC` - Shared HPC * `AWS_BATCH` - AWS Batch * `LOCAL` - Local * `SSH_REMOTE` - Remote SSH x-spec-enum-id: 14feee6ab64a0c6e status: enum: - queued - running - cancelling - cancellation_failed - failed - aborted - cancelled - succeeded type: string x-spec-enum-id: 6b8a9060f1dec637 description: |- (1:1일 때 프로젝트) 1:N일 때 Job에 대한 상태값 / 상세페이지용 X * `queued` - Queued * `running` - Running * `cancelling` - Cancelling * `cancellation_failed` - Cancellation failed * `failed` - Failed * `aborted` - Aborted * `cancelled` - Cancelled * `succeeded` - Succeeded stage: enum: - ffd_setup - grid_setup - meshing - simulating - optimizing - postprocessing - '' - null type: string x-spec-enum-id: e13d93bda64d2665 nullable: true description: |- Latest canonical active_stage snapshot from monitoring_log.json * `ffd_setup` - FFD Setup * `grid_setup` - Grid Setup * `meshing` - Meshing * `simulating` - Simulating * `optimizing` - Optimizing * `postprocessing` - Postprocessing progress: type: number format: double description: Latest execution progress, normalized to 0.0 through 1.0. runConfig: allOf: - $ref: '#/components/schemas/JobRunConfigEnvelope' readOnly: true resultSummary: nullable: true description: Job execution results result: type: object nullable: true additionalProperties: true description: Compact result-viewer metadata for successful job detail views. readOnly: true errorSummary: type: string nullable: true readOnly: true errorDetail: type: object nullable: true additionalProperties: true description: Canonical error object; code-specific wording resolved at read time. readOnly: true payload: type: object nullable: true additionalProperties: true description: Job payload plus compact result-viewer metadata under result. readOnly: true operationMode: enum: - BASIC - PRO type: string description: |- * `BASIC` - Basic * `PRO` - Pro x-spec-enum-id: 8ac5c73d7e96b3a3 solverEngine: enum: - G1 - G2 - G4 - S2 type: string x-spec-enum-id: 4f8f60f427162f7a readOnly: true description: |- Immutable solver engine snapshot captured when the Job is created. * `G1` - G1 * `G2` - G2 * `G4` - G4 * `S2` - Sketch 2D workloadType: enum: - STANDARD - LES type: string x-spec-enum-id: fb11bf304307d132 readOnly: true description: |- Solver workload discriminator; LES uses solver_engine=G4 and workload_type=LES. * `STANDARD` - Standard solver workload * `LES` - LES fluid simulation restartFromJob: type: integer readOnly: true nullable: true description: 원본 Job. 단계 재시작(restart)으로 생성된 Job 이면 설정됨. restartFromJobUid: type: string nullable: true readOnly: true restartStage: type: string readOnly: true description: '재시작 진입 단계: scratch/mesh/cfd/opt. 일반 신규 제출이면 빈 값.' queuedAt: type: string format: date-time createdAt: type: string format: date-time readOnly: true finishedAt: type: string format: date-time nullable: true cancelledAt: type: string format: date-time readOnly: true nullable: true inputSnapshotPatches: type: array items: $ref: '#/components/schemas/Patch' readOnly: true summaryFiles: type: array items: type: object additionalProperties: {} readOnly: true summaryGifs: type: array items: type: object additionalProperties: {} readOnly: true figsZipUrl: type: string nullable: true description: G1/G2/G4 figs.zip presigned S3 URL (succeeded job only) readOnly: true g2FfdBoxes: type: array nullable: true items: type: object additionalProperties: true description: Result viewer bounding boxes from the job input manifest. readOnly: true executions: type: array items: $ref: '#/components/schemas/JobExecution' readOnly: true events: type: array items: $ref: '#/components/schemas/JobStatusEvent' readOnly: true isDeleted: type: boolean readOnly: true description: 소프트 삭제 여부. True이면 API에서 노출되지 않음 (어드민에서 복구 가능). deletedAt: type: string format: date-time readOnly: true nullable: true description: 소프트 삭제된 시각. purgeAfter: type: string format: date-time readOnly: true nullable: true description: 삭제 유예기간이 끝나 S3 및 관련 데이터를 영구 삭제할 수 있는 시각. canRestore: type: boolean readOnly: true deletion: readOnly: true downloadQuota: readOnly: true required: - canRestore - cancelledAt - createdAt - deletedAt - deletion - downloadQuota - errorDetail - errorSummary - events - executionBackend - executions - figsZipUrl - g2FfdBoxes - id - inputSnapshotPatches - isDeleted - operationMode - payload - project - purgeAfter - restartFromJob - restartFromJobUid - restartStage - result - runConfig - solverEngine - summaryFiles - summaryGifs - uid - workloadType JobDailyUsage: type: object properties: date: type: string format: date g1TotalSeconds: type: integer g2TotalSeconds: type: integer g4TotalSeconds: type: integer frontierTotalSeconds: type: integer required: - date - g1TotalSeconds - g2TotalSeconds JobExecution: type: object description: Job 상세 응답의 executions[] 블록을 구성하는 실행 상세 정보. properties: id: type: integer readOnly: true uid: type: string readOnly: true backendType: enum: - SHARED_HPC - AWS_BATCH - LOCAL - K8S - SKETCH_GPU - SSH_REMOTE type: string description: |- * `SHARED_HPC` - Shared HPC * `AWS_BATCH` - AWS Batch * `LOCAL` - Local * `K8S` - Kubernetes * `SKETCH_GPU` - Sketch GPU * `SSH_REMOTE` - Remote SSH x-spec-enum-id: 2af077c591bf1be8 attemptNo: type: integer maximum: 2147483647 minimum: -2147483648 batchJobId: type: string nullable: true maxLength: 255 batchQueueName: type: string nullable: true maxLength: 255 batchJobDefinition: type: string nullable: true maxLength: 255 computeRegion: type: string nullable: true maxLength: 64 status: enum: - submitted - pending - runnable - running - cancelling - cancellation_failed - succeeded - failed - cancelled - timeout type: string description: |- * `submitted` - Submitted * `pending` - Pending * `runnable` - Runnable * `running` - Running * `cancelling` - Cancelling * `cancellation_failed` - Cancellation failed * `succeeded` - Succeeded * `failed` - Failed * `cancelled` - Cancelled * `timeout` - Timeout x-spec-enum-id: 0ef3d8c1f80fe2d3 statusReason: type: string nullable: true progress: type: number format: double submittedAt: type: string format: date-time startedAt: type: string format: date-time nullable: true finishedAt: type: string format: date-time nullable: true duration: type: string readOnly: true required: - backendType - duration - id - status - uid JobList: type: object description: Job 목록용 경량 시리얼라이저. properties: id: type: integer readOnly: true uid: type: string readOnly: true name: type: string description: Runtime job name submitted to the execution backend. maxLength: 128 displayName: type: string description: Human-friendly run label (e.g. 'Run 3'); user-editable. Distinct from the batch runtime name. maxLength: 128 projectId: type: integer nullable: true description: Associated project readOnly: true executionBackend: enum: - SHARED_HPC - AWS_BATCH - LOCAL - SSH_REMOTE type: string description: |- * `SHARED_HPC` - Shared HPC * `AWS_BATCH` - AWS Batch * `LOCAL` - Local * `SSH_REMOTE` - Remote SSH x-spec-enum-id: 14feee6ab64a0c6e status: enum: - queued - running - cancelling - cancellation_failed - failed - aborted - cancelled - succeeded type: string x-spec-enum-id: 6b8a9060f1dec637 description: |- (1:1일 때 프로젝트) 1:N일 때 Job에 대한 상태값 / 상세페이지용 X * `queued` - Queued * `running` - Running * `cancelling` - Cancelling * `cancellation_failed` - Cancellation failed * `failed` - Failed * `aborted` - Aborted * `cancelled` - Cancelled * `succeeded` - Succeeded progress: type: number format: double description: Latest execution progress, normalized to 0.0 through 1.0. operationMode: enum: - BASIC - PRO type: string description: |- * `BASIC` - Basic * `PRO` - Pro x-spec-enum-id: 8ac5c73d7e96b3a3 solverEngine: enum: - G1 - G2 - G4 - S2 - '' type: string x-spec-enum-id: 4f8f60f427162f7a description: |- Immutable solver engine snapshot captured when the Job is created. * `G1` - G1 * `G2` - G2 * `G4` - G4 * `S2` - Sketch 2D workloadType: enum: - STANDARD - LES type: string x-spec-enum-id: fb11bf304307d132 description: |- Solver workload discriminator; LES uses solver_engine=G4 and workload_type=LES. * `STANDARD` - Standard solver workload * `LES` - LES fluid simulation queuedAt: type: string format: date-time finishedAt: type: string format: date-time nullable: true cancelledAt: type: string format: date-time nullable: true createdAt: type: string format: date-time readOnly: true updatedAt: type: string format: date-time readOnly: true resultSummary: nullable: true description: Job execution results errorSummary: type: string nullable: true readOnly: true thumbnailUrl: type: string format: uri nullable: true readOnly: true duration: type: string readOnly: true executionsCount: type: string readOnly: true restartFromJobUid: type: string nullable: true readOnly: true restartStage: type: string description: '재시작 진입 단계: scratch/mesh/cfd/opt. 일반 신규 제출이면 빈 값.' maxLength: 16 isDeleted: type: boolean readOnly: true description: 소프트 삭제 여부. True이면 API에서 노출되지 않음 (어드민에서 복구 가능). deletedAt: type: string format: date-time readOnly: true nullable: true description: 소프트 삭제된 시각. purgeAfter: type: string format: date-time readOnly: true nullable: true description: 삭제 유예기간이 끝나 S3 및 관련 데이터를 영구 삭제할 수 있는 시각. canRestore: type: boolean readOnly: true deletion: readOnly: true downloadQuota: readOnly: true required: - canRestore - createdAt - deletedAt - deletion - downloadQuota - duration - errorSummary - executionBackend - executionsCount - id - isDeleted - operationMode - projectId - purgeAfter - restartFromJobUid - thumbnailUrl - uid - updatedAt JobMonitorConsoleLog: type: object description: Monitor API console log 엔트리. properties: seq: type: integer timestamp: type: string tag: type: string trigger: type: string message: type: string required: - message - seq - tag - timestamp JobMonitorIter: type: object description: Monitor API iteration 정보. properties: current: type: integer nullable: true total: type: integer nullable: true required: - current - total JobMonitorMetrics: type: object description: Monitor API metrics 정보. properties: iter: allOf: - $ref: '#/components/schemas/JobMonitorIter' nullable: true residual: allOf: - $ref: '#/components/schemas/JobMonitorValueLabel' nullable: true runtime: allOf: - $ref: '#/components/schemas/JobMonitorRuntime' nullable: true cd: allOf: - $ref: '#/components/schemas/JobMonitorValueLabel' nullable: true cl: allOf: - $ref: '#/components/schemas/JobMonitorValueLabel' nullable: true required: - cd - cl - iter - residual - runtime JobMonitorResponse: type: object description: Job Monitor API 전체 응답 스키마. properties: jobId: type: integer project: allOf: - $ref: '#/components/schemas/SimpleProject' nullable: true status: type: string stage: type: string nullable: true progress: type: number format: double metrics: $ref: '#/components/schemas/JobMonitorMetrics' consoleLogs: type: array items: $ref: '#/components/schemas/JobMonitorConsoleLog' updatedAt: type: string required: - consoleLogs - jobId - metrics - progress - project - stage - status - updatedAt JobMonitorRuntime: type: object description: Monitor API runtime 정보. properties: seconds: type: integer label: type: string required: - label - seconds JobMonitorValueLabel: type: object description: Monitor API value-label 페어. properties: value: type: number format: double label: type: string required: - label - value JobParameterItem: type: object properties: key: type: string label: type: string group: type: string value: nullable: true displayValue: type: string required: - displayValue - key - label - value JobParametersResponse: type: object properties: jobId: type: integer engine: type: string operationMode: type: string restartFromJobUid: type: string nullable: true restartMode: type: string nullable: true parameters: type: array items: $ref: '#/components/schemas/JobParameterItem' required: - engine - jobId - operationMode - parameters - restartFromJobUid - restartMode JobRename: type: object description: Run(Job) 이름 변경 요청 바디. properties: name: type: string maxLength: 128 required: - name JobRunConfigEnvelope: type: object properties: unifiedConfig: allOf: - $ref: '#/components/schemas/CanonicalJobSpec' readOnly: true nullable: true nativeConfig: type: object additionalProperties: {} readOnly: true required: - nativeConfig - unifiedConfig JobStatusEvent: type: object description: Job 상세 응답의 events[] 블록을 구성하는 상태 이벤트. properties: id: type: integer readOnly: true source: enum: - API - ADMIN - WORKER - SCHEDULER - EXTERNAL - USER type: string description: |- * `API` - API * `ADMIN` - Admin * `WORKER` - Worker * `SCHEDULER` - Scheduler * `EXTERNAL` - External System * `USER` - User x-spec-enum-id: 15fa1de5d5d7f5f1 status: type: string maxLength: 32 progressPercent: type: integer maximum: 2147483647 minimum: -2147483648 message: type: string nullable: true metadata: nullable: true recordedAt: type: string format: date-time required: - id - source - status JobUsageSummary: type: object description: |- Job 실시간 소모 크레딧 응답 스키마. consumedCredits 는 정수로 확정 차감된 누적분. 1 미만 잔여는 아직 차감 전이라 포함되지 않는다. properties: consumedCredits: type: integer required: - consumedCredits LesAutoconfig: type: object properties: uid: type: string readOnly: true stlFilename: type: string readOnly: true intent: type: string readOnly: true status: enum: - pending - ready - failed type: string description: |- * `pending` - Pending * `ready` - Ready * `failed` - Failed x-spec-enum-id: 95a96ed85bfac560 readOnly: true progress: readOnly: true geometry: readOnly: true config: readOnly: true error: type: string readOnly: true createdAt: type: string format: date-time readOnly: true required: - config - createdAt - error - geometry - intent - progress - status - stlFilename - uid LesAutoconfigUploadComplete: type: object properties: uploadId: type: string maxLength: 512 completedParts: type: array items: $ref: '#/components/schemas/_CompletedPart' reservationId: type: string format: uuid required: - completedParts - reservationId - uploadId LesInputUpload: type: object properties: uid: type: string readOnly: true stlFilename: type: string readOnly: true sizeBytes: type: integer readOnly: true status: enum: - pending - ready - failed type: string description: |- * `pending` - Pending * `ready` - Ready * `failed` - Failed x-spec-enum-id: 95a96ed85bfac560 readOnly: true createdAt: type: string format: date-time readOnly: true required: - createdAt - sizeBytes - status - stlFilename - uid LesInputUploadComplete: type: object properties: uploadId: type: string maxLength: 512 completedParts: type: array items: $ref: '#/components/schemas/_CompletedPart' reservationId: type: string format: uuid required: - completedParts - reservationId - uploadId LoginRequest: type: object properties: email: type: string format: email password: type: string writeOnly: true required: - email - password LoginResponse: type: object properties: detail: type: string teamId: type: integer nullable: true teamName: type: string nullable: true userType: type: string mustChangePassword: type: boolean required: - detail MeResponse: type: object properties: id: type: integer email: type: string format: email displayName: type: string userType: type: string isPlatformAdmin: type: boolean role: type: string nullable: true isSuperAdmin: type: boolean canViewPlatform: type: boolean canManagePlatform: type: boolean mustChangePassword: type: boolean defaultTeamId: type: integer nullable: true socialKind: type: string nullable: true tenantFeatureAccess: $ref: '#/components/schemas/TenantFeatureAccess' billingMode: enum: - TEAM - TENANT type: string description: |- * `TEAM` - TEAM * `TENANT` - TENANT x-spec-enum-id: b4a3018a77249123 teams: type: array items: $ref: '#/components/schemas/AccountTeam' required: - billingMode - canManagePlatform - canViewPlatform - defaultTeamId - displayName - email - id - isPlatformAdmin - isSuperAdmin - mustChangePassword - teams - tenantFeatureAccess - userType MergedSourcePatch: type: object properties: id: type: integer readOnly: true label: type: string readOnly: true boundingBox: readOnly: true nullable: true inputPreviewPoints: readOnly: true nullable: true required: - boundingBox - id - inputPreviewPoints - label MeshPredictResponse: type: object properties: solverType: enum: - G1 - G2 type: string description: |- * `G1` - G1 * `G2` - G2 x-spec-enum-id: 7419f4880cbd06f5 totalArea: type: number format: double totalFacets: type: integer meshCells: type: integer nullable: true predictedCells: type: integer nullable: true cellLimit: type: integer nullable: true required: - meshCells - solverType - totalArea - totalFacets NextBilling: type: object description: 다음 사이클에 청구될 플랜 + 금액. `price` 는 플랜 리스트의 가격 객체와 동일 구조. properties: plan: $ref: '#/components/schemas/NextBillingPlan' price: $ref: '#/components/schemas/PriceEntry' required: - plan - price NextBillingPlan: type: object description: 다음 결제될 플랜 식별 정보. properties: id: type: integer code: type: string name: type: string required: - code - id - name ObjectiveSpec: type: object properties: primary: enum: - drag - lift - liftBalance - efficiency - downforce - multi type: string description: |- * `drag` - drag * `lift` - lift * `liftBalance` - liftBalance * `efficiency` - efficiency * `downforce` - downforce * `multi` - multi x-spec-enum-id: 1a92fab45dc97f84 default: drag monitoringQuantities: type: array items: type: string liftWeight: type: number format: double nullable: true autoClConstraint: type: boolean default: true clTolerance: type: number format: double nullable: true clPenalty: type: number format: double nullable: true OneTimePrepareRequest: type: object properties: teamId: type: integer provider: enum: - payletter - paypal - galaxia type: string description: |- * `payletter` - PayLetter * `paypal` - PayPal * `galaxia` - Galaxia x-spec-enum-id: 57f6d0e06595d82e default: paypal amount: type: integer minimum: 1 currency: type: string default: USD maxLength: 8 orderName: type: string maxLength: 200 channelKey: type: string maxLength: 128 billingCountry: type: string maxLength: 2 required: - amount - orderName - teamId OneTimePrepareResponse: type: object description: |- 단건결제 준비 응답. PaymentSerializer 의 모든 필드 + bypass. bypass: PG 별로 프론트 SDK 호출에 필요한 추가 페이로드 (예: Galaxia ITEM_CODE). Galaxia/PayLetter/PayPal 각각 백엔드가 채워 보내므로 프론트는 그대로 `PortOne.requestPayment({..., bypass})` 의 `bypass` 인자에 전달. properties: paymentId: type: string maxLength: 64 teamId: type: integer readOnly: true teamName: type: string readOnly: true requestedByUserId: type: integer readOnly: true nullable: true type: enum: - ONE_TIME - BILLING type: string description: |- * `ONE_TIME` - 단건결제 * `BILLING` - 빌링키결제 x-spec-enum-id: 1bec82349f1a053f provider: enum: - payletter - paypal - galaxia type: string description: |- * `payletter` - PayLetter * `paypal` - PayPal * `galaxia` - Galaxia x-spec-enum-id: 57f6d0e06595d82e status: enum: - READY - PAID - VIRTUAL_ACCOUNT_ISSUED - PAY_PENDING - PARTIAL_CANCELLED - CANCELLED - FAILED type: string description: |- * `READY` - 결제 대기 (paymentId 채번 직후) * `PAID` - 결제 완료 * `VIRTUAL_ACCOUNT_ISSUED` - 가상계좌 발급 완료 * `PAY_PENDING` - 결제 승인 대기 * `PARTIAL_CANCELLED` - 부분 취소 * `CANCELLED` - 전체 취소 * `FAILED` - 결제 실패 x-spec-enum-id: f6b6565c3eca53e9 billingKey: type: string readOnly: true nullable: true channelKey: type: string maxLength: 128 orderName: type: string maxLength: 200 amountMinor: type: integer readOnly: true currency: type: string maxLength: 8 paidAmountMinor: type: integer readOnly: true cancelledAmountMinor: type: integer readOnly: true refundAvailableAmountMinor: type: integer readOnly: true display: type: object additionalProperties: {} readOnly: true pgProvider: type: string maxLength: 64 pgTxId: type: string maxLength: 128 methodType: type: string maxLength: 32 failureCode: type: string maxLength: 64 failureMessage: type: string requestedAt: type: string format: date-time readOnly: true paidAt: type: string format: date-time nullable: true failedAt: type: string format: date-time nullable: true cancelledAt: type: string format: date-time nullable: true cancellations: type: array items: $ref: '#/components/schemas/PaymentCancellation' readOnly: true bypass: type: object additionalProperties: {} readOnly: true description: 'PG 별 SDK 호출 추가 페이로드. Galaxia 는 {''galaxia'': {''ITEM_CODE'': ''...''}}.' required: - amountMinor - billingKey - bypass - cancellations - cancelledAmountMinor - display - orderName - paidAmountMinor - paymentId - refundAvailableAmountMinor - requestedAt - requestedByUserId - teamId - teamName - type OptimizationSpec: type: object properties: enabled: type: boolean default: true cycles: type: integer minimum: 1 default: 5 deformLimit: type: number format: double nullable: true method: enum: - adjoint - slsqp - sqp - steepest - adam - sgd - '' type: string description: |- * `adjoint` - adjoint * `slsqp` - slsqp * `sqp` - sqp * `steepest` - steepest * `adam` - adam * `sgd` - sgd x-spec-enum-id: e92402542252bd8e default: '' gradientMethod: enum: - adjoint - fd type: string description: |- * `adjoint` - adjoint * `fd` - fd x-spec-enum-id: 46d5636d932d27b2 default: adjoint learningRate: type: number format: double nullable: true step: type: number format: double nullable: true nWarmup: type: integer nullable: true nAdjoint: type: integer nullable: true nPrimal: type: integer nullable: true convergence: type: object additionalProperties: {} PaginatedArtifactListList: type: object required: - count - results properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?offset=400&limit=100 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?offset=200&limit=100 results: type: array items: $ref: '#/components/schemas/ArtifactList' PaginatedFileUploadTrackerList: type: object required: - count - results properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?offset=400&limit=100 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?offset=200&limit=100 results: type: array items: $ref: '#/components/schemas/FileUploadTracker' PaginatedJobListList: type: object properties: count: type: integer cursor: type: string nullable: true results: type: array items: $ref: '#/components/schemas/JobList' PaginatedProjectListList: type: object properties: count: type: integer cursor: type: string nullable: true results: type: array items: $ref: '#/components/schemas/ProjectList' ParameterizationSpec: type: object properties: mode: enum: - morph - ffd - rbf - sdf type: string description: |- * `morph` - morph * `ffd` - ffd * `rbf` - rbf * `sdf` - sdf x-spec-enum-id: ae3ce64c24db245b engine: enum: - G1 - G2 - G4 type: string description: |- * `G1` - G1 * `G2` - G2 * `G4` - G4 x-spec-enum-id: d5df67bc8a34864a params: type: object additionalProperties: {} required: - engine - mode Patch: type: object properties: id: type: integer readOnly: true uid: type: string readOnly: true patchType: enum: - source - ref type: string description: |- * `source` - Source * `ref` - Ref x-spec-enum-id: 946c46f06a235611 readOnly: true label: type: string maxLength: 255 category: enum: - optimization - constant - wing - wheel_front - wheel_rear - optimization_target - constant_target - front_wheel - rear_wheel type: string description: |- * `optimization` - Optimization * `constant` - Constant * `wing` - Wing * `wheel_front` - Wheel Front * `wheel_rear` - Wheel Rear * `optimization_target` - Optimization Target * `constant_target` - Constant Target * `front_wheel` - Front Wheel * `rear_wheel` - Rear Wheel x-spec-enum-id: 5dd1d70043ac53a5 artifactId: type: integer nullable: true description: Associated artifact for source patch readOnly: true triangleCount: type: integer maximum: 2147483647 minimum: -2147483648 nullable: true description: source patch original STL triangle count surfaceArea: type: number format: double nullable: true description: source/ref patch surface area selectedProxyTriangleCount: type: integer maximum: 2147483647 minimum: -2147483648 nullable: true description: ref patch only boundingBox: nullable: true description: source/ref 공용 bbox payload {min:[x,y,z], max:[x,y,z], ffd_degree?:[i,j,k]} ffdDegree: type: array items: type: integer writeOnly: true nullable: true proxyMaskSizeBytes: type: integer minimum: 1 writeOnly: true normalDisplacementInward: type: number format: double nullable: true title: (constraint) normal displacement inward normalDisplacementOutward: type: number format: double nullable: true title: (constraint) normal displacement outward planeLimitXMin: type: number format: double nullable: true title: (constraint) plane limit x min planeLimitXMax: type: number format: double nullable: true title: (constraint) plane limit x max planeLimitYMin: type: number format: double nullable: true title: (constraint) plane limit y min planeLimitYMax: type: number format: double nullable: true title: (constraint) plane limit y max planeLimitZMin: type: number format: double nullable: true title: (constraint) plane limit z min planeLimitZMax: type: number format: double nullable: true title: (constraint) plane limit z max inputPreviewPointsKey: type: string description: source patch point preview only maxLength: 1024 inputPreviewPoints: nullable: true description: source patch point preview metadata inputPreviewVoxelsKey: type: string description: source patch voxel preview only maxLength: 1024 inputPreviewVoxels: nullable: true description: source patch voxel preview metadata proxyCacheKey: type: string description: source patch only maxLength: 255 proxyMeshKey: type: string description: source patch only maxLength: 1024 proxyLayoutKey: type: string description: source patch only maxLength: 1024 atlasKey: type: string description: source patch only maxLength: 1024 proxyWorkerRevision: type: string description: source patch only maxLength: 64 proxyArtifactSignature: type: string description: source patch only maxLength: 128 proxyTriangleCount: type: integer maximum: 2147483647 minimum: -2147483648 nullable: true description: source patch only hasRefs: type: boolean readOnly: true isMergeOutput: type: boolean readOnly: true isMergePending: type: boolean readOnly: true mergedSourcePatches: type: array items: $ref: '#/components/schemas/MergedSourcePatch' readOnly: true isInitialSourceUpload: type: boolean readOnly: true description: source patch only - uploaded while project was draft sourcePatchId: type: integer readOnly: true nullable: true mergedIntoPatchId: type: integer readOnly: true nullable: true proxyMeshMaskKey: type: string description: ref patch only maxLength: 1024 sourceProxyArtifactSignature: type: string description: ref patch only — 부모 source patch proxy signature 스냅샷 maxLength: 128 proxyMaskSignature: type: string description: ref patch only maxLength: 128 createdAt: type: string format: date-time readOnly: true updatedAt: type: string format: date-time readOnly: true required: - artifactId - createdAt - hasRefs - id - isInitialSourceUpload - isMergeOutput - isMergePending - mergedIntoPatchId - mergedSourcePatches - patchType - sourcePatchId - uid - updatedAt PatchCreate: type: object properties: category: type: string default: optimization maxLength: 50 sourcePatchId: type: integer nullable: true sourceArtifactId: type: integer nullable: true selectedProxyTriangleCount: type: integer minimum: 0 surfaceArea: type: number format: double minimum: 1.0e-06 nullable: true boundingBox: nullable: true ffdDegree: type: array items: type: integer nullable: true proxyMeshMaskKey: type: string sourceProxyArtifactSignature: type: string proxyMaskSignature: type: string required: - selectedProxyTriangleCount PatchMerge: type: object properties: patchIds: type: array items: type: integer minimum: 1 minItems: 2 required: - patchIds PatchMergeResponse: type: object properties: status: type: string patchId: type: integer batchJobId: type: string mergeJobId: type: integer patch: allOf: - $ref: '#/components/schemas/Patch' readOnly: true required: - batchJobId - mergeJobId - patch - patchId - status PatchProxyArtifact: type: object properties: kind: enum: - proxy_mesh - proxy_layout - atlas type: string description: |- * `proxy_mesh` - proxy_mesh * `proxy_layout` - proxy_layout * `atlas` - atlas x-spec-enum-id: 52920026f3197740 key: type: string proxyMeshKey: type: string proxyLayoutKey: type: string atlasKey: type: string proxyCacheKey: type: string proxyWorkerRevision: type: string proxyArtifactSignature: type: string proxyTriangleCount: type: integer nullable: true triangleCount: type: integer nullable: true originalMeshTriangleCount: type: integer nullable: true originalTriangleCount: type: integer nullable: true surfaceArea: type: number format: double minimum: 1.0e-06 nullable: true boundingBox: nullable: true proxyMeshMaskKey: type: string selectedProxyTriangleCount: type: integer nullable: true sourceProxyArtifactSignature: type: string proxyMaskSignature: type: string reservationId: type: string format: uuid PatchProxyArtifactPresign: type: object properties: kind: enum: - proxy_mesh - proxy_layout - atlas type: string description: |- * `proxy_mesh` - proxy_mesh * `proxy_layout` - proxy_layout * `atlas` - atlas x-spec-enum-id: 52920026f3197740 sizeBytes: type: integer minimum: 1 contentType: type: string default: application/octet-stream proxyWorkerRevision: type: string proxyArtifactSignature: type: string proxyCacheKey: type: string required: - kind - sizeBytes PatchProxyMaskFinalize: type: object properties: reservationId: type: string format: uuid required: - reservationId PatchUnmergeResponse: type: object properties: status: type: string patchId: type: integer restoredPatchIds: type: array items: type: integer restoredPatches: type: array items: $ref: '#/components/schemas/Patch' readOnly: true required: - patchId - restoredPatchIds - restoredPatches - status PatchedArtifact: type: object properties: id: type: integer readOnly: true uid: type: string readOnly: true artifactRole: enum: - PROJECT_THUMBNAIL_IMAGE - PROJECT_SOURCE_STL - OPTIMIZED_STL - G2_SUMMARY_IMAGE - G2_SHAPE_REPORT_IMAGE - G2_FIGS_ZIP - G1_INPUT_STL - G1_SUMMARY_GIF - G1_FIGS_ZIP - G1_NORMAL_DISPLACEMENT_VTP - RESULT_MESH - RESULT_HISTORY - RESULT_SUMMARY_JSON - RESULT_FLOW_VOLUME - RESULT_GEOMETRY_SCALE - RESULT_PREVIEW_POINTS - RESULT_PROXY_MESH - RESULT_PROXY_LAYOUT - RESULT_PROXY_ATLAS - STREAMLINES_BIN - FLOWFIELD_BIN - G4_SUMMARY_IMAGE - G4_FIGS_ZIP - STEP_EXPORT_ASSEMBLY - STEP_EXPORT_PART_STEP - STEP_EXPORT_PART_STL - ASSET_FLOW_VISUALIZATION_IMAGE - ASSET_RENDERED_IMAGE - S2_FINAL_FIELD_IMAGE - S2_REPLAY_FRAMES - RACING_BASELINE_GLB - RACING_OPTIMIZED_GLB - USER_PROFILE_IMAGE type: string description: |- * `PROJECT_THUMBNAIL_IMAGE` - Project Thumbnail Image * `PROJECT_SOURCE_STL` - Project Source STL * `OPTIMIZED_STL` - Optimized STL * `G2_SUMMARY_IMAGE` - G2 Summary Image * `G2_SHAPE_REPORT_IMAGE` - G2 Shape Report Image * `G2_FIGS_ZIP` - G2 Figs ZIP * `G1_INPUT_STL` - G1 Input STL * `G1_SUMMARY_GIF` - G1 Summary GIF * `G1_FIGS_ZIP` - G1 Figs ZIP * `G1_NORMAL_DISPLACEMENT_VTP` - G1 Normal Displacement VTP * `RESULT_MESH` - Result Mesh * `RESULT_HISTORY` - Result History * `RESULT_SUMMARY_JSON` - Result Summary JSON * `RESULT_FLOW_VOLUME` - Result Flow Volume * `RESULT_GEOMETRY_SCALE` - Result Geometry Scale * `RESULT_PREVIEW_POINTS` - Result Preview Points * `RESULT_PROXY_MESH` - Result Proxy Mesh * `RESULT_PROXY_LAYOUT` - Result Proxy Layout * `RESULT_PROXY_ATLAS` - Result Proxy Atlas * `STREAMLINES_BIN` - Streamlines Binary * `FLOWFIELD_BIN` - Flow Field Binary * `G4_SUMMARY_IMAGE` - G4 Summary Image * `G4_FIGS_ZIP` - G4 Figs ZIP * `STEP_EXPORT_ASSEMBLY` - STEP Export Assembly * `STEP_EXPORT_PART_STEP` - STEP Export Part STEP * `STEP_EXPORT_PART_STL` - STEP Export Part STL * `ASSET_FLOW_VISUALIZATION_IMAGE` - Asset Flow Visualization Image * `ASSET_RENDERED_IMAGE` - Asset Rendered Image * `S2_FINAL_FIELD_IMAGE` - Sketch 2D Final Field Image * `S2_REPLAY_FRAMES` - Sketch 2D Replay Frames * `RACING_BASELINE_GLB` - Racing Baseline GLB * `RACING_OPTIMIZED_GLB` - Racing Optimized GLB * `USER_PROFILE_IMAGE` - User Profile Image x-spec-enum-id: ef52df4c3b39155d storageProvider: enum: - S3 - GCS - AZURE type: string description: |- * `S3` - Amazon S3 * `GCS` - Google Cloud Storage * `AZURE` - Azure Blob Storage x-spec-enum-id: 3e1757d60d74052a s3Bucket: type: string maxLength: 255 s3Key: type: string maxLength: 1024 s3Url: type: string readOnly: true fileName: type: string readOnly: true contentType: type: string nullable: true maxLength: 255 sizeBytes: type: integer maximum: 9223372036854775807 minimum: -9223372036854775808 format: int64 nullable: true checksumSha256: type: string nullable: true maxLength: 128 createdAt: type: string format: date-time readOnly: true PatchedFileUploadTracker: type: object properties: id: type: integer readOnly: true userId: type: integer readOnly: true uploadId: type: string maxLength: 255 fileName: type: string maxLength: 255 contentType: type: string nullable: true maxLength: 255 fileSize: type: integer maximum: 9223372036854775807 minimum: -9223372036854775808 format: int64 nullable: true status: enum: - pending - uploading - completed - failed - cancelled type: string description: |- * `pending` - Pending * `uploading` - Uploading * `completed` - Completed * `failed` - Failed * `cancelled` - Cancelled x-spec-enum-id: 09b6c2bacd3dd5f3 progressPercent: type: integer maximum: 2147483647 minimum: -2147483648 bytesUploaded: type: integer maximum: 9223372036854775807 minimum: -9223372036854775808 format: int64 s3Bucket: type: string maxLength: 255 s3Key: type: string maxLength: 1024 artifact: allOf: - $ref: '#/components/schemas/Artifact' readOnly: true errorMessage: type: string nullable: true completedAt: type: string format: date-time readOnly: true nullable: true createdAt: type: string format: date-time readOnly: true updatedAt: type: string format: date-time readOnly: true Payment: type: object properties: paymentId: type: string maxLength: 64 teamId: type: integer readOnly: true teamName: type: string readOnly: true requestedByUserId: type: integer readOnly: true nullable: true type: enum: - ONE_TIME - BILLING type: string description: |- * `ONE_TIME` - 단건결제 * `BILLING` - 빌링키결제 x-spec-enum-id: 1bec82349f1a053f provider: enum: - payletter - paypal - galaxia type: string description: |- * `payletter` - PayLetter * `paypal` - PayPal * `galaxia` - Galaxia x-spec-enum-id: 57f6d0e06595d82e status: enum: - READY - PAID - VIRTUAL_ACCOUNT_ISSUED - PAY_PENDING - PARTIAL_CANCELLED - CANCELLED - FAILED type: string description: |- * `READY` - 결제 대기 (paymentId 채번 직후) * `PAID` - 결제 완료 * `VIRTUAL_ACCOUNT_ISSUED` - 가상계좌 발급 완료 * `PAY_PENDING` - 결제 승인 대기 * `PARTIAL_CANCELLED` - 부분 취소 * `CANCELLED` - 전체 취소 * `FAILED` - 결제 실패 x-spec-enum-id: f6b6565c3eca53e9 billingKey: type: string readOnly: true nullable: true channelKey: type: string maxLength: 128 orderName: type: string maxLength: 200 amountMinor: type: integer readOnly: true currency: type: string maxLength: 8 paidAmountMinor: type: integer readOnly: true cancelledAmountMinor: type: integer readOnly: true refundAvailableAmountMinor: type: integer readOnly: true display: type: object additionalProperties: {} readOnly: true pgProvider: type: string maxLength: 64 pgTxId: type: string maxLength: 128 methodType: type: string maxLength: 32 failureCode: type: string maxLength: 64 failureMessage: type: string requestedAt: type: string format: date-time readOnly: true paidAt: type: string format: date-time nullable: true failedAt: type: string format: date-time nullable: true cancelledAt: type: string format: date-time nullable: true cancellations: type: array items: $ref: '#/components/schemas/PaymentCancellation' readOnly: true required: - amountMinor - billingKey - cancellations - cancelledAmountMinor - display - orderName - paidAmountMinor - paymentId - refundAvailableAmountMinor - requestedAt - requestedByUserId - teamId - teamName - type PaymentCancellation: type: object properties: cancellationId: type: string maxLength: 64 amount: type: integer maximum: 2147483647 minimum: 0 reason: type: string maxLength: 200 requestedByUserId: type: integer readOnly: true nullable: true cancelledAt: type: string format: date-time nullable: true required: - amount - cancellationId - requestedByUserId Plan: type: object properties: id: type: integer readOnly: true code: enum: - beginner - engineer - turbo - professional - oem - promotion type: string description: |- * `beginner` - Beginner * `engineer` - Engineer * `turbo` - Turbo * `professional` - Professional * `oem` - OEM * `promotion` - Promotion x-spec-enum-id: 790e8ec979be1b98 name: type: string maxLength: 64 description: type: string itemCode: type: string maxLength: 10 price: allOf: - $ref: '#/components/schemas/PriceEntry' nullable: true readOnly: true monthlyCredits: type: integer maximum: 2147483647 minimum: 0 storageQuotaBytes: type: integer maximum: 9223372036854775807 minimum: 0 format: int64 nullable: true description: Storage entitlement in bytes. Null means the catalogue has no numeric quota. storageAddonMaxBytes: type: integer maximum: 9223372036854775807 minimum: 0 format: int64 description: Maximum cumulative self-service storage add-on entitlement in bytes. storageAddonPrices: type: array items: $ref: '#/components/schemas/StorageAddonPrice' readOnly: true allowedSolvers: type: array items: type: string readOnly: true isActive: type: boolean isCustomPricing: type: boolean isPromotional: type: boolean sortOrder: type: integer maximum: 2147483647 minimum: 0 createdAt: type: string format: date-time readOnly: true updatedAt: type: string format: date-time readOnly: true required: - allowedSolvers - code - createdAt - id - name - price - storageAddonPrices - updatedAt PlanChangeRequest: type: object properties: teamId: type: integer planCode: type: string maxLength: 32 currency: type: string maxLength: 8 required: - planCode - teamId PlanGateResponse: type: object description: '`/subscriptions/plan-gate/` 응답 — 실행 진입용 구독 판정.' properties: teamId: type: integer readOnly: true hasCurrentPlan: type: boolean readOnly: true required: - hasCurrentPlan - teamId PlaneConstraint: type: object properties: axis: enum: - x - y - z type: string description: |- * `x` - x * `y` - y * `z` - z x-spec-enum-id: 27a7e2bcc96b78e8 min: type: number format: double nullable: true max: type: number format: double nullable: true minOffset: type: number format: double nullable: true maxOffset: type: number format: double nullable: true required: - axis Presigned: type: object properties: fieldChoice: enum: - PROJECT_THUMBNAIL_IMAGE - PROJECT_SOURCE_STL - OPTIMIZED_STL - G2_SUMMARY_IMAGE - G2_SHAPE_REPORT_IMAGE - G2_FIGS_ZIP - G1_INPUT_STL - G1_SUMMARY_GIF - G1_FIGS_ZIP - G1_NORMAL_DISPLACEMENT_VTP - RESULT_MESH - RESULT_HISTORY - RESULT_SUMMARY_JSON - RESULT_FLOW_VOLUME - RESULT_GEOMETRY_SCALE - RESULT_PREVIEW_POINTS - RESULT_PROXY_MESH - RESULT_PROXY_LAYOUT - RESULT_PROXY_ATLAS - STREAMLINES_BIN - FLOWFIELD_BIN - G4_SUMMARY_IMAGE - G4_FIGS_ZIP - STEP_EXPORT_ASSEMBLY - STEP_EXPORT_PART_STEP - STEP_EXPORT_PART_STL - ASSET_FLOW_VISUALIZATION_IMAGE - ASSET_RENDERED_IMAGE - S2_FINAL_FIELD_IMAGE - S2_REPLAY_FRAMES - RACING_BASELINE_GLB - RACING_OPTIMIZED_GLB - USER_PROFILE_IMAGE type: string description: |- * `PROJECT_THUMBNAIL_IMAGE` - Project Thumbnail Image * `PROJECT_SOURCE_STL` - Project Source STL * `OPTIMIZED_STL` - Optimized STL * `G2_SUMMARY_IMAGE` - G2 Summary Image * `G2_SHAPE_REPORT_IMAGE` - G2 Shape Report Image * `G2_FIGS_ZIP` - G2 Figs ZIP * `G1_INPUT_STL` - G1 Input STL * `G1_SUMMARY_GIF` - G1 Summary GIF * `G1_FIGS_ZIP` - G1 Figs ZIP * `G1_NORMAL_DISPLACEMENT_VTP` - G1 Normal Displacement VTP * `RESULT_MESH` - Result Mesh * `RESULT_HISTORY` - Result History * `RESULT_SUMMARY_JSON` - Result Summary JSON * `RESULT_FLOW_VOLUME` - Result Flow Volume * `RESULT_GEOMETRY_SCALE` - Result Geometry Scale * `RESULT_PREVIEW_POINTS` - Result Preview Points * `RESULT_PROXY_MESH` - Result Proxy Mesh * `RESULT_PROXY_LAYOUT` - Result Proxy Layout * `RESULT_PROXY_ATLAS` - Result Proxy Atlas * `STREAMLINES_BIN` - Streamlines Binary * `FLOWFIELD_BIN` - Flow Field Binary * `G4_SUMMARY_IMAGE` - G4 Summary Image * `G4_FIGS_ZIP` - G4 Figs ZIP * `STEP_EXPORT_ASSEMBLY` - STEP Export Assembly * `STEP_EXPORT_PART_STEP` - STEP Export Part STEP * `STEP_EXPORT_PART_STL` - STEP Export Part STL * `ASSET_FLOW_VISUALIZATION_IMAGE` - Asset Flow Visualization Image * `ASSET_RENDERED_IMAGE` - Asset Rendered Image * `S2_FINAL_FIELD_IMAGE` - Sketch 2D Final Field Image * `S2_REPLAY_FRAMES` - Sketch 2D Replay Frames * `RACING_BASELINE_GLB` - Racing Baseline GLB * `RACING_OPTIMIZED_GLB` - Racing Optimized GLB * `USER_PROFILE_IMAGE` - User Profile Image x-spec-enum-id: ef52df4c3b39155d writeOnly: true default: PROJECT_SOURCE_STL fileName: type: string writeOnly: true isDownload: type: boolean writeOnly: true default: false contentType: type: string default: '' projectId: type: integer writeOnly: true url: type: string format: uri readOnly: true fields: readOnly: true s3Bucket: type: string readOnly: true expiresIn: type: integer readOnly: true required: - expiresIn - fields - fileName - projectId - s3Bucket - url PriceDisplay: type: object properties: supplyAmount: type: string taxAmount: type: string totalAmount: type: string unitPrice: type: string discountRate: type: string nullable: true required: - supplyAmount - taxAmount - totalAmount PriceEntry: type: object properties: currency: type: string supplyAmountMinor: type: integer taxAmountMinor: type: integer totalAmountMinor: type: integer display: $ref: '#/components/schemas/PriceDisplay' required: - currency - display - supplyAmountMinor - taxAmountMinor - totalAmountMinor Project: type: object properties: id: type: integer readOnly: true uid: type: string readOnly: true teamId: type: integer readOnly: true name: type: string nullable: true maxLength: 255 mode: enum: - G1 - G2 - G3 - G4 - S2 type: string description: |- * `G1` - G1 * `G2` - G2 * `G3` - G3 * `G4` - G4 * `S2` - Sketch 2D x-spec-enum-id: b6373ee318bc60a4 slug: type: string readOnly: true description: type: string nullable: true g1NodeKey: type: string readOnly: true nullable: true description: SM g1-nodes 의 노드 키 (G1 mode 에서만 사용, immutable) lastActivityAt: type: string format: date-time readOnly: true createdAt: type: string format: date-time readOnly: true updatedAt: type: string format: date-time readOnly: true archivedAt: type: string format: date-time nullable: true isDeleted: type: boolean readOnly: true description: 소프트 삭제 여부. True이면 API에서 노출되지 않음 (어드민에서 복구 가능). deletedAt: type: string format: date-time readOnly: true nullable: true description: 소프트 삭제된 시각. purgeAfter: type: string format: date-time readOnly: true nullable: true description: 삭제 유예기간이 끝나 S3 및 관련 데이터를 영구 삭제할 수 있는 시각. canRestore: type: boolean readOnly: true deletion: readOnly: true downloadQuota: readOnly: true workbenchState: allOf: - $ref: '#/components/schemas/WorkbenchState' readOnly: true artifacts: type: array items: $ref: '#/components/schemas/Artifact' readOnly: true patches: type: array items: $ref: '#/components/schemas/Patch' readOnly: true patchesCount: type: integer readOnly: true thumbnailUrl: type: string format: uri nullable: true readOnly: true thumbnailS3Key: type: string nullable: true readOnly: true thumbnailSourceSignature: type: string nullable: true readOnly: true projectInputUnionBoundingBox: nullable: true readOnly: true projectInputViewerTranslate: nullable: true readOnly: true sourceFiles: type: array items: $ref: '#/components/schemas/SourceFile' writeOnly: true required: - artifacts - canRestore - createdAt - deletedAt - deletion - downloadQuota - g1NodeKey - id - isDeleted - lastActivityAt - patches - patchesCount - purgeAfter - slug - teamId - thumbnailS3Key - thumbnailSourceSignature - thumbnailUrl - uid - updatedAt - workbenchState ProjectCreate: type: object properties: id: type: integer readOnly: true uid: type: string readOnly: true name: type: string nullable: true mode: type: string default: G2 slug: type: string description: type: string nullable: true teamId: type: integer nullable: true g1NodeKey: type: string readOnly: true nullable: true description: SM g1-nodes 의 노드 키 (G1 mode 에서만 사용, immutable) node: type: string writeOnly: true description: 'G1 전용: 사용할 G1 노드 키 (예: us-east-1-node-1/us-east-2-node-1/eu-west-1-node-1). 비우면 자동 선택.' sourceFiles: type: array items: $ref: '#/components/schemas/SourceFile' projectInputUnionBoundingBox: nullable: true readOnly: true projectInputViewerTranslate: nullable: true readOnly: true workbenchState: allOf: - $ref: '#/components/schemas/WorkbenchState' readOnly: true createdAt: type: string format: date-time readOnly: true updatedAt: type: string format: date-time readOnly: true required: - createdAt - g1NodeKey - id - uid - updatedAt - workbenchState ProjectDownloadFile: type: object properties: artifactUid: type: string fileId: type: string fileName: type: string url: type: string format: uri required: - artifactUid - fileId - fileName - url ProjectDownloadTicket: type: object properties: downloadId: type: string format: uuid limit: type: integer used: type: integer remaining: type: integer canDownload: type: boolean updatedAt: type: string format: date-time expiresAt: type: string format: date-time files: type: array items: $ref: '#/components/schemas/ProjectDownloadFile' required: - canDownload - downloadId - expiresAt - files - limit - remaining - updatedAt - used ProjectDownloadTicketRequest: type: object properties: source: enum: - JOB_RESULT_ZIP - SUMMARY_FIGURES - LES_FIGURES - G3_EDITED_STL - WORKBENCH_PATCH_EXPORT type: string description: |- * `JOB_RESULT_ZIP` - Job result ZIP * `SUMMARY_FIGURES` - Summary figures * `LES_FIGURES` - LES figures * `G3_EDITED_STL` - G3 edited STL * `WORKBENCH_PATCH_EXPORT` - Workbench patch export x-spec-enum-id: 7ce9d8b5eee7ed41 jobUid: type: string maxLength: 36 items: type: array items: $ref: '#/components/schemas/DownloadItemRequest' clientExport: $ref: '#/components/schemas/ClientExportRequest' required: - source ProjectList: type: object properties: id: type: integer readOnly: true uid: type: string readOnly: true teamId: type: integer readOnly: true name: type: string nullable: true maxLength: 255 mode: enum: - G1 - G2 - G3 - G4 - S2 type: string description: |- * `G1` - G1 * `G2` - G2 * `G3` - G3 * `G4` - G4 * `S2` - Sketch 2D x-spec-enum-id: b6373ee318bc60a4 slug: type: string maxLength: 160 description: type: string nullable: true g1NodeKey: type: string readOnly: true nullable: true description: SM g1-nodes 의 노드 키 (G1 mode 에서만 사용, immutable) lastActivityAt: type: string format: date-time readOnly: true createdAt: type: string format: date-time readOnly: true updatedAt: type: string format: date-time readOnly: true archivedAt: type: string format: date-time nullable: true isDeleted: type: boolean readOnly: true description: 소프트 삭제 여부. True이면 API에서 노출되지 않음 (어드민에서 복구 가능). deletedAt: type: string format: date-time readOnly: true nullable: true description: 소프트 삭제된 시각. purgeAfter: type: string format: date-time readOnly: true nullable: true description: 삭제 유예기간이 끝나 S3 및 관련 데이터를 영구 삭제할 수 있는 시각. canRestore: type: boolean readOnly: true deletion: readOnly: true downloadQuota: readOnly: true jobsCount: type: integer readOnly: true patchesCount: type: integer readOnly: true thumbnailUrl: type: string format: uri nullable: true readOnly: true thumbnailS3Key: type: string nullable: true readOnly: true thumbnailSourceSignature: type: string nullable: true readOnly: true required: - canRestore - createdAt - deletedAt - deletion - downloadQuota - g1NodeKey - id - isDeleted - jobsCount - lastActivityAt - patchesCount - purgeAfter - slug - teamId - thumbnailS3Key - thumbnailSourceSignature - thumbnailUrl - uid - updatedAt ProjectThumbnail: type: object properties: thumbnailUrl: type: string format: uri nullable: true thumbnailS3Key: type: string nullable: true thumbnailSourceSignature: type: string nullable: true required: - thumbnailS3Key - thumbnailSourceSignature - thumbnailUrl ProjectThumbnailRequest: type: object properties: s3Bucket: type: string s3Key: type: string contentType: type: string default: image/webp width: type: integer minimum: 1 height: type: integer minimum: 1 sourceSignature: type: string maxLength: 128 required: - height - s3Bucket - s3Key - sourceSignature - width ProviderCheckoutOption: type: object properties: provider: enum: - payletter - paypal - galaxia type: string description: |- * `payletter` - PayLetter * `paypal` - PayPal * `galaxia` - Galaxia x-spec-enum-id: 57f6d0e06595d82e currencies: type: array items: enum: - JPY - KRW - USD type: string description: |- * `JPY` - JPY * `KRW` - KRW * `USD` - USD x-spec-enum-id: b58a39bc60fabdb8 required: - currencies - provider RaceFeedback: type: object properties: differenceFelt: type: integer maximum: 5 minimum: 1 wouldOptimizeAgain: type: boolean comment: type: string default: '' maxLength: 2000 required: - differenceFelt - wouldOptimizeAgain RaceJobListResponse: type: object properties: count: type: integer results: type: array items: $ref: '#/components/schemas/RaceJobResponse' required: - count - results RaceJobResponse: type: object properties: uid: type: string projectUid: type: string projectName: type: string nullable: true solver: type: string finishedAt: type: string format: date-time nullable: true availability: type: string reasonCode: type: string nullable: true reason: type: string nullable: true primaryMetric: type: string aerodynamics: type: object additionalProperties: {} required: - availability - finishedAt - projectName - projectUid - solver - uid RaceLapCreate: type: object properties: clientLapUid: type: string maxLength: 64 variant: enum: - baseline - optimized type: string description: |- * `baseline` - baseline * `optimized` - optimized x-spec-enum-id: 25d9810d1ad94602 isValid: type: boolean lapTimeMs: type: integer minimum: 1 nullable: true sectorTimesMs: type: array items: type: integer minimum: 1 maxItems: 3 maxSpeedKph: type: number format: double minimum: 0 nullable: true cornerSpeedsKph: type: object additionalProperties: type: number format: double minimum: 0 referenceResult: type: object additionalProperties: {} invalidReasons: type: array items: type: string maxLength: 64 required: - clientLapUid - isValid - variant RaceSessionCreate: type: object properties: jobUid: type: string maxLength: 36 gameBuildId: type: string maxLength: 64 vehiclePresetId: enum: - gt-validation-v1 - formula-student-validation-v1 type: string description: |- * `gt-validation-v1` - gt-validation-v1 * `formula-student-validation-v1` - formula-student-validation-v1 x-spec-enum-id: c9fb85c158588aaa default: gt-validation-v1 required: - gameBuildId - jobUid RaceSessionResponse: type: object properties: uid: type: string status: type: string expiresAt: type: string format: date-time readOnly: type: boolean performanceSnapshot: type: object additionalProperties: {} bestLaps: type: object additionalProperties: {} error: type: object additionalProperties: {} nullable: true required: - bestLaps - error - expiresAt - performanceSnapshot - readOnly - status - uid STLArtifactRegister: type: object properties: s3Bucket: type: string maxLength: 255 s3Key: type: string maxLength: 1024 contentType: type: string nullable: true maxLength: 255 sizeBytes: type: integer maximum: 9223372036854775807 minimum: -9223372036854775808 format: int64 nullable: true required: - s3Bucket - s3Key SampleStl: type: object properties: id: type: string readOnly: true label: type: string readOnly: true unit: type: string readOnly: true s3Key: type: string readOnly: true required: - id - label - s3Key - unit SampleStlDownload: type: object properties: url: type: string format: uri readOnly: true expiresIn: type: integer readOnly: true required: - expiresIn - url Signup: type: object properties: email: type: string format: email password: type: string writeOnly: true minLength: 8 displayName: type: string default: '' maxLength: 150 inviteToken: type: string format: uuid nullable: true emailToken: type: string writeOnly: true nullable: true required: - email - password SignupResponse: type: object properties: id: type: integer email: type: string format: email displayName: type: string teamId: type: integer teamName: type: string required: - displayName - email - id - teamId - teamName SimpleProject: type: object description: Job 응답에 포함될 간단한 Project 정보. properties: id: type: integer readOnly: true uid: type: string readOnly: true name: type: string nullable: true maxLength: 255 mode: enum: - G1 - G2 - G3 - G4 - S2 type: string description: |- * `G1` - G1 * `G2` - G2 * `G3` - G3 * `G4` - G4 * `S2` - Sketch 2D x-spec-enum-id: b6373ee318bc60a4 required: - id - uid SketchCancelResponse: type: object properties: status: type: string generation: type: integer required: - generation - status SketchConditions: type: object description: Reject retired client controls instead of silently accepting them. properties: conditions: type: object additionalProperties: {} required: - conditions SketchFinishResponse: type: object properties: terminal: type: boolean generation: type: integer required: - generation - terminal SketchGeometry: type: object description: Reject retired client controls instead of silently accepting them. properties: board: type: object additionalProperties: {} nullable: true strokes: type: array items: {} penWidthMm: type: number format: double minimum: 1.0e-06 required: - strokes SketchInput: type: object description: Reject retired client controls instead of silently accepting them. properties: board: type: object additionalProperties: {} nullable: true strokes: type: array items: {} conditions: type: object additionalProperties: {} penWidthMm: type: number format: double minimum: 1.0e-06 quality: enum: - coarse - fine type: string description: |- * `coarse` - coarse * `fine` - fine x-spec-enum-id: 361df4b011166ecc required: - conditions - penWidthMm - quality - strokes SketchProjectCreate: type: object description: Reject retired client controls instead of silently accepting them. properties: name: type: string nullable: true state: $ref: '#/components/schemas/SketchInput' required: - state SketchProjectState: type: object properties: projectId: type: integer projectUid: type: string projectStatus: enum: - draft - active type: string description: |- * `draft` - draft * `active` - active x-spec-enum-id: bfb862cdb2d36f11 revision: type: integer canEdit: type: boolean state: {} required: - canEdit - projectId - projectStatus - projectUid - revision - state SketchProjectStateUpdate: type: object description: Reject retired client controls instead of silently accepting them. properties: revision: type: integer minimum: 0 state: $ref: '#/components/schemas/SketchInput' required: - revision - state SketchSession: type: object properties: createdAt: type: string format: date-time displayName: type: string projectUid: type: string jobUid: type: string restartFromJobUid: type: string nullable: true restartStage: type: string nullable: true executionUid: type: string status: type: string phase: type: string generation: type: integer queuePosition: type: integer nullable: true eventsPath: type: string canControl: type: boolean canCancel: type: boolean input: {} streamMetadata: {} resultSummary: nullable: true finalArtifact: nullable: true required: - canCancel - canControl - createdAt - displayName - eventsPath - executionUid - finalArtifact - generation - input - jobUid - phase - projectUid - queuePosition - restartFromJobUid - restartStage - resultSummary - status - streamMetadata SketchSessionCreate: type: object description: Reject retired client controls instead of silently accepting them. properties: projectUid: type: string required: - projectUid SketchSessionList: type: object properties: results: type: array items: $ref: '#/components/schemas/SketchSession' required: - results SolverAccessResponse: type: object description: '`/subscriptions/solver-access/` 응답 — 실시간 조회 결과.' properties: teamId: type: integer readOnly: true allowedSolvers: type: array items: type: string readOnly: true sourceSubscriptionId: type: integer readOnly: true nullable: true sourceContractId: type: integer readOnly: true nullable: true required: - allowedSolvers - sourceContractId - sourceSubscriptionId - teamId SourceFile: type: object description: source_files 항목 하나. POST(생성) / PUT(수정) 공용. properties: s3Key: type: string s3Bucket: type: string fileName: type: string default: '' contentType: type: string default: '' sizeBytes: type: integer nullable: true triangleCount: type: integer readOnly: true nullable: true surfaceArea: type: number format: double readOnly: true nullable: true required: - s3Bucket - s3Key - surfaceArea - triangleCount SourceUploadAbort: type: object properties: objectKey: type: string uploadId: type: string reservationId: type: string format: uuid required: - objectKey - reservationId - uploadId SourceUploadComplete: type: object properties: fileName: type: string contentType: type: string nullable: true objectKey: type: string uploadId: type: string reservationId: type: string format: uuid proxyWorkerRevision: type: string proxyArtifactSignature: type: string proxyCacheKey: type: string completedParts: type: array items: type: object additionalProperties: {} required: - completedParts - fileName - objectKey - reservationId - uploadId SourceUploadInit: type: object properties: fileName: type: string sizeBytes: type: integer minimum: 1 contentType: type: string nullable: true required: - fileName - sizeBytes StorageAddonChange: type: object properties: teamId: type: integer unitCount: type: integer minimum: 0 required: - teamId - unitCount StorageAddonCycle: type: object properties: id: type: integer readOnly: true unitCountSnapshot: type: integer maximum: 2147483647 minimum: 0 unitBytesSnapshot: type: integer maximum: 9223372036854775807 minimum: 0 format: int64 currency: type: string maxLength: 8 supplyAmountSnapshot: type: integer maximum: 2147483647 minimum: 0 taxAmountSnapshot: type: integer maximum: 2147483647 minimum: 0 totalAmountSnapshot: type: integer maximum: 2147483647 minimum: 0 cycleStartedAt: type: string format: date-time cycleEndsAt: type: string format: date-time status: enum: - PENDING - PAID - FAILED - PRORATED type: string description: |- * `PENDING` - 결제 시도 중 * `PAID` - 결제 성공 * `FAILED` - 결제 실패 * `PRORATED` - 업그레이드 일할 지급 x-spec-enum-id: 4bf9b922a073ba54 paymentId: type: string readOnly: true nullable: true note: type: string maxLength: 200 createdAt: type: string format: date-time readOnly: true required: - createdAt - currency - cycleEndsAt - cycleStartedAt - id - paymentId - supplyAmountSnapshot - taxAmountSnapshot - totalAmountSnapshot - unitBytesSnapshot - unitCountSnapshot StorageAddonPrice: type: object properties: currency: type: string supplyAmountMinor: type: integer taxAmountMinor: type: integer totalAmountMinor: type: integer isActive: type: boolean required: - currency - isActive - supplyAmountMinor - taxAmountMinor - totalAmountMinor StorageAddonPurchase: type: object properties: teamId: type: integer unitCount: type: integer minimum: 1 currency: type: string maxLength: 8 required: - teamId - unitCount StorageAddonQuote: type: object properties: currency: type: string unitCount: type: integer unitBytes: type: integer addedBytes: type: integer monthlySupplyAmountMinor: type: integer monthlyTaxAmountMinor: type: integer monthlyTotalAmountMinor: type: integer chargedSupplyAmountMinor: type: integer chargedTaxAmountMinor: type: integer chargedTotalAmountMinor: type: integer cycleStartedAt: type: string format: date-time cycleEndsAt: type: string format: date-time remainingDays: type: integer totalDays: type: integer prorationRatio: type: string display: allOf: - $ref: '#/components/schemas/StorageAddonQuoteDisplay' readOnly: true description: Backend-formatted currency strings; do not recalculate client-side. required: - addedBytes - chargedSupplyAmountMinor - chargedTaxAmountMinor - chargedTotalAmountMinor - currency - cycleEndsAt - cycleStartedAt - display - monthlySupplyAmountMinor - monthlyTaxAmountMinor - monthlyTotalAmountMinor - prorationRatio - remainingDays - totalDays - unitBytes - unitCount StorageAddonQuoteDisplay: type: object description: Backend-formatted UI strings for a storage add-on quote. properties: monthlySupplyAmount: type: string monthlyTaxAmount: type: string monthlyTotalAmount: type: string chargedSupplyAmount: type: string chargedTaxAmount: type: string chargedTotalAmount: type: string required: - chargedSupplyAmount - chargedTaxAmount - chargedTotalAmount - monthlySupplyAmount - monthlyTaxAmount - monthlyTotalAmount StorageUsage: type: object properties: summary: $ref: '#/components/schemas/StorageUsageSummary' project: type: array items: $ref: '#/components/schemas/StorageUsageProject' required: - project - summary StorageUsageProject: type: object properties: projectId: type: integer projectName: type: string mode: type: string totalSizeBytes: type: integer required: - mode - projectId - projectName - totalSizeBytes StorageUsageSummary: type: object properties: totalSizeBytes: type: integer g1TotalSizeBytes: type: integer g2TotalSizeBytes: type: integer g4TotalSizeBytes: type: integer frontierTotalSizeBytes: type: integer required: - g1TotalSizeBytes - g2TotalSizeBytes - totalSizeBytes SubscribeRequest: type: object properties: teamId: type: integer billingKeyId: type: string maxLength: 128 currency: type: string maxLength: 8 paymentId: type: string maxLength: 128 required: - teamId Subscription: type: object properties: id: type: integer readOnly: true teamId: type: integer readOnly: true teamName: type: string readOnly: true plan: type: integer planCode: type: string readOnly: true planName: type: string readOnly: true billingKey: type: string readOnly: true source: enum: - SELF_SERVE - ADMIN_ASSIGNED type: string description: |- * `SELF_SERVE` - 자가 결제 * `ADMIN_ASSIGNED` - 관리자 할당 x-spec-enum-id: daef43a6d8659a7a status: enum: - ACTIVE - PAST_DUE - CANCELLED - EXPIRED - SCHEDULED type: string description: |- * `ACTIVE` - 활성 * `PAST_DUE` - 재결제 실패 대기 * `CANCELLED` - 해지 예약(사이클 종료 시 EXPIRED) * `EXPIRED` - 만료 * `SCHEDULED` - 다음 사이클 적용 예약(다운그레이드) x-spec-enum-id: 44ba4537fdae9638 startedAt: type: string format: date-time anchorDay: type: integer maximum: 32767 minimum: 0 currentCycleStartedAt: type: string format: date-time currentCycleEndsAt: type: string format: date-time nextBillingAttemptAt: type: string format: date-time nextBilling: allOf: - $ref: '#/components/schemas/NextBilling' nullable: true readOnly: true cancelAtPeriodEnd: type: boolean failedAttemptCount: type: integer maximum: 32767 minimum: 0 lastFailedAt: type: string format: date-time nullable: true expiredAt: type: string format: date-time nullable: true createdAt: type: string format: date-time readOnly: true updatedAt: type: string format: date-time readOnly: true required: - anchorDay - billingKey - createdAt - currentCycleEndsAt - currentCycleStartedAt - id - nextBilling - nextBillingAttemptAt - plan - planCode - planName - startedAt - teamId - teamName - updatedAt SubscriptionCycle: type: object properties: id: type: integer readOnly: true subscription: type: integer planSnapshotCode: type: string maxLength: 32 planSnapshotMonthlyCredits: type: integer maximum: 2147483647 minimum: 0 cycleStartedAt: type: string format: date-time cycleEndsAt: type: string format: date-time status: enum: - PENDING - PAID - FAILED - PRORATED type: string description: |- * `PENDING` - 결제 시도 중 * `PAID` - 결제 성공 * `FAILED` - 결제 실패 * `PRORATED` - 업그레이드 일할 지급 x-spec-enum-id: 4bf9b922a073ba54 default: PENDING paymentId: type: string readOnly: true nullable: true creditBucketId: type: integer readOnly: true nullable: true note: type: string maxLength: 200 createdAt: type: string format: date-time readOnly: true required: - createdAt - creditBucketId - cycleEndsAt - cycleStartedAt - id - paymentId - planSnapshotCode - subscription TeamBillingProfile: type: object properties: teamId: type: integer billingCountry: type: string maxLength: 2 legalName: type: string maxLength: 255 billingEmail: type: string format: email maxLength: 254 billingAddress: type: string taxId: type: string maxLength: 128 countryLockedAt: type: string format: date-time readOnly: true nullable: true required: - countryLockedAt TeamCapabilities: type: object description: |- role→액션 매핑으로 계산한 capability boolean 7종. `app.teams.permissions.get_team_capabilities` 반환 dict 스키마와 1:1 대응한다 (설계 문서 §3.6). 필드명은 스네이크로 두되 camel-case 렌더러가 응답에서 canManageTeamSettings 형태로 직렬화한다. properties: canManageTeamSettings: type: boolean canManageTeamMembers: type: boolean canManageJobRuns: type: boolean canCreateProjects: type: boolean canManageProjects: type: boolean canManageBilling: type: boolean canAccessPreviewFeatures: type: boolean required: - canAccessPreviewFeatures - canCreateProjects - canManageBilling - canManageJobRuns - canManageProjects - canManageTeamMembers - canManageTeamSettings TeamStorageAddon: type: object properties: id: type: integer readOnly: true teamId: type: integer readOnly: true subscriptionId: type: integer readOnly: true unitCount: type: integer maximum: 2147483647 minimum: 0 addonBytes: type: integer readOnly: true scheduledUnitCount: type: integer maximum: 2147483647 minimum: 0 nullable: true currency: type: string maxLength: 8 status: enum: - ACTIVE - EXPIRED type: string description: |- * `ACTIVE` - 활성 * `EXPIRED` - 만료 x-spec-enum-id: fee46434bd68355a currentCycleStartedAt: type: string format: date-time currentCycleEndsAt: type: string format: date-time nextBillingAttemptAt: type: string format: date-time failedAttemptCount: type: integer maximum: 32767 minimum: 0 lastFailedAt: type: string format: date-time nullable: true expiredAt: type: string format: date-time nullable: true cycles: type: array items: $ref: '#/components/schemas/StorageAddonCycle' readOnly: true required: - addonBytes - currentCycleEndsAt - currentCycleStartedAt - cycles - id - nextBillingAttemptAt - subscriptionId - teamId - unitCount TeamStorageUsage: type: object properties: teamId: type: integer usedBytes: type: integer quotaBytes: type: integer nullable: true baseQuotaBytes: type: integer nullable: true addonQuotaBytes: type: integer nullable: true maxAddonBytes: type: integer nullable: true availableBytes: type: integer nullable: true usagePercent: type: number format: double nullable: true isOverQuota: type: boolean objectCount: type: integer measuredAt: type: string format: date-time source: enum: - s3 - artifact_db type: string description: |- * `s3` - s3 * `artifact_db` - artifact_db x-spec-enum-id: 8a4851ae1bab9fd0 isEstimated: type: boolean required: - addonQuotaBytes - availableBytes - baseQuotaBytes - isEstimated - isOverQuota - maxAddonBytes - measuredAt - objectCount - quotaBytes - source - teamId - usagePercent - usedBytes TeamSwitchRequest: type: object properties: teamId: type: integer required: - teamId TeamsResponse: type: object properties: teams: type: array items: $ref: '#/components/schemas/AccountTeam' required: - teams TenantFeatureAccess: type: object properties: validationDes: enum: - hidden - disabled - active type: string description: |- * `hidden` - Hidden * `disabled` - Disabled * `active` - Active x-spec-enum-id: 718a9c513d88ba39 manualOptimization: enum: - hidden - disabled - active type: string description: |- * `hidden` - Hidden * `disabled` - Disabled * `active` - Active x-spec-enum-id: 718a9c513d88ba39 market: enum: - hidden - disabled - active type: string description: |- * `hidden` - Hidden * `disabled` - Disabled * `active` - Active x-spec-enum-id: 718a9c513d88ba39 racingDiv: enum: - hidden - disabled - active type: string description: |- * `hidden` - Hidden * `disabled` - Disabled * `active` - Active x-spec-enum-id: 718a9c513d88ba39 g3: enum: - hidden - disabled - active type: string description: |- * `hidden` - Hidden * `disabled` - Disabled * `active` - Active x-spec-enum-id: 718a9c513d88ba39 submenus: type: object additionalProperties: type: array items: type: string required: - g3 - manualOptimization - market - racingDiv - submenus - validationDes UpgradeQuote: type: object description: 업그레이드 견적 — 결제에 사용되는 백엔드 계산 결과를 그대로 노출. properties: quotedAt: type: string format: date-time currency: type: string currentPlan: $ref: '#/components/schemas/UpgradeQuotePlan' newPlan: $ref: '#/components/schemas/UpgradeQuotePlan' currentPlanPrice: $ref: '#/components/schemas/PriceEntry' newPlanPrice: $ref: '#/components/schemas/PriceEntry' differenceSupplyAmountMinor: type: integer differenceTaxAmountMinor: type: integer differenceTotalAmountMinor: type: integer cycleStartedAt: type: string format: date-time cycleEndsAt: type: string format: date-time usedDays: type: integer remainingDays: type: integer totalDays: type: integer prorationRatio: type: string subtotalAmountMinor: type: integer vatAmountMinor: type: integer totalChargedAmountMinor: type: integer display: type: object additionalProperties: {} monthlyCreditDifference: type: integer proratedCredits: type: integer required: - currency - currentPlan - currentPlanPrice - cycleEndsAt - cycleStartedAt - differenceSupplyAmountMinor - differenceTaxAmountMinor - differenceTotalAmountMinor - display - monthlyCreditDifference - newPlan - newPlanPrice - proratedCredits - prorationRatio - quotedAt - remainingDays - subtotalAmountMinor - totalChargedAmountMinor - totalDays - usedDays - vatAmountMinor UpgradeQuotePlan: type: object properties: id: type: integer code: type: string name: type: string required: - code - id - name UpgradeQuoteResponse: type: object properties: upgradeQuote: $ref: '#/components/schemas/UpgradeQuote' required: - upgradeQuote UpgradeResponse: type: object properties: id: type: integer readOnly: true teamId: type: integer readOnly: true teamName: type: string readOnly: true plan: type: integer planCode: type: string readOnly: true planName: type: string readOnly: true billingKey: type: string readOnly: true source: enum: - SELF_SERVE - ADMIN_ASSIGNED type: string description: |- * `SELF_SERVE` - 자가 결제 * `ADMIN_ASSIGNED` - 관리자 할당 x-spec-enum-id: daef43a6d8659a7a status: enum: - ACTIVE - PAST_DUE - CANCELLED - EXPIRED - SCHEDULED type: string description: |- * `ACTIVE` - 활성 * `PAST_DUE` - 재결제 실패 대기 * `CANCELLED` - 해지 예약(사이클 종료 시 EXPIRED) * `EXPIRED` - 만료 * `SCHEDULED` - 다음 사이클 적용 예약(다운그레이드) x-spec-enum-id: 44ba4537fdae9638 startedAt: type: string format: date-time anchorDay: type: integer maximum: 32767 minimum: 0 currentCycleStartedAt: type: string format: date-time currentCycleEndsAt: type: string format: date-time nextBillingAttemptAt: type: string format: date-time nextBilling: allOf: - $ref: '#/components/schemas/NextBilling' nullable: true readOnly: true cancelAtPeriodEnd: type: boolean failedAttemptCount: type: integer maximum: 32767 minimum: 0 lastFailedAt: type: string format: date-time nullable: true expiredAt: type: string format: date-time nullable: true createdAt: type: string format: date-time readOnly: true updatedAt: type: string format: date-time readOnly: true upgradeQuote: allOf: - $ref: '#/components/schemas/UpgradeQuote' nullable: true required: - anchorDay - billingKey - createdAt - currentCycleEndsAt - currentCycleStartedAt - id - nextBilling - nextBillingAttemptAt - plan - planCode - planName - startedAt - teamId - teamName - updatedAt UserForcePasswordChange: type: object description: |- must_change_password=True 계정 전용 강제 변경 시리얼라이저. 기존 password-verify 2단계 흐름과 달리 old-password 검증을 생략한다 — 대신 View 에서 must_change_password 플래그로 접근을 제한한다. properties: password: type: string writeOnly: true passwordConfirm: type: string writeOnly: true required: - password - passwordConfirm UserMeUsage: type: object properties: jobDailyUsage: type: array items: $ref: '#/components/schemas/JobDailyUsage' readOnly: true storageUsageByProject: type: array items: $ref: '#/components/schemas/StorageUsage' readOnly: true storageUsage: allOf: - $ref: '#/components/schemas/TeamStorageUsage' readOnly: true required: - jobDailyUsage - storageUsage - storageUsageByProject UserPasswordChange: type: object properties: token: type: string writeOnly: true password: type: string writeOnly: true passwordConfirm: type: string writeOnly: true required: - password - passwordConfirm - token UserPasswordReset: type: object properties: email: type: string format: email required: - email UserPasswordResetConfirm: type: object properties: email: type: string format: email writeOnly: true token: type: string writeOnly: true password: type: string writeOnly: true passwordConfirm: type: string writeOnly: true required: - email - password - passwordConfirm - token UserPasswordVerify: type: object properties: oldPassword: type: string writeOnly: true token: type: string readOnly: true required: - oldPassword - token UserSearchResult: type: object properties: id: type: integer email: type: string format: email displayName: type: string required: - displayName - email - id UserSocialLogin: type: object properties: code: type: string writeOnly: true socialAccessToken: type: string writeOnly: true state: enum: - google type: string description: '* `google` - google' x-spec-enum-id: 6ad05742f68a2748 writeOnly: true accessToken: type: string readOnly: true refreshToken: type: string readOnly: true registerToken: type: string readOnly: true isRegister: type: boolean readOnly: true required: - accessToken - isRegister - refreshToken - registerToken - state WorkbenchRuntime: type: object properties: projectId: type: integer projectUpdatedAt: type: string format: date-time patches: type: array items: $ref: '#/components/schemas/Patch' projectInputUnionBoundingBox: nullable: true projectInputViewerTranslate: nullable: true projectInputRotationPivot: type: array items: type: number format: double nullable: true projectInputRotationEulerDeg: type: array items: type: number format: double nullable: true coordinateUnit: enum: - m - mm - null type: string description: |- * `m` - m * `mm` - mm x-spec-enum-id: fddbc5bb0cce19dc nullable: true sceneUnitsPerMeter: type: number format: double nullable: true processingState: enum: - empty - pending - ready - failed type: string description: |- * `empty` - empty * `pending` - pending * `ready` - ready * `failed` - failed x-spec-enum-id: aa6baf46565dd051 sourceProcessingFailed: type: boolean sourceProcessingPending: type: boolean required: - coordinateUnit - patches - processingState - projectId - projectInputRotationEulerDeg - projectInputRotationPivot - projectInputUnionBoundingBox - projectInputViewerTranslate - projectUpdatedAt - sceneUnitsPerMeter - sourceProcessingFailed - sourceProcessingPending WorkbenchState: type: object properties: id: type: integer readOnly: true projectId: type: integer readOnly: true unifiedConfig: description: Solver-independent editable project configuration. revision: type: integer readOnly: true description: Monotonic revision used for conditional workbench UI state updates. updatedAt: type: string format: date-time readOnly: true required: - id - projectId - revision - updatedAt WorkbenchStateUpdate: type: object description: |- PUT /projects/{id}/workbench-state/ unified_config: solver-independent project configuration (전체 덮어쓰기) expected_revision: 마지막으로 읽은 WorkbenchState revision properties: unifiedConfig: {} expectedRevision: type: integer minimum: 0 _CompletedPart: type: object properties: etag: type: string maxLength: 255 partNumber: type: integer maximum: 10000 minimum: 1 required: - etag - partNumber