{"openapi":"3.1.0","info":{"title":"XBOSS API","description":"통합 REST API 서버 (홈택스 등). Human API guide: https://developer.xdata.kr · OpenAPI Reference: /docs","version":"2.0.0"},"components":{"schemas":{"AllAccountsInterruptionResponse":{"properties":{"code":{"type":"string","title":"Code","description":"표준 오류 코드."},"message":{"type":"string","title":"Message","description":"고객에게 보여 줄 문장."},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","description":"세부 까닭 코드. 거절이 싣고 있을 때만 값이 있다(없으면 `null`)."}},"type":"object","required":["code","message","reason"],"title":"AllAccountsInterruptionResponse","description":"호출이 중간에 멈춘 까닭 - 같은 거절이 계좌 하나로 부른 호출에서 났다면 오류 응답이 싣는 코드 · 문장 · 세부 까닭과 같다."},"AllAccountsLineResponse":{"properties":{"account_link_id":{"type":"string","title":"Account Link Id"},"bank_account_credential_id":{"type":"string","title":"Bank Account Credential Id"},"masked_account_no":{"type":"string","title":"Masked Account No","description":"가린 계좌번호 (예: `110-***-123456`)."},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id","description":"접수한 작업 번호. 이 번호로 `GET /v1/jobs/{job_id}` 와 `GET /v1/jobs/{job_id}/result` 를 부른다. 아직 접수하지 못한 줄은 없다."},"status":{"type":"string","title":"Status","description":"그 작업의 지금 상태이거나 접수하지 못했다는 `NOT_SUBMITTED`. 가능한 값: `CANCELED` · `FAILED` · `NOT_SUBMITTED` · `QUEUED` · `RUNNING` · `SUCCEEDED` · `TIMEOUT`. 같은 멱등키로 다시 부르면 이미 접수한 줄은 새 작업 없이 그 작업의 지금 상태로 돌아온다."},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","description":"`NOT_SUBMITTED` 줄에만 있다 - 접수하지 못한 까닭. 가능한 값: `over_concurrency_limit`(은행 동시 작업 상한 때문에 아직 접수하지 못했다) · `interrupted`(호출이 다른 거절로 중간에 멈춰 접수하지 못했다. 응답의 `interruption` 이 까닭을 말한다)."}},"type":"object","required":["account_link_id","bank_account_credential_id","masked_account_no","status"],"title":"AllAccountsLineResponse","description":"계좌 한 줄 - 이 계좌로 접수한 작업, 또는 아직 접수하지 못했다는 사실."},"AllAccountsNextResponse":{"properties":{"retry_after_seconds":{"type":"integer","title":"Retry After Seconds","description":"다시 부르기 전에 기다릴 만한 초."},"bank_account_credential_ids":{"items":{"type":"string"},"type":"array","title":"Bank Account Credential Ids","description":"아직 접수하지 못한 계좌 식별자 - 같은 이름의 요청 칸에 그대로 준다."},"message":{"type":"string","title":"Message"}},"type":"object","required":["retry_after_seconds","bank_account_credential_ids","message"],"title":"AllAccountsNextResponse","description":"아직 접수하지 못한 계좌가 있을 때만 있다 - 앞선 작업이 끝난 뒤 같은 호출을 이 계좌들로 다시 한다."},"AllAccountsSubmitRequest":{"properties":{"provider":{"type":"string","minLength":1,"title":"Provider","description":"요청 provider - 계좌를 고르는 은행 상품이어야 한다."},"action":{"type":"string","minLength":1,"title":"Action","description":"요청 action - 계좌를 고르는 액션이어야 한다 (은행 거래내역 조회 등). 계좌를 고르지 않는 액션은 거절한다."},"account_link_id":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Account Link Id","description":"연동 계정 식별자 (선택). 주면 그 연동의 계좌만 처리한다. 생략하면 이 은행의 모든 연동이다."},"bank_account_credential_ids":{"anyOf":[{"items":{"type":"string"},"type":"array","minItems":1},{"type":"null"}],"title":"Bank Account Credential Ids","description":"처리할 계좌 식별자 목록 (선택). 생략하면 계좌 전부를 처리한다. 동시 상한 때문에 아직 접수하지 못한 계좌를 이어서 접수할 때 응답의 `next.bank_account_credential_ids` 로 받은 목록을 준다."},"params":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Params","description":"액션별 파라미터 (선택). 계좌 하나를 고르는 칸(`bank_account_credential_id`)은 넣지 않는다 - 이 호출이 계좌마다 채운다."}},"additionalProperties":false,"type":"object","required":["provider","action"],"title":"AllAccountsSubmitRequest","description":"`POST /v1/jobs/all-accounts` 요청 본문."},"AllAccountsSubmitResponse":{"properties":{"env_scope":{"type":"string","title":"Env Scope","description":"요청한 환경 그대로. `sandbox` · `real_test` · `production`."},"provider":{"type":"string","title":"Provider"},"action":{"type":"string","title":"Action"},"submitted_at":{"type":"string","title":"Submitted At","description":"호출을 받은 시각 (KST ISO-8601). 줄마다 작업의 접수 시각은 `GET /v1/jobs/{job_id}` 에 있다."},"account_count":{"type":"integer","title":"Account Count","description":"이 호출이 다룬 계좌 수."},"submitted_count":{"type":"integer","title":"Submitted Count","description":"작업을 접수한 줄 수 - 같은 멱등키의 재생으로 돌아온 줄도 센다."},"accounts":{"items":{"$ref":"#/components/schemas/AllAccountsLineResponse"},"type":"array","title":"Accounts","description":"계좌마다 한 줄. 최근 등록한 연동의 계좌부터 최근 등록한 계좌 순서다."},"next":{"anyOf":[{"$ref":"#/components/schemas/AllAccountsNextResponse"},{"type":"null"}],"description":"접수하지 못한 계좌가 있을 때만 있다."},"interruption":{"anyOf":[{"$ref":"#/components/schemas/AllAccountsInterruptionResponse"},{"type":"null"}],"description":"호출이 중간에 멈췄을 때만 있다 - 멈추지 않았으면 이 칸 자체가 없다. 줄을 접수한 뒤 동시 작업 상한이 아닌 다른 거절(예: 사용 토큰이 도중에 모자라게 된 경우)로 멈췄다는 뜻이다. 이미 접수한 줄은 그대로이고, 멈춘 줄과 그 뒤 줄은 `NOT_SUBMITTED` + `interrupted` 이며 `next` 가 그 계좌 목록을 준다. 새로 접수한 줄이 있으면 응답 코드는 `202` 그대로다."}},"type":"object","required":["env_scope","provider","action","submitted_at","account_count","submitted_count","accounts"],"title":"AllAccountsSubmitResponse","description":"`POST /v1/jobs/all-accounts` 응답 - 계좌마다 작업을 하나씩 접수한 결과다. 새로 접수한 줄이 하나라도 있으면 `202`, 없으면 `200` 이다. 같은 `Idempotency-Key` 로 다시 부르면 이미 접수한 계좌는 새 작업 없이 그 작업의 지금 상태로 돌아오고(재생), 그 사이 계좌가 늘어 있으면 늘어난 계좌만 새 작업이므로 응답은 `202` 다. 계좌마다 사용 토큰이 하나씩 듭니다. 기업정보 브리프처럼 한 번에 여러 사용 토큰을 쓰는 업무는 그 값만큼 계좌마다 듭니다."},"AppCredentialIssueRequest":{"properties":{"label":{"type":"string","maxLength":100,"minLength":1,"title":"Label","description":"자격증명 라벨 (1~100자)"},"allowed_env_scopes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Env Scopes","description":"발급 허용 env_scope. None → default ('sandbox'). real_test requires APPROVED env access request (ADR-043). v1 'production' 포함 시 402 POLICY_PAID_REQUIRED."},"integration_profile":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Integration Profile","description":"Omit for standard_external (default ERP). desktop_agent for integrator SaaS keys — admin_user issuance only (ADR-XDATA-XSTAFF-001); console rejected at AppCredentialService."}},"type":"object","required":["label"],"title":"AppCredentialIssueRequest","description":"`POST /v1/app-credentials` 요청 본문 (APP_CREDENTIAL_SCHEMA §6 + §3 1:1).\n\n필드:\n    label: 자격증명 라벨 (1~100자, human-readable, e.g. 'ERP-Prod-1').\n    allowed_env_scopes: 발급 허용 env_scope 목록. 누락/None → default\n        ('sandbox') (Service 가 default 적용). real_test 는 ADR-043\n        APPROVED env_access_requests 후 approve append 또는 issue inherit.\n        v1 'production' 포함 시 402 POLICY_PAID_REQUIRED 거부 (Plan §3-2.A — PAID\n        멤버십 통합 PR-N-6 PATCH 위임).\n\nHeaders:\n    Authorization: Bearer console_jwt 또는 admin_jwt (필수). client_credential/\n        legacy_api_key 는 §5-5 매트릭스 PR-N-3-pre 잠금으로 403 거부.\n    X-Env-Scope: sandbox/real_test/production. production 진입은 §5-7 PAID\n        잠금 (AuthPolicyService 책임).\n    X-Trace-Id / X-Request-Id: 운영 상관관계 (선택, 누락 시 자동 발급).\n    X-Organization-Id: admin_user 위임 organization_id hint (선택, 누락 시\n        console_user 는 자기 조직 사용)."},"AppCredentialRevokeRequest":{"properties":{"revoked_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Revoked Reason","description":"폐기 사유 (선택). console_user None → 'user_request' 자동 채움, admin_user None → REVOKED_REASON_MISSING 거부 (admin 명시 필수). principal_kind 별 허용 enum 위반 시 REVOKED_REASON_FORBIDDEN 거부."}},"type":"object","title":"AppCredentialRevokeRequest","description":"`POST /v1/app-credentials/{client_id}/revoke` 요청 본문\n(APP_CREDENTIAL_SCHEMA §6 line 195 + §1 line 50 1:1, PR-N-5).\n\n필드:\n    revoked_reason: 폐기 사유 (선택). None 의 경우:\n        - console_user: 'user_request' 자동 채움 (Service M-1 추천 결정).\n        - admin_user: 명시 필수 (REVOKED_REASON_MISSING 거부).\n        principal_kind 별 허용 enum:\n        - console_user: ('user_request',) 단일 — admin_action /\n          security_incident / superseded 모두 거부 (M-8 추천 결정).\n        - admin_user: ('admin_action', 'security_incident') 2종 —\n          user_request / superseded 거부 (M-8 추천 결정).\n        'superseded' 는 시스템 batch / reissue 트랜잭션 한정 별도 경로,\n        본 사용자 표면 진입 0건 (Repository 단계 차단).\n\nHeaders (PR-N-3 issue 와 동일 잠금):\n    Authorization: Bearer console_jwt 또는 admin_jwt (필수). client_credential/\n        legacy_api_key 는 ADR-010 §2-8 매트릭스 PR-N-4-pre 잠금으로 403 거부.\n    X-Env-Scope: sandbox/real_test/production.\n    X-Trace-Id / X-Request-Id: 운영 상관관계 (선택, 누락 시 자동 발급).\n    X-Organization-Id: admin_user 위임 organization_id hint (선택)."},"AuthHandoffExchangeRequest":{"properties":{"handoff_token":{"type":"string","maxLength":512,"minLength":16,"title":"Handoff Token"}},"type":"object","required":["handoff_token"],"title":"AuthHandoffExchangeRequest"},"AuthHandoffExchangeResponse":{"properties":{"client_id":{"type":"string","title":"Client Id"},"client_secret":{"type":"string","title":"Client Secret"}},"type":"object","required":["client_id","client_secret"],"title":"AuthHandoffExchangeResponse"},"AuthLoginBody":{"properties":{"email":{"type":"string","title":"Email","description":"Account email address."},"password":{"type":"string","title":"Password","description":"Account password."}},"type":"object","required":["email","password"],"title":"AuthLoginBody","description":"POST /v1/auth/login request body (CR-FE-012)."},"AuthRegisterBody":{"properties":{"email":{"type":"string","title":"Email","description":"Account email address."},"password":{"type":"string","title":"Password","description":"Account password."},"name":{"type":"string","title":"Name","description":"Display name."},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone","description":"Contact phone (KR mobile, E.164 normalized server-side). Optional at signup (user decision D-119); validated when present."},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name","description":"Organization display name."},"business_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Number","description":"Business registration number."},"agree_terms":{"type":"boolean","title":"Agree Terms","description":"Terms of service acceptance.","default":false},"agree_privacy":{"type":"boolean","title":"Agree Privacy","description":"Privacy policy acceptance.","default":false}},"type":"object","required":["email","password","name"],"title":"AuthRegisterBody","description":"POST /v1/auth/register request body (CR-FE-012, CR-FE-003 v2 phone)."},"BankAccountCredentialLinkRequest":{"properties":{"account_no":{"type":"string","minLength":1,"title":"Account No","description":"RSA-OAEP encrypted account number"},"account_password":{"type":"string","minLength":1,"title":"Account Password","description":"RSA-OAEP encrypted account password"}},"additionalProperties":false,"type":"object","required":["account_no","account_password"],"title":"BankAccountCredentialLinkRequest"},"BankAccountCredentialResponse":{"properties":{"bank_account_credential_id":{"type":"string","title":"Bank Account Credential Id"},"masked_account_no":{"type":"string","title":"Masked Account No"},"status":{"type":"string","title":"Status"},"is_default":{"type":"boolean","title":"Is Default"},"registered_at":{"type":"string","format":"date-time","title":"Registered At"}},"type":"object","required":["bank_account_credential_id","masked_account_no","status","is_default","registered_at"],"title":"BankAccountCredentialResponse"},"BankAccountCredentialUpdateRequest":{"properties":{"account_password":{"type":"string","minLength":1,"title":"Account Password","description":"RSA-OAEP encrypted replacement account password"}},"additionalProperties":false,"type":"object","required":["account_password"],"title":"BankAccountCredentialUpdateRequest"},"BillingAuthSessionResponse":{"properties":{"customer_key":{"type":"string","maxLength":300,"minLength":2,"title":"Customer Key"},"client_key":{"type":"string","maxLength":200,"minLength":1,"title":"Client Key"},"session_proof":{"type":"string","maxLength":128,"minLength":64,"title":"Session Proof"}},"additionalProperties":false,"type":"object","required":["customer_key","client_key","session_proof"],"title":"BillingAuthSessionResponse","description":"Toss billing-auth session response."},"ConsentSelfServiceRecordRequest":{"properties":{"consent_type":{"type":"string","title":"Consent Type","description":"Self-service consent type enum."},"action":{"type":"string","title":"Action","description":"GRANT or REVOKE."}},"type":"object","required":["consent_type","action"],"title":"ConsentSelfServiceRecordRequest","description":"POST /v1/consents request body (CR-FE-006)."},"CredentialConsentUrlRequest":{"properties":{"provider":{"type":"string","title":"Provider","description":"연동할 기관(provider) id"},"features":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Features","description":"Optional feature bundles to request consent for. Omit to request the provider's default scope set. Unknown names are rejected with 400."}},"type":"object","required":["provider"],"title":"CredentialConsentUrlRequest","description":"`POST /v1/credentials/consent-url` 요청 본문. **provider 하나만** 받는다.\n\n복귀 주소를 화면에서 받지 않는 이유: 그 값을 그대로 쓰면 열린 리디렉션이 되고, 플랫폼에\n등록한 주소와 글자 그대로 같아야 해서 화면이 정할 수 있는 값이 아니다. 서버가\n`public_urls` 한 곳에서 만든다."},"CredentialLinkRequest":{"properties":{"cert_data":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cert Data","description":"인증서 DER (RSA-OAEP base64)"},"key_data":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Data","description":"개인키 (RSA-OAEP base64)"},"encrypted_pw":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Encrypted Pw","description":"인증서 비밀번호 (RSA-OAEP base64)"},"login_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Login Id","description":"이용자 ID (RSA-OAEP base64)"},"login_password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Login Password","description":"이용자 비밀번호 (RSA-OAEP base64)"},"display_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Label","description":"연결 표시 이름"},"authorization_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization Code","description":"동의 화면에서 돌아온 인가 코드(동의 왕복 provider 전용). RSA 로 감싸지 않는다 - 플랫폼이 고객 브라우저에 URL 로 돌려준 값이고 한 번만 쓸 수 있다."},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State","description":"consent-url 이 발급한 state. 우리가 시작한 연결인지 확인한다."},"random_enc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Random Enc","description":"random_enc (RSA-OAEP base64)"},"cert_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cert Name","description":"인증서 별명"},"is_primary":{"type":"boolean","title":"Is Primary","description":"대표 인증서 지정 여부","default":false},"confirm":{"type":"boolean","title":"Confirm","description":"이미 등록된 같은 아이디의 **비밀번호를 바꾸겠다**는 명시 확인(ID/비밀번호 연동 전용). 값이 같으면 이 칸과 무관하게 아무것도 바꾸지 않는다. 값이 다른데 이 칸이 false 면 거절한다 - 옛 값으로 덮이면 되돌릴 수 없고 기관 세션도 함께 끊어지기 때문이다. 인증서·동의 왕복 연동에는 필요 없다.","default":false},"biz_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Biz Number","description":"사업자등록번호"},"business_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Name","description":"사업자명"},"cert_oid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cert Oid","description":"인증서 정책 OID"},"provider":{"type":"string","title":"Provider","description":"연동 provider (default hometax — 기존 클라이언트 무중단)","default":"hometax"},"exclude_providers":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Exclude Providers","description":"console certificate fan-out 제외 provider 목록. omit/empty = registry certificate_fanout 전체 sibling 연동."},"serverTransmissionData":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Servertransmissiondata","description":"레거시 이중 포장 JSON (호환 전용)"}},"type":"object","title":"CredentialLinkRequest","description":"`POST /v1/credentials/link` 요청 본문 (레거시 register/v1 필드 정합 + v1 확장).\n\nRSA-OAEP 암호문 필드는 라우트가 서버 개인키로 복호화 후\nkind별 credential payload로 변환한다. 평문 credential은\n본 API body 에 직접 전송 금지.\n\nHeaders:\n    Authorization: Bearer console JWT, or Basic client_credential when\n        app_credentials.integration_profile is desktop_agent.\n    standard_external client keys remain 403 on this surface.\n    X-Env-Scope: sandbox/real_test/production (필수).\n    X-Trace-Id / X-Request-Id: 운영 상관관계 (선택).\n    X-Organization-Id: admin_user 위임 hint (선택 — v1 Service 는\n        console_user 만 허용하므로 admin_user 는 403)."},"CredentialSelectedAssetsRequest":{"properties":{"selected_assets":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Selected Assets","description":"고른 자산 문서. 예) {\"property_id\": [\"properties/123\"], \"site_url\": [\"sc-domain:example.com\"]}. null 이면 선택을 비운다."}},"type":"object","title":"CredentialSelectedAssetsRequest","description":"`PUT /v1/credentials/{account_link_id}/selected-assets` 요청 본문.\n\n고객이 이 연동에서 조회할 자산을 고른 결과를 **통째로** 보낸다. 키와 값의 모양은\n기관(provider)마다 다르고 상품이 정본을 갖는다 - 그 액션의 `inputs[].key` 를 그대로 쓴다.\n``null`` 을 보내면 선택을 비운다(고르기 전 상태로 되돌린다)."},"CredentialUnlinkRequest":{"properties":{"unlink_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unlink Reason","description":"폐기 사유 enum: user_request / admin_action / security_incident. None -> user_request (console_user v1 default)."}},"type":"object","title":"CredentialUnlinkRequest","description":"`POST /v1/credentials/{account_link_id}/unlink` 요청 본문."},"CurrentVersionSummary":{"properties":{"id":{"type":"integer","minimum":1.0,"title":"Id","description":"api_product_versions.id."},"version":{"type":"string","maxLength":20,"minLength":1,"pattern":"^[A-Za-z0-9._\\-]{1,20}$","title":"Version","description":"버전 식별자(예: 'v1'/'v2'). 형식 `^[A-Za-z0-9._-]{1,20}$`."},"version_status":{"type":"string","enum":["DRAFT","PUBLISHED","DEPRECATED","RETIRED"],"title":"Version Status","description":"버전 상태 enum."},"provider":{"type":"string","maxLength":64,"minLength":1,"pattern":"^[a-z][a-z0-9_]{0,63}$","title":"Provider","description":"등록된 기관 식별자. 형식 `^[a-z][a-z0-9_]{0,63}$`."},"action":{"type":"string","maxLength":64,"minLength":1,"pattern":"^[a-z][a-z0-9_.]{0,63}$","title":"Action","description":"등록된 액션 식별자. 기관에 종속한다. 형식 `^[a-z][a-z0-9_.]{0,63}$`."}},"additionalProperties":false,"type":"object","required":["id","version","version_status","provider","action"],"title":"CurrentVersionSummary","description":"상품 응답에 nested 로 동봉되는 활성 버전 요약.\n\n`GET /v1/products`(목록) + `GET /v1/products/{id}`(상세) 응답에 동봉.\n전체 `ProductVersionResponse`(11+ 필드)가 아닌 운영자 카탈로그 표시에 필요한\n핵심 필드만 추려 응답 크기를 줄인다.\n\nversion · provider · action 셋은 형식과 길이 64자를 상품 버전 쪽과 같은 선언으로\n잠근다 - 두 자리가 갈리면 한쪽만 고쳐진다."},"DeletionRequestCancelBody":{"properties":{"password":{"type":"string","title":"Password","description":"Account password for re-authentication."},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","description":"Optional cancel reason."}},"type":"object","required":["password"],"title":"DeletionRequestCancelBody","description":"DELETE /v1/me/deletion-requests/{request_uuid} request body (CR-FE-015)."},"DeletionRequestSubmitBody":{"properties":{"password":{"type":"string","title":"Password","description":"Account password for re-authentication."},"reason_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason Text","description":"Optional deletion reason (max 2000 chars)."}},"type":"object","required":["password"],"title":"DeletionRequestSubmitBody","description":"POST /v1/me/deletion-requests request body (CR-FE-015)."},"EnvAccessRequestSubmitBody":{"properties":{"requested_target_env":{"type":"string","title":"Requested Target Env","description":"Target environment for access elevation (v1: real_test only)."},"reason_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason Text","description":"Optional user reason (max 500 chars)."}},"type":"object","required":["requested_target_env"],"title":"EnvAccessRequestSubmitBody","description":"POST /v1/me/env-access-requests request body (CR-FE-011)."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InitialVersionEcho":{"properties":{"id":{"type":"integer","minimum":1.0,"title":"Id","description":"api_product_versions.id."},"version":{"type":"string","maxLength":20,"minLength":1,"pattern":"^[A-Za-z0-9._\\-]{1,20}$","title":"Version"},"version_status":{"type":"string","enum":["DRAFT","PUBLISHED","DEPRECATED","RETIRED"],"title":"Version Status"},"provider":{"type":"string","maxLength":64,"minLength":1,"pattern":"^[a-z][a-z0-9_]{0,63}$","title":"Provider"},"action":{"type":"string","maxLength":64,"minLength":1,"pattern":"^[a-z][a-z0-9_.]{0,63}$","title":"Action"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At","description":"발행 시각. publish_immediately=false 면 null."}},"additionalProperties":false,"type":"object","required":["id","version","version_status","provider","action"],"title":"InitialVersionEcho","description":"`POST /v1/products` 응답에 nested로 동봉되는 초기 버전 요약.\n\n초기 버전을 동봉했을 때 응답 본문의 `initial_version` nested 가 이 모양이다.\n\n`version` · `provider` · `action` 은 상품 등록과 같은 꼴 · 같은 길이(최대 64자)로 잠근다."},"InitialVersionRequest":{"properties":{"version":{"type":"string","maxLength":20,"minLength":1,"pattern":"^[A-Za-z0-9._\\-]{1,20}$","title":"Version","description":"버전 식별자. 같은 상품 안에서 유일해야 한다. 형식 `^[A-Za-z0-9._-]{1,20}$`."},"provider":{"type":"string","maxLength":64,"minLength":1,"pattern":"^[a-z][a-z0-9_]{0,63}$","title":"Provider","description":"등록된 기관 식별자. 등록되지 않은 값이면 400 으로 거절한다. 형식 `^[a-z][a-z0-9_]{0,63}$`."},"action":{"type":"string","maxLength":64,"minLength":1,"pattern":"^[a-z][a-z0-9_.]{0,63}$","title":"Action","description":"등록된 액션 식별자. 기관에 종속한다. 형식 `^[a-z][a-z0-9_.]{0,63}$`."},"params_schema_ref":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Params Schema Ref","description":"`provider.action.vN` 형식. 작업 결과의 schema 값과 같은 형식이다."},"result_schema_ref":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Result Schema Ref","description":"동상."},"pricing_hint":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Pricing Hint","description":"가격 표시 힌트. 정책을 결정하는 키는 넣을 수 없다. JSON 직렬화 후 최대 65536 bytes."},"rate_limit_hint":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Rate Limit Hint","description":"rate limit 표시 힌트. 정책을 결정하는 키는 넣을 수 없다. JSON 직렬화 후 최대 65536 bytes."},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata","description":"자유 메타데이터. 정책을 결정하는 키는 넣을 수 없다. JSON 직렬화 후 최대 65536 bytes."},"publish_immediately":{"type":"boolean","title":"Publish Immediately","description":"true 이면 발행 트랜잭션 안에서 version_status='PUBLISHED' + api_products.current_version_id 동시 채움. false 면 DRAFT 상태로 발행.","default":false}},"additionalProperties":false,"type":"object","required":["version","provider","action"],"title":"InitialVersionRequest","description":"`POST /v1/products` 요청 본문에 nested로 동봉되는 초기 버전.\n\n초기 버전 동시 발행 옵션이다. 동봉 시 단일 트랜잭션으로\n`api_products` + `api_product_versions` 동시 INSERT."},"IntegratorApplicationReissueBody":{"properties":{"reissue_reason":{"type":"string","title":"Reissue Reason","description":"One of 'lost_secret' / 'security_incident' / 'rotation'."},"revoke_client_id":{"type":"string","maxLength":64,"minLength":1,"title":"Revoke Client Id"},"company_name":{"type":"string","maxLength":200,"minLength":1,"title":"Company Name"},"contact_email":{"type":"string","maxLength":320,"minLength":1,"title":"Contact Email"},"terms_agreed":{"type":"boolean","title":"Terms Agreed","description":"Must be true — integrator_platform_terms_v1 consent checkbox (ADR-068 section 4-6/2-6). Re-required on every reissue submission."},"use_case_text":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Use Case Text"},"expected_customer_count":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Expected Customer Count"},"requested_plan_code":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Requested Plan Code"}},"type":"object","required":["reissue_reason","revoke_client_id","company_name","contact_email","terms_agreed"],"title":"IntegratorApplicationReissueBody","description":"POST /v1/me/integrator-applications/reissue request body (ADR-068 reissue)."},"IntegratorApplicationSubmitBody":{"properties":{"company_name":{"type":"string","maxLength":200,"minLength":1,"title":"Company Name"},"contact_email":{"type":"string","maxLength":320,"minLength":1,"title":"Contact Email"},"terms_agreed":{"type":"boolean","title":"Terms Agreed","description":"Must be true — integrator_platform_terms_v1 consent checkbox (ADR-068 section 4-6/2-6). Re-required on every submission."},"use_case_text":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Use Case Text"},"expected_customer_count":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Expected Customer Count"},"requested_plan_code":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Requested Plan Code"}},"type":"object","required":["company_name","contact_email","terms_agreed"],"title":"IntegratorApplicationSubmitBody","description":"POST /v1/me/integrator-applications request body (ADR-068 initial application)."},"InvoiceItemResponse":{"properties":{"invoice_item_id":{"type":"integer","minimum":1.0,"title":"Invoice Item Id","description":"invoice_items.id."},"description":{"type":"string","maxLength":200,"minLength":1,"title":"Description","description":"청구 항목 설명."},"quantity":{"type":"integer","minimum":0.0,"title":"Quantity","description":"수량. 0 이상이어야 한다."},"unit_amount_minor":{"type":"integer","minimum":0.0,"title":"Unit Amount Minor","description":"단가 (minor unit 정수). 음수 금지."},"amount_minor":{"type":"integer","minimum":0.0,"title":"Amount Minor","description":"항목 합계 (minor unit 정수). 수량 x 단가와 같아야 한다. (= quantity * unit_amount_minor) 강제. 서비스 계층 검증 책임."},"currency":{"type":"string","const":"KRW","title":"Currency","description":"통화 코드. v1=KRW."},"item_kind":{"type":"string","enum":["SUBSCRIPTION","USAGE","ONE_TIME","DISCOUNT","TAX_ADJUSTMENT"],"title":"Item Kind","description":"항목 종류 (5값 enum)."},"period_start":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Period Start","description":"항목 적용 기간 시작 (구독성 항목만 채워짐)."},"period_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Period End","description":"항목 적용 기간 종료."}},"additionalProperties":false,"type":"object","required":["invoice_item_id","description","quantity","unit_amount_minor","amount_minor","currency","item_kind"],"title":"InvoiceItemResponse","description":"인보이스 항목 단일 객체 응답.\n\n자세한 SCHEMA 매핑과 제약은 이 클래스 위 주석에 있다."},"InvoiceListQuery":{"properties":{"organization_id":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Organization Id","description":"조직 PK. 본인 조직 미지정 가능(라우트 주입)."},"subscription_id":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Subscription Id","description":"구독 ID 필터."},"status":{"anyOf":[{"items":{"type":"string","enum":["DRAFT","OPEN","PAID","VOID","UNCOLLECTIBLE","REFUNDED","PARTIALLY_REFUNDED"]},"type":"array"},{"type":"null"}],"title":"Status","description":"상태 필터(다중). 미지정 시 전체."},"limit":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Limit","description":"페이지 크기.","default":20},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor","description":"이전 응답의 next_cursor."}},"type":"object","title":"InvoiceListQuery","description":"인보이스 목록 조회 쿼리.\n\n자동 필터(라우트 강제):\n- `organization_id`: 본인 조직(ADMIN은 명시 가능)\n- `env_scope = X-Env-Scope`\n\n명세에 쿼리 표가 없어 이 DTO 가 그 표의 자리를 대신한다."},"InvoiceResponse":{"properties":{"invoice_id":{"type":"integer","minimum":1.0,"title":"Invoice Id","description":"invoices.id."},"organization_id":{"type":"integer","minimum":1.0,"title":"Organization Id","description":"소유 조직 PK."},"subscription_id":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Subscription Id","description":"연결된 구독 ID. 일회성 청구 시 NULL."},"env_scope":{"type":"string","enum":["sandbox","real_test","production"],"title":"Env Scope","description":"환경 스코프."},"invoice_number":{"type":"string","maxLength":40,"minLength":1,"title":"Invoice Number","description":"인보이스 비즈 번호 'INV-YYYYMM-XXXXXX' 형식."},"status":{"type":"string","enum":["DRAFT","OPEN","PAID","VOID","UNCOLLECTIBLE","REFUNDED","PARTIALLY_REFUNDED"],"title":"Status","description":"인보이스 상태 (7값 enum)."},"subtotal_amount_minor":{"type":"integer","minimum":0.0,"title":"Subtotal Amount Minor","description":"공급가액 합계 (minor unit). 음수는 받지 않는다."},"tax_amount_minor":{"type":"integer","minimum":0.0,"title":"Tax Amount Minor","description":"부가세 합계 (minor unit). 0 허용 (영세율 등)."},"total_amount_minor":{"type":"integer","minimum":0.0,"title":"Total Amount Minor","description":"총액 (minor unit). 공급가액 + 세액과 같아야 한다. (= subtotal + tax) 강제. 서비스 계층 검증 책임."},"currency":{"type":"string","const":"KRW","title":"Currency","description":"통화 코드. v1=KRW."},"period_start":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Period Start","description":"청구 적용 기간 시작."},"period_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Period End","description":"청구 적용 기간 종료."},"issued_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Issued At","description":"OPEN 전이 시각 (DRAFT는 NULL)."},"due_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Due At","description":"지급 만기 시각."},"paid_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Paid At","description":"PAID 전이 시각 (미결제 시 NULL)."},"voided_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Voided At","description":"VOID 전이 시각 (정상 시 NULL)."},"items":{"items":{"$ref":"#/components/schemas/InvoiceItemResponse"},"type":"array","title":"Items","description":"청구 항목 배열. 빈 배열 허용(DRAFT 단계)."},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"인보이스 생성 시각 (aware datetime, naive 입력 시 422)."}},"additionalProperties":false,"type":"object","required":["invoice_id","organization_id","env_scope","invoice_number","status","subtotal_amount_minor","tax_amount_minor","total_amount_minor","currency","created_at"],"title":"InvoiceResponse","description":"인보이스 단일 객체 응답.\n\n자세한 SCHEMA 매핑과 제약은 이 클래스 위 주석에 있다."},"JobArtifactEntry":{"properties":{"artifact_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Artifact Id","description":"`art_` + 26자 ULID."},"name":{"type":"string","title":"Name","description":"받을 파일명(`업무명_YYYYMMDD[_구분].확장자`)."},"content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Type","description":"예: `application/pdf`."},"size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Size Bytes"},"sha256":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sha256","description":"받은 파일과 대조할 해시(16진수 64자)."},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At","description":"KST ISO-8601. 이 시각 뒤로는 파일을 받을 수 없다(보관 7일)."},"expired":{"type":"boolean","title":"Expired","description":"보관 기간이 지났는가. 참이면 `download_url` 이 없다."},"download_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Download Url","description":"서명된 단기 URL(15분). 지나면 결과를 다시 조회하면 새로 받는다."}},"type":"object","required":["name","expired"],"title":"JobArtifactEntry","description":"`result.artifacts[]` 항목 하나 - 상품이 낸 문서 파일.\n\n이 표준 전에 끝난 작업의 파일은 `artifact_id` · `size_bytes` · `sha256` 이 없다.\n`expires_at` 은 그 옛 파일에도 있다 - 끝난 시각에서 계산해 채운다."},"JobArtifactsDeleteResponse":{"properties":{"job_id":{"type":"string","title":"작업 번호"},"deleted_count":{"type":"integer","title":"Deleted Count","description":"이번 요청이 지운 파일 수. 이미 지웠으면 0 이다."}},"type":"object","required":["job_id","deleted_count"],"title":"JobArtifactsDeleteResponse","description":"`DELETE /v1/jobs/{job_id}/artifacts` 성공 응답 (ADR-081 D-9).\n\n같은 요청을 다시 보내도 200 이고 `deleted_count` 가 0 이다. 지운 파일은 결과 조회의\n`artifacts[]` 에서 빠진다. 문서 전용인 까닭은 `JobSubmitResponse` 의 그 문단과 같다."},"JobReadErrorEnvelope":{"properties":{"code":{"type":"string","title":"Code","description":"표준 오류 코드."},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message","description":"고객에게 보여 줄 한국어 설명."},"retryable":{"type":"boolean","title":"Retryable","description":"다시 부를 만한 실패인가. **기관 쓰기 액션이면 코드와 무관하게 거짓**이다 - 이미 기관에 닿았을 수 있어 두 번째 요청이 또 나간다."},"provider_error_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider Error Ref","description":"기관이 준 오류 식별자(있을 때만)."},"upstream_status":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Upstream Status","description":"기관 응답의 HTTP 상태(있을 때만)."}},"type":"object","required":["code","retryable"],"title":"JobReadErrorEnvelope","description":"실패한 작업의 오류 봉투 - 표준 다섯 칸."},"JobReadResponse":{"properties":{"job_id":{"type":"string","title":"작업 번호"},"status":{"type":"string","title":"Status","description":"QUEUED · RUNNING · SUCCEEDED · FAILED · TIMEOUT 등."},"env_scope":{"type":"string","title":"Env Scope"},"provider":{"type":"string","title":"Provider"},"action":{"type":"string","title":"Action"},"submitted_at":{"type":"string","title":"Submitted At","description":"KST ISO-8601."},"started_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Started At","description":"시작 전이면 없다."},"finished_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Finished At","description":"끝나기 전이면 없다."},"retry_count":{"type":"integer","title":"Retry Count"},"progress":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Progress","description":"0~100. 값과 문구는 MCP(SSE)와 같은 한 곳에서 온다(job_progress)."},"progress_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Progress Message","description":"지금 무엇을 하고 있는지 한국어 한 줄."},"retry_after_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Retry After Seconds","description":"다음 조회까지 기다릴 초. 끝난 작업에는 없다."},"error":{"anyOf":[{"$ref":"#/components/schemas/JobReadErrorEnvelope"},{"type":"null"}],"description":"FAILED · TIMEOUT 이고 코드가 있을 때만."}},"type":"object","required":["job_id","status","env_scope","provider","action","submitted_at","retry_count"],"title":"JobReadResponse","description":"`GET /v1/jobs/{job_id}` 응답."},"JobResultPayload":{"properties":{"schema":{"type":"string","title":"Schema","description":"`provider.action.vN` 형식으로 고정(정본 §4-3)."},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data","description":"인라인 결과(요약). 이 표준 전 저장소 결과면 없다."},"artifacts":{"items":{"$ref":"#/components/schemas/JobArtifactEntry"},"type":"array","title":"Artifacts","description":"문서 파일 목록. 파일을 내지 않는 작업이면 빈 배열이다."}},"type":"object","required":["schema"],"title":"JobResultPayload","description":"`GET /v1/jobs/{job_id}/result` 의 `result` 칸 - 정본 §4-3.\n\n`data` 는 인라인 결과(요약)이고 `artifacts` 는 문서 파일 목록이다(항상 배열). 이 표준 전에\n저장소로 끝난 작업은 `data` 가 없고 파일 하나가 `artifacts` 한 항목으로 온다. 이 모델은\n**문서 전용**이고(위 `JobSubmitResponse` 의 그 문단) 값의 강제는 DB 와\n`serialize_job_result_response` 의 다층 안전망이 한다. 여기서 또 검증하면 판정이 두 벌이 된다.\n\n`result_schema` 라는 파이썬 이름에 `alias=\"schema\"` 를 둔 까닭: 정본 칸 이름은 `schema` 인데\n그 이름을 그대로 쓰면 pydantic 이 `Field name \"schema\" shadows an attribute in parent\n\"BaseModel\"` 경고를 낸다(직접 넣어 재서 확인했다). alias 를 쓰면 경고가 0 이고 OpenAPI 의 칸\n이름은 `schema` 그대로다 - 정본과 1:1 이 유지된다."},"JobResultResponse":{"properties":{"job_id":{"type":"string","title":"작업 번호"},"status":{"type":"string","title":"Status","description":"이 본문이 나올 때는 항상 `SUCCEEDED` 다."},"result":{"$ref":"#/components/schemas/JobResultPayload"},"finished_at":{"type":"string","title":"Finished At","description":"KST ISO-8601."}},"type":"object","required":["job_id","status","result","finished_at"],"title":"JobResultResponse","description":"`GET /v1/jobs/{job_id}/result` 성공 응답 - 정본 §4-3 의 네 칸과 1:1.\n\n이 라우트는 `status == 'SUCCEEDED'` 일 때만 이 본문을 낸다(그 아닌 상태는 409). 그래서\n`finished_at` 이 필수다 - `serialize_job_result_response` 가 그것이 비면 ValueError 로\n격상하는 다층 안전망을 둔다.\n\n문서 전용인 까닭은 `JobSubmitResponse` 의 그 문단과 같다."},"JobSubmitRequest":{"properties":{"provider":{"type":"string","title":"Provider","description":"요청 provider (예: hometax)"},"action":{"type":"string","title":"Action","description":"요청 action — provider 종속 enum"},"account_link_id":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Account Link Id","description":"연동 계정 식별자 (선택). 생략 시 API 키 기반 자동 해결. 다중 인증서 환경에서만 명시."},"params":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Params","description":"액션별 파라미터 (선택). 평문 PII 직접 전송 금지 — encrypted_fields 사용."},"encrypted_fields":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Encrypted Fields","description":"RSA-OAEP base64 암호문 필드 (선택). 평문 dict 저장 금지 — base64 형식 강제."}},"type":"object","required":["provider","action"],"title":"JobSubmitRequest","description":"`POST /v1/jobs` 요청 본문."},"JobSubmitResponse":{"properties":{"job_id":{"type":"string","title":"작업 번호","description":"`job_` + 26자 ULID."},"status":{"type":"string","title":"Status","description":"새 접수면 `QUEUED`. 멱등 재생이면 **그 작업의 지금 상태**다 - 끝난 작업을 `QUEUED` 라고 하지 않는다(멱등 재호출 규칙)."},"env_scope":{"type":"string","title":"Env Scope","description":"요청한 환경 그대로. `sandbox` · `real_test` · `production`."},"provider":{"type":"string","title":"Provider"},"action":{"type":"string","title":"Action"},"submitted_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Submitted At","description":"KST ISO-8601. 접수 시각을 아직 모르면 없다(조립부가 None 을 싣는 갈래가 있다)."}},"type":"object","required":["job_id","status","env_scope","provider","action"],"title":"JobSubmitResponse","description":"`POST /v1/jobs` 성공 응답 - `202 Accepted` 본문과 **1:1**. 칸은 여섯이다."},"McpJsonRpcErrorBody":{"properties":{"code":{"type":"integer","title":"Code","description":"JSON-RPC 오류 코드. 우리 코드는 -32001 대역을 쓴다."},"message":{"type":"string","title":"Message","description":"고객 AI 에게 보이는 한국어 문장."},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data","description":"구조화 칸. 없으면 키 자체가 없다. reason · error_code · safe_to_retry · next_action · \"xdata.kr/next\" 가 여기 실린다."}},"type":"object","required":["code","message"],"title":"McpJsonRpcErrorBody","description":"오류 봉투의 ``error`` 칸 - ``McpError.to_dict()`` 가 만드는 모양 그대로."},"McpJsonRpcResponse":{"properties":{"jsonrpc":{"type":"string","const":"2.0","title":"Jsonrpc","description":"늘 \"2.0\" 이다."},"id":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"null"}],"title":"Id","description":"요청의 id. 요청을 파싱하지 못했으면 null 이다."},"result":{"anyOf":[{},{"type":"null"}],"title":"Result","description":"성공일 때의 결과. 오류일 때는 키 자체가 없다."},"error":{"anyOf":[{"$ref":"#/components/schemas/McpJsonRpcErrorBody"},{"type":"null"}],"description":"오류일 때의 봉투. 성공일 때는 키 자체가 없다."}},"type":"object","required":["jsonrpc"],"title":"McpJsonRpcResponse","description":"``POST /mcp`` 의 200 응답 - JSON-RPC 2.0 봉투.\n\n``result`` 와 ``error`` 는 **둘 중 하나만** 실린다(JSON-RPC 2.0 규약). 둘 다 선택으로\n둔 까닭: 하나를 필수로 하면 다른 갈래가 규격을 위반하게 되고, ``oneOf`` 로 쪼개면 같은\n봉투가 모델 둘이 되어 읽는 쪽이 그 둘을 맞춰야 한다. 그 배타는 문장으로 적는다.\n\n**이 모델은 ``response_model`` 로 달지 않는다.** 그 라우트 핸들러는\n``Union[JSONResponse, StreamingResponse]`` 를 돌려주고, 같은 200 이 협상에 따라\n``text/event-stream`` 일 수 있다 - ``response_model`` 은 미디어 하나를 강제하므로\n스트리밍 갈래에서 규격이 거짓이 된다. ``responses={200: ...}`` 로 **문서만** 더한다\n(그 자리는 런타임을 건드리지 않는다)."},"MePasswordChangeBody":{"properties":{"current_password":{"type":"string","title":"Current Password","description":"Current password for re-authentication."},"new_password":{"type":"string","title":"New Password","description":"New password (server enforces the minimum length)."}},"type":"object","required":["current_password","new_password"],"title":"MePasswordChangeBody","description":"POST /v1/me/password request body."},"MembershipMeResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"조회 성공 여부. 이 라우트는 성공 시 늘 true 다."},"policy_decision_id":{"type":"string","title":"Policy Decision Id","description":"이 조회를 평가한 정책 결정의 식별자. 문의 시 이 값을 전달한다."},"principal_kind":{"anyOf":[{"type":"string","enum":["client","console_user","admin_user","legacy_api_key","system"]},{"type":"null"}],"title":"Principal Kind","description":"인증 주체의 종류."},"organization_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Organization Id","description":"소속 조직 식별자. 조직 밖 주체는 없다."},"organization_role":{"anyOf":[{"type":"string","enum":["OWNER","ADMIN","MEMBER"]},{"type":"null"}],"title":"Organization Role","description":"그 조직에서의 역할."},"membership_tier":{"anyOf":[{"type":"string","enum":["FREE","PAID"]},{"type":"null"}],"title":"Membership Tier","description":"멤버십 등급."},"plan_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan Name","description":"멤버십이 가리키는 요금제의 공개명(예: 라이트, 스탠다드, PRO). 멤버십이 없으면 없다. 주의: 가입 직후 데모 단계 계정도 공개명은 「라이트」 로 나온다 - 단계(데모 vs 정식)를 가르려면 이 이름이 아니라 membership_tier(FREE 또는 PAID)와 환경을 본다."},"subscription_status":{"anyOf":[{"type":"string","enum":["ACTIVE","PAUSED","CANCELED","EXPIRED"]},{"type":"null"}],"title":"Subscription Status","description":"구독 상태."},"quota_after":{"anyOf":[{"$ref":"#/components/schemas/MembershipQuotaAfterModel"},{"type":"null"}],"description":"현재 사용 토큰 쿼터 스냅샷. 이 조회(GET /v1/membership/me, request_kind=membership_self_read)는 **쿼터를 쓰지 않는다** - 읽기 전용 스냅샷이라 이 값을 읽어도 한도가 줄지 않는다(auth_policy_quota.QUOTA_SNAPSHOT_REQUEST_KINDS). 한도가 없는 환경에서는 없다. (rate_limit_after 와 달리 쿼터는 이 조회로 차감되지 않는다 - 이 조회가 쓰는 것은 프로세스 레이트리밋 토큰 1개뿐이다.)"},"quota_month_after":{"anyOf":[{"$ref":"#/components/schemas/MembershipQuotaAfterModel"},{"type":"null"}],"description":"이번 주기(정식 환경은 결제 주기)의 월 사용량. period 는 month 다. 그 환경의 요금제가 월 한도를 두지 않으면 없다."},"demo_ends_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Demo Ends At","description":"데모 환경이 닫히는 시각(ISO 8601, KST). 기한이 없거나 데모 승인 전이면 없다."},"rate_limit_after":{"$ref":"#/components/schemas/MembershipRateLimitAfterModel","description":"이 조회를 센 뒤의 레이트리밋."}},"type":"object","required":["success","policy_decision_id","rate_limit_after"],"title":"MembershipMeResponse","description":"`GET /v1/membership/me` 의 200 응답.\n\n**Optional 을 넉넉히 둔 이유**: 이 응답은 주체에 따라 칸이 비는 것이 정상이다. 조직에 속하지\n않은 주체는 `organization_id` 와 `organization_role` 이 없고, 운영 환경은 무제한이라\n`quota_after` 가 없다(`AuthPolicyDecision.quota_after` 가 `Optional` 인 그 까닭).\n`rate_limit_after` 만 선언이 필수다 - 결정 객체에서도 필수 칸이다."},"MembershipQuotaAfterModel":{"properties":{"limit":{"type":"integer","title":"Limit","description":"그 주기에 허용된 사용 토큰 수."},"used":{"type":"integer","title":"Used","description":"그 주기에 누적된 사용 토큰 수."},"remaining":{"type":"integer","title":"Remaining","description":"남은 사용 토큰 수."},"reset_at":{"type":"string","title":"Reset At","description":"주기가 초기화되는 시각(ISO 8601, KST)."},"period":{"type":"string","enum":["day","month"],"title":"Period","description":"이 수치가 세는 주기."}},"type":"object","required":["limit","used","remaining","reset_at","period"],"title":"MembershipQuotaAfterModel","description":"이 요청을 센 뒤의 쿼터. `QuotaSnapshot.to_dict(include_key=False)` 의 거울이다.\n\n`key` 칸은 **일부러 없다**(모듈 머리말). 테스트 환경에서만 의미가 있어 상위 칸이 선택이다."},"MembershipRateLimitAfterModel":{"properties":{"window_seconds":{"type":"integer","title":"Window Seconds","description":"평가 윈도우 길이(초)."},"limit":{"type":"integer","title":"Limit","description":"윈도우당 허용 횟수."},"used":{"type":"integer","title":"Used","description":"현 윈도우 누적 횟수."},"remaining":{"type":"integer","title":"Remaining","description":"남은 횟수."},"reset_at":{"type":"string","title":"Reset At","description":"윈도우가 초기화되는 시각(ISO 8601)."}},"type":"object","required":["window_seconds","limit","used","remaining","reset_at"],"title":"MembershipRateLimitAfterModel","description":"이 요청을 센 뒤의 레이트리밋. `RateLimitSnapshot` 의 거울이다."},"MoneyMinor":{"properties":{"amount_minor":{"type":"integer","minimum":0.0,"title":"Amount Minor","description":"minor unit 정수 금액. KRW는 원 단위. 음수 금지 (SCHEMA CHECK 정합)."},"currency":{"type":"string","const":"KRW","title":"Currency","description":"통화 코드 (v1=KRW). 세 글자여야 한다."},"tax_included":{"type":"boolean","title":"Tax Included","description":"부가세 포함 여부. SCHEMA NOT NULL."}},"additionalProperties":false,"type":"object","required":["amount_minor","currency","tax_included"],"title":"MoneyMinor","description":"minor unit 정수 기반 금액 객체.\n\nSCHEMA 컬럼 `price_amount_minor BIGINT NOT NULL CHECK (>= 0)` +\n`currency CHAR(3) DEFAULT 'KRW'` + `tax_included BOOLEAN DEFAULT TRUE`를\nAPI 응답의 nested `price` 객체로 묶는다.\n\n- `amount_minor`: 1회 청구/결제 금액의 minor unit 정수(KRW는 원 단위, JPY는 엔 단위).\n  절대 float/Decimal 사용 금지(부동소수 오차 + JSON 직렬화 일관성).\n- `currency`: v1 단일 KRW. 통화 확장은 별도 ADR.\n- `tax_included`: 부가세 포함 여부. NULL 금지(SCHEMA NOT NULL DEFAULT TRUE 정합)."},"OAuthApproveBody":{"properties":{"organization_id":{"type":"integer","minimum":1.0,"title":"Organization Id"}},"type":"object","required":["organization_id"],"title":"OAuthApproveBody"},"OfflineBillingProfileResponse":{"properties":{"organization_id":{"type":"integer","title":"Organization Id"},"env_scope":{"type":"string","enum":["sandbox","real_test","production"],"title":"Env Scope"},"tax_invoice_required":{"type":"boolean","title":"Tax Invoice Required","default":false},"business_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Name"},"business_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Number"},"representative_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Representative Name"},"tax_invoice_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tax Invoice Email"},"depositor_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Depositor Name"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"additionalProperties":false,"type":"object","required":["organization_id","env_scope"],"title":"OfflineBillingProfileResponse"},"OfflineBillingProfileUpsertRequest":{"properties":{"tax_invoice_required":{"type":"boolean","title":"Tax Invoice Required","default":false},"business_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Business Name"},"business_number":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Business Number"},"representative_name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Representative Name"},"tax_invoice_email":{"anyOf":[{"type":"string","maxLength":254},{"type":"null"}],"title":"Tax Invoice Email"},"depositor_name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Depositor Name"}},"additionalProperties":false,"type":"object","title":"OfflineBillingProfileUpsertRequest"},"OfflineOrderCreateRequest":{"properties":{"plan_id":{"type":"integer","minimum":1.0,"title":"Plan Id","description":"PAID 플랜 PK (MONTHLY 또는 YEARLY_BRIDGE)"},"billing_term":{"type":"string","enum":["MONTHLY","YEARLY"],"title":"Billing Term","description":"MONTHLY | YEARLY"},"depositor_name":{"type":"string","maxLength":100,"minLength":1,"title":"Depositor Name"},"tax_invoice_required":{"type":"boolean","title":"Tax Invoice Required","default":false},"business_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Business Name"},"business_number":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Business Number"},"representative_name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Representative Name"},"tax_invoice_email":{"anyOf":[{"type":"string","maxLength":254},{"type":"null"}],"title":"Tax Invoice Email"},"addon_product_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Addon Product Ids"}},"additionalProperties":false,"type":"object","required":["plan_id","billing_term","depositor_name"],"title":"OfflineOrderCreateRequest"},"OfflineOrderResponse":{"properties":{"order_id":{"type":"integer","title":"Order Id"},"order_number":{"type":"string","title":"Order Number"},"organization_id":{"type":"integer","title":"Organization Id"},"env_scope":{"type":"string","enum":["sandbox","real_test","production"],"title":"Env Scope"},"plan_id":{"type":"integer","title":"Plan Id"},"billing_term":{"type":"string","enum":["MONTHLY","YEARLY"],"title":"Billing Term"},"subscription_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Subscription Id"},"invoice_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Invoice Id"},"payment_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Payment Id"},"total_amount_minor":{"type":"integer","title":"Total Amount Minor"},"currency":{"type":"string","title":"Currency"},"status":{"type":"string","enum":["AWAITING_DEPOSIT","DEPOSIT_CONFIRMED","EXPIRED","CANCELED"],"title":"Status"},"depositor_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Depositor Name"},"tax_invoice_required":{"type":"boolean","title":"Tax Invoice Required"},"deposit_bank_name":{"type":"string","title":"Deposit Bank Name"},"deposit_account_number":{"type":"string","title":"Deposit Account Number"},"deposit_account_holder":{"type":"string","title":"Deposit Account Holder"},"deposit_deadline_at":{"type":"string","format":"date-time","title":"Deposit Deadline At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"order_kind":{"type":"string","enum":["NEW","RENEWAL"],"title":"Order Kind","default":"NEW"}},"additionalProperties":false,"type":"object","required":["order_id","order_number","organization_id","env_scope","plan_id","billing_term","subscription_id","invoice_id","payment_id","total_amount_minor","currency","status","depositor_name","tax_invoice_required","deposit_bank_name","deposit_account_number","deposit_account_holder","deposit_deadline_at","created_at"],"title":"OfflineOrderResponse"},"OfflineRenewalOfferResponse":{"properties":{"eligible":{"type":"boolean","title":"Eligible"},"reason":{"anyOf":[{"type":"string","enum":["NOT_SUBSCRIBED","NOT_ACTIVE","NOT_OFFLINE","WINDOW_NOT_OPEN","WINDOW_CLOSED","ORDER_PENDING","PLAN_UNAVAILABLE"]},{"type":"null"}],"title":"Reason"},"subscription_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Subscription Id"},"plan_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Plan Id"},"billing_term":{"anyOf":[{"type":"string","enum":["MONTHLY","YEARLY"]},{"type":"null"}],"title":"Billing Term"},"current_period_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Current Period End"},"new_period_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"New Period End"},"window_opens_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Window Opens At"},"window_closes_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Window Closes At"},"total_amount_minor":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Amount Minor"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"}},"additionalProperties":false,"type":"object","required":["eligible"],"title":"OfflineRenewalOfferResponse","description":"지금 이 조직이 무통장 구독을 연장할 수 있는가 + 연장하면 어떻게 되는가. ``eligible=false`` 면 ``reason`` 이 이유다."},"OfflineRenewalOrderCreateRequest":{"properties":{"depositor_name":{"type":"string","maxLength":100,"minLength":1,"title":"Depositor Name"},"tax_invoice_required":{"type":"boolean","title":"Tax Invoice Required","default":false},"business_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Business Name"},"business_number":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Business Number"},"representative_name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Representative Name"},"tax_invoice_email":{"anyOf":[{"type":"string","maxLength":254},{"type":"null"}],"title":"Tax Invoice Email"}},"additionalProperties":false,"type":"object","required":["depositor_name"],"title":"OfflineRenewalOrderCreateRequest","description":"무통장 연장 주문 생성 - 요금제 · 주기 · 부가 상품은 이용 중인 구독에서 온다(고객이 고르지 않는다)."},"OrganizationInviteAcceptRequest":{"properties":{"token":{"type":"string","title":"Token","description":"Organization invite token from email link."}},"type":"object","required":["token"],"title":"OrganizationInviteAcceptRequest","description":"POST /v1/organization-invites/accept request body (CR-FE-029)."},"OrganizationProfilePatchRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Organization display name (1-200 chars when provided)."},"business_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Number","description":"Business registration number: 10 digits (hyphens or spaces allowed, max 20 chars) that must pass the NTS check-digit rule. An empty string clears it."}},"type":"object","title":"OrganizationProfilePatchRequest","description":"PATCH /v1/me/organization request body (CR-FE-002)."},"PackArtifactsDeleteResponse":{"properties":{"pack_run_id":{"type":"string","title":"Pack Run Id","description":"파일을 지운 묶음 실행 번호."},"deleted_count":{"type":"integer","title":"Deleted Count","description":"이번 요청이 지운 파일 수. 이미 지웠으면 0 이다."}},"type":"object","required":["pack_run_id","deleted_count"],"title":"PackArtifactsDeleteResponse","description":"`DELETE /v1/packs/{pack_run_id}/artifacts` 성공 응답.\n\n같은 요청을 다시 보내도 200 이고 `deleted_count` 가 0 이다. 지운 파일은 상태 조회의\n`result.artifacts` 에서 빠진다."},"PackLegEnvelope":{"properties":{"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"작업 번호","description":"이 단계로 제출된 호출의 번호. 아직 제출되지 않았으면 없다."},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider","description":"이 단계가 부른 상품 묶음."},"action":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action","description":"이 단계가 부른 기능."},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"이 단계 호출의 상태. 아직 제출되지 않았으면 없다."}},"type":"object","title":"PackLegEnvelope","description":"묶음을 이루는 호출 하나의 지금 상태."},"PackResultPayload":{"properties":{"artifacts":{"items":{"$ref":"#/components/schemas/JobArtifactEntry"},"type":"array","title":"Artifacts","description":"문서 파일 목록. 파일을 내지 않는 묶음이면 빈 배열이다."}},"additionalProperties":true,"type":"object","title":"PackResultPayload","description":"묶음 실행이 성공으로 끝났을 때의 결과.\n\n`artifacts` 는 문서 파일 목록이다(항상 배열, 파일을 내지 않는 묶음이면 빈 배열). 나머지 칸은 묶음\n종류마다 다르다."},"PackRunErrorEnvelope":{"properties":{"code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Code","description":"숫자 오류 코드. 표준 오류 코드 문자열은 `data.error_code` 에 있다."},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message","description":"고객에게 보여 줄 한국어 설명."},"data":{"anyOf":[{},{"type":"null"}],"title":"Data","description":"오류의 추가 정보. `error_code`(표준 오류 코드), `safe_to_retry`(다시 불러도 되는가)가 들어 있을 수 있다. 문서 파일을 만들지 못한 실패에는 받은 자료가 함께 들어 있다."}},"type":"object","title":"PackRunErrorEnvelope","description":"실패한 묶음 실행의 오류."},"PackRunResponse":{"properties":{"pack_run_id":{"type":"string","title":"Pack Run Id","description":"묶음 실행 번호. 상태 조회와 결과 파일 삭제의 주소에 쓴다."},"status":{"type":"string","title":"Status","description":"RUNNING, SUCCEEDED, FAILED, TIMEOUT 중 하나."},"env_scope":{"type":"string","title":"Env Scope","description":"요청한 환경 그대로. `sandbox`, `real_test`, `production` 중 하나."},"provider":{"type":"string","title":"Provider"},"action":{"type":"string","title":"Action"},"submitted_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Submitted At","description":"KST ISO-8601. 접수한 시각."},"completed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Completed At","description":"KST ISO-8601. 끝나기 전이면 없다."},"progress":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Progress","description":"0~100. 값과 문구는 단일 작업 조회와 같은 규칙에서 온다."},"progress_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Progress Message","description":"지금 무엇을 하고 있는지 한국어 한 줄. 끝난 실행에는 없다."},"retry_after_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Retry After Seconds","description":"다음 조회까지 기다릴 초. 끝난 실행에는 없다."},"legs":{"items":{"$ref":"#/components/schemas/PackLegEnvelope"},"type":"array","title":"Legs","description":"묶음을 이루는 호출 목록. 접수 직후에는 아직 제출되지 않은 단계의 칸이 비어 있다."},"result":{"anyOf":[{"$ref":"#/components/schemas/PackResultPayload"},{"type":"null"}],"description":"SUCCEEDED 로 끝났을 때의 결과. 끝나기 전이거나 실패했으면 없다."},"error":{"anyOf":[{"$ref":"#/components/schemas/PackRunErrorEnvelope"},{"type":"null"}],"description":"FAILED 또는 TIMEOUT 으로 끝났을 때의 오류."}},"type":"object","required":["pack_run_id","status","env_scope","provider","action","legs"],"title":"PackRunResponse","description":"묶음 실행의 접수 응답과 상태 조회 응답 - 두 응답은 같은 칸을 가진다."},"PackRunSubmitRequest":{"properties":{"provider":{"type":"string","minLength":1,"title":"Provider","description":"팩 provider (조합 상품)"},"action":{"type":"string","minLength":1,"title":"Action","description":"팩 action"},"params":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Params","description":"팩 파라미터 (선택). 실행기가 leg 로 나눠 쓴다."}},"additionalProperties":false,"type":"object","required":["provider","action"],"title":"PackRunSubmitRequest","description":"팩 실행 제출 본문. 받는 이름은 셋뿐이고 나머지는 **거절**한다.\n\n이름 셋은 단일 작업 제출 본문과 같은 낱말이라(`provider` · `action` · `params`) 고객이 두 계약을\n따로 배우지 않는다."},"PageEnvelope_InvoiceResponse_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/InvoiceResponse"},"type":"array","title":"Items","description":"Page result items. Empty list allowed."},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Opaque cursor for next page, or null on last page."},"has_more":{"type":"boolean","title":"Has More","description":"Whether another page exists. False when next_cursor is null.","default":false}},"additionalProperties":false,"type":"object","title":"PageEnvelope[InvoiceResponse]"},"PageEnvelope_PaymentMethodResponse_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PaymentMethodResponse"},"type":"array","title":"Items","description":"Page result items. Empty list allowed."},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Opaque cursor for next page, or null on last page."},"has_more":{"type":"boolean","title":"Has More","description":"Whether another page exists. False when next_cursor is null.","default":false}},"additionalProperties":false,"type":"object","title":"PageEnvelope[PaymentMethodResponse]"},"PageEnvelope_PaymentResponse_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PaymentResponse"},"type":"array","title":"Items","description":"Page result items. Empty list allowed."},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Opaque cursor for next page, or null on last page."},"has_more":{"type":"boolean","title":"Has More","description":"Whether another page exists. False when next_cursor is null.","default":false}},"additionalProperties":false,"type":"object","title":"PageEnvelope[PaymentResponse]"},"PageEnvelope_PlanProductMappingResponseItem_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PlanProductMappingResponseItem"},"type":"array","title":"Items","description":"Page result items. Empty list allowed."},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Opaque cursor for next page, or null on last page."},"has_more":{"type":"boolean","title":"Has More","description":"Whether another page exists. False when next_cursor is null.","default":false}},"additionalProperties":false,"type":"object","title":"PageEnvelope[PlanProductMappingResponseItem]"},"PageEnvelope_PlanProductMappingWithPlanItem_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PlanProductMappingWithPlanItem"},"type":"array","title":"Items","description":"Page result items. Empty list allowed."},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Opaque cursor for next page, or null on last page."},"has_more":{"type":"boolean","title":"Has More","description":"Whether another page exists. False when next_cursor is null.","default":false}},"additionalProperties":false,"type":"object","title":"PageEnvelope[PlanProductMappingWithPlanItem]"},"PageEnvelope_PlanResponse_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PlanResponse"},"type":"array","title":"Items","description":"Page result items. Empty list allowed."},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Opaque cursor for next page, or null on last page."},"has_more":{"type":"boolean","title":"Has More","description":"Whether another page exists. False when next_cursor is null.","default":false}},"additionalProperties":false,"type":"object","title":"PageEnvelope[PlanResponse]"},"PageEnvelope_ProductListItem_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ProductListItem"},"type":"array","title":"Items","description":"Page result items. Empty list allowed."},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Opaque cursor for next page, or null on last page."},"has_more":{"type":"boolean","title":"Has More","description":"Whether another page exists. False when next_cursor is null.","default":false}},"additionalProperties":false,"type":"object","title":"PageEnvelope[ProductListItem]"},"PageEnvelope_ProductVersionResponse_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ProductVersionResponse"},"type":"array","title":"Items","description":"Page result items. Empty list allowed."},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Opaque cursor for next page, or null on last page."},"has_more":{"type":"boolean","title":"Has More","description":"Whether another page exists. False when next_cursor is null.","default":false}},"additionalProperties":false,"type":"object","title":"PageEnvelope[ProductVersionResponse]"},"PageEnvelope_RefundResponse_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/RefundResponse"},"type":"array","title":"Items","description":"Page result items. Empty list allowed."},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Opaque cursor for next page, or null on last page."},"has_more":{"type":"boolean","title":"Has More","description":"Whether another page exists. False when next_cursor is null.","default":false}},"additionalProperties":false,"type":"object","title":"PageEnvelope[RefundResponse]"},"PageEnvelope_SubscriptionResponse_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/SubscriptionResponse"},"type":"array","title":"Items","description":"Page result items. Empty list allowed."},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Opaque cursor for next page, or null on last page."},"has_more":{"type":"boolean","title":"Has More","description":"Whether another page exists. False when next_cursor is null.","default":false}},"additionalProperties":false,"type":"object","title":"PageEnvelope[SubscriptionResponse]"},"PasswordResetConfirmBody":{"properties":{"token":{"type":"string","title":"Token","description":"Password reset token from email link."},"new_password":{"type":"string","title":"New Password","description":"New account password."}},"type":"object","required":["token","new_password"],"title":"PasswordResetConfirmBody","description":"POST /v1/auth/password-reset/confirm request body (CR-FE-004)."},"PasswordResetRequestBody":{"properties":{"email":{"type":"string","title":"Email","description":"Account email address."}},"type":"object","required":["email"],"title":"PasswordResetRequestBody","description":"POST /v1/auth/password-reset/request request body (CR-FE-004)."},"PaymentListQuery":{"properties":{"organization_id":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Organization Id","description":"조직 PK. 본인 조직 미지정 가능(라우트 주입)."},"invoice_id":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Invoice Id","description":"인보이스 ID 필터."},"subscription_id":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Subscription Id","description":"구독 ID 필터."},"status":{"anyOf":[{"items":{"type":"string","enum":["INITIATED","PENDING","SUCCEEDED","FAILED","CANCELED","EXPIRED"]},"type":"array"},{"type":"null"}],"title":"Status","description":"상태 필터(다중). 미지정 시 전체."},"limit":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Limit","description":"페이지 크기.","default":20},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor","description":"이전 응답의 next_cursor."}},"type":"object","title":"PaymentListQuery","description":"결제 목록 조회 쿼리.\n\n자동 필터(라우트 강제):\n- `organization_id`: 본인 조직(ADMIN은 명시 가능)\n- `env_scope = X-Env-Scope`\n\n명세에 쿼리 표가 없어 이 DTO 가 그 표의 자리를 대신한다."},"PaymentMethodCapabilitiesResponse":{"properties":{"payup_hub_enabled":{"type":"boolean","title":"Payup Hub Enabled","description":"자동결제(월 정기결제) 카드 등록을 받는가. false 면 화면은 등록 진입점을 그리지 않는다."}},"additionalProperties":false,"type":"object","required":["payup_hub_enabled"],"title":"PaymentMethodCapabilitiesResponse","description":"결제수단 기능 켜짐 여부 (`GET /v1/payment-methods/capabilities`, U3-H)."},"PaymentMethodListQuery":{"properties":{"include_revoked":{"type":"boolean","title":"Include Revoked","description":"REVOKED 결제수단 포함 여부. 기본 False (활성만 노출).","default":false},"limit":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Limit","description":"페이지 크기.","default":20},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor","description":"이전 응답의 next_cursor."}},"type":"object","title":"PaymentMethodListQuery","description":"결제수단 목록 조회 쿼리.\n\n자동 필터(라우트/서비스 강제 적용, 쿼리 미노출):\n- `organization_id = principal.organization_id`\n- `env_scope = X-Env-Scope`\n- `status != 'REVOKED'` (REVOKED는 명시적 옵션으로만 포함)"},"PaymentMethodRegisterFromBillingAuthRequest":{"properties":{"organization_id":{"type":"integer","minimum":1.0,"title":"Organization Id"},"method_kind":{"type":"string","enum":["CARD","VBANK","MOBILE","SIMPLE","PAYPAL","OTHER"],"title":"Method Kind","default":"CARD"},"pg_provider":{"type":"string","enum":["portone","toss","payup","offline"],"title":"Pg Provider","default":"toss"},"auth_key":{"type":"string","maxLength":512,"minLength":1,"title":"Auth Key"},"customer_key":{"type":"string","maxLength":300,"minLength":2,"title":"Customer Key"},"session_proof":{"type":"string","maxLength":128,"minLength":64,"title":"Session Proof"},"label":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Label"}},"additionalProperties":false,"type":"object","required":["organization_id","auth_key","customer_key","session_proof"],"title":"PaymentMethodRegisterFromBillingAuthRequest","description":"Toss from-billing-auth register request."},"PaymentMethodRegisterRequest":{"properties":{"organization_id":{"type":"integer","minimum":1.0,"title":"Organization Id","description":"결제수단 소유 조직 PK. 주체 조직과 일치 강제(라우트 검증)."},"method_kind":{"type":"string","enum":["CARD","VBANK","MOBILE","SIMPLE","PAYPAL","OTHER"],"title":"Method Kind","description":"결제수단 종류. v1은 CARD 우선."},"pg_provider":{"type":"string","enum":["portone","toss","payup","offline"],"title":"Pg Provider","description":"PG 사업자. v1=portone."},"billing_key":{"type":"string","maxLength":255,"minLength":1,"title":"Billing Key","description":"PG 빌링키(토큰). PG SDK 토큰화 결과만 허용. 평문 카드정보 전송 금지. repr=False로 로그/디버그 노출 차단."},"label":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Label","description":"사용자 표시 라벨 (예: \"신한카드 1234\")."},"last4":{"anyOf":[{"type":"string","maxLength":8,"minLength":2},{"type":"null"}],"title":"Last4","description":"마스킹 표시용 마지막 자리(평문 카드번호 아님)."},"issuer_name":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Issuer Name","description":"발급사 명칭 (예: 신한카드, 국민카드)."},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At","description":"카드/수단 만료 시각 (TIMESTAMPTZ). AwareDatetime: naive 입력 시 422 VALIDATION_REQUEST_INVALID."}},"additionalProperties":false,"type":"object","required":["organization_id","method_kind","pg_provider","billing_key"],"title":"PaymentMethodRegisterRequest","description":"결제수단 등록 요청.\n\n클라이언트는 PG SDK로 카드 토큰화를 마친 뒤 `billing_key`만 본 API로 전달한다.\n평문 카드정보(PAN/CVV/유효기간)는 절대 전송되지 않으며, 위반 시 422 VALIDATION_*\n+ 보안 사고로 분류된다.\n\n`organization_id`는 요청 주체의 `PrincipalContext.organization_id`와 일치해야 하며,\n불일치 시 라우트 계층에서 `403 AUTHZ_FORBIDDEN`을 반환한다(본 DTO는 입력 형식만 검증)."},"PaymentMethodResponse":{"properties":{"payment_method_id":{"type":"integer","minimum":1.0,"title":"Payment Method Id","description":"payment_methods.id (BIGSERIAL PK)."},"organization_id":{"type":"integer","minimum":1.0,"title":"Organization Id","description":"소유 조직 PK."},"method_kind":{"type":"string","enum":["CARD","VBANK","MOBILE","SIMPLE","PAYPAL","OTHER"],"title":"Method Kind","description":"결제수단 종류."},"pg_provider":{"type":"string","enum":["portone","toss","payup","offline"],"title":"Pg Provider","description":"PG 사업자."},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label","description":"사용자 표시 라벨."},"last4":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last4","description":"마스킹 마지막 자리."},"issuer_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Issuer Name","description":"발급사 명칭."},"status":{"type":"string","enum":["ACTIVE","REVOKED","EXPIRED"],"title":"Status","description":"결제수단 상태."},"env_scope":{"type":"string","enum":["sandbox","real_test","production"],"title":"Env Scope","description":"환경 스코프."},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At","description":"만료 시각 (aware datetime, naive 입력 시 422)."},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"등록 시각 (aware datetime, naive 입력 시 422)."}},"additionalProperties":false,"type":"object","required":["payment_method_id","organization_id","method_kind","pg_provider","status","env_scope","created_at"],"title":"PaymentMethodResponse","description":"결제수단 단일 객체 응답.\n\n`billing_key` 필드 부재가 본 응답 모델의 가장 중요한 정합 강제 — 응답 직렬화 시\n평문 PG 토큰이 절대 외부로 노출되지 않는다 - 전송 금지와 저장 금지를 함께 지킨다.\n\nSCHEMA → DTO 매핑:\n- `payment_methods.id` → `payment_method_id`.\n- `organization_id/method_kind/provider/label/last4/issuer_name/status/expires_at/created_at`\n  → 직접 매핑.\n- `billing_key/metadata/updated_at/deleted_at`는 외부 노출 X."},"PaymentResponse":{"properties":{"payment_id":{"type":"integer","minimum":1.0,"title":"Payment Id","description":"payments.id."},"organization_id":{"type":"integer","minimum":1.0,"title":"Organization Id","description":"소유 조직 PK."},"invoice_id":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Invoice Id","description":"연결된 인보이스 ID (선택)."},"invoice_number":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Invoice Number","description":"연결된 청구서의 번호 'INV-YYYYMM-XXXXXX' - 청구서 목록의 번호와 같은 값이라 고객이 문의할 때 한 이름으로 부른다. 청구서가 없으면 null. 결제 조회(GET /v1/payments · /v1/payments/{id})가 읽어서 채운다 - 결제 행에는 없는 값이라 그 밖의 경로가 돌려주는 결제 객체에서는 비어 있을 수 있다."},"subscription_id":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Subscription Id","description":"연결된 구독 ID (선택)."},"payment_method_id":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Payment Method Id","description":"사용된 결제수단 ID (선택)."},"env_scope":{"type":"string","enum":["sandbox","real_test","production"],"title":"Env Scope","description":"환경 스코프."},"pg_provider":{"type":"string","enum":["portone","toss","payup","offline"],"title":"Pg Provider","description":"PG 사업자."},"provider_payment_id":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Provider Payment Id","description":"PG 발급 결제 식별자 (imp_uid 등). BFF/관리자/환불 입력용. INITIATED 시점에는 NULL일 수 있다."},"amount_minor":{"type":"integer","exclusiveMinimum":0.0,"title":"Amount Minor","description":"결제 금액 (minor unit). 0 과 음수는 받지 않는다."},"currency":{"type":"string","const":"KRW","title":"Currency","description":"통화 코드. v1=KRW."},"status":{"type":"string","enum":["INITIATED","PENDING","SUCCEEDED","FAILED","CANCELED","EXPIRED"],"title":"Status","description":"결제 상태 (6값 enum)."},"failure_code":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Failure Code","description":"결제 실패 코드 (FAILED 상태에서 채워짐). SCHEMA는 PG 원문 허용하나 서비스 계층이 정규화된 안전 문자열로 set 책임."},"failure_reason":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Failure Reason","description":"결제 실패 사유. **서비스 계층이 PG 원문을 사용자 안전 문자열로 정규화한 값만 set 가능**. raw 원문 직접 노출 금지."},"requested_at":{"type":"string","format":"date-time","title":"Requested At","description":"결제 요청 시각 (aware datetime, naive 입력 시 422)."},"confirmed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Confirmed At","description":"결제 확정 시각 (SUCCEEDED 진입 시 채워짐)."},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"결제 행 생성 시각 (aware datetime, naive 입력 시 422)."}},"additionalProperties":false,"type":"object","required":["payment_id","organization_id","env_scope","pg_provider","amount_minor","currency","status","requested_at","created_at"],"title":"PaymentResponse","description":"결제 단일 객체 응답.\n\nSCHEMA → DTO 매핑:\n- `payments.id` → `payment_id`.\n- `organization_id/invoice_id/subscription_id/payment_method_id/env_scope/\n  provider/provider_payment_id/amount_minor/currency/status/failure_code/\n  failure_reason/requested_at/confirmed_at/created_at` → 직접 매핑.\n- `metadata`/`updated_at`는 외부 노출 X.\n- `invoice_number` 는 payments 행의 칸이 아니다 - 결제 조회 서비스(`PaymentQueryService`)가\n  `invoices.invoice_number` 를 일괄 조회로 읽어 얹는다(청구서가 없으면 null).\n\n정책 위험 강제 잠금:\n- **`failure_reason`은 서비스 계층이 PG 원문을 사용자 안전 문자열로 정규화하여\n  set한 값만 들어와야 한다**. PG raw 응답을\n  그대로 전달하면 시크릿/내부 IP/스택트레이스 누설 사고로 분류된다.\n- `provider_payment_id`는 PG 트랜잭션 식별자. BFF/관리자/환불 입력용으로 노출하되\n  외부 사용자 UI 표시 권장 X."},"PaymentRetryInvoice":{"properties":{"invoice_id":{"type":"integer","minimum":1.0,"title":"Invoice Id"},"amount_minor":{"type":"integer","minimum":0.0,"title":"Amount Minor","description":"청구 금액. KRW 는 원 단위 정수다."},"currency":{"type":"string","const":"KRW","title":"Currency","description":"통화. v1 은 KRW 하나."}},"additionalProperties":false,"type":"object","required":["invoice_id","amount_minor","currency"],"title":"PaymentRetryInvoice","description":"다시 결제로 청구될 미결제 청구서."},"PaymentRetryPaymentMethod":{"properties":{"payment_method_id":{"type":"integer","minimum":1.0,"title":"Payment Method Id"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label","description":"사용자 표시 라벨."},"last4":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last4","description":"마스킹 마지막 자리."},"issuer_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Issuer Name","description":"발급사 명칭."}},"additionalProperties":false,"type":"object","required":["payment_method_id"],"title":"PaymentRetryPaymentMethod","description":"구독에 지금 붙은 결제수단 - 화면에 보일 것만 싣는다(제공자 이름 · 빌키 등 내부 값은 싣지 않는다)."},"PayupHubCardRegistrationResponse":{"properties":{"registration_id":{"type":"string","title":"Registration Id","description":"등록의 불투명 식별자."},"status":{"type":"string","enum":["PENDING","ACTIVE","FAILED","CANCELED","EXPIRED"],"title":"Status","description":"등록의 상태."},"failure_code":{"anyOf":[{"type":"string","enum":["AUTH_FAILED","PROVIDER_ERROR","SERVER_ERROR"]},{"type":"null"}],"title":"Failure Code","description":"status 가 FAILED 일 때만 있다."},"card_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Card Name","description":"status 가 ACTIVE 일 때 발급사 이름."},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label","description":"시작할 때 적은 표시 라벨."},"payment_method_id":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Payment Method Id","description":"status 가 ACTIVE 일 때 만들어진 결제수단 PK."},"expires_at":{"type":"string","format":"date-time","title":"Expires At","description":"등록의 시한."}},"additionalProperties":false,"type":"object","required":["registration_id","status","expires_at"],"title":"PayupHubCardRegistrationResponse","description":"등록의 현재 상태(조회 · 취소 응답)."},"PayupHubCardRegistrationStartRequest":{"properties":{"organization_id":{"type":"integer","minimum":1.0,"title":"Organization Id","description":"결제수단 소유 조직 PK. 주체 조직과 일치해야 한다."},"label":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Label","description":"사용자 표시 라벨."},"consent":{"$ref":"#/components/schemas/RegistrationConsent","description":"자동 청구 고지 동의."},"user_agent":{"type":"string","enum":["PC","MW"],"title":"User Agent","description":"카드등록창을 여는 환경(PC 웹 · 모바일 웹)."}},"additionalProperties":false,"type":"object","required":["organization_id","consent","user_agent"],"title":"PayupHubCardRegistrationStartRequest","description":"카드 등록 시작 요청. 카드 칸이 없다."},"PayupHubCardRegistrationStartResponse":{"properties":{"registration_id":{"type":"string","title":"Registration Id","description":"등록의 불투명 식별자. 상태 조회에 쓴다."},"status":{"type":"string","const":"PENDING","title":"Status","description":"시작 직후는 항상 PENDING."},"sdk_url":{"type":"string","title":"Sdk Url","description":"카드등록창 스크립트 주소. 서버가 준다(시험과 운영이 다르다)."},"form":{"additionalProperties":{"type":"string"},"type":"object","title":"Form","description":"창을 여는 폼의 숨은 입력 값. **그대로** 폼에 넣는다(키 이름 포함). `ReturnURL` 은 서버가 만든 복귀 주소다."},"expires_at":{"type":"string","format":"date-time","title":"Expires At","description":"이 시각이 지나면 등록은 EXPIRED 가 된다."}},"additionalProperties":false,"type":"object","required":["registration_id","status","sdk_url","form","expires_at"],"title":"PayupHubCardRegistrationStartResponse","description":"카드 등록 시작 응답 - 호스팅창을 여는 데 필요한 값."},"PlanCatalogAddonOfferItem":{"properties":{"plan_addon_offer_id":{"type":"integer","minimum":1.0,"title":"Plan Addon Offer Id"},"product_id":{"type":"integer","minimum":1.0,"title":"Product Id"},"product_code":{"type":"string","maxLength":64,"minLength":1,"title":"Product Code"},"product_name":{"type":"string","maxLength":200,"minLength":1,"title":"Product Name"},"product_description":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Product Description","description":"api_products.description projection for Console checkout copy. NULL when the catalog product has no description."},"is_mcp_pack":{"type":"boolean","title":"Is Mcp Pack","description":"True when api_products.metadata marks an MCP package sale product (seed=mcp_package_addon_sale and/or mcp_package_id). Console may show a small MCP-pack label; not an entitlement SSOT."},"recurring_amount_minor":{"type":"integer","exclusiveMinimum":0.0,"title":"Recurring Amount Minor"},"currency":{"type":"string","maxLength":3,"minLength":3,"title":"Currency"},"billing_cycle":{"type":"string","enum":["MONTHLY","YEARLY"],"title":"Billing Cycle"}},"additionalProperties":false,"type":"object","required":["plan_addon_offer_id","product_id","product_code","product_name","is_mcp_pack","recurring_amount_minor","currency","billing_cycle"],"title":"PlanCatalogAddonOfferItem","description":"Purchasable add-on offer for Console checkout (ACTIVE offers only)."},"PlanCatalogIncludedProductItem":{"properties":{"plan_product_mapping_id":{"type":"integer","minimum":1.0,"title":"Plan Product Mapping Id","description":"plan_products.id."},"product_id":{"type":"integer","minimum":1.0,"title":"Product Id"},"product_code":{"type":"string","maxLength":64,"minLength":1,"title":"Product Code"},"product_name":{"type":"string","maxLength":200,"minLength":1,"title":"Product Name"},"is_default":{"type":"boolean","title":"Is Default","description":"Default BASE mapping flag (plan_products.is_default)."}},"additionalProperties":false,"type":"object","required":["plan_product_mapping_id","product_id","product_code","product_name","is_default"],"title":"PlanCatalogIncludedProductItem","description":"BASE entitlement product row for Console checkout catalog-offer."},"PlanCatalogOfferResponse":{"properties":{"plan":{"$ref":"#/components/schemas/PlanResponse"},"env_scope":{"type":"string","enum":["sandbox","real_test","production"],"title":"Env Scope"},"included_products":{"items":{"$ref":"#/components/schemas/PlanCatalogIncludedProductItem"},"type":"array","title":"Included Products"},"addon_offers":{"items":{"$ref":"#/components/schemas/PlanCatalogAddonOfferItem"},"type":"array","title":"Addon Offers"},"usage_unit_prices":{"items":{"$ref":"#/components/schemas/PlanCatalogUsageUnitPriceItem"},"type":"array","title":"Usage Unit Prices"}},"additionalProperties":false,"type":"object","required":["plan","env_scope"],"title":"PlanCatalogOfferResponse","description":"`GET /v1/plans/{plan_id}/catalog-offer` Console subscribe catalog snapshot."},"PlanCatalogUsageUnitPriceItem":{"properties":{"data_provider":{"type":"string","maxLength":64,"minLength":1,"title":"Data Provider"},"action":{"type":"string","maxLength":128,"minLength":1,"title":"Action"},"unit_amount_minor":{"type":"integer","exclusiveMinimum":0.0,"title":"Unit Amount Minor"},"currency":{"type":"string","maxLength":3,"minLength":3,"title":"Currency"}},"additionalProperties":false,"type":"object","required":["data_provider","action","unit_amount_minor","currency"],"title":"PlanCatalogUsageUnitPriceItem","description":"Metered unit price overlay for Console catalog-offer (read-only)."},"PlanListQuery":{"properties":{"status":{"anyOf":[{"items":{"type":"string","enum":["DRAFT","ACTIVE","DEPRECATED","RETIRED"]},"type":"array"},{"type":"null"}],"title":"Status","description":"상태 필터. 미지정 시 ACTIVE+DEPRECATED 기본(노출 가능 행)."},"tier":{"anyOf":[{"type":"string","enum":["FREE","PAID"]},{"type":"null"}],"title":"Tier","description":"등급 필터."},"limit":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Limit","description":"페이지 크기. 1~100. 기본 20.","default":20},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor","description":"이전 응답의 next_cursor."}},"type":"object","title":"PlanListQuery","description":"요금제 목록 조회 쿼리.\n\n`env_scope`는 요청 헤더 `X-Env-Scope`에서 라우트 의존성으로 주입되므로 쿼리에 없다.\n`deleted_at IS NULL` 필터는 서비스 레이어가 항상 적용한다(쿼리 미노출)."},"PlanProductMappingCreateRequest":{"properties":{"product_id":{"anyOf":[{"type":"integer","maximum":9.223372036854776e+18,"minimum":1.0},{"type":"null"}],"title":"Product Id","description":"옵션 A (단일 매핑). 옵션 B (mappings) 와 상호 배타. BIGINT 범위 잠금."},"product_version_id":{"anyOf":[{"type":"integer","maximum":9.223372036854776e+18,"minimum":1.0},{"type":"null"}],"title":"Product Version Id","description":"옵션 A (단일 매핑). NULL=동적 (api_products.current_version_id 참조). BIGINT 범위 잠금."},"is_default":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Default","description":"옵션 A (단일 매핑). 기본 false (서비스 레벨 보강)."},"mappings":{"anyOf":[{"items":{"$ref":"#/components/schemas/PlanProductMappingItem"},"type":"array","maxItems":100,"minItems":1},{"type":"null"}],"title":"Mappings","description":"옵션 B (다중 매핑 일괄 추가/갱신). 1~100 행. 옵션 A (product_id) 와 상호 배타."}},"additionalProperties":false,"type":"object","title":"PlanProductMappingCreateRequest","description":"`POST /v1/plans/{plan_id}/products` 요청 본문.\n\n옵션 A (단일): `product_id` + `product_version_id` + `is_default` 평면 본문.\n옵션 B (다중): `mappings` 배열 nested 본문 (운영 효율).\n\nDTO `model_validator(mode='after')` 가 \"양쪽 모두 지정\" 또는 \"양쪽 모두 미지정\"\n본문을 사전 거부한다 - 422 분기가 한 곳에 있어야 하므로 라우트 진입 전에 걸러진다.\n라우트와 서비스는 옵션 A · B 분기와 DB 트랜잭션만 맡는다(빈 본문 · 모순 본문은\n여기서 막혀 라우트에 닿지 않는다)."},"PlanProductMappingDeleteResponse":{"properties":{"plan_id":{"type":"integer","maximum":9.223372036854776e+18,"minimum":1.0,"title":"Plan Id"},"mapping_id":{"type":"integer","maximum":9.223372036854776e+18,"minimum":1.0,"title":"Mapping Id","description":"plan_products.id."},"product_id":{"type":"integer","maximum":9.223372036854776e+18,"minimum":1.0,"title":"Product Id"},"product_version_id":{"anyOf":[{"type":"integer","maximum":9.223372036854776e+18,"minimum":1.0},{"type":"null"}],"title":"Product Version Id"},"is_default":{"type":"boolean","title":"Is Default"},"env_scope":{"type":"string","enum":["sandbox","real_test","production"],"title":"Env Scope"}},"additionalProperties":false,"type":"object","required":["plan_id","mapping_id","product_id","is_default","env_scope"],"title":"PlanProductMappingDeleteResponse","description":"``DELETE /v1/plans/{plan_id}/products/{product_id}`` 응답 본문.\n\n**내린 행의 정체성만** 돌려준다 - ``deleted_at`` 은 싣지 않는다. 그 값을 실으려면\n저장소의 ``soft_delete_mapping`` 이 시각을 돌려줘야 하는데 그 함수는 호출자가 셋이고\n(매핑 교체 · MCP 패키지 재시드 · 묶음 삭제) 반환 모양을 바꾸면 그 셋이 함께 흔들린다.\n2026-10-13 에 목록 함수의 둘째 반환값을 바꿔 쪽 넘김 반복문 둘이 500 이 된 일이 있어\n(abb4e4093 · 413b20f63 으로 고침) 같은 꼴을 되풀이하지 않는다 - 운영자가 알아야 할\n것은 「무엇이 내려갔나」 이고 그것은 이 칸들로 충분하다."},"PlanProductMappingItem":{"properties":{"product_id":{"type":"integer","maximum":9.223372036854776e+18,"minimum":1.0,"title":"Product Id","description":"api_products.id 존재 + env_scope 일치 + status IN ('ACTIVE','DEPRECATED'). RETIRED/DRAFT 매핑 거부 → 409 CATALOG_RETIRED_PRODUCT_USE / CATALOG_VERSION_NOT_PUBLISHED. BIGINT 범위 잠금."},"product_version_id":{"anyOf":[{"type":"integer","maximum":9.223372036854776e+18,"minimum":1.0},{"type":"null"}],"title":"Product Version Id","description":"(선택) api_product_versions.id. NULL=동적 (api_products.current_version_id 참조). BIGINT 범위 잠금."},"is_default":{"type":"boolean","title":"Is Default","description":"true 지정 시 같은 plan 내 다른 default 매핑 자동 false 전환. 같은 plan 내 default 행 최대 1건(부분 유니크 인덱스가 강제한다).","default":false}},"additionalProperties":false,"type":"object","required":["product_id"],"title":"PlanProductMappingItem","description":"매핑 1 항목 - 단일(옵션 A) · 다중(옵션 B) 양쪽에서 공유한다.\n\n`product_version_id`:\n- 지정 시 `api_product_versions.id` 존재 + `product_id` 일치 + `version_status='PUBLISHED'`.\n  PUBLISHED 아니면 `409 CATALOG_VERSION_NOT_PUBLISHED`.\n- NULL 이면 항상 `api_products.current_version_id` 참조(동적). 운영 권장.\n\n`is_default`:\n- true 지정 시 같은 plan 내 다른 default 매핑 자동 false 전환(트랜잭션).\n- 같은 plan 내 default 행은 최대 1건 (BILLING `plan_products` 부분 유니크 인덱스)."},"PlanProductMappingListQuery":{"properties":{"limit":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Limit","default":20},"cursor":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Cursor","description":"opaque cursor (id DESC tie-break)."},"sort":{"type":"string","enum":["id:desc","id:asc","created_at:desc","created_at:asc"],"title":"Sort","default":"id:desc"}},"type":"object","title":"PlanProductMappingListQuery","description":"Shared list query for plan mapping GET endpoints (Sprint 1 SS7 read extension)."},"PlanProductMappingResponse":{"properties":{"plan_id":{"type":"integer","maximum":9.223372036854776e+18,"minimum":1.0,"title":"Plan Id","description":"plans.id. 경로 파라미터 echo. BIGINT 범위 잠금."},"mappings":{"items":{"$ref":"#/components/schemas/PlanProductMappingResponseItem"},"type":"array","minItems":1,"title":"Mappings","description":"신규 INSERT 또는 갱신된 매핑 행 목록. 옵션 A 는 1행, 옵션 B 는 N 행."}},"additionalProperties":false,"type":"object","required":["plan_id","mappings"],"title":"PlanProductMappingResponse","description":"`POST /v1/plans/{plan_id}/products` 응답 본문.\n\n- 신규 매핑 INSERT만 발생 시 → 201 Created (응답 상태 코드는 라우트 영역).\n- 기존 활성 매핑 본문 갱신 발생 시 → 200 OK + 기존 행 soft delete + 신규 INSERT\n  (감사 이벤트 2건 = `plan_product.mapping.deleted` + `plan_product.mapping.created`).\n\n응답 envelope:\n```json\n{ \"data\": { \"plan_id\": 100, \"mappings\": [ {...}, ... ] } }\n```\n본 DTO 는 `data` 내부 본문 (`plan_id` + `mappings` 배열) 만 정의 — 외부 `data`\n래핑은 통합 담당 envelope 영역."},"PlanProductMappingResponseItem":{"properties":{"id":{"type":"integer","maximum":9.223372036854776e+18,"minimum":1.0,"title":"Id","description":"plan_products.id."},"product_id":{"type":"integer","maximum":9.223372036854776e+18,"minimum":1.0,"title":"Product Id"},"product_version_id":{"anyOf":[{"type":"integer","maximum":9.223372036854776e+18,"minimum":1.0},{"type":"null"}],"title":"Product Version Id"},"is_default":{"type":"boolean","title":"Is Default"},"env_scope":{"type":"string","enum":["sandbox","real_test","production"],"title":"Env Scope"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"additionalProperties":false,"type":"object","required":["id","product_id","is_default","env_scope","created_at","updated_at"],"title":"PlanProductMappingResponseItem","description":"매핑 응답 1행.\n\nDB → DTO 매핑(`plan_products`):\n- `id` / `product_id` / `product_version_id` / `is_default` / `env_scope` /\n  `created_at` / `updated_at` → 직접 매핑.\n- `plan_id` 는 응답 envelope 상위 키로 분리(같은 plan 내 1개 + 매핑 N 개 구조)."},"PlanProductMappingWithPlanItem":{"properties":{"plan_id":{"type":"integer","maximum":9.223372036854776e+18,"minimum":1.0,"title":"Plan Id"},"id":{"type":"integer","maximum":9.223372036854776e+18,"minimum":1.0,"title":"Id","description":"plan_products.id."},"product_id":{"type":"integer","maximum":9.223372036854776e+18,"minimum":1.0,"title":"Product Id"},"product_version_id":{"anyOf":[{"type":"integer","maximum":9.223372036854776e+18,"minimum":1.0},{"type":"null"}],"title":"Product Version Id"},"is_default":{"type":"boolean","title":"Is Default"},"env_scope":{"type":"string","enum":["sandbox","real_test","production"],"title":"Env Scope"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"additionalProperties":false,"type":"object","required":["plan_id","id","product_id","is_default","env_scope","created_at","updated_at"],"title":"PlanProductMappingWithPlanItem","description":"Reverse-index mapping row (`GET /v1/products/{id}/plan-mappings`)."},"PlanResponse":{"properties":{"plan_id":{"type":"integer","minimum":1.0,"title":"Plan Id","description":"plans.id (BIGSERIAL PK)."},"code":{"type":"string","maxLength":64,"minLength":1,"title":"Code","description":"비즈 식별 코드. 환경 내 유니크 (SCHEMA uq_plans_code_env_active)."},"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name","description":"사용자 노출 명칭."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"요금제 설명 (마크다운 허용)."},"tier":{"type":"string","enum":["FREE","PAID"],"title":"Tier","description":"요금제 등급. FREE/PAID."},"billing_cycle":{"type":"string","enum":["ONCE","MONTHLY","YEARLY"],"title":"Billing Cycle","description":"청구 주기. ONCE/MONTHLY/YEARLY."},"price":{"$ref":"#/components/schemas/MoneyMinor","description":"1회 청구 금액 (minor unit + 통화 + 부가세 포함 여부)."},"status":{"type":"string","enum":["DRAFT","ACTIVE","DEPRECATED","RETIRED"],"title":"Status","description":"요금제 상태."},"env_scope":{"type":"string","enum":["sandbox","real_test","production"],"title":"Env Scope","description":"환경 스코프."},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"발행 시각 (TIMESTAMPTZ, ISO 8601 + offset 포함; naive 입력 시 422)."},"addon_select_min":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Addon Select Min","description":"W6/G7: min Path B pack count at subscribe (NULL=unlimited)."},"addon_select_max":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Addon Select Max","description":"W6/G7: max Path B pack count (NULL=unlimited)."},"audience":{"type":"string","enum":["standard","integrator"],"title":"Audience","description":"기본값 standard · 연동사 요금제는 integrator.","default":"standard"},"max_active_account_links":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Max Active Account Links","description":"연동사 요금제의 좌석 상한 - 한 desktop_agent 클라이언트가 가질 수 있는 ACTIVE account_links 최대 수. audience='integrator' 일 때만 뜻이 있고 NULL 은 제한 없음(또는 해당 없음)이다."},"included_usage_free_units":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Included Usage Free Units","description":"요금제 전체의 종량 무료 허용량(한 청구 기간 기준) - (sum of all data_provider/action usage_records quantity, not per action). NULL or 0 = no free allowance (billed from unit 1, current behavior)."},"daily_token_limit":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Daily Token Limit","description":"T12: daily usage-token allowance this plan grants, read from the linked quota_policies row (plans.quota_policy_id). The unit is usage tokens, not call count. null means THIS PLAN HAS NO DAILY CAP from a quota policy - do not read it as not-configured-yet. It covers four cases that are deliberately not distinguished: no policy linked, a linked policy whose own daily_limit is null, a linked policy that was soft-deleted, and the admin create/update responses (those are built from RETURNING, which this repository keeps narrow - read the plan again to get the limits)."},"monthly_token_limit":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Monthly Token Limit","description":"T12: monthly usage-token allowance from the same quota_policies row. NULL = no monthly limit for this plan (the user instruction gives a monthly number for the paid plans only). The unit is usage tokens."},"contact_sales":{"type":"boolean","title":"Contact Sales","description":"상담으로 가입하는 요금제(엔터프라이즈)이면 true. 고객이 스스로 가입하는 길(0원 가입 · 결제 가입)에 서지 않는다. 입력값을 받지 않고 `code` 에서 유도한다(`CONTACT_SALES_PLAN_CODES`).","default":false}},"additionalProperties":false,"type":"object","required":["plan_id","code","name","tier","billing_cycle","price","status","env_scope","created_at"],"title":"PlanResponse","description":"요금제 단일 객체 응답.\n\nSCHEMA → DTO 매핑:\n- `plans.id` → `plan_id` (외부 노출 식별자명 — 표준 `<resource>_id` 패턴).\n- `plans.code/name/description/tier/billing_cycle/status/env_scope/created_at` → 직접 매핑.\n- `plans.price_amount_minor + currency + tax_included` → nested `MoneyMinor` 객체 `price`.\n- `plans.metadata`/`updated_at`/`deleted_at`는 외부 노출 X(BFF/콘솔 미사용 + 정책 평가 키 보호).\n\nSCHEMA가 글로벌 카탈로그이므로 `organization_id` 필드 없음."},"PlanSummary":{"properties":{"plan_id":{"type":"integer","minimum":1.0,"title":"Plan Id","description":"plans.id."},"code":{"type":"string","maxLength":64,"minLength":1,"title":"Code","description":"비즈 식별 코드."},"tier":{"type":"string","enum":["FREE","PAID"],"title":"Tier","description":"요금제 등급. FREE/PAID."},"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name","description":"고객에게 보이는 요금제 이름(`plans.name`). 콘솔이 구독 제목에 그대로 쓴다 - 코드(`PAID_BASIC_V1`)를 고객에게 보여 줄 수는 없기 때문이다."}},"additionalProperties":false,"type":"object","required":["plan_id","code","tier","name"],"title":"PlanSummary","description":"요금제 요약 객체(nested 응답용).\n\n`GET /v1/subscriptions/{id}` 응답 등 다른 자원이 요금제를 nested로 표시할 때\n사용한다. 전체 `PlanResponse`(가격·주기·메타 포함)보다 가벼운 요약으로 분리\n(응답 크기 최소화 + BFF 캐시 효율).\n\n**`name` 은 2026-09-15 에 들어왔다**(결정 큐 D-2(나), 사용자 승인 2026-09-13).\n그전에는 식별자/코드/등급 3필드였는데, 콘솔이 구독 제목을 그릴 값이 없어\n`PAID_BASIC_V1` 같은 **코드를 고객에게 보여 주거나** 자기 쪽에 이름 표를 또 두어야\n했다. 둘 다 정책 위반이라(고객 노출 문구는 DB 가 정본) 여기 한 칸을 늘렸다.\n`plans.name` 은 `VARCHAR(200) NOT NULL` 이므로 Optional 이 아니다 - 기본값을 두면\n읽기 경로가 빠뜨렸을 때 제목이 조용히 비어 나간다(검수 원장 #56 과 같은 이유)."},"ProductCreateRequest":{"properties":{"code":{"type":"string","maxLength":64,"minLength":3,"pattern":"^[A-Z][A-Z0-9_]{2,63}$","title":"Code","description":"비즈 식별 코드. 환경 내 + 발행자 범위 내 유일해야 한다. 중복이면 409 CATALOG_DUPLICATE_CODE 로 거절한다."},"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name","description":"사용자 노출 명칭. 공백만 입력은 거절한다."},"description":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Description","description":"카탈로그 설명(마크다운 허용 — UI 렌더링 시 HTML sanitization 의무, raw HTML/javascript: scheme 차단 = UI 트랙 책임). SCHEMA `description TEXT NULL` 최대 10000자."},"category":{"anyOf":[{"type":"string","enum":["tax","gov","finance","marketing"]},{"type":"null"}],"title":"Category","description":"카탈로그 그룹화 enum (`tax`/`gov`/`finance`). 비워 둘 수 있다."},"status":{"type":"string","enum":["DRAFT","ACTIVE","DEPRECATED","RETIRED"],"title":"Status","description":"초기 상태. 기본 DRAFT. `DRAFT`/`ACTIVE`만 발행 가능 — `DEPRECATED`/`RETIRED` 직접 생성 금지(`trg_api_products_insert_must_be_draft` 트리거가 DRAFT 외 차단). DTO 레벨에서는 enum만 잠그고 강제는 트리거/서비스에서.","default":"DRAFT"},"visibility":{"type":"string","enum":["PUBLIC","PRIVATE","ENTERPRISE"],"title":"Visibility","description":"가시성 enum. 기본 PRIVATE.","default":"PRIVATE"},"organization_id":{"anyOf":[{"type":"integer","maximum":2147483647.0,"minimum":1.0},{"type":"null"}],"title":"Organization Id","description":"NULL=글로벌 카탈로그(v1 운영 정책 권장). NOT NULL=조직 전용 사설 상품 (v1 운영 정책으로 차단 — 403 POLICY_TIER_FORBIDDEN. 별도 결정 뒤 해제). INT4 범위 잠금."},"monitoring_grade":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Monitoring Grade","description":"Ops monitoring grade 1..5 (api_products.monitoring_grade)."},"website_slug":{"anyOf":[{"type":"string","maxLength":128,"minLength":1,"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$"},{"type":"null"}],"title":"Website Slug","description":"Public Website slug for /service-products routing. Must align with page_content.content.slug when both set. 소문자 · 숫자 · 사이 하이픈만."},"collection_sites":{"anyOf":[{"items":{"type":"string","enum":["hometax","wetax","nhis","nhis_edi","nps_edi","comwel","fourinsure","coocon"]},"type":"array"},{"type":"null"}],"title":"Collection Sites","description":"Collection institution/vendor codes (product_collection_site SSOT). When set, replaces active site rows for the product env_scope."},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata","description":"자유 메타데이터. 정책 키(`status`/`visibility`/`provider`/`action`/`env_scope`/`organization_id`/`plan_id`/`code`) 진입 금지 — DB CHECK 1차 + 서비스 1차. JSON 직렬화 후 최대 65536 bytes."},"initial_version":{"anyOf":[{"$ref":"#/components/schemas/InitialVersionRequest"},{"type":"null"}],"description":"동봉 시 단일 트랜잭션으로 `api_product_versions` 1건 동시 INSERT."}},"additionalProperties":false,"type":"object","required":["code","name"],"title":"ProductCreateRequest","description":"`POST /v1/products` 요청 본문.\n\nSCHEMA → DTO 매핑:\n- `code`/`name`/`description`/`category`/`status`/`visibility`/`organization_id`\n  → 직접 매핑. `env_scope`는 헤더 `X-Env-Scope`에서 주입(본문에 없음).\n- `metadata` JSONB → 자유 형식. 정책 키 진입 차단은 DB CHECK 1차 + 서비스 1차.\n- `initial_version` → 동봉 시 단일 트랜잭션 안 자식 INSERT.\n\nimmutable 컬럼: `code`/`organization_id`/`env_scope`/`current_version_id` 는 본 요청\nDTO 외 PATCH 요청에 포함되면 `extra='forbid'`로 422 차단."},"ProductDeleteRequest":{"properties":{"reason":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Reason","description":"삭제 사유. 감사로그 적재(`product.catalog.deleted`)."}},"additionalProperties":false,"type":"object","title":"ProductDeleteRequest","description":"`DELETE /v1/products/{product_id}` 요청 본문(선택).\n\n`reason` 단일 선택 필드. 본 DTO는 본문이 없을 때도\n삭제 호출이 정상 동작하도록 모든 필드 Optional."},"ProductDeleteResponse":{"properties":{"id":{"type":"integer","minimum":1.0,"title":"Id"},"code":{"type":"string","maxLength":64,"minLength":3,"pattern":"^[A-Z][A-Z0-9_]{2,63}$","title":"Code"},"status":{"type":"string","enum":["DRAFT","ACTIVE","DEPRECATED","RETIRED"],"title":"Status"},"deleted_at":{"type":"string","format":"date-time","title":"Deleted At","description":"soft delete 시각(`deleted_at = now()`)."}},"additionalProperties":false,"type":"object","required":["id","code","status","deleted_at"],"title":"ProductDeleteResponse","description":"`DELETE /v1/products/{product_id}` 응답 본문.\n\n`status` 는 변경되지 않는다 — soft delete 와 RETIRED 진입은 독립 차원이다."},"ProductFacts":{"properties":{"credential":{"$ref":"#/components/schemas/ProductFactsCredential"},"prerequisite_login":{"anyOf":[{"$ref":"#/components/schemas/ProductFactsPrerequisiteLogin"},{"type":"null"}],"description":"먼저 불러야 하는 로그인. 없으면 null."},"effect":{"anyOf":[{"type":"string","enum":["read","draft","submit"]},{"type":"null"}],"title":"Effect","description":"기관에 하는 일: `read`(조회만), `draft`(초안을 덧붙일 뿐 기존 상태를 바꾸지 않음), `submit`(기관 상태를 바꿀 수 있음 - 접수 · 발급 · 저장 등). 로그인 · 세션 · 입력 서식 초기화 같은 단계처럼 분류하지 않은 도구는 null."},"irreversible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Irreversible","description":"되돌릴 수 없는가. 조회는 false. 쓰기는 null(알 수 없음) - `effect` 가 `submit` 이라는 것이 되돌릴 수 없다는 뜻이 아니다."},"confirm_required":{"type":"boolean","title":"Confirm Required","description":"쓰기가 먼저 확인(미리보기 · 동의)을 거쳐야 끝나는가. 조회는 false."},"limits":{"$ref":"#/components/schemas/ProductFactsLimits"}},"additionalProperties":false,"type":"object","required":["credential","prerequisite_login","effect","irreversible","confirm_required","limits"],"title":"ProductFacts","description":"상품 상세페이지 안내 블록이 읽는 **서버가 아는 사실**. 도구 계약에서 만들어 손으로 적지 않는다.\n\n모르는 값은 null 로 둔다 - 그럴듯한 값으로 채우지 않는다. 특히 `irreversible` 은 조회면 false 이고\n쓰기는 상품이 되돌릴 수 없음을 선언하기 전까지 null 이다(쓰기가 「기관 상태를 바꿀 수 있음」 이라는 것과\n「되돌릴 수 없음」 은 다른 말이다)."},"ProductFactsCredential":{"properties":{"required":{"type":"boolean","title":"Required","description":"연동해 둔 자격이 필요한가. false 면 연동 없이 바로 부를 수 있다."},"kind":{"anyOf":[{"type":"string","enum":["certificate","id_or_key","bank_account"]},{"type":"null"}],"title":"Kind","description":"자격의 종류: `certificate`(공동인증서), `bank_account`(은행 계좌 연동), `id_or_key`(아이디 · 키 · 계정 연결). 연동이 필요 없으면 null. 여러 기관이 섞이면 인증서 > 은행 계좌 > 아이디 · 키 순으로 하나만 말한다."},"windows_pc_needed":{"type":"boolean","title":"Windows Pc Needed","description":"인증서 연동에 Windows PC 와 연결 프로그램 설치가 한 번 필요한가."},"providers":{"items":{"type":"string"},"type":"array","title":"Providers","description":"연동해야 하는 기관의 슬러그 목록(중복 없음, 호출 순서). 연동이 필요 없으면 빈 목록."}},"additionalProperties":false,"type":"object","required":["required","kind","windows_pc_needed","providers"],"title":"ProductFactsCredential","description":"이 상품을 쓰기 전에 **연동해 둬야 하는 자격**."},"ProductFactsLimits":{"properties":{"file_link_minutes":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"File Link Minutes","description":"결과 파일 내려받기 링크가 열려 있는 분."},"file_retention_days":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"File Retention Days","description":"결과 파일을 보관하는 일수."}},"additionalProperties":false,"type":"object","title":"ProductFactsLimits","description":"결과 파일에 관한 한도. 파일을 내주지 않는 상품은 둘 다 null."},"ProductFactsPrerequisiteLogin":{"properties":{"provider":{"type":"string","title":"Provider","description":"로그인해야 하는 기관의 슬러그."},"provider_label_ko":{"type":"string","title":"Provider Label Ko","description":"그 기관의 한국어 이름(서버 표에서 유도한 값)."}},"additionalProperties":false,"type":"object","required":["provider","provider_label_ko"],"title":"ProductFactsPrerequisiteLogin","description":"이 상품을 부르기 전에 먼저 불러야 하는 로그인."},"ProductListItem":{"properties":{"id":{"type":"integer","maximum":9.223372036854776e+18,"minimum":1.0,"title":"Id"},"code":{"type":"string","maxLength":64,"minLength":3,"pattern":"^[A-Z][A-Z0-9_]{2,63}$","title":"Code"},"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"status":{"type":"string","enum":["DRAFT","ACTIVE","DEPRECATED","RETIRED"],"title":"Status"},"visibility":{"type":"string","enum":["PUBLIC","PRIVATE","ENTERPRISE"],"title":"Visibility"},"category":{"anyOf":[{"type":"string","enum":["tax","gov","finance","marketing"]},{"type":"null"}],"title":"Category"},"organization_id":{"anyOf":[{"type":"integer","maximum":2147483647.0,"minimum":1.0},{"type":"null"}],"title":"Organization Id"},"env_scope":{"type":"string","enum":["sandbox","real_test","production"],"title":"Env Scope"},"current_version_id":{"anyOf":[{"type":"integer","maximum":9.223372036854776e+18,"minimum":1.0},{"type":"null"}],"title":"Current Version Id"},"current_version_summary":{"anyOf":[{"$ref":"#/components/schemas/CurrentVersionSummary"},{"type":"null"}],"description":"활성 버전 nested 요약. current_version_id가 NULL이면 항상 null."},"monitoring_grade":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Monitoring Grade"},"website_slug":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Website Slug"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"},"page_content_exists":{"type":"boolean","title":"Page Content Exists","description":"True when an active product_page_content row exists for this product+env. Always filled by list enrichment (WebsiteExposable row badge input).","default":false},"mcp_tool_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mcp Tool Name","description":"이 상품의 활성 버전 (provider, action) 에 해당하는 MCP 도구 이름. null 이면 그 쌍에 도구 행이 없다(활성 버전이 없을 때도 null)."},"mcp_tool_enabled":{"type":"boolean","title":"Mcp Tool Enabled","description":"그 도구가 켜져 있고 이 env_scope 에서 팔리는가. false 는 꺼졌거나 이 레인에서 팔지 않는다는 뜻이며 '준비 중' 을 뜻하지 않는다.","default":false},"website_featured_rank":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Website Featured Rank","description":"웹사이트 상품 목록 맨 위 대표 카드의 순서(1 이 맨 앞). 어드민 「웹사이트 대표 상품」 이 정하고 이 env_scope 의 website_featured_products 에서 온다. null 이면 대표가 아니다."},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"additionalProperties":false,"type":"object","required":["id","code","name","status","visibility","env_scope","created_at","updated_at"],"title":"ProductListItem","description":"`GET /v1/products` 목록 응답 1행.\n\n목록 응답은 상세보다 가벼운 필드 집합 — `description` 등 큰 필드 미노출.\n`current_version_summary` nested 를 동봉한다."},"ProductListQuery":{"properties":{"limit":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Limit","description":"1~100.","default":20},"cursor":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Cursor","description":"opaque 커서 (BIGINT after_id 또는 URL-safe base64 인코딩 페이로드 — RFC 4648 §5). 최대 2048자 — RFC 7230 권고 HTTP URI 한도 (~8KB) 아래로 안전 마진. 운영 페이로드는 통상 256 bytes 이내. 클라이언트는 본문을 해석하거나 만들지 않는다."},"sort":{"type":"string","enum":["created_at:asc","created_at:desc","updated_at:asc","updated_at:desc","code:asc","code:desc"],"title":"Sort","default":"created_at:desc"},"from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"From","description":"created_at 시작 시각 (포함). aware datetime 필수. 쿼리스트링 이름은 `?from=` 하나다 — OpenAPI 에 선언되는 이름이자 공개 계약이다. Python 예약어 회피용 필드명 `from_` 는 모델 생성(`ProductListQuery(from_=...)`)과 `model_validate` 에서만 쓴다(`populate_by_name=True`)."},"to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"To","description":"created_at 종료 시각 (포함). aware datetime 필수."},"status":{"anyOf":[{"items":{"type":"string","enum":["DRAFT","ACTIVE","DEPRECATED","RETIRED"]},"type":"array","maxItems":20},{"type":"null"}],"title":"Status","description":"상태 필터. 다중 콤마 (`?status=ACTIVE,DEPRECATED`) 또는 반복형 (`?status=ACTIVE&status=DEPRECATED`) 양쪽 허용. 최대 20 원소."},"visibility":{"anyOf":[{"items":{"type":"string","enum":["PUBLIC","PRIVATE","ENTERPRISE"]},"type":"array","maxItems":20},{"type":"null"}],"title":"Visibility","description":"가시성 필터. status 와 동일 - 콤마 · 반복형 양쪽 허용 + 최대 20 원소."},"provider":{"anyOf":[{"type":"string","maxLength":64,"minLength":1,"pattern":"^[a-z][a-z0-9_]{0,63}$"},{"type":"null"}],"title":"Provider","description":"등록된 기관 식별자로 걸러낸다. 형식 `^[a-z][a-z0-9_]{0,63}$`."},"category":{"anyOf":[{"type":"string","enum":["tax","gov","finance","marketing"]},{"type":"null"}],"title":"Category"},"include_deleted":{"type":"boolean","title":"Include Deleted","description":"true + 운영자 토큰 시만 deleted_at NOT NULL 행을 노출한다.","default":false},"q":{"anyOf":[{"type":"string","maxLength":80,"minLength":1},{"type":"null"}],"title":"Q","description":"이름/code 부분일치 검색(ILIKE 기반)."},"website_slug":{"anyOf":[{"type":"string","maxLength":128,"minLength":1},{"type":"null"}],"title":"Website Slug","description":"Website URL slug exact match (`api_products.website_slug`). Sprint 2 legacy routing SSOT."},"website_legacy_id":{"anyOf":[{"type":"string","maxLength":64,"minLength":1},{"type":"null"}],"title":"Website Legacy Id","description":"Legacy mock id exact match (`metadata.website_legacy_id`, e.g. hometax-1)."},"expose_mode_filter":{"anyOf":[{"type":"string","enum":["marketing_only","exclude_marketing_only"]},{"type":"null"}],"title":"Expose Mode Filter","description":"Admin catalog list filter on metadata.expose_mode. `marketing_only` = 소개만; `exclude_marketing_only` = 소개 제외. Omit for all. Server-side WHERE only (no client page-local filter)."}},"type":"object","title":"ProductListQuery","description":"`GET /v1/products` 쿼리 파라미터.\n\n페이지네이션 + 필터. 헤더 `X-Env-Scope` 는 서비스 레벨에서 강제 부착(본 DTO 영역 외)."},"ProductPageContentPutRequest":{"properties":{"content":{"additionalProperties":true,"type":"object","title":"Content","description":"Website structured sections JSON. Service layer enforces PRODUCT_PAGE_CONTENT_SCHEMA validation (additionalProperties=false)."}},"additionalProperties":false,"type":"object","required":["content"],"title":"ProductPageContentPutRequest","description":"`PUT /v1/products/{product_id}/page-content` request body."},"ProductPageContentResponse":{"properties":{"product_id":{"type":"integer","maximum":9.223372036854776e+18,"minimum":1.0,"title":"Product Id"},"env_scope":{"type":"string","enum":["sandbox","real_test","production"],"title":"Env Scope"},"revision":{"type":"integer","minimum":1.0,"title":"Revision"},"content":{"additionalProperties":true,"type":"object","title":"Content"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"additionalProperties":false,"type":"object","required":["product_id","env_scope","revision","created_at","updated_at"],"title":"ProductPageContentResponse","description":"`GET/PUT /v1/products/{product_id}/page-content` response body."},"ProductResponse":{"properties":{"id":{"type":"integer","minimum":1.0,"title":"Id","description":"api_products.id."},"code":{"type":"string","maxLength":64,"minLength":3,"pattern":"^[A-Z][A-Z0-9_]{2,63}$","title":"Code"},"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Description","description":"카탈로그 설명. `ProductCreateRequest.description` 과 같은 정책이다 - 화면이 sanitize 를 맡고 최대 10000자."},"status":{"type":"string","enum":["DRAFT","ACTIVE","DEPRECATED","RETIRED"],"title":"Status"},"visibility":{"type":"string","enum":["PUBLIC","PRIVATE","ENTERPRISE"],"title":"Visibility"},"category":{"anyOf":[{"type":"string","enum":["tax","gov","finance","marketing"]},{"type":"null"}],"title":"Category"},"organization_id":{"anyOf":[{"type":"integer","maximum":2147483647.0,"minimum":1.0},{"type":"null"}],"title":"Organization Id"},"env_scope":{"type":"string","enum":["sandbox","real_test","production"],"title":"Env Scope"},"current_version_id":{"anyOf":[{"type":"integer","maximum":9.223372036854776e+18,"minimum":1.0},{"type":"null"}],"title":"Current Version Id","description":"활성 버전 포인터. DRAFT 상태에서만 NULL 허용 — ACTIVE/DEPRECATED/RETIRED 상태에서는 반드시 있어야 한다."},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata","description":"자유 메타데이터. 정책을 결정하는 키는 넣을 수 없다. JSON 직렬화 후 최대 65536 bytes."},"monitoring_grade":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Monitoring Grade","description":"Ops monitoring grade 1..5."},"website_slug":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Website Slug","description":"Public Website slug for routing."},"collection_sites":{"items":{"type":"string","enum":["hometax","wetax","nhis","nhis_edi","nps_edi","comwel","fourinsure","coocon"]},"type":"array","title":"Collection Sites","description":"Active collection site codes (product_collection_site SSOT)."},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At","description":"soft delete 시각. NULL=활성, NOT NULL=삭제 완료."},"current_version":{"anyOf":[{"$ref":"#/components/schemas/CurrentVersionSummary"},{"type":"null"}],"description":"GET /v1/products/{id} 상세 응답에만 동봉."},"mcp_tool_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mcp Tool Name","description":"이 상품의 활성 버전 (provider, action) 에 해당하는 MCP 도구 이름. null 이면 그 쌍에 도구 행이 없다(활성 버전이 없을 때도 null)."},"mcp_tool_enabled":{"type":"boolean","title":"Mcp Tool Enabled","description":"그 도구가 켜져 있고 이 env_scope 에서 팔리는가. false 는 꺼졌거나 이 레인에서 팔지 않는다는 뜻이며 '준비 중' 을 뜻하지 않는다.","default":false},"facts":{"anyOf":[{"$ref":"#/components/schemas/ProductFacts"},{"type":"null"}],"description":"이 상품이 호출 전에 요구하는 것과 기관에 하는 일. 도구 계약에서 만든 값이다. null 이면 그 쌍에 도구 행이 없다(활성 버전이 없을 때도 null)."},"initial_version":{"anyOf":[{"$ref":"#/components/schemas/InitialVersionEcho"},{"type":"null"}],"description":"POST /v1/products 응답에서 `initial_version` 동봉 시 채운다. PATCH/GET 응답에는 항상 null."},"versions":{"anyOf":[{"items":{"$ref":"#/components/schemas/CurrentVersionSummary"},"type":"array"},{"type":"null"}],"title":"Versions","description":"GET /v1/products/{id}?include_versions=true 시만 채운다. 그 외 응답은 항상 null."}},"additionalProperties":false,"type":"object","required":["id","code","name","status","visibility","env_scope","created_at","updated_at"],"title":"ProductResponse","description":"상품 단일 객체 응답.\n\nSCHEMA → DTO 매핑:\n- `api_products.id` → `id`.\n- `code`/`name`/`description`/`category`/`status`/`visibility`/`organization_id`/\n  `env_scope`/`current_version_id`/`metadata`/`created_at`/`updated_at`/`deleted_at`\n  → 직접 매핑.\n- `current_version` (nested) — `GET /v1/products/{id}` 상세 응답에서만 채운다.\n  `POST /v1/products` 응답은 `initial_version` echo만 동봉한다.\n- `versions` (List) — `GET /v1/products/{id}?include_versions=true` 시만 채운다.\n\nlifecycle timestamp 3종(`activated_at`/`deprecated_at`/`retired_at`)은 본 응답에 미노출\n(운영 추적성은 운영 API 영역). UI/콘솔이 필요하면 별도 결정 뒤 노출을 넓힌다."},"ProductUpdateRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Name","description":"공백만 입력 금지."},"description":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Description","description":"카탈로그 설명. `ProductCreateRequest.description` 과 같은 정책이다 - 화면이 sanitize 를 맡고 최대 10000자."},"category":{"anyOf":[{"type":"string","enum":["tax","gov","finance","marketing"]},{"type":"null"}],"title":"Category"},"visibility":{"anyOf":[{"type":"string","enum":["PUBLIC","PRIVATE","ENTERPRISE"]},{"type":"null"}],"title":"Visibility"},"monitoring_grade":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Monitoring Grade","description":"Ops monitoring grade 1..5 (api_products.monitoring_grade)."},"website_slug":{"anyOf":[{"type":"string","maxLength":128,"minLength":1,"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$"},{"type":"null"}],"title":"Website Slug","description":"Public Website slug; null clears the column when explicitly set. 소문자 · 숫자 · 사이 하이픈만."},"collection_sites":{"anyOf":[{"items":{"type":"string","enum":["hometax","wetax","nhis","nhis_edi","nps_edi","comwel","fourinsure","coocon"]},"type":"array"},{"type":"null"}],"title":"Collection Sites","description":"When set, replaces active product_collection_site rows for env_scope."},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata","description":"정책 키 진입 금지. JSON 직렬화 후 최대 65536 bytes."},"status_transition":{"anyOf":[{"$ref":"#/components/schemas/StatusTransition"},{"type":"null"}],"description":"상태 전이 본문. 동봉 시 허용 전이(ALLOWED_TRANSITIONS)만 받는다. 비허용 시 409 CATALOG_INVALID_TRANSITION."}},"additionalProperties":false,"type":"object","title":"ProductUpdateRequest","description":"`PATCH /v1/products/{product_id}` 요청 본문.\n\n모든 필드 선택. immutable 컬럼은 `extra='forbid'`로 본 DTO에서 차단:\n- `code` / `organization_id` / `env_scope` / `current_version_id` 는 본 DTO에 미선언.\n  클라이언트가 본문에 포함하면 `422 VALIDATION_SEMANTIC_ERROR` 다.\n- 상태 전이는 nested `StatusTransition` 으로 분리(단일 책임)."},"ProductVersionCreateRequest":{"properties":{"version":{"type":"string","maxLength":20,"minLength":1,"pattern":"^[A-Za-z0-9._\\-]{1,20}$","title":"Version","description":"버전 식별자(예: 'v1'/'v2'). 같은 상품 안에서 유일해야 한다. 형식 `^[A-Za-z0-9._-]{1,20}$`."},"provider":{"type":"string","maxLength":64,"minLength":1,"pattern":"^[a-z][a-z0-9_]{0,63}$","title":"Provider","description":"등록된 기관 식별자. 등록되지 않은 값이면 400 VALIDATION_INVALID_FIELD 로 거절한다. 형식 `^[a-z][a-z0-9_]{0,63}$`."},"action":{"type":"string","maxLength":64,"minLength":1,"pattern":"^[a-z][a-z0-9_.]{0,63}$","title":"Action","description":"등록된 액션 식별자. 기관에 종속한다. 형식 `^[a-z][a-z0-9_.]{0,63}$`."},"params_schema_ref":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Params Schema Ref","description":"`provider.action.vN` 형식. 작업 결과의 schema 값과 같은 형식이다."},"result_schema_ref":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Result Schema Ref","description":"동상."},"pricing_hint":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Pricing Hint","description":"가격 표시 힌트. 정책을 결정하는 키는 넣을 수 없다. JSON 직렬화 후 최대 65536 bytes."},"rate_limit_hint":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Rate Limit Hint","description":"rate limit 표시 힌트. 정책을 결정하는 키는 넣을 수 없다. JSON 직렬화 후 최대 65536 bytes."},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata","description":"자유 메타데이터. 정책을 결정하는 키는 넣을 수 없다. JSON 직렬화 후 최대 65536 bytes."},"publish_immediately":{"type":"boolean","title":"Publish Immediately","description":"true 이면 발행 트랜잭션 안에서 version_status='PUBLISHED' + published_at=now(). false 이면 DRAFT 발행.","default":false},"set_as_current":{"type":"boolean","title":"Set As Current","description":"publish_immediately=true + 본 필드 true ⇒ api_products.current_version_id 동시 UPDATE. publish_immediately=false + 본 필드 true ⇒ 422 VALIDATION_SEMANTIC_ERROR.","default":false}},"additionalProperties":false,"type":"object","required":["version","provider","action"],"title":"ProductVersionCreateRequest","description":"`POST /v1/products/{product_id}/versions` 요청 본문.\n\n자세한 SCHEMA 매핑과 제약은 이 클래스 위 주석에 있다."},"ProductVersionListQuery":{"properties":{"limit":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Limit","default":20},"cursor":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Cursor","description":"opaque 커서 (BIGINT after_id 또는 URL-safe base64 인코딩 페이로드 — RFC 4648 §5). 최대 2048자 — RFC 7230 권고 HTTP URI 한도 (~8KB) 아래 안전 마진. 클라이언트는 본문을 해석하거나 만들지 않는다."},"sort":{"type":"string","enum":["created_at:asc","created_at:desc","version:asc","version:desc"],"title":"Sort","default":"created_at:desc"},"version_status":{"anyOf":[{"items":{"type":"string","enum":["DRAFT","PUBLISHED","DEPRECATED","RETIRED"]},"type":"array","maxItems":20},{"type":"null"}],"title":"Version Status","description":"버전 상태 필터. 다중 콤마 (`?version_status=PUBLISHED,DEPRECATED`) 또는 반복형 양쪽 허용. 최대 20 원소."}},"type":"object","title":"ProductVersionListQuery","description":"`GET /v1/products/{product_id}/versions` 쿼리 파라미터.\n\n페이지네이션 + 필터. 부모 `product_id` 는 경로 파라미터(본 DTO 영역 외)."},"ProductVersionResponse":{"properties":{"id":{"type":"integer","maximum":9.223372036854776e+18,"minimum":1.0,"title":"Id","description":"api_product_versions.id."},"product_id":{"type":"integer","maximum":9.223372036854776e+18,"minimum":1.0,"title":"Product Id","description":"부모 api_products.id."},"version":{"type":"string","maxLength":20,"minLength":1,"pattern":"^[A-Za-z0-9._\\-]{1,20}$","title":"Version"},"version_status":{"type":"string","enum":["DRAFT","PUBLISHED","DEPRECATED","RETIRED"],"title":"Version Status"},"provider":{"type":"string","maxLength":64,"minLength":1,"pattern":"^[a-z][a-z0-9_]{0,63}$","title":"Provider"},"action":{"type":"string","maxLength":64,"minLength":1,"pattern":"^[a-z][a-z0-9_.]{0,63}$","title":"Action"},"params_schema_ref":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Params Schema Ref"},"result_schema_ref":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Result Schema Ref"},"pricing_hint":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Pricing Hint"},"rate_limit_hint":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Rate Limit Hint"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"},"env_scope":{"type":"string","enum":["sandbox","real_test","production"],"title":"Env Scope","description":"부모 상품의 환경을 상속한다."},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At","description":"발행 시각. DRAFT 행은 NULL. PUBLISHED 진입 시 trg_*_lifecycle_timestamps 자동 채움."},"deprecated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deprecated At","description":"폐기 시각. PUBLISHED → DEPRECATED 전이 시 자동 채움."},"retired_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Retired At","description":"종결 시각. DEPRECATED → RETIRED 전이 시 자동 채움. terminal."},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"additionalProperties":false,"type":"object","required":["id","product_id","version","version_status","provider","action","env_scope","created_at"],"title":"ProductVersionResponse","description":"상품 버전 단일 객체 응답.\n\nSCHEMA → DTO 매핑:\n- `api_product_versions.id` → `id`.\n- `product_id` / `version` / `version_status` / `provider` / `action` / 스키마 ref 2종 /\n  `pricing_hint` / `rate_limit_hint` / `metadata` / `env_scope` / `created_at` →\n  직접 매핑.\n- lifecycle timestamps (`published_at` / `deprecated_at` / `retired_at`) — append-only\n  트리거가 단방향 전이 시 자동 채움. DRAFT 행은 모두 NULL.\n\n응답에서 `metadata`/`pricing_hint`/`rate_limit_hint` 노출 허용\n(자유 표시 메타다)."},"PublicInquirySubmitBody":{"properties":{"contactName":{"type":"string","maxLength":200,"minLength":1,"title":"Contactname"},"contactEmail":{"type":"string","maxLength":320,"minLength":1,"title":"Contactemail"},"subject":{"type":"string","maxLength":500,"minLength":1,"title":"Subject"},"bodyText":{"type":"string","maxLength":8000,"minLength":1,"title":"Bodytext"},"sourceCategory":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Sourcecategory"}},"type":"object","required":["contactName","contactEmail","subject","bodyText"],"title":"PublicInquirySubmitBody","description":"POST /v1/inquiries request body (INQUIRIES_SCHEMA section 3-1)."},"RefundCreateRequest":{"properties":{"payment_id":{"type":"integer","minimum":1.0,"title":"Payment Id","description":"환불 대상 결제 ID (payments.id). status='SUCCEEDED'만 허용하고 무통장 입금 결제는 받지 않는다(422)."},"amount_minor":{"type":"integer","exclusiveMinimum":0.0,"title":"Amount Minor","description":"환불 금액 (minor unit 정수). 0 과 음수는 받지 않는다. 전액/부분 모두 허용. 환불 합산 ≤ 원 결제 amount_minor는 서비스 계층 검증."},"reason":{"anyOf":[{"type":"string","enum":["USER_REQUEST","OPS_DISPUTE_RESOLUTION","DUPLICATE_PAYMENT","PAYMENT_FAILED_REVERSAL","FRAUDULENT_PAYMENT","OTHER"]},{"type":"null"}],"title":"Reason","description":"환불 사유 enum. 미지정이면 기본값 없이 저장하고 응답 reason 은 null (note 만 있으면 그 글만 저장)."},"note":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Note","description":"운영 메모(자유 텍스트). SCHEMA `refunds.reason VARCHAR(255)` 컬럼에 `reason` enum과 함께 합성 저장(서비스 계층 책임). PII/secret 금지."},"cancel_subscription":{"type":"boolean","title":"Cancel Subscription","description":"동일 트랜잭션에서 구독 CANCELED 전이 여부. True 시 `subscriptions.status='CANCELED'`로 전이 + `audit_logs.billing.subscription.transition` 적재.","default":false},"metadata":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Metadata","description":"운영 메타데이터 (예: source, dispute_id, support_ticket_id). PII/secret 적재 금지. 키 화이트리스트는 별도 결정."}},"additionalProperties":false,"type":"object","required":["payment_id","amount_minor"],"title":"RefundCreateRequest","description":"환불 생성 요청.\n\n처리 흐름:\n1) AuthPolicyService 평가(`request_kind='billing'`, BILLING_ADMIN·SYS_ADMIN 또는 본인 조직 OWNER)\n2) `payment_id` 소유권·`status='SUCCEEDED'`·env_scope 검증 - 무통장 입금 결제는 이 요청으로 환불하지 않는다\n   (`422 BILLING_INVALID_INPUT`, 아무것도 쓰기 전에 거절)\n3) 환불 합산 ≤ 원 결제 amount_minor 검증 (서비스 계층 책임)\n   - 위반 시 `422 BILLING_REFUND_EXCEEDS_PAYMENT`\n4) `refunds` 행 PENDING 생성\n5) 환불 요청 (어댑터 호출)\n6) `cancel_subscription=true`인 경우 동일 트랜잭션에서 구독 `CANCELED` 전이\n7) 동기 응답: 202 Accepted + 환불 객체 스냅샷(PENDING)\n\nPG 환불 결과는 웹훅으로 수신 → `refunds.SUCCEEDED` + `invoices.REFUNDED/PARTIALLY_REFUNDED`.\n\n`organization_id`는 본 DTO에 두지 않는다 — `payment_id`로 조직이 자동 추론되며,\n라우트가 `PrincipalContext.organization_id`와의 일치를 검증하여 403 차단(IDOR 방지).\n\n`metadata`는 입력만 허용(응답 미노출). PII/secret/credential 적재 금지.\n키 화이트리스트는 후속 ADR."},"RefundCreateResponse":{"properties":{"refund_id":{"type":"integer","minimum":1.0,"title":"Refund Id","description":"refunds.id (BIGSERIAL PK)."},"payment_id":{"type":"integer","minimum":1.0,"title":"Payment Id","description":"원 결제 ID (payments.id)."},"amount_minor":{"type":"integer","exclusiveMinimum":0.0,"title":"Amount Minor","description":"환불 금액 (minor unit). 0 과 음수는 받지 않는다."},"status":{"type":"string","enum":["PENDING","SUCCEEDED","FAILED","CANCELED"],"title":"Status","description":"환불 상태. 본 응답은 보통 PENDING(202 Accepted)."},"env_scope":{"type":"string","enum":["sandbox","real_test","production"],"title":"Env Scope","description":"환경 스코프. 모든 응답에 일관되게 노출한다(환경 식별 + 감사 일관성)."},"requested_at":{"type":"string","format":"date-time","title":"Requested At","description":"환불 요청 시각 (aware datetime, naive 입력 시 422)."}},"additionalProperties":false,"type":"object","required":["refund_id","payment_id","amount_minor","status","env_scope","requested_at"],"title":"RefundCreateResponse","description":"환불 생성 응답 - `202 Accepted` 의 몸통.\n\n즉시 응답 다섯 칸(`refund_id` · `payment_id` · `amount_minor` · `status` ·\n`requested_at`)에 **`env_scope` 를 더해** 모든 응답에 일관되게 노출한다.\n\nGET 단건 조회(`RefundResponse`)와 다른 객체:\n- 본 응답은 **즉시 응답 최소 필드**만 포함(BFF 폴링 시작용).\n- 상세 조회는 `GET /v1/refunds/{id}` (`RefundResponse`) 사용.\n\n`status`는 통상 PENDING(PG 비동기 결과 대기). 동기 SUCCEEDED는 PG가 즉시 응답한 경우만."},"RefundListQuery":{"properties":{"organization_id":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Organization Id","description":"조직 PK. 본인 조직 미지정 가능(라우트 주입)."},"payment_id":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Payment Id","description":"결제 ID 필터 (단일 결제의 환불 이력 조회)."},"status":{"anyOf":[{"items":{"type":"string","enum":["PENDING","SUCCEEDED","FAILED","CANCELED"]},"type":"array"},{"type":"null"}],"title":"Status","description":"상태 필터(다중). 미지정 시 전체."},"limit":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Limit","description":"페이지 크기.","default":20},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor","description":"이전 응답의 next_cursor."}},"type":"object","title":"RefundListQuery","description":"환불 목록 조회 쿼리.\n\n자동 필터(라우트 강제):\n- `organization_id`: 본인 조직(ADMIN은 명시 가능)\n- `env_scope = X-Env-Scope`\n\n명세에 GET 목록 표가 없어 이 DTO 가 그 자리를 대신하며\n함께 잠금한다(`InvoiceListQuery`/`PaymentListQuery` 패턴 동형)."},"RefundResponse":{"properties":{"refund_id":{"type":"integer","minimum":1.0,"title":"Refund Id","description":"refunds.id."},"organization_id":{"type":"integer","minimum":1.0,"title":"Organization Id","description":"소유 조직 PK."},"payment_id":{"type":"integer","minimum":1.0,"title":"Payment Id","description":"원 결제 ID."},"invoice_id":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Invoice Id","description":"연결된 인보이스 ID. NULL 허용."},"env_scope":{"type":"string","enum":["sandbox","real_test","production"],"title":"Env Scope","description":"환경 스코프."},"pg_provider":{"type":"string","enum":["portone","toss","payup","offline"],"title":"Pg Provider","description":"PG 사업자."},"provider_refund_id":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Provider Refund Id","description":"PG 발급 환불 식별자. PG 비동기 처리 중에는 NULL일 수 있다. BFF/관리자/대사 입력용. 외부 사용자 UI 표시 권장 X."},"amount_minor":{"type":"integer","exclusiveMinimum":0.0,"title":"Amount Minor","description":"환불 금액 (minor unit). 0 과 음수는 받지 않는다."},"currency":{"type":"string","const":"KRW","title":"Currency","description":"통화 코드. v1=KRW."},"status":{"type":"string","enum":["PENDING","SUCCEEDED","FAILED","CANCELED"],"title":"Status","description":"환불 상태 (4값 enum)."},"reason":{"anyOf":[{"type":"string","enum":["USER_REQUEST","OPS_DISPUTE_RESOLUTION","DUPLICATE_PAYMENT","PAYMENT_FAILED_REVERSAL","FRAUDULENT_PAYMENT","OTHER"]},{"type":"null"}],"title":"Reason","description":"환불 사유 enum. SCHEMA 자유 텍스트를 enum으로 정규화 노출 (자유 텍스트 원문은 `audit_logs.billing.refund.transition.payload.reason_raw`로 보존)."},"requested_at":{"type":"string","format":"date-time","title":"Requested At","description":"환불 요청 시각 (aware datetime, naive 입력 시 422)."},"confirmed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Confirmed At","description":"환불 확정 시각 (SUCCEEDED 진입 시 채워짐)."},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"환불 행 생성 시각 (aware datetime, naive 입력 시 422)."}},"additionalProperties":false,"type":"object","required":["refund_id","organization_id","payment_id","env_scope","pg_provider","amount_minor","currency","status","requested_at","created_at"],"title":"RefundResponse","description":"환불 단일 객체 응답 - `GET /v1/refunds/{id}`.\n\nSCHEMA → DTO 매핑:\n- `refunds.id` → `refund_id`.\n- `organization_id/payment_id/invoice_id/env_scope/provider/provider_refund_id/\n  amount_minor/currency/status/requested_at/confirmed_at/created_at` → 직접 매핑.\n- `reason`은 enum 정규화하여 노출(SCHEMA는 자유 텍스트지만 DTO는 enum 형식 권장).\n- `requested_by/metadata/updated_at` 미노출 (운영 추적은 audit_logs + 운영 API).\n\n`provider_refund_id`는 PG 트랜잭션 식별자. PG 비동기 처리 중에는 NULL일 수 있다."},"RegistrationConsent":{"properties":{"accepted":{"type":"boolean","const":true,"title":"Accepted","description":"첫 결제 뒤에는 고객이 인지하지 못한 채 결제되므로 반드시 고지해야 한다 - 동의했을 때만 시작할 수 있다. 동의 시각은 서버가 잰다."},"text_version":{"type":"string","maxLength":40,"minLength":1,"title":"Text Version","description":"고객이 본 고지 · 동의 문안의 판. 어떤 문장에 동의했는지 나중에 대조하려고 남긴다."}},"additionalProperties":false,"type":"object","required":["accepted","text_version"],"title":"RegistrationConsent","description":"매달 자동 청구 · 해지 방법 고지에 동의했다는 표시."},"StandardCheckoutApproveRequest":{"properties":{"transaction_id":{"type":"string","maxLength":20,"minLength":1,"title":"Transaction Id"},"checkout_token":{"type":"string","maxLength":4096,"minLength":1,"title":"Checkout Token"}},"additionalProperties":false,"type":"object","required":["transaction_id","checkout_token"],"title":"StandardCheckoutApproveRequest","description":"결제창 인증이 끝난 뒤 승인/조회에 쓰는 입력 (두 라우트 공용).\n\n`transaction_id` 상한 20 은 결제대행사 규격값이다. 계약과 다른 길이는 **전송 전에** 거부한다."},"StandardCheckoutApproveResponse":{"properties":{"organization_id":{"type":"integer","minimum":1.0,"title":"Organization Id"},"subscription_id":{"type":"integer","minimum":1.0,"title":"Subscription Id"},"plan_id":{"type":"integer","minimum":1.0,"title":"Plan Id"},"env_scope":{"type":"string","enum":["sandbox","real_test","production"],"title":"Env Scope"},"invoice_id":{"type":"integer","minimum":1.0,"title":"Invoice Id"},"payment_id":{"type":"integer","minimum":1.0,"title":"Payment Id"},"payment_status":{"type":"string","enum":["SUCCEEDED","PENDING","FAILED"],"title":"Payment Status","description":"이번 승인 요청의 결과. PENDING = 확인 중(미확정 포함)."}},"additionalProperties":false,"type":"object","required":["organization_id","subscription_id","plan_id","env_scope","invoice_id","payment_id","payment_status"],"title":"StandardCheckoutApproveResponse","description":"승인 요청 결과 스냅샷. 신규 구독 갈래와 추가 상품 갈래가 같은 모양을 쓴다."},"StandardCheckoutPrepareRequest":{"properties":{"organization_id":{"type":"integer","minimum":1.0,"title":"Organization Id","description":"결제 주체 조직 PK."},"plan_id":{"type":"integer","minimum":1.0,"title":"Plan Id","description":"plans.id."},"addon_product_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Addon Product Ids","description":"함께 구매할 추가 상품 api_products.id 목록."},"payer_name":{"type":"string","maxLength":50,"minLength":1,"title":"Payer Name","description":"결제창에 표시할 결제자명."},"subscription_id":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Subscription Id","description":"대상 구독. 추가 상품을 더하거나(기본) 실패한 결제를 다시 시도할 때 필수."},"mode":{"anyOf":[{"type":"string","enum":["subscription","addon","retry"]},{"type":"null"}],"title":"Mode","description":"결제 갈래를 명시한다. 생략하면 subscription_id 유무로 정한다. 'retry' 는 결제가 실패한 구독의 미결제 금액을 다시 내는 갈래."}},"additionalProperties":false,"type":"object","required":["organization_id","plan_id","payer_name"],"title":"StandardCheckoutPrepareRequest","description":"결제창을 열기 전에 서버가 값을 확정한다 (금액을 클라이언트가 정하지 못하게).\n\n갈래를 요청 DTO 여럿으로 나누지 않는 이유: 결제창을 여는 절차와 승인 절차가 갈래마다 완전히\n같고, 다른 것은 금액을 어디서 계산하느냐 하나뿐이다.\n\n`mode` 를 주면 그 갈래다. 생략하면 `subscription_id` 유무로 정한다(없으면 신규 구독, 있으면\n추가 상품) — 재시도만은 생략으로 도달할 수 없다. 추측으로 열리면 안 되는 갈래이기 때문이다\n(`CheckoutMode` 참고)."},"StandardCheckoutPrepareResponse":{"properties":{"merchant_id":{"type":"string","title":"Merchant Id","description":"결제창이 요구하는 가맹점 식별자(시크릿 아님)."},"sdk_url":{"type":"string","title":"Sdk Url","description":"결제창 스크립트 주소."},"item_name":{"type":"string","maxLength":128,"title":"Item Name","description":"결제창에 표시할 상품명."},"amount":{"type":"integer","minimum":1.0,"title":"Amount","description":"결제 금액 (minor unit)."},"currency":{"type":"string","const":"KRW","title":"Currency","description":"통화 코드."},"order_number":{"type":"string","maxLength":128,"title":"Order Number","description":"우리 주문번호."},"checkout_token":{"type":"string","title":"Checkout Token","description":"서버 서명 체크아웃 토큰."},"return_url":{"type":"string","title":"Return Url","description":"모바일 결제창 복귀 주소."}},"additionalProperties":false,"type":"object","required":["merchant_id","sdk_url","item_name","amount","currency","order_number","checkout_token","return_url"],"title":"StandardCheckoutPrepareResponse","description":"결제창을 띄우는 데 필요한 값 + 서버가 서명한 체크아웃 토큰.\n\n`checkout_token` 은 승인 단계에서 **서버가 정한 금액·상품** 을 되찾는 열쇠다. 금액을 응답에도\n함께 싣는 이유는 고객에게 보여 주기 위해서이고, 승인 때 믿는 값은 토큰 안의 것뿐이다."},"StandardCheckoutStatusResponse":{"properties":{"payment_id":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Payment Id"},"payment_status":{"anyOf":[{"type":"string","enum":["INITIATED","PENDING","SUCCEEDED","FAILED","CANCELED","EXPIRED"]},{"type":"null"}],"title":"Payment Status"},"retry_available":{"type":"boolean","title":"Retry Available","description":"지금 이 구독의 결제를 다시 시도할 수 있는지. false 면 결과를 확인하는 중이거나 이미 처리가 끝난 결제다.","default":false}},"additionalProperties":false,"type":"object","title":"StandardCheckoutStatusResponse","description":"우리 DB 에 적힌 결제 상태 조회 (외부 통신 0건).\n\n결제대행사에 거래조회 API 가 없어서 이 조회는 **우리가 아는 것만** 돌려준다.\n모르는 거래는 빈 응답이다 — 남의 거래번호를 넣어 본 사람에게 \"그런 거래가 있다\" 는 사실조차\n알려 주지 않는다.\n\n`retry_available` 이 여기 있는 이유: 결제가 실패한 고객에게 다음 행동을 알려\n주는 자리가 이 응답이다. 화면이 `payment_status` 로 추론하면 안 된다 — **실패한 결제라고 해서\n항상 다시 시도할 수 있는 것이 아니다**(결과를 모르는 승인이 남아 있으면 재시도는 이중 청구가\n된다). 그래서 버튼을 여는 판정과 실제로 문을 여는 판정을 **같은 함수 하나**로 묶는다."},"StatusTransition":{"properties":{"to":{"type":"string","enum":["DRAFT","ACTIVE","DEPRECATED","RETIRED"],"title":"To","description":"목표 상태. 허용 전이(ALLOWED_TRANSITIONS)만 받는다."},"reason":{"type":"string","maxLength":200,"minLength":1,"title":"Reason","description":"전이 사유. 감사로그에 적재된다."}},"additionalProperties":false,"type":"object","required":["to","reason"],"title":"StatusTransition","description":"상태 전이 본문 - `status_transition`.\n\n`PATCH /v1/products/{product_id}` 요청 본문에 nested로 동봉.\n허용 전이는 상태 전이 매트릭스(`ALLOWED_TRANSITIONS`)에 따른다.\n비허용 전이 시 라우트/서비스/DB 트리거 단계에서 `409 CATALOG_INVALID_TRANSITION`.\n\n감사 이벤트: `product.catalog.transitioned`(from, to, reason)."},"SubscriptionAddonAddRequest":{"properties":{"organization_id":{"type":"integer","minimum":1.0,"title":"Organization Id","description":"구독 소유 조직 PK. 주체 조직과 일치 강제."},"addon_product_ids":{"items":{"type":"integer"},"type":"array","minItems":1,"title":"Addon Product Ids","description":"Purchasable add-on api_products.id list. Must match ACTIVE plan_addon_offers for the subscription plan + env_scope."},"metadata":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Metadata","description":"Optional ops metadata. Reserved keys xdata_purpose / xdata_midlife_addons are owned by the service."}},"additionalProperties":false,"type":"object","required":["organization_id","addon_product_ids"],"title":"SubscriptionAddonAddRequest","description":"Mid-life Path B add-on purchase on an ACTIVE subscription.\n\nDoes not create a subscription. Charges add-on + tax only (no plan re-bill).\nPath B ``subscription_items`` are inserted only after payment SUCCEEDED."},"SubscriptionAddonAddResponse":{"properties":{"subscription_id":{"type":"integer","minimum":1.0,"title":"Subscription Id"},"organization_id":{"type":"integer","minimum":1.0,"title":"Organization Id"},"plan_id":{"type":"integer","minimum":1.0,"title":"Plan Id"},"payment_method_id":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Payment Method Id","description":"NULL = 결제창 인증 경로."},"status":{"type":"string","enum":["PENDING","ACTIVE","PAUSED","CANCELED","EXPIRED","PAYMENT_FAILED"],"title":"Status","description":"Subscription remains ACTIVE; add-on items appear after SUCCEEDED."},"env_scope":{"type":"string","enum":["sandbox","real_test","production"],"title":"Env Scope"},"invoice_id":{"type":"integer","minimum":1.0,"title":"Invoice Id"},"payment_id":{"type":"integer","minimum":1.0,"title":"Payment Id"},"addon_product_ids":{"items":{"type":"integer"},"type":"array","minItems":1,"title":"Addon Product Ids"}},"additionalProperties":false,"type":"object","required":["subscription_id","organization_id","plan_id","status","env_scope","invoice_id","payment_id","addon_product_ids"],"title":"SubscriptionAddonAddResponse","description":"202 Accepted mid-life add-on charge snapshot (invoice + payment INITIATED)."},"SubscriptionAddonItemResponse":{"properties":{"product_id":{"type":"integer","minimum":1.0,"title":"Product Id","description":"api_products.id."},"product_name":{"type":"string","maxLength":200,"minLength":1,"title":"Product Name","description":"api_products.name."},"amount_minor":{"type":"integer","minimum":0.0,"title":"Amount Minor","description":"subscription_items.amount_minor snapshot (renewal line)."},"currency":{"type":"string","const":"KRW","title":"Currency","description":"통화 코드. v1=KRW."}},"additionalProperties":false,"type":"object","required":["product_id","product_name","amount_minor","currency"],"title":"SubscriptionAddonItemResponse","description":"ACTIVE Path B subscription_items projection (custom-plan P1-sub / U3).\n\nMapped from ``SubscriptionItemRepository.list_active_item_snapshots_for_subscription``."},"SubscriptionAddonPreviewRequest":{"properties":{"organization_id":{"type":"integer","minimum":1.0,"title":"Organization Id","description":"구독 소유 조직 PK. 주체 조직과 일치 강제."},"addon_product_ids":{"items":{"type":"integer"},"type":"array","minItems":1,"title":"Addon Product Ids","description":"Purchasable add-on api_products.id list. Must match ACTIVE plan_addon_offers for the subscription plan + env_scope."}},"additionalProperties":false,"type":"object","required":["organization_id","addon_product_ids"],"title":"SubscriptionAddonPreviewRequest","description":"Mid-life Path B add-on charge preview (no DB write; no Idempotency-Key)."},"SubscriptionCancelRequest":{"properties":{"reason":{"anyOf":[{"type":"string","enum":["USER_REQUEST","OPS_FORCE_CANCEL","PAYMENT_FAILED","OTHER"]},{"type":"null"}],"title":"Reason","description":"취소 사유 enum. 미지정 시 라우트가 주체 권한 기반 기본값 부여 (사용자=USER_REQUEST, 운영자=OPS_FORCE_CANCEL)."},"note":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Note","description":"운영 메모(자유 텍스트). SCHEMA `cancel_reason VARCHAR(200)` 컬럼에 `reason` enum과 함께 합성 저장(서비스 계층 책임). PII 금지."}},"additionalProperties":false,"type":"object","title":"SubscriptionCancelRequest","description":"구독 취소 요청 - `POST .../cancel` 의 본문.\n\n허용 권한: 본인 조직 OWNER 또는 운영자(`BILLING_ADMIN`·`SYS_ADMIN`, request_kind=billing).\n본문 `{ \"reason\": \"USER_REQUEST\" }`(선택)를 DTO 단에서 enum으로 잠근다."},"SubscriptionCreateRequest":{"properties":{"organization_id":{"type":"integer","minimum":1.0,"title":"Organization Id","description":"구독 소유 조직 PK. 주체 조직과 일치 강제."},"plan_id":{"type":"integer","minimum":1.0,"title":"Plan Id","description":"plans.id (ACTIVE 상태만 허용)."},"payment_method_id":{"type":"integer","minimum":1.0,"title":"Payment Method Id","description":"payment_methods.id (ACTIVE 상태 + 본인 조직 소유만 허용)."},"metadata":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Metadata","description":"운영 메타데이터 (예: source, utm_*, referrer). PII/secret 적재 금지. 키 화이트리스트는 별도 결정."},"addon_product_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Addon Product Ids","description":"Optional purchasable add-on api_products.id list. Must match ACTIVE plan_addon_offers for plan_id + env_scope."}},"additionalProperties":false,"type":"object","required":["organization_id","plan_id","payment_method_id"],"title":"SubscriptionCreateRequest","description":"구독 생성 요청.\n\n처리 흐름:\n1) AuthPolicyService 평가(`request_kind='billing'`, OWNER/ADMIN)\n2) plan/payment_method 소유권·상태·env_scope 검증\n3) `subscriptions` 행 PENDING 생성\n4) `invoices` DRAFT→OPEN 발행\n5) 결제 요청 → `payments` INITIATED→PENDING\n6) 동기 응답: 202 Accepted + 현재 상태 스냅샷\n\n`organization_id`는 주체(`PrincipalContext.organization_id`)와 일치 강제(라우트 검증).\n조직당 활성 구독 1건 룰은 서비스 계층이 SCHEMA `uq_subscriptions_org_active`로 보장.\n\n`metadata`는 입력만 허용(응답 미노출). PII/secret/credential 적재 금지.\n키 화이트리스트는 후속 ADR(`source`/`utm_*`/`referrer` 등 운영 메타)."},"SubscriptionCreateResponse":{"properties":{"subscription_id":{"type":"integer","minimum":1.0,"title":"Subscription Id","description":"subscriptions.id."},"organization_id":{"type":"integer","minimum":1.0,"title":"Organization Id","description":"소유 조직 PK."},"plan_id":{"type":"integer","minimum":1.0,"title":"Plan Id","description":"plans.id."},"payment_method_id":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Payment Method Id","description":"NULL = 결제창 인증 경로."},"status":{"type":"string","enum":["PENDING","ACTIVE","PAUSED","CANCELED","EXPIRED","PAYMENT_FAILED"],"title":"Status","description":"구독 상태. 본 응답은 보통 PENDING(202 Accepted)."},"env_scope":{"type":"string","enum":["sandbox","real_test","production"],"title":"Env Scope","description":"환경 스코프."},"first_invoice_id":{"type":"integer","minimum":1.0,"title":"First Invoice Id","description":"구독 생성과 함께 발행된 첫 인보이스 ID(invoices.id, OPEN 상태)."},"first_payment_id":{"type":"integer","minimum":1.0,"title":"First Payment Id","description":"구독 생성과 함께 시도된 첫 결제 ID(payments.id, INITIATED/PENDING 상태)."},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"구독 생성 시각 (aware datetime, naive 입력 시 422)."}},"additionalProperties":false,"type":"object","required":["subscription_id","organization_id","plan_id","status","env_scope","first_invoice_id","first_payment_id","created_at"],"title":"SubscriptionCreateResponse","description":"구독 생성 응답 - `202 Accepted` 의 몸통.\n\n조회 응답과 다른 객체:\n- 본 응답은 **첫 청구/결제 식별자**(`first_invoice_id`/`first_payment_id`)를 포함하여\n  BFF가 즉시 결제 진행 상태를 폴링/구독할 수 있도록 한다.\n- 본 응답에는 nested `plan` 객체 없음(생성 시점에 plan 변경 없음 + 응답 크기 최소화).\n  조회는 `GET /v1/subscriptions/{id}`(`SubscriptionResponse`) 사용."},"SubscriptionListQuery":{"properties":{"organization_id":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Organization Id","description":"조직 PK. 본인 조직이면 미지정 가능(라우트가 PrincipalContext에서 주입). 운영자(BILLING_ADMIN·SYS_ADMIN)는 타 조직 조회 시 명시."},"status":{"anyOf":[{"items":{"type":"string","enum":["PENDING","ACTIVE","PAUSED","CANCELED","EXPIRED","PAYMENT_FAILED"]},"type":"array"},{"type":"null"}],"title":"Status","description":"상태 필터(다중). 미지정 시 PENDING+ACTIVE+PAUSED+PAYMENT_FAILED 기본."},"limit":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Limit","description":"페이지 크기.","default":20},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor","description":"이전 응답의 next_cursor."}},"type":"object","title":"SubscriptionListQuery","description":"구독 목록 조회 쿼리.\n\n상위 계약에 쿼리 표가 없어 이 DTO 가 그 자리를 대신한다. 자동 필터(라우트 강제):\n- `organization_id`: 본인 조직(운영자 admin_user 는 명시 organization_id 전달 가능)\n- `env_scope = X-Env-Scope` (헤더)\n- `deleted_at IS NULL` (서비스 항상 적용)"},"SubscriptionPauseRequest":{"properties":{"reason":{"type":"string","enum":["OPS_HOLD","USER_REQUEST","OTHER"],"title":"Reason","description":"일시중지 사유. 기본값 OPS_HOLD.","default":"OPS_HOLD"},"note":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Note","description":"운영 메모(자유 텍스트). PII 금지."}},"additionalProperties":false,"type":"object","title":"SubscriptionPauseRequest","description":"구독 일시중지 요청 - `POST .../pause` 의 본문.\n\n허용 권한: 운영자(`BILLING_ADMIN`·`SYS_ADMIN`, request_kind=billing) 전용.\n`reason`의 기본값은 `OPS_HOLD`다."},"SubscriptionPaymentMethodAttachRequest":{"properties":{"payment_method_id":{"type":"integer","minimum":1.0,"title":"Payment Method Id","description":"구독이 앞으로 쓸 결제수단 id. 같은 조직 · 같은 환경의 ACTIVE 이고 빌키로 청구할 수 있는 종류여야 한다."}},"additionalProperties":false,"type":"object","required":["payment_method_id"],"title":"SubscriptionPaymentMethodAttachRequest","description":"구독이 쓸 결제수단. 구독과 같은 조직의 ACTIVE 결제수단이어야 한다(서비스가 가린다)."},"SubscriptionPaymentRetryPreviewResponse":{"properties":{"subscription_id":{"type":"integer","minimum":1.0,"title":"Subscription Id"},"organization_id":{"type":"integer","minimum":1.0,"title":"Organization Id"},"available":{"type":"boolean","title":"Available","description":"지금 POST 를 보내면 열리는가. 붙은 카드가 청구할 수 있는 카드일 때까지 포함한다."},"reason":{"anyOf":[{"type":"string","enum":["NOT_PAYMENT_FAILED","NO_OPEN_INVOICE","MULTIPLE_OPEN_INVOICES","PAYMENT_IN_PROGRESS","NO_PAYMENT_METHOD","PAYMENT_METHOD_NOT_CHARGEABLE"]},{"type":"null"}],"title":"Reason","description":"available 이 false 일 때만. 구조 사유(앞 넷)가 카드 사유(뒤 둘)보다 먼저 판정된다 - NO_PAYMENT_METHOD · PAYMENT_METHOD_NOT_CHARGEABLE 만 카드를 붙이면 풀린다."},"invoice":{"anyOf":[{"$ref":"#/components/schemas/PaymentRetryInvoice"},{"type":"null"}],"description":"미결제 청구서가 정확히 하나일 때만(아니면 null). 못 열 때도 하나면 실린다."},"payment_method":{"anyOf":[{"$ref":"#/components/schemas/PaymentRetryPaymentMethod"},{"type":"null"}],"description":"구독이 지금 가리키는 결제수단(없으면 null). 못 열 때도 실린다."}},"additionalProperties":false,"type":"object","required":["subscription_id","organization_id","available"],"title":"SubscriptionPaymentRetryPreviewResponse","description":"읽기 응답 - 「다시 결제」 단추를 그릴지와 그 화면에 보일 값."},"SubscriptionPaymentRetryRequest":{"properties":{"payment_method_id":{"type":"integer","minimum":1.0,"title":"Payment Method Id","description":"화면이 고객에게 보여 준 결제수단 id. 구독에 **지금 붙은** 결제수단과 같아야 한다 - 다르면 청구하지 않고 거절한다(고객이 본 카드로만 청구)."}},"additionalProperties":false,"type":"object","required":["payment_method_id"],"title":"SubscriptionPaymentRetryRequest","description":"다시 결제 요청 - 화면이 보여 준 카드 번호 하나."},"SubscriptionPaymentRetryResponse":{"properties":{"subscription_id":{"type":"integer","minimum":1.0,"title":"Subscription Id"},"organization_id":{"type":"integer","minimum":1.0,"title":"Organization Id"},"invoice_id":{"type":"integer","minimum":1.0,"title":"Invoice Id"},"payment_id":{"type":"integer","minimum":1.0,"title":"Payment Id"},"payment_status":{"type":"string","enum":["SUCCEEDED","PENDING"],"title":"Payment Status"},"subscription_status":{"type":"string","enum":["PENDING","ACTIVE","PAUSED","CANCELED","EXPIRED","PAYMENT_FAILED"],"title":"Subscription Status","description":"이 응답 시점의 구독 상태. 자동결제(HUB)는 성공이 같은 요청 안에서 ACTIVE 로 돌린다."},"amount_minor":{"type":"integer","minimum":0.0,"title":"Amount Minor"},"currency":{"type":"string","const":"KRW","title":"Currency"}},"additionalProperties":false,"type":"object","required":["subscription_id","organization_id","invoice_id","payment_id","payment_status","subscription_status","amount_minor","currency"],"title":"SubscriptionPaymentRetryResponse","description":"쓰기 응답 - 거절(FAILED)은 응답이 아니라 402 오류로 온다.\n\n`payment_status` 가 PENDING 이면 **결과를 모르는 승인**이거나 웹훅을 기다리는 청구다 - 실패로 적지 않는다(카드사에서는 승인됐을 수 있다).\n그때 `subscription_status` 는 PAYMENT_FAILED 그대로이고, 읽기는 PAYMENT_IN_PROGRESS 로 닫힌다."},"SubscriptionQuoteLineItem":{"properties":{"description":{"type":"string","title":"Description"},"quantity":{"type":"integer","minimum":1.0,"title":"Quantity"},"unit_amount_minor":{"type":"integer","minimum":0.0,"title":"Unit Amount Minor"},"amount_minor":{"type":"integer","minimum":0.0,"title":"Amount Minor"},"currency":{"type":"string","maxLength":3,"minLength":3,"title":"Currency"},"item_kind":{"type":"string","title":"Item Kind"},"plan_id":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Plan Id"},"product_id":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Product Id"}},"additionalProperties":false,"type":"object","required":["description","quantity","unit_amount_minor","amount_minor","currency","item_kind"],"title":"SubscriptionQuoteLineItem","description":"Preview line item mirroring invoice issue input."},"SubscriptionQuoteRequest":{"properties":{"organization_id":{"type":"integer","minimum":1.0,"title":"Organization Id"},"plan_id":{"type":"integer","minimum":1.0,"title":"Plan Id"},"addon_product_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Addon Product Ids"}},"additionalProperties":false,"type":"object","required":["organization_id","plan_id"],"title":"SubscriptionQuoteRequest","description":"Hybrid subscribe quote preview. No DB write; no Idempotency-Key."},"SubscriptionQuoteResponse":{"properties":{"organization_id":{"type":"integer","minimum":1.0,"title":"Organization Id"},"plan_id":{"type":"integer","minimum":1.0,"title":"Plan Id"},"env_scope":{"type":"string","enum":["sandbox","real_test","production"],"title":"Env Scope"},"subtotal_amount_minor":{"type":"integer","minimum":0.0,"title":"Subtotal Amount Minor"},"tax_amount_minor":{"type":"integer","minimum":0.0,"title":"Tax Amount Minor"},"total_amount_minor":{"type":"integer","minimum":0.0,"title":"Total Amount Minor"},"currency":{"type":"string","maxLength":3,"minLength":3,"title":"Currency"},"line_items":{"items":{"$ref":"#/components/schemas/SubscriptionQuoteLineItem"},"type":"array","title":"Line Items"},"subscription_id":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Subscription Id","description":"Set for mid-life add-on preview only."},"full_charge":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Full Charge","description":"True for mid-life preview: no proration; immediate full charge."},"next_billing_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Billing At","description":"Echo of subscription.next_billing_at (unchanged by mid-life charge)."}},"additionalProperties":false,"type":"object","required":["organization_id","plan_id","env_scope","subtotal_amount_minor","tax_amount_minor","total_amount_minor","currency","line_items"],"title":"SubscriptionQuoteResponse","description":"Quote preview envelope (no invoice/payment ids).\n\nNew-subscribe ``POST /quote`` leaves mid-life-only fields unset.\nMid-life ``POST .../addons/preview`` sets ``subscription_id``,\n``full_charge=True``, and ``next_billing_at`` (period unchanged)."},"SubscriptionResponse":{"properties":{"subscription_id":{"type":"integer","minimum":1.0,"title":"Subscription Id","description":"subscriptions.id."},"organization_id":{"type":"integer","minimum":1.0,"title":"Organization Id","description":"소유 조직 PK."},"plan":{"$ref":"#/components/schemas/PlanSummary","description":"현재 요금제 요약(plan_id/code/tier)."},"payment_method_id":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Payment Method Id","description":"활성 결제수단 ID. SCHEMA NULL 허용 (수동 청구 모드 가능)."},"status":{"type":"string","enum":["PENDING","ACTIVE","PAUSED","CANCELED","EXPIRED","PAYMENT_FAILED"],"title":"Status","description":"구독 상태 (6값 enum)."},"env_scope":{"type":"string","enum":["sandbox","real_test","production"],"title":"Env Scope","description":"환경 스코프."},"current_period_start":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Current Period Start","description":"현재 청구 기간 시작 (PENDING 시 NULL 가능)."},"current_period_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Current Period End","description":"현재 청구 기간 종료 (PENDING 시 NULL 가능)."},"next_billing_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Billing At","description":"다음 자동 청구 시각 (PAUSED/CANCELED/EXPIRED 시 NULL)."},"grace_period_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Grace Period Until","description":"결제 실패 유예 종료 시각 (PAYMENT_FAILED 상태에서 채워짐)."},"canceled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Canceled At","description":"취소 시각 (CANCELED 진입 시 채워짐)."},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"구독 생성 시각 (aware datetime, naive 입력 시 422)."},"addon_items":{"items":{"$ref":"#/components/schemas/SubscriptionAddonItemResponse"},"type":"array","title":"Addon Items","description":"ACTIVE Path B packs (product_name for Console subscription card)."}},"additionalProperties":false,"type":"object","required":["subscription_id","organization_id","plan","status","env_scope","created_at"],"title":"SubscriptionResponse","description":"구독 단일 객체 응답.\n\nSCHEMA → DTO 매핑:\n- `subscriptions.id` → `subscription_id`.\n- `organization_id/payment_method_id/status/env_scope/current_period_*/next_billing_at/\n  grace_period_until/canceled_at/created_at` → 직접 매핑.\n- `plans.id` + `plans.code` + `plans.tier` → nested `PlanSummary` 객체 `plan`\n  (BFF가 plan 별도 조회 회피).\n- ACTIVE `subscription_items` → `addon_items[]` (Service enrich; mapper default []).\n- `cancel_reason`/`metadata`/`updated_at`/`deleted_at`/`plan_id` 직접 노출 X\n  (cancel_reason은 감사로그/운영 API에서 조회).\n\n`payment_method_id`는 SCHEMA `NULL 허용`(자동 결제 미설정 가능)이므로 Optional."},"SubscriptionResumeRequest":{"properties":{"note":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Note","description":"운영 메모(자유 텍스트). PII 금지."}},"additionalProperties":false,"type":"object","title":"SubscriptionResumeRequest","description":"구독 재개 요청 - `POST .../resume` 의 본문.\n\n허용 권한: 운영자(`BILLING_ADMIN`·`SYS_ADMIN`, request_kind=billing) 전용.\n본문은 비어 있어야 한다(빈 `{}`). `extra='forbid'`로 미선언 필드 거부."},"SubscriptionUsageSummaryResponse":{"properties":{"subscription_id":{"type":"integer","minimum":1.0,"title":"Subscription Id","description":"subscriptions.id."},"organization_id":{"type":"integer","minimum":1.0,"title":"Organization Id","description":"소유 조직 PK."},"env_scope":{"type":"string","enum":["sandbox","real_test","production"],"title":"Env Scope","description":"환경 스코프."},"period_start":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Period Start","description":"현재 청구 기간 시작 (미확정 시 NULL)."},"period_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Period End","description":"현재 청구 기간 종료 (미확정 시 NULL)."},"included_usage_free_units":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Included Usage Free Units","description":"플랜 무료 포함건수(N). NULL=무료 미설정(1건부터 종량 과금)."},"used_quantity":{"type":"integer","minimum":0.0,"title":"Used Quantity","description":"현재 청구 기간 내 총 사용량(집계+미집계 합산)."}},"additionalProperties":false,"type":"object","required":["subscription_id","organization_id","env_scope","used_quantity"],"title":"SubscriptionUsageSummaryResponse","description":"`GET /v1/subscriptions/{id}/usage-summary` 응답 - 실사용 축이고 청구 계산과 무관하다.\n\n콘솔 \"이번 결제주기 사용량\" 표시 전용 — `used_quantity` 는 집계(청구 확정) +\n미집계(pending) 사용량을 모두 합산한 값이라 `sum_aggregated_quantity_for_period`\n(청구 로직, 집계된 수량만) 와는 축이 다르다. 청구 금액 산정에는 사용하지 않는다.\n\n`period_start`/`period_end`/`included_usage_free_units` 가 모두 NULL 이면\n(`current_period_start`/`end` 미확정 = PENDING 등) `used_quantity=0` 고정\n(`_resolve_free_allowance` fail-safe 1:1 재사용)."},"UserProfilePatchRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"User display name (1-200 chars when provided)."},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone","description":"Contact phone (KR mobile; normalized server-side)."}},"type":"object","title":"UserProfilePatchRequest","description":"PATCH /v1/me/profile request body (CR-FE-002, CR-FE-003 v2)."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WebhookAckResponse":{"properties":{"received":{"type":"boolean","const":true,"title":"Received","description":"수신 확인. 잠금된 단일 값(`true`). PG 사업자 호환 보존 위해 변경 금지. false 반환 케이스는 정의되지 않으며, 영구 오류도 `received=true` + 내부 FAILED 분류."}},"additionalProperties":false,"type":"object","required":["received"],"title":"WebhookAckResponse","description":"PG 웹훅 수신 ACK 응답.\n\n외부 응답은 단순 ack만 반환한다:\n    - 정상 처리: 200 OK + `{ \"received\": true }`\n    - 중복 수신: 200 OK + `{ \"received\": true }` (SKIPPED_DUPLICATE 내부 분류)\n    - 영구 오류: 200 OK + `{ \"received\": true }` (FAILED 내부 분류; PG 재전송 폭주 방지)\n\nPG가 비-2xx 응답 시 재전송하므로, 비즈 처리 실패가 일시적이지 않은 **영구 오류**라면\n200 OK + `processing_status='FAILED'` 적재로 재전송 폭주를 막는다.\n\n서명 실패/payload 오류는 본 DTO 대신 표준 오류 envelope으로 응답:\n    - 401 WEBHOOK_SIGNATURE_INVALID\n    - 400 WEBHOOK_PAYLOAD_INVALID\n    - 503 PROVIDER_UNAVAILABLE (PG 자동 재전송 유도)\n\n응답 시그니처는 PG 사업자별로 호환을 유지해야 하므로(PG 재시도 정책 보존),\n필드 추가/제거/변경은 상위 계약과 이 docstring 을 함께 고치고 별도 결정을 거친다.\n\n본 응답은 외부 노출 전용 — `billing_events.id`/`processing_status` 등 내부 식별자는\n포함하지 않는다(증거 보존 + 운영 API 분리)."},"ZeroPricePlanJoinRequest":{"properties":{"organization_id":{"type":"integer","minimum":1.0,"title":"Organization Id"},"plan_id":{"type":"integer","minimum":1.0,"title":"Plan Id"}},"additionalProperties":false,"type":"object","required":["organization_id","plan_id"],"title":"ZeroPricePlanJoinRequest","description":"결제 없이 그 요금제의 ACTIVE 구독을 만든다.\n\n같은 요금제에 다시 부르면 바뀌는 것 없이 같은 구독이 온다 - 그래서 Idempotency-Key 를 받지 않는다."},"ZeroPricePlanJoinResponse":{"properties":{"organization_id":{"type":"integer","minimum":1.0,"title":"Organization Id"},"plan_id":{"type":"integer","minimum":1.0,"title":"Plan Id"},"subscription_id":{"type":"integer","minimum":1.0,"title":"Subscription Id"},"membership_tier":{"type":"string","title":"Membership Tier"},"subscription_status":{"type":"string","title":"Subscription Status"},"idempotent":{"type":"boolean","title":"Idempotent"}},"additionalProperties":false,"type":"object","required":["organization_id","plan_id","subscription_id","membership_tier","subscription_status","idempotent"],"title":"ZeroPricePlanJoinResponse"},"services__common__routes__OrganizationMemberInviteRequest":{"properties":{"email":{"type":"string","title":"Email","description":"Existing console user email."},"role":{"type":"string","title":"Role","description":"ADMIN or MEMBER."}},"type":"object","required":["email","role"],"title":"OrganizationMemberInviteRequest","description":"POST /v1/me/organization/members request body (CR-FE-009)."},"services__common__routes__OrganizationMemberRolePatchRequest":{"properties":{"role":{"type":"string","title":"Role","description":"ADMIN or MEMBER."}},"type":"object","required":["role"],"title":"OrganizationMemberRolePatchRequest","description":"PATCH /v1/me/organization/members/{user_id} request body (CR-FE-009)."}},"securitySchemes":{"basicClientCredential":{"type":"http","scheme":"basic","description":"Console-issued client credential. Send `Authorization: Basic base64(client_id:client_secret)`."},"mcpOAuth2":{"type":"oauth2","description":"For MCP clients. Dynamic client registration is supported.","flows":{"authorizationCode":{"authorizationUrl":"https://api.xdata.kr/oauth/authorize","tokenUrl":"https://api.xdata.kr/oauth/token","scopes":{}}}}}},"paths":{"/v1/jobs":{"post":{"tags":["UnifiedJob"],"summary":"작업 제출","description":"`POST /v1/jobs` 작업 제출 단일 진입점.\n\n응답 분기:\n    - 신규 INSERT (inserted=True)         → 202 Accepted\n    - 멱등 매칭 (inserted=False, no conflict) → 200 OK\n    - 멱등 충돌 (IdempotencyKeyConflict)  → 409 IDEMPOTENCY_KEY_CONFLICT\n    - 정책 거부 (AuthPolicyError)         → 401/402/403/422/429\n    - 입력 검증 실패 (ValueError)         → 400 VALIDATION_INVALID_FIELD\n    - account_link 소유권 실패            → 404 RESOURCE_NOT_FOUND\n    - 그 외 예외                          → 500 INTERNAL_ERROR","operationId":"submit_job_v1_v1_jobs_post","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}},{"name":"User-Agent","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User-Agent"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobSubmitRequest"}}}},"responses":{"200":{"description":"같은 멱등키·같은 본문의 재생 - 그 작업의 **지금** 상태다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobSubmitResponse"}}}},"202":{"description":"새 접수 - 작업이 `QUEUED` 로 들어갔다(정본 §4-1).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobSubmitResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/jobs/all-accounts":{"post":{"tags":["UnifiedJob"],"summary":"모든 계좌 작업 제출","description":"계좌 전부(또는 `bank_account_credential_ids` 로 고른 계좌들)로 작업을 계좌마다 하나씩 접수한다. 계좌마다 사용 토큰이 하나씩 듭니다. 기업정보 브리프처럼 한 번에 여러 사용 토큰을 쓰는 업무는 그 값만큼 계좌마다 듭니다.\n\n응답 분기:\n- 새로 접수한 줄이 하나라도 있다 -> `202 Accepted`\n- 새로 접수한 줄이 없다(같은 멱등키의 재전송이거나 전부 접수하지 못했다) -> `200 OK`\n- 사용 토큰이 모자라다 -> 하나도 접수하지 않고 거절한다. 거절 문장에 필요한 토큰과 지금 남은 토큰이 있다.\n- 은행 동시 작업 상한 때문에 아직 접수하지 못한 줄은 `NOT_SUBMITTED` 로 남고, 응답의 `next` 가 그 계좌 목록을 준다.\n- 줄을 접수한 뒤 동시 작업 상한이 아닌 다른 거절로 호출이 멈추면 오류로 돌려주지 않는다 - 이미 접수한 줄은 그대로 두고 응답에 `interruption`(코드 · 문장 · 세부 까닭)을 더한다. 멈춘 줄과 그 뒤 줄은 `NOT_SUBMITTED` + `interrupted` 이고 `next` 가 그 계좌 목록을 준다.\n- 계좌가 하나도 없거나 이 액션이 계좌를 고르지 않는 액션이면 접수 없이 거절한다.\n\n`Idempotency-Key` 헤더가 필수다. 계좌마다 키를 만들어 쓰므로 같은 요청을 같은 키로 다시 보내면 이미 접수한 줄은 새 작업 없이 그대로 돌아온다.","operationId":"submit_all_accounts_v1_v1_jobs_all_accounts_post","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}},{"name":"User-Agent","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User-Agent"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AllAccountsSubmitRequest"}}}},"responses":{"200":{"description":"새로 접수한 줄이 없다 - 같은 멱등키의 재전송이거나 전부 접수하지 못했다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AllAccountsSubmitResponse"}}}},"202":{"description":"새로 접수한 줄이 하나라도 있다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AllAccountsSubmitResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/app-credentials":{"post":{"tags":["AppCredential"],"summary":"외부 앱 client_credential 발급 (APP_CREDENTIAL_SCHEMA §3-3)","description":"`POST /v1/app-credentials` 단일 진입점 (APP_CREDENTIAL_SCHEMA §3-3 + §6 1:1).\n\nPR-N-3 (Phase 2 외부 표면 4호 본체 3단계). PR-J-3 의 `submit_job_v1` 패턴\n1:1 재사용 (8 원칙 #1 공통모듈화). 정책 평가 + app_credentials INSERT +\n`app_credential.issued` audit 적재 단일 트랜잭션.\n\n응답 분기:\n    - 정상 발급                              → 201 Created + 3필드 envelope\n      ({client_id, client_secret, created_at})\n    - 정책 거부 (AuthPolicyError)            → 401/402/403/422/429 (PR-M 정밀 매핑)\n    - Service 거부 (AppCredentialIssueError) → 6 error_code 정밀 매핑:\n        * PRINCIPAL_KIND_FORBIDDEN          → 403 AUTHZ_FORBIDDEN\n        * PRINCIPAL_USER_ID_MISSING         → 500 INTERNAL_ERROR (운영 진단)\n        * ORGANIZATION_ID_MISSING           → 400 VALIDATION_INVALID_FIELD\n        * PRODUCTION_SCOPE_FORBIDDEN_V1     → 402 POLICY_PAID_REQUIRED\n        * INVALID_LABEL_LENGTH              → 400 VALIDATION_INVALID_FIELD\n        * INVALID_ENV_SCOPE                 → 400 VALIDATION_INVALID_FIELD\n    - Repository ValueError                  → 500 INTERNAL_ERROR (Service 가 만든 행의\n      사전 검증 실패 = 우리 결함. 고객 입력은 위 두 코드로 먼저 걸린다, 검수 1a0c5311804)\n    - 그 외 예외                              → 500 INTERNAL_ERROR\n\nSecurity (APP_CREDENTIAL_SCHEMA §10 금지):\n    평문 `client_secret` 은 본 응답 body 에서 1회 노출 후 caller 가 즉시\n    보관해야 한다. 서버는 본 함수가 응답 직렬화 직후 변수 reference 를\n    새 dict 로 분리하여 best-effort 폐기 (Python str immutable). 평문은\n    로그/메트릭/exception traceback 어디에도 진입하지 않는다.","operationId":"issue_app_credential_v1_v1_app_credentials_post","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"User-Agent","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User-Agent"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppCredentialIssueRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["AppCredential"],"summary":"외부 앱 client_credential 목록 조회 (APP_CREDENTIAL_SCHEMA §6 line 194)","description":"`GET /v1/app-credentials` 단일 진입점\n(APP_CREDENTIAL_SCHEMA §6 line 194 1:1, PR-N-6).\n\nPhase 2 외부 표면 5호 — 자기 organization 의 ACTIVE 자격증명 목록 조회.\nPR-J-4 read 패턴 1:1 재사용 (8 원칙 #1 공통모듈화 + #3 일관성). SELECT 만\n이므로 audit 신규 적재 0건 — 정책 평가 자체의 `auth.policy.evaluation`\naudit 1건만 §5-11 에서 적재.\n\n응답 분기 (4 error_code → ERROR_CODES.md 표준 envelope 정밀 매핑 잠금):\n    - 정상 조회                              → 200 OK + 4필드 envelope\n      ({items, total, limit, offset}) — items 는 6-key row (client_id /\n      label / allowed_env_scopes / status / created_at / last_used_at)\n    - 정책 거부 (AuthPolicyError)            → 401/402/403/422/429\n      (PR-M 정밀 매핑, 미들웨어 위임)\n    - Service 거부 (AppCredentialListError)  → 4 error_code 정밀 매핑:\n        * PRINCIPAL_KIND_FORBIDDEN          → 403 AUTHZ_FORBIDDEN\n        * PRINCIPAL_USER_ID_MISSING         → 500 INTERNAL_ERROR (운영 진단)\n        * ORGANIZATION_ID_MISSING           → 400 VALIDATION_INVALID_FIELD\n        * PRINCIPAL_NOT_OWNER_OR_ADMIN      → 403 AUTHZ_FORBIDDEN\n    - Repository ValueError                  → 400 VALIDATION_INVALID_FIELD\n      (limit/offset 사전 검증 결함 — Pydantic Field constraints 가 1차 차단)\n    - 그 외 예외                              → 500 INTERNAL_ERROR (미들웨어)\n\nFilter / Pagination (M-3 Opt-A + M-2 Opt-A 추천 결정):\n    - status 필터: default ACTIVE-only (REVOKED 자격증명 외부 노출 0건 —\n      보안 표면 최소화). 후속 PR 에서 ?status=all|revoked query 파라미터로\n      확장 가능 (의식적 deferred — 본 PR-N-6 v1 default 잠금).\n    - 정렬: created_at DESC, id DESC (최근 발급 순 + tie-breaker 안정 정렬).\n    - SELECT 컬럼 (M-5 Opt-A — PII 외부 노출 0건): client_id / label /\n      allowed_env_scopes / status / created_at / last_used_at 6 컬럼.\n      제외 = id / client_secret_hash / secret_algo / organization_id* /\n      created_by_user_id* / revoked_* / last_used_ip_hash / updated_at.\n\norganization 격리 (M-3 Opt-c 패턴 1:1 재사용):\n    Repository SQL `WHERE organization_id = :o` + Service principal.\n    organization_id 양측 잠금 — 다른 organization 의 자격증명 조회 표면\n    0건 (escalation 차단). console_user 는 자기 organization 만, admin_user\n    는 X-Organization-Id 헤더로 위임 organization 진입.","operationId":"list_app_credentials_v1_v1_app_credentials_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"페이지 크기 (1-100). default 20 — 운영자 콘솔 일반 페이지 크기 + Repository._validate_list_inputs 다층 안전망.","default":20,"title":"Limit"},"description":"페이지 크기 (1-100). default 20 — 운영자 콘솔 일반 페이지 크기 + Repository._validate_list_inputs 다층 안전망."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"페이지 오프셋 (>= 0). default 0 — 첫 페이지 진입. OFFSET 음수는 Pydantic ge=0 + Repository._validate_list_inputs 양측 차단.","default":0,"title":"Offset"},"description":"페이지 오프셋 (>= 0). default 0 — 첫 페이지 진입. OFFSET 음수는 Pydantic ge=0 + Repository._validate_list_inputs 양측 차단."},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/credentials/link":{"post":{"tags":["CredentialLink"],"summary":"Connected ID (account_link_id) 발급 — 사용자 인증서 연동","description":"`POST /v1/credentials/link` 자격증명 연결 단일 진입점.\n\nJWT(console_user) 또는 desktop_agent client_credential 로 호출한다.\n정책 평가 + user_credentials\nINSERT + `account_link.linked` audit 단일 트랜잭션. 레거시 `register/v1` 도\n동일 `_run_credential_link_pipeline` 경유. `register_user_certificate()`\n우회 0건.\n\n응답 분기:\n    - LINKED                                   -> 201 Created + 2필드 envelope\n    - IDEMPOTENT_MATCH / REACTIVATED / UPDATED -> 200 OK + 2필드 envelope\n    - 정책 거부 (AuthPolicyError)            -> 401/402/403/422/429\n    - Service 거부 (AccountLinkLinkError)    → 5 error_code 정밀 매핑\n    - RSA/필드 검증 ValueError               → 400 VALIDATION_INVALID_FIELD\n    - 그 외 예외                              → 500 INTERNAL_ERROR\n\n같은 신원으로 다시 부를 때 무엇이 되는지는 **자재 값**이 정한다(결정 큐 D-76,\n사용자 결정 2026-09-20 · 선언은\n`identity_credential_link_lifecycle.MATERIAL_REPLACEMENT_BY_CREDENTIAL_KIND`):\n\n    - 값이 같다                 -> ``IDEMPOTENT_MATCH``. 쓰기 0 · 감사 0 · 기관 세션 유지.\n    - 값이 다르다 (인증서)      -> 지문이 자재 자체라 애초에 다른 연동이 된다.\n    - 값이 다르다 (동의 왕복)   -> ``UPDATED``. 동의 화면이 곧 명시 확인이다.\n    - 값이 다르다 (ID/비밀번호) -> ``confirm: true`` 가 없으면 **409 RESOURCE_CONFLICT**\n      (``MATERIAL_REPLACEMENT_NOT_CONFIRMED``). 있으면 ``UPDATED``.\n\n``UPDATED`` 는 전에 이 목록에 없었다 - 덮어쓰기가 문서화되지 않은 조용한 200 이었다.\n\n`Idempotency-Key` 는 선택이다. 헤더가 없으면 위 분기가 그대로다. 헤더를 주면 첫 응답이\n저장되고 같은 키의 재전송은 그 status/body 를 그대로 재생하며 `X-Idempotency-Replay: true`\n를 붙인다(IDEMPOTENCY_STANDARD §4). 만료·본문 불일치는 409 IDEMPOTENCY_KEY_CONFLICT 다.","operationId":"link_credential_v1_v1_credentials_link_post","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"User-Agent","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User-Agent"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"선택. 전사 표준 형식(1~128자 ASCII, UUID v4 권장). 주면 같은 키의 재전송이 등록을 두 번 하지 않고 첫 응답을 그대로 돌려준다(X-Idempotency-Replay: true). 결과는 GET /v1/credentials/link-operations 로 같은 키를 주고 조회한다.","title":"Idempotency-Key"},"description":"선택. 전사 표준 형식(1~128자 ASCII, UUID v4 권장). 주면 같은 키의 재전송이 등록을 두 번 하지 않고 첫 응답을 그대로 돌려준다(X-Idempotency-Replay: true). 결과는 GET /v1/credentials/link-operations 로 같은 키를 주고 조회한다."},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CredentialLinkRequest"}}}},"responses":{"200":{"description":"Idempotent match or reactivated credential","content":{"application/json":{"schema":{}}}},"201":{"description":"New credential linked"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/credentials/consent-url":{"post":{"tags":["CredentialLink"],"summary":"동의 화면 주소 발급 (OAuth 연동 시작)","description":"`POST /v1/credentials/consent-url` — 고객을 보낼 동의 화면 주소를 만든다 (E3).\n\n폼으로 연결하는 provider(인증서 · 아이디/비밀번호)와 달리, 동의 왕복 provider 는 고객이\n플랫폼 화면에서 허락한 뒤 돌아온다. 이 엔드포인트가 그 **시작점**이고, 돌아온 뒤에는\n지금까지와 같은 단일 진입점 `POST /v1/credentials/link` 로 인가 코드를 보낸다.\n\n주소 안의 값은 전부 서버가 정한다 — 범위 · 동의 주소는 상품 어댑터가, 복귀 주소는\n`public_urls` 한 곳이, `state` 는 서명이 만든다. 화면이 보낸 값을 그대로 쓰지 않는다.","operationId":"issue_credential_consent_url_v1_v1_credentials_consent_url_post","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CredentialConsentUrlRequest"}}}},"responses":{"200":{"description":"Consent URL issued","content":{"application/json":{"schema":{}}}},"400":{"description":"Provider does not use a consent redirect"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/credentials/link-operations":{"get":{"tags":["CredentialLink"],"summary":"등록 작업 결과 조회 (Idempotency-Key 헤더)","description":"`GET /v1/credentials/link-operations` — 등록 결과만 읽는다 (U1).\n\n키를 경로 변수가 아니라 헤더로 받는다. 경로에 넣으면 `/` 가 든 키가 라우터에서 404 로\n깨지고, 원문이 URL · 접근 로그에 남는다. 등록 때와 같은 헤더 이름 · 같은 값이다.\n\n상태:\n    - 200 COMPLETED — 등록이 끝났고 그때의 응답 본문을 그대로 돌려준다.\n    - 202 UNKNOWN   — 작업은 있으나 결과가 아직 확정되지 않았다.\n    - 404           — 이 주체에게 보이는 작업이 없다. **실행되지 않았다는 증거가 아니다.**\n    - 409           — 작업 창(24시간)이 지났다 (IDEMPOTENCY_KEY_CONFLICT).\n\n이 경로는 INSERT · lock 재점유 · 등록 dispatcher 를 부르지 않는다.","operationId":"read_credential_operation_v1_v1_credentials_link_operations_get","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"필수. 등록할 때 보낸 것과 같은 키.","title":"Idempotency-Key"},"description":"필수. 등록할 때 보낸 것과 같은 키."},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Original registration result","content":{"application/json":{"schema":{}}}},"202":{"description":"Result is not yet known"},"404":{"description":"No visible operation for this key"},"409":{"description":"Operation window expired"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/credentials/{account_link_id}/bank-accounts":{"get":{"tags":["CredentialLink"],"summary":"Linked bank-account credential list","operationId":"list_bank_account_credentials_v1_v1_credentials__account_link_id__bank_accounts_get","parameters":[{"name":"account_link_id","in":"path","required":true,"schema":{"type":"string","title":"Account Link Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BankAccountCredentialResponse"},"title":"Response List Bank Account Credentials V1 V1 Credentials  Account Link Id  Bank Accounts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/credentials/{account_link_id}/bank-accounts/link":{"post":{"tags":["CredentialLink"],"summary":"Link Bank Account Credential V1","operationId":"link_bank_account_credential_v1_v1_credentials__account_link_id__bank_accounts_link_post","parameters":[{"name":"account_link_id","in":"path","required":true,"schema":{"type":"string","title":"Account Link Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BankAccountCredentialLinkRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BankAccountCredentialResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/credentials/{account_link_id}/bank-accounts/{bank_account_credential_id}":{"patch":{"tags":["CredentialLink"],"summary":"Update Bank Account Credential V1","operationId":"update_bank_account_credential_v1_v1_credentials__account_link_id__bank_accounts__bank_account_credential_id__patch","parameters":[{"name":"account_link_id","in":"path","required":true,"schema":{"type":"string","title":"Account Link Id"}},{"name":"bank_account_credential_id","in":"path","required":true,"schema":{"type":"string","title":"Bank Account Credential Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BankAccountCredentialUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BankAccountCredentialResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["CredentialUnlink"],"summary":"Unlink Bank Account Credential V1","operationId":"unlink_bank_account_credential_v1_v1_credentials__account_link_id__bank_accounts__bank_account_credential_id__delete","parameters":[{"name":"account_link_id","in":"path","required":true,"schema":{"type":"string","title":"Account Link Id"}},{"name":"bank_account_credential_id","in":"path","required":true,"schema":{"type":"string","title":"Bank Account Credential Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BankAccountCredentialResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/credentials/{account_link_id}/unlink":{"post":{"tags":["CredentialUnlink"],"summary":"Connected ID (account_link_id) 인증서 연동 해제","description":"`POST /v1/credentials/{account_link_id}/unlink` 연결 해제 단일 진입점.\n\nJWT(console_user) 또는 desktop_agent client_credential 로 호출한다.\n정책 평가 + user_credentials\nUPDATE (ACTIVE -> INACTIVE) + GCS cert/key 삭제 + `account_link.unlinked`\naudit 단일 트랜잭션.\n\n응답 분기:\n    - 정상 해제                              -> 200 OK + 3필드 envelope\n    - 정책 거부 (AuthPolicyError)            -> 401/402/403/422/429\n    - Service 거부 (AccountLinkUnlinkError)  -> 8 error_code 정밀 매핑\n    - ValueError (account_link_id 형식 등)   -> 400 VALIDATION_INVALID_FIELD\n    - 그 외 예외                              -> 500 INTERNAL_ERROR","operationId":"unlink_credential_v1_v1_credentials__account_link_id__unlink_post","parameters":[{"name":"account_link_id","in":"path","required":true,"schema":{"type":"string","title":"Account Link Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"User-Agent","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User-Agent"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CredentialUnlinkRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/credentials/{account_link_id}/selected-assets":{"put":{"tags":["CredentialLink"],"summary":"이 연동에서 조회할 자산 선택 저장","description":"`PUT /v1/credentials/{account_link_id}/selected-assets` - 고객이 고른 자산을 저장한다.\n\n연동만으로는 조회가 시작되지 않는다. 기관 계정 하나에 GA4 속성 · 사이트가 여러 개 딸려\n올 수 있고 **그중 고객이 고른 것만** 읽어야 하기 때문이다(의뢰서 AT-002). 고를 수 있는\n목록은 그 상품의 상태 조회 액션이 준다 - 화면은 자기가 보여 준 키를 그대로 보낸다.\n\n**통째로 바꾼다.** 부분 수정 경로를 두지 않는 이유는 서비스 docstring 에 적었다.","operationId":"replace_credential_selected_assets_v1_v1_credentials__account_link_id__selected_assets_put","parameters":[{"name":"account_link_id","in":"path","required":true,"schema":{"type":"string","title":"Account Link Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CredentialSelectedAssetsRequest"}}}},"responses":{"200":{"description":"Stored selection","content":{"application/json":{"schema":{}}}},"400":{"description":"Selected assets document is not storable"},"404":{"description":"No such active account link for this user"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["CredentialLink"],"summary":"이 연동에 저장된 자산 선택 조회","description":"`GET /v1/credentials/{account_link_id}/selected-assets` - 지금 무엇이 골라져 있나.\n\n화면이 선택 화면을 다시 열 때 이미 고른 것을 표시할 재료다. 값은 저장된 그대로이고,\n아직 고르지 않았으면 ``null`` 이다(빈 선택과 미선택을 엔진이 가르지 않는다).","operationId":"read_credential_selected_assets_v1_v1_credentials__account_link_id__selected_assets_get","parameters":[{"name":"account_link_id","in":"path","required":true,"schema":{"type":"string","title":"Account Link Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Stored selection","content":{"application/json":{"schema":{}}}},"404":{"description":"No such active account link for this user"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/credentials/linkable-providers":{"get":{"tags":["CredentialLink"],"summary":"Linkable provider catalog (console credential dialog SSOT)","operationId":"list_linkable_providers_v1_v1_credentials_linkable_providers_get","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/credentials/{account_link_id}":{"get":{"tags":["CredentialLink"],"summary":"Connected ID (account_link_id) ACTIVE probe","description":"GET /v1/credentials/{account_link_id} — desktop_agent pre-flight probe (E6-c PR3).\n\nRead-only durability helper path (list pattern). Returns 200 when ACTIVE,\n404 when missing/INACTIVE/wrong owner.","operationId":"get_credential_v1_v1_credentials__account_link_id__get","parameters":[{"name":"account_link_id","in":"path","required":true,"schema":{"type":"string","title":"Account Link Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/credentials":{"get":{"tags":["CredentialLink"],"summary":"Connected ID (account_link_id) list","description":"GET /v1/credentials (CR-FE-017).","operationId":"list_credentials_v1_v1_credentials_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/credentials":{"get":{"tags":["ConsoleSelfService","CredentialLink"],"summary":"Connected ID list (console alias)","description":"GET /v1/me/credentials — FE alias for CR-FE-017.","operationId":"list_me_credentials_v1_v1_me_credentials_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/app-credentials/{client_id}/revoke":{"post":{"tags":["AppCredential"],"summary":"외부 앱 client_credential 폐기 (APP_CREDENTIAL_SCHEMA §6 + §1 line 50)","description":"`POST /v1/app-credentials/{client_id}/revoke` 단일 진입점\n(APP_CREDENTIAL_SCHEMA §6 line 195 + §1 line 50 1:1, PR-N-5).\n\nPhase 2 외부 표면 4호 폐기 단계 (PR-N-3 발급 패턴 1:1 재사용 — 8 원칙 #1\n공통모듈화). 정책 평가 + app_credentials UPDATE (ACTIVE -> REVOKED) +\n`app_credential.revoked` audit 적재 단일 트랜잭션. 단방향 전이 (resurrection\n0건, 계획서 §16-1 line 816 정본).\n\n응답 분기 (8 error_code → ERROR_CODES.md 표준 envelope 정밀 매핑 잠금):\n    - 정상 폐기                              → 200 OK + 3필드 envelope\n      ({client_id, status='REVOKED', revoked_at})\n    - 정책 거부 (AuthPolicyError)            → 401/402/403/422/429\n      (PR-M 정밀 매핑, 미들웨어 위임)\n    - Service 거부 (AppCredentialRevokeError) → 8 error_code 정밀 매핑:\n        * PRINCIPAL_KIND_FORBIDDEN          → 403 AUTHZ_FORBIDDEN\n        * PRINCIPAL_USER_ID_MISSING         → 500 INTERNAL_ERROR (운영 진단)\n        * ORGANIZATION_ID_MISSING           → 400 VALIDATION_INVALID_FIELD\n        * PRINCIPAL_NOT_OWNER_OR_ADMIN      → 403 AUTHZ_FORBIDDEN\n        * REVOKED_REASON_MISSING            → 400 VALIDATION_INVALID_FIELD\n        * REVOKED_REASON_FORBIDDEN          → 400 VALIDATION_INVALID_FIELD\n        * TARGET_NOT_FOUND                  → 404 RESOURCE_NOT_FOUND\n        * TARGET_ALREADY_REVOKED            → 409 RESOURCE_CONFLICT\n    - Repository ValueError                  → 400 VALIDATION_INVALID_FIELD\n      (client_id 정규식 위반 / organization_id 음수 등 사전 검증 결함 —\n      Service 가 정상 통과한 입력이라 도달 0건 fallback)\n    - 그 외 예외                              → 500 INTERNAL_ERROR (미들웨어)\n\n시나리오 4 (계획서 §15-5 line 791) 정합:\n    본 핸들러가 status='REVOKED' 전이 commit 후 동일 client_id 로 인증\n    시도 시 AuthPolicyService._verify_client_credential 의 status != 'ACTIVE'\n    분기 (CWE-208 Timing Oracle 차단 + OWASP 인증 모범 사례) 가 즉시\n    AUTH_CREDENTIAL_INVALID 401 거부 — 폐기 즉시 차단 보장.\n\nAudit (계획서 §3-2.D line 219 + §14-2 line 684 정합):\n    `app_credential.revoked` (AUDIT_LOG_SCHEMA §7 line 326) 단일 진입점\n    emit. payload={client_id, reason} 2키 + actor_user_id (who) +\n    revoked_at (when) + revoked_reason (why) 1:1 정합. helper 의 audit\n    durability 5분기로 DENIED/FAILURE/RevokeError/ValueError/SUCCESS 모두\n    commit 영구 보존 (감사로그 손실 0건).","operationId":"revoke_app_credential_v1_v1_app_credentials__client_id__revoke_post","parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"User-Agent","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User-Agent"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppCredentialRevokeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/app-credentials/{client_id}/takeover-confirmation":{"post":{"tags":["AppCredential"],"summary":"에이전트가 가입으로 만든 키를 계속 쓰기로 확인","description":"콘솔의 「계속 쓰기」 (퍼널 W4 길③). 본문이 없고 두 번 불러도 같은 200 이다.\n\n확인되면 그 키의 멈춤이 풀려 **같은 비밀값**으로 다시 호출된다 - 키를 새로 받지 않는다.\n권한은 폐기와 같다(조직 소유자 · 관리자, 운영자 대리). 응답은 목록 항목과 같은 이름\n`signup_takeover_pending` 으로 끝 상태를 준다. 감사 `app_credential.signup_takeover_confirmed`\n는 이번 호출이 적었을 때만 남는다.","operationId":"confirm_app_credential_signup_takeover_v1_v1_app_credentials__client_id__takeover_confirmation_post","parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"User-Agent","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User-Agent"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/jobs/{job_id}":{"get":{"tags":["UnifiedJob"],"summary":"작업 상태 조회","description":"`GET /v1/jobs/{job_id}` 작업 상태 조회.\n\n응답 분기:\n    - 작업 발견 (정책 통과 + 동일 org/env)  → 200 OK + 응답 10필드\n    - 잡 부재 (또는 다른 org/env)            → 404 JOB_NOT_FOUND (정보 노출 차단)\n    - 정책 거부 (AuthPolicyError)            → 401/402/403/422/429\n    - PrincipalContext.organization_id None → 400 VALIDATION_INVALID_FIELD\n        (데이터 손상 운영 진단 — 외부 silent 500 fallback 차단)\n    - 잘못된 job_id 형식                     → 400 VALIDATION_INVALID_FIELD\n    - 그 외 예외                             → 500 INTERNAL_ERROR","operationId":"get_job_v1_v1_jobs__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"작업 번호"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobReadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/jobs/{job_id}/result":{"get":{"tags":["UnifiedJob"],"summary":"작업 결과 조회","description":"`GET /v1/jobs/{job_id}/result` 작업 결과 조회.\n\n응답 분기:\n    - 작업 부재 (또는 다른 org/env)          → 404 JOB_NOT_FOUND (정보 노출 차단)\n    - status != 'SUCCEEDED'                  → 409 JOB_INVALID_TRANSITION\n    - status == 'SUCCEEDED'                  → 200 OK + result.data + result.artifacts\n      (산출물 서명은 한 곳에서 한다). 허용 목록 · 서명 실패 → 500\n    - 정책 거부 (AuthPolicyError)            → 401/402/403/422/429 (PR-M)\n    - PrincipalContext.organization_id None → 400 (운영 진단)\n    - JobRepository.get_result_by_id ValueError → 400 VALIDATION_INVALID_FIELD\n    - 그 외 예외                             → 500 (미들웨어 fallback)","operationId":"get_job_result_v1_v1_jobs__job_id__result_get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"작업 번호"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResultResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/jobs/{job_id}/artifacts":{"delete":{"tags":["UnifiedJob"],"summary":"작업 결과 파일 삭제 (ADR-081 D-9)","description":"`DELETE /v1/jobs/{job_id}/artifacts` - 끝난 작업의 결과 파일을 보관 기간 전에 지운다.\n\n정책 종류는 `job_artifact_delete` 다(ADR-010 §2-15). 지우는 일은\n`auth_policy_routing.delete_job_artifacts_with_audit_durability` 를 거쳐\n`job_artifacts.retention.delete_artifacts` 한 곳에서 한다.\n\n응답 분기 (결과 조회 `GET /v1/jobs/{job_id}/result` 와 같은 판정):\n    - 잡 부재 (또는 다른 org/env)            → 404 JOB_NOT_FOUND\n    - status != 'SUCCEEDED'                  → 409 JOB_INVALID_TRANSITION\n    - status == 'SUCCEEDED'                  → 200 OK + `deleted_count` (다시 부르면 0)\n    - 정책 거부 (AuthPolicyError)            → 401/403/429 등\n    - job_id 사전 검증 ValueError            → 400 VALIDATION_INVALID_FIELD","operationId":"delete_job_artifacts_v1_v1_jobs__job_id__artifacts_delete","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"작업 번호"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobArtifactsDeleteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/crypto/public-key":{"get":{"tags":["Crypto"],"summary":"JWKS public key retrieval (CRYPTO_KEY_SCHEMA §6)","description":"`GET /v1/crypto/public-key` 공개키 조회 단일 진입점.\n\nPhase 2 외부 표면 6호 — env_scope 별 ACTIVE + RETIRING JWKS 공개키 회수.\n목록 조회와 같은 읽기 패턴을 그대로 쓴다(원칙 1 공통모듈화 · 3 일관성).\nSELECT 만이므로 audit 신규 적재 0건 — 정책 평가 자체의\n`auth.policy.evaluation` audit 1건만 §5-11 에서 적재.\n\nenv_scope 전달: ``resolve_env_scope`` dependency — Query ``env_scope`` 또는\n``X-Env-Scope`` 헤더 (AUTH_POLICY_INTERFACE §5-5-i Query 관행 유지, PR-ENV-WIRE).\n\n응답 분기 (CryptoKeyError 2종 + ValueError -> ERROR_CODES.md envelope):\n    - 정상 조회                              -> 200 OK + JWKS envelope\n      ({keys: [{kid, kty, alg, use, n, e}, ...]})\n    - 정책 거부 (AuthPolicyError)            -> 401/402/403/422/429\n      (PR-M 정밀 매핑, 미들웨어 위임)\n    - Service 거부 (CryptoKeyError)          -> 2 error_code 정밀 매핑:\n        * NO_ACTIVE_KEY_FOR_ENV_SCOPE       -> 503 SERVICE_UNAVAILABLE\n        * INVALID_PEM_FORMAT                -> 500 INTERNAL_ERROR\n    - Repository/Service ValueError          -> 400 VALIDATION_INVALID_FIELD\n    - 그 외 예외                              -> 500 INTERNAL_ERROR (미들웨어)\n\n금지 (CRYPTO_KEY_SCHEMA §10): server_public.pem file-based fallback /\ncrypto_keys 직접 SELECT / PEM 분해 — 본 핸들러는 auth_policy_routing\n헬퍼 단일 경로만 사용.","operationId":"get_crypto_public_key_v1_v1_crypto_public_key_get","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/profile":{"get":{"tags":["ConsoleSelfService"],"summary":"Console user profile read","description":"GET /v1/me/profile (CR-FE-002, CR-FE-003 v2 / ADR-054).\n\nReturns userId, email, name, phone, organizationId.","operationId":"get_me_profile_v1_v1_me_profile_get","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["ConsoleSelfService"],"summary":"Console user profile update","description":"PATCH /v1/me/profile (CR-FE-002, CR-FE-003 v2).\n\nConsole users may update name and/or phone (user_contact_methods SSOT).","operationId":"patch_me_profile_v1_v1_me_profile_patch","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProfilePatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/password":{"post":{"tags":["ConsoleSelfService"],"summary":"Change own password (re-authenticated)","description":"POST /v1/me/password - every earlier login ends, so the response carries the new token.","operationId":"post_me_password_v1_v1_me_password_post","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MePasswordChangeBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/organization":{"get":{"tags":["ConsoleSelfService"],"summary":"Console organization profile read","description":"GET /v1/me/organization (CR-FE-002).","operationId":"get_me_organization_v1_v1_me_organization_get","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["ConsoleSelfService"],"summary":"Console organization profile update","description":"PATCH /v1/me/organization (CR-FE-002).\n\nOWNER/ADMIN console users may update name and/or business_number.","operationId":"patch_me_organization_v1_v1_me_organization_patch","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationProfilePatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/organization/members":{"get":{"tags":["ConsoleSelfService"],"summary":"Console organization member list","description":"GET /v1/me/organization/members (CR-FE-009).","operationId":"get_me_organization_members_v1_v1_me_organization_members_get","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["ConsoleSelfService"],"summary":"Console organization member invite","description":"POST /v1/me/organization/members (CR-FE-009).","operationId":"post_me_organization_member_v1_v1_me_organization_members_post","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/services__common__routes__OrganizationMemberInviteRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/organization/invites":{"get":{"tags":["ConsoleSelfService"],"summary":"Console organization pending invites list","description":"GET /v1/me/organization/invites (CR-FE-029).","operationId":"get_me_organization_invites_v1_v1_me_organization_invites_get","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/organization/invites/{invite_id}":{"delete":{"tags":["ConsoleSelfService"],"summary":"Console organization invite revoke","description":"DELETE /v1/me/organization/invites/{invite_id} (CR-FE-029).","operationId":"delete_me_organization_invite_v1_v1_me_organization_invites__invite_id__delete","parameters":[{"name":"invite_id","in":"path","required":true,"schema":{"type":"integer","title":"Invite Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/organization-invites/preview":{"get":{"tags":["ConsoleSelfService"],"summary":"Organization invite preview (unauthenticated)","description":"GET /v1/organization-invites/preview (CR-FE-029).","operationId":"get_organization_invite_preview_v1_v1_organization_invites_preview_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","description":"Organization invite token from email link.","title":"Token"},"description":"Organization invite token from email link."},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/organization-invites/accept":{"post":{"tags":["ConsoleSelfService"],"summary":"Organization invite accept","description":"POST /v1/organization-invites/accept (CR-FE-029).","operationId":"post_organization_invite_accept_v1_v1_organization_invites_accept_post","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationInviteAcceptRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/organization/members/{user_id}":{"patch":{"tags":["ConsoleSelfService"],"summary":"Console organization member role update","description":"PATCH /v1/me/organization/members/{user_id} (CR-FE-009).","operationId":"patch_me_organization_member_v1_v1_me_organization_members__user_id__patch","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/services__common__routes__OrganizationMemberRolePatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["ConsoleSelfService"],"summary":"Console organization member remove","description":"DELETE /v1/me/organization/members/{user_id} (CR-FE-009).","operationId":"delete_me_organization_member_v1_v1_me_organization_members__user_id__delete","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/consents":{"get":{"tags":["ConsoleSelfService"],"summary":"Console user consent status list","description":"GET /v1/me/consents (CR-FE-006).","operationId":"get_me_consents_v1_v1_me_consents_get","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/consents":{"post":{"tags":["ConsoleSelfService"],"summary":"Console user consent grant or revoke","description":"POST /v1/consents (CR-FE-006).","operationId":"post_consent_v1_v1_consents_post","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"User-Agent","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User-Agent"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentSelfServiceRecordRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/env-access-requests":{"post":{"tags":["ConsoleSelfService"],"summary":"Submit environment access request","description":"POST /v1/me/env-access-requests (CR-FE-011).","operationId":"post_me_env_access_request_v1_v1_me_env_access_requests_post","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnvAccessRequestSubmitBody"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["ConsoleSelfService"],"summary":"List organization environment access requests","description":"GET /v1/me/env-access-requests (CR-FE-011).","operationId":"get_me_env_access_requests_v1_v1_me_env_access_requests_get","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/integrator-applications":{"post":{"tags":["ConsoleSelfService"],"summary":"Submit integrator (desktop_agent) application","description":"POST /v1/me/integrator-applications (ADR-068 initial application).","operationId":"post_me_integrator_application_v1_v1_me_integrator_applications_post","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegratorApplicationSubmitBody"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["ConsoleSelfService"],"summary":"List organization integrator applications","description":"GET /v1/me/integrator-applications (ADR-068).","operationId":"get_me_integrator_applications_v1_v1_me_integrator_applications_get","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/integrator-applications/reissue":{"post":{"tags":["ConsoleSelfService"],"summary":"Submit integrator (desktop_agent) reissue application","description":"POST /v1/me/integrator-applications/reissue (ADR-068 reissue application).","operationId":"post_me_integrator_application_reissue_v1_v1_me_integrator_applications_reissue_post","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegratorApplicationReissueBody"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/integrator-applications/{request_uuid}/cancel":{"post":{"tags":["ConsoleSelfService"],"summary":"Cancel pending integrator application","description":"POST /v1/me/integrator-applications/{request_uuid}/cancel (ADR-068).","operationId":"post_me_integrator_application_cancel_v1_v1_me_integrator_applications__request_uuid__cancel_post","parameters":[{"name":"request_uuid","in":"path","required":true,"schema":{"type":"string","title":"Request Uuid"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/integrator-hub-summary":{"get":{"tags":["ConsoleSelfService"],"summary":"Get integrator (desktop_agent) hub summary","description":"GET /v1/me/integrator-hub-summary (ADR-068). No secret -- client_id/status/seat only.","operationId":"get_me_integrator_hub_summary_v1_v1_me_integrator_hub_summary_get","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/deletion-requests":{"post":{"tags":["ConsoleSelfService"],"summary":"Submit account deletion request","description":"POST /v1/me/deletion-requests (CR-FE-015).","operationId":"post_me_deletion_request_v1_v1_me_deletion_requests_post","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeletionRequestSubmitBody"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["ConsoleSelfService"],"summary":"List account deletion requests for current user","description":"GET /v1/me/deletion-requests (CR-FE-015).","operationId":"get_me_deletion_requests_v1_v1_me_deletion_requests_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/deletion-requests/{request_uuid}":{"delete":{"tags":["ConsoleSelfService"],"summary":"Cancel account deletion request","description":"DELETE /v1/me/deletion-requests/{request_uuid} (CR-FE-015).","operationId":"delete_me_deletion_request_v1_v1_me_deletion_requests__request_uuid__delete","parameters":[{"name":"request_uuid","in":"path","required":true,"schema":{"type":"string","title":"Request Uuid"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeletionRequestCancelBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/password-reset/request":{"post":{"tags":["Auth"],"summary":"Request password reset email","description":"POST /v1/auth/password-reset/request (CR-FE-004).","operationId":"post_password_reset_request_v1_v1_auth_password_reset_request_post","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetRequestBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/password-reset/confirm":{"post":{"tags":["Auth"],"summary":"Confirm password reset with token","description":"POST /v1/auth/password-reset/confirm (CR-FE-004).","operationId":"post_password_reset_confirm_v1_v1_auth_password_reset_confirm_post","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetConfirmBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/login":{"post":{"tags":["Auth"],"summary":"Email/password login","description":"POST /v1/auth/login (CR-FE-012).","operationId":"post_auth_login_v1_v1_auth_login_post","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthLoginBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/register":{"post":{"tags":["Auth"],"summary":"Email/password registration","description":"POST /v1/auth/register (CR-FE-012).","operationId":"post_auth_register_v1_v1_auth_register_post","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthRegisterBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/membership/me":{"get":{"tags":["Membership"],"summary":"내 멤버십/정책 스냅샷 조회","description":"현재 인증 주체의 멤버십/정책 스냅샷 조회.\n\n응답은 AuthPolicyService 평가 결과(PrincipalContext + quota/rate snapshot)를 그대로 노출한다.","operationId":"get_membership_me_v1_v1_membership_me_get","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"현재 주체의 멤버십·정책 스냅샷.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MembershipMeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/entitled-tools":{"get":{"tags":["MCP"],"summary":"내 MCP 사용 가능 도구 메타데이터 조회","description":"Return Console-safe MCP metadata from entitlement and registry SSOTs.","operationId":"get_mcp_entitled_tools_v1_v1_mcp_entitled_tools_get","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/capability-catalog":{"get":{"tags":["MCP"],"summary":"Console MCP capability package + atomic catalog","description":"Return tool-ready MCP package hero cards and atomic grid for console marketing.","operationId":"get_mcp_capability_catalog_v1_v1_mcp_capability_catalog_get","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/handoff/exchange":{"post":{"tags":["PublicContent","AuthHandoff"],"summary":"Exchange one-time handoff token for client credentials (CR-FE-020)","operationId":"post_auth_handoff_exchange_v1_auth_handoff_exchange_post","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthHandoffExchangeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthHandoffExchangeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/notices":{"get":{"tags":["PublicContent","PublicNotices"],"summary":"List published notices for env_scope (CR-FE-008)","operationId":"list_public_notices_v1_v1_notices_get","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Public Notices V1 V1 Notices Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/notices/{notice_id}":{"get":{"tags":["PublicContent","PublicNotices"],"summary":"Get published notice detail (CR-FE-008)","operationId":"get_public_notice_v1_v1_notices__notice_id__get","parameters":[{"name":"notice_id","in":"path","required":true,"schema":{"type":"string","title":"Notice Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Public Notice V1 V1 Notices  Notice Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/inquiries":{"get":{"tags":["PublicContent","PublicInquiries"],"summary":"List recent inquiry previews for homepage NewsHub (CR-FE-010, no PII)","operationId":"list_public_inquiry_previews_v1_v1_inquiries_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"default":6,"title":"Limit"}},{"name":"sourceCategory","in":"query","required":false,"schema":{"type":"string","default":"service","title":"Sourcecategory"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Public Inquiry Previews V1 V1 Inquiries Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["PublicContent","PublicInquiries"],"summary":"Submit public support inquiry (CR-FE-010)","operationId":"submit_public_inquiry_v1_v1_inquiries_post","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicInquirySubmitBody"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Submit Public Inquiry V1 V1 Inquiries Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/inquiries/recent-count":{"get":{"tags":["PublicContent","PublicInquiries"],"summary":"Recent inquiry aggregate count for homepage stats (CR-FE-010)","operationId":"get_recent_inquiry_count_v1_v1_inquiries_recent_count_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":30,"minimum":1,"default":7,"title":"Days"}},{"name":"sourceCategory","in":"query","required":false,"schema":{"type":"string","default":"service","title":"Sourcecategory"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Recent Inquiry Count V1 V1 Inquiries Recent Count Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/faq":{"get":{"tags":["PublicContent","PublicFaqs"],"summary":"List published FAQ entries for env_scope (CR-FE-027)","operationId":"list_public_faqs_v1_v1_faq_get","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Public Faqs V1 V1 Faq Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/public/catalog/products":{"get":{"tags":["PublicContent","PublicCatalogProducts"],"summary":"List website-exposable catalog products (CR-FE-027)","operationId":"list_public_catalog_products_v1_v1_public_catalog_products_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":100,"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageEnvelope_ProductListItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/public/catalog/products/by-slug/{website_slug}":{"get":{"tags":["PublicContent","PublicCatalogProducts"],"summary":"Get website-exposable product by website_slug (CR-FE-027)","operationId":"get_public_catalog_product_by_slug_v1_v1_public_catalog_products_by_slug__website_slug__get","parameters":[{"name":"website_slug","in":"path","required":true,"schema":{"type":"string","title":"Website Slug"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/public/catalog/products/by-legacy-id/{website_legacy_id}":{"get":{"tags":["PublicContent","PublicCatalogProducts"],"summary":"Get website-exposable product by metadata.website_legacy_id (CR-FE-027)","operationId":"get_public_catalog_product_by_legacy_id_v1_v1_public_catalog_products_by_legacy_id__website_legacy_id__get","parameters":[{"name":"website_legacy_id","in":"path","required":true,"schema":{"type":"string","title":"Website Legacy Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/public/catalog/products/{product_id}/page-content":{"get":{"tags":["PublicContent","PublicCatalogProducts"],"summary":"Get website-exposable product page content (CR-FE-027)","operationId":"get_public_catalog_product_page_content_v1_v1_public_catalog_products__product_id__page_content_get","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductPageContentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/public/catalog/products/{product_id}":{"get":{"tags":["PublicContent","PublicCatalogProducts"],"summary":"Get website-exposable product by id (CR-FE-027)","operationId":"get_public_catalog_product_by_id_v1_v1_public_catalog_products__product_id__get","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/plans":{"get":{"tags":["Billing Plans"],"summary":"List Plans","description":"요금제 목록 조회.","operationId":"list_plans_v1_plans_get","parameters":[{"name":"query","in":"query","required":true,"schema":{"$ref":"#/components/schemas/PlanListQuery"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageEnvelope_PlanResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/plans/{plan_id}":{"get":{"tags":["Billing Plans"],"summary":"Get Plan","description":"요금제 상세 조회.","operationId":"get_plan_v1_plans__plan_id__get","parameters":[{"name":"plan_id","in":"path","required":true,"schema":{"type":"integer","title":"Plan Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/plans/{plan_id}/catalog-offer":{"get":{"tags":["Billing Plans"],"summary":"Get Plan Catalog Offer","description":"Hybrid subscribe catalog snapshot.","operationId":"get_plan_catalog_offer_v1_plans__plan_id__catalog_offer_get","parameters":[{"name":"plan_id","in":"path","required":true,"schema":{"type":"integer","title":"Plan Id"}},{"name":"exclude_owned_subscription_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"When set, omit ACTIVE subscription_items product_ids from addon_offers (midlife Path B catalog; custom-plan W0 G2). Subscription must be ACTIVE and plan_id must match this catalog plan_id.","title":"Exclude Owned Subscription Id"},"description":"When set, omit ACTIVE subscription_items product_ids from addon_offers (midlife Path B catalog; custom-plan W0 G2). Subscription must be ACTIVE and plan_id must match this catalog plan_id."},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanCatalogOfferResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/payment-methods/capabilities":{"get":{"tags":["Billing Payment Methods"],"summary":"Get Payment Method Capabilities","description":"결제수단 기능 켜짐 여부 (U3-H). 콘솔은 이것으로 자동결제 카드 등록 진입점을 그릴지 정한다.\n\n정본은 BE 스위치 하나다(`config.payup_hub_enabled`) - FE 빌드 변수로 따로 두면 FE 켜짐 · BE 꺼짐일 때\n고객이 404 막다른 길을 만난다(console 편지 1a0c4b99f30). `/{payment_method_id}` 보다 앞에 둔다\n(경로가 겹치면 그 라우트가 'capabilities' 를 ID 로 읽으려 한다).","operationId":"get_payment_method_capabilities_v1_payment_methods_capabilities_get","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentMethodCapabilitiesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/payment-methods/payup-hub/registrations":{"post":{"tags":["Billing Payment Methods","Billing Payment Methods"],"summary":"Start a card registration","description":"자동결제 카드 등록을 시작한다 - 고객이 동의하면 카드등록창을 여는 값을 돌려준다.\n\n카드 정보는 이 API 를 지나지 않는다. 고객은 결제대행사의 창에서 직접 입력하고, 결과는 서버가 받아 결제수단을 만든다.\n같은 `Idempotency-Key` 로 다시 부르면 같은 등록을 돌려준다. 결과는 등록 상태 조회로 안다.","operationId":"start_card_registration_v1_payment_methods_payup_hub_registrations_post","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"title":"Idempotency-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayupHubCardRegistrationStartRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayupHubCardRegistrationStartResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/payment-methods/payup-hub/registrations/{registration_id}":{"get":{"tags":["Billing Payment Methods","Billing Payment Methods"],"summary":"Get Card Registration","description":"카드 등록의 현재 상태. 콘솔은 이 조회만 믿는다(제출 응답이 아니다). 남의 조직의 등록은 없는 것과 같은 404 다.","operationId":"get_card_registration_v1_payment_methods_payup_hub_registrations__registration_id__get","parameters":[{"name":"registration_id","in":"path","required":true,"schema":{"type":"string","title":"Registration Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayupHubCardRegistrationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/payment-methods/payup-hub/registrations/{registration_id}/cancel":{"post":{"tags":["Billing Payment Methods","Billing Payment Methods"],"summary":"Cancel Card Registration","description":"고객이 카드 등록 창을 닫았다 - 진행 중인 등록을 취소로 닫는다. 이미 끝난 등록은 그 상태 그대로 돌려준다.","operationId":"cancel_card_registration_v1_payment_methods_payup_hub_registrations__registration_id__cancel_post","parameters":[{"name":"registration_id","in":"path","required":true,"schema":{"type":"string","title":"Registration Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayupHubCardRegistrationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/payment-methods/billing-auth/session":{"post":{"tags":["Billing Payment Methods"],"summary":"Create Billing Auth Session","description":"Toss SDK session.","operationId":"create_billing_auth_session_v1_payment_methods_billing_auth_session_post","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingAuthSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/payment-methods/from-billing-auth":{"post":{"tags":["Billing Payment Methods"],"summary":"Register Payment Method From Billing Auth","description":"Toss authKey register.","operationId":"register_payment_method_from_billing_auth_v1_payment_methods_from_billing_auth_post","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"title":"Idempotency-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentMethodRegisterFromBillingAuthRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentMethodResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/payment-methods":{"post":{"tags":["Billing Payment Methods"],"summary":"Register Payment Method","description":"결제수단 등록.","operationId":"register_payment_method_v1_payment_methods_post","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"title":"Idempotency-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentMethodRegisterRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentMethodResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Billing Payment Methods"],"summary":"List Payment Methods","description":"결제수단 목록 조회.","operationId":"list_payment_methods_v1_payment_methods_get","parameters":[{"name":"query","in":"query","required":true,"schema":{"$ref":"#/components/schemas/PaymentMethodListQuery"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageEnvelope_PaymentMethodResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/payment-methods/{payment_method_id}":{"get":{"tags":["Billing Payment Methods"],"summary":"Get Payment Method","description":"결제수단 단건 조회 (Service docstring + Repository IDOR 정합).","operationId":"get_payment_method_v1_payment_methods__payment_method_id__get","parameters":[{"name":"payment_method_id","in":"path","required":true,"schema":{"type":"integer","title":"Payment Method Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentMethodResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Billing Payment Methods"],"summary":"Revoke Payment Method","description":"결제수단 폐기.","operationId":"revoke_payment_method_v1_payment_methods__payment_method_id__delete","parameters":[{"name":"payment_method_id","in":"path","required":true,"schema":{"type":"integer","title":"Payment Method Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"title":"Idempotency-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/subscriptions/payup-standard/prepare":{"post":{"tags":["Billing Standard Checkout"],"summary":"Prepare Checkout","description":"서버가 금액을 확정하고 서명한다 (DB 쓰기 0건).","operationId":"prepare_checkout_v1_subscriptions_payup_standard_prepare_post","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardCheckoutPrepareRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardCheckoutPrepareResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/subscriptions/payup-standard/approve":{"post":{"tags":["Billing Standard Checkout"],"summary":"Approve Checkout","description":"결제창 인증이 끝난 거래를 승인한다 (T1 COMMIT 후 승인 전송).","operationId":"approve_checkout_v1_subscriptions_payup_standard_approve_post","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"title":"Idempotency-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardCheckoutApproveRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardCheckoutApproveResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/subscriptions/payup-standard/status":{"post":{"tags":["Billing Standard Checkout"],"summary":"Read Checkout Status","description":"우리 DB 에 적힌 결제 상태 조회 (결제대행사 호출 0건).\n\nPOST 인 이유: 입력에 체크아웃 토큰이 들어가고, 토큰을 URL 에 실으면 접근 로그·리퍼러에\n남는다.","operationId":"read_checkout_status_v1_subscriptions_payup_standard_status_post","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardCheckoutApproveRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardCheckoutStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/subscriptions/zero-price-plan":{"post":{"tags":["Billing Subscriptions"],"summary":"Join a price-0 plan without a payment (quota_token_v1 6-6)","description":"키의 정식 환경 스코프는 감사 행을 소비자 워커가 따라 맞추지만, 가입 직후 고객이 바로 정식\n환경을 부를 수 있게 커밋 뒤 한 번 바로 맞춘다. 그 호출이 실패해도 가입은 유지되고 워커가\n다시 맞춘다.","operationId":"join_zero_price_plan_route_v1_subscriptions_zero_price_plan_post","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZeroPricePlanJoinRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZeroPricePlanJoinResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/subscriptions/quote":{"post":{"tags":["Billing Subscriptions"],"summary":"Preview hybrid subscribe invoice (no DB write)","description":"Validate bundle and return invoice line preview without issuance.","operationId":"quote_subscription_v1_subscriptions_quote_post","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionQuoteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionQuoteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/subscriptions":{"post":{"tags":["Billing Subscriptions"],"summary":"Create Subscription","description":"구독 생성 + 첫 결제 PG 제출.","operationId":"create_subscription_v1_subscriptions_post","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"title":"Idempotency-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionCreateRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Billing Subscriptions"],"summary":"List Subscriptions","description":"구독 목록 조회.","operationId":"list_subscriptions_v1_subscriptions_get","parameters":[{"name":"query","in":"query","required":true,"schema":{"$ref":"#/components/schemas/SubscriptionListQuery"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageEnvelope_SubscriptionResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/subscriptions/{subscription_id}":{"get":{"tags":["Billing Subscriptions"],"summary":"Get Subscription","description":"구독 단건 조회.","operationId":"get_subscription_v1_subscriptions__subscription_id__get","parameters":[{"name":"subscription_id","in":"path","required":true,"schema":{"type":"integer","title":"Subscription Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/subscriptions/{subscription_id}/usage-summary":{"get":{"tags":["Billing Subscriptions"],"summary":"Get Subscription Usage Summary","description":"구독 이번 결제주기 사용량 조회 (실사용 축, 콘솔 표시 전용 — 청구 계산과 무관).","operationId":"get_subscription_usage_summary_v1_subscriptions__subscription_id__usage_summary_get","parameters":[{"name":"subscription_id","in":"path","required":true,"schema":{"type":"integer","title":"Subscription Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionUsageSummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/subscriptions/{subscription_id}/addons/preview":{"post":{"tags":["Billing Subscriptions"],"summary":"Preview mid-life Path B add-on charge (no DB write)","description":"Validate mid-life add-ons and return invoice line preview without issuance.\n\nMust not call ``POST /quote`` / ``validate_subscribe_bundle`` (active\nsubscription fails new-subscribe quote). Shares resolve/owned/overlap\nchecks with ``SubscriptionAddonAddService.add``.","operationId":"preview_subscription_addons_v1_subscriptions__subscription_id__addons_preview_post","parameters":[{"name":"subscription_id","in":"path","required":true,"schema":{"type":"integer","title":"Subscription Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionAddonPreviewRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionQuoteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/subscriptions/{subscription_id}/addons":{"post":{"tags":["Billing Subscriptions"],"summary":"Mid-life Path B add-on charge (ACTIVE subscription)","description":"Charge add-on-only invoice on ACTIVE subscription; items after SUCCEEDED.","operationId":"add_subscription_addons_v1_subscriptions__subscription_id__addons_post","parameters":[{"name":"subscription_id","in":"path","required":true,"schema":{"type":"integer","title":"Subscription Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"title":"Idempotency-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionAddonAddRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionAddonAddResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/subscriptions/{subscription_id}/addons/{product_id}/cancel":{"post":{"tags":["Billing Subscriptions"],"summary":"Cancel one Path B pack (next renewal excluded)","description":"Mark one ACTIVE Path B item CANCELED (no refund). Custom-plan W5 / G8.\n\nEntitled-tools cache is invalidated only after DB commit so concurrent\ntools/list cannot re-warm from pre-commit ACTIVE rows.","operationId":"cancel_subscription_addon_v1_subscriptions__subscription_id__addons__product_id__cancel_post","parameters":[{"name":"subscription_id","in":"path","required":true,"schema":{"type":"integer","title":"Subscription Id"}},{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"title":"Idempotency-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/subscriptions/{subscription_id}/cancel":{"post":{"tags":["Billing Subscriptions"],"summary":"Cancel Subscription","description":"구독 취소.\n\nEntitled-tools cache is invalidated only after DB commit (same SSOT as\nPath B pack cancel / F4-a) so tools/list cannot re-warm ACTIVE rows.","operationId":"cancel_subscription_v1_subscriptions__subscription_id__cancel_post","parameters":[{"name":"subscription_id","in":"path","required":true,"schema":{"type":"integer","title":"Subscription Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"title":"Idempotency-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionCancelRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/subscriptions/{subscription_id}/pause":{"post":{"tags":["Billing Subscriptions"],"summary":"Pause Subscription","description":"구독 일시중지 - 운영자 전용.\n\nPAUSED 는 entitled-tools SQL 의 `subscriptions.status = 'ACTIVE'` 조건을 깨므로\ncancel 과 동일하게 COMMIT 이후에만 캐시를 무효화한다.","operationId":"pause_subscription_v1_subscriptions__subscription_id__pause_post","parameters":[{"name":"subscription_id","in":"path","required":true,"schema":{"type":"integer","title":"Subscription Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"title":"Idempotency-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionPauseRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/subscriptions/{subscription_id}/resume":{"post":{"tags":["Billing Subscriptions"],"summary":"Resume Subscription","description":"구독 재개 - 운영자 전용.\n\nPAUSED→ACTIVE 는 Path B 팩 권한을 다시 부여하므로 pause 와 대칭으로\nCOMMIT 이후 entitled 캐시를 무효화한다.","operationId":"resume_subscription_v1_subscriptions__subscription_id__resume_post","parameters":[{"name":"subscription_id","in":"path","required":true,"schema":{"type":"integer","title":"Subscription Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"title":"Idempotency-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionResumeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/subscriptions/{subscription_id}/payment-method":{"post":{"tags":["Billing Subscriptions"],"summary":"Attach a registered payment method to an existing subscription","description":"구독이 쓸 결제수단을 지정한다 - 구독 생성과 같은 권한(OWNER · ADMIN 또는 운영자).\n\nload -> idempotency begin(+replay) -> 지정 -> complete -> COMMIT 순서다. 권한 · 조직 격리는 구독 불러오기가 한다\n(다른 조직의 구독은 404). 결제수단 검증(같은 조직 · ACTIVE · 청구 가능)은 서비스가 한다.","operationId":"attach_subscription_payment_method_v1_subscriptions__subscription_id__payment_method_post","parameters":[{"name":"subscription_id","in":"path","required":true,"schema":{"type":"integer","title":"Subscription Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"title":"Idempotency-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionPaymentMethodAttachRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/subscriptions/{subscription_id}/payment-retry":{"get":{"tags":["Billing Subscriptions"],"summary":"Preview paying a PAYMENT_FAILED subscription again with its attached card (no DB write)","description":"「다시 결제」 단추를 그릴지 · 청구 금액 · 붙은 카드. 구독 조회와 같은 권한이다(자기 조직의 구독만 - 다른 조직은 404).","operationId":"get_subscription_payment_retry_v1_subscriptions__subscription_id__payment_retry_get","parameters":[{"name":"subscription_id","in":"path","required":true,"schema":{"type":"integer","title":"Subscription Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionPaymentRetryPreviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Billing Subscriptions"],"summary":"Pay a PAYMENT_FAILED subscription's open invoice again with its attached card","description":"붙은 카드로 그 구독의 미결제 청구서 한 장을 청구한다 - 구독 생성과 같은 권한(OWNER · ADMIN 또는 운영자).\n\nload -> 멱등 시작(+재생) -> T1(결제 만들기) COMMIT -> T2(PG) -> 멱등 완료 순서다. 카드 거절은 402 `PAYMENT_PG_DECLINED`, 결제대행 일시 오류 · 우리 쪽 사유 ·\n보내기 전 설정 오류는 503 `PAYMENT_PG_UNAVAILABLE`(구독 생성 · 추가 상품 문과 같은 분류 · 문장), 결과를 모르는 승인은 200 + `payment_status: PENDING` 이다(오류가 아니다).","operationId":"retry_subscription_payment_v1_subscriptions__subscription_id__payment_retry_post","parameters":[{"name":"subscription_id","in":"path","required":true,"schema":{"type":"integer","title":"Subscription Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"title":"Idempotency-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionPaymentRetryRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionPaymentRetryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/invoices":{"get":{"tags":["Billing Invoices"],"summary":"List Invoices","description":"인보이스 목록 조회.","operationId":"list_invoices_v1_invoices_get","parameters":[{"name":"query","in":"query","required":true,"schema":{"$ref":"#/components/schemas/InvoiceListQuery"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageEnvelope_InvoiceResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/invoices/{invoice_id}":{"get":{"tags":["Billing Invoices"],"summary":"Get Invoice","description":"인보이스 단건 조회.","operationId":"get_invoice_v1_invoices__invoice_id__get","parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/payments":{"get":{"tags":["Billing Payments"],"summary":"List Payments","description":"결제 목록 조회.","operationId":"list_payments_v1_payments_get","parameters":[{"name":"query","in":"query","required":true,"schema":{"$ref":"#/components/schemas/PaymentListQuery"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageEnvelope_PaymentResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/payments/{payment_id}":{"get":{"tags":["Billing Payments"],"summary":"Get Payment","description":"결제 단건 조회.","operationId":"get_payment_v1_payments__payment_id__get","parameters":[{"name":"payment_id","in":"path","required":true,"schema":{"type":"integer","title":"Payment Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/refunds":{"post":{"tags":["Billing Refunds"],"summary":"Create Refund","description":"환불 요청.","operationId":"create_refund_v1_refunds_post","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"title":"Idempotency-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefundCreateRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefundCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Billing Refunds"],"summary":"List Refunds","description":"환불 목록 조회.","operationId":"list_refunds_v1_refunds_get","parameters":[{"name":"query","in":"query","required":true,"schema":{"$ref":"#/components/schemas/RefundListQuery"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageEnvelope_RefundResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/refunds/{refund_id}":{"get":{"tags":["Billing Refunds"],"summary":"Get Refund","description":"환불 단건 조회.","operationId":"get_refund_v1_refunds__refund_id__get","parameters":[{"name":"refund_id","in":"path","required":true,"schema":{"type":"integer","title":"Refund Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefundResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/billing/webhooks/{provider}":{"post":{"tags":["Billing Webhooks"],"summary":"Receive Webhook","description":"PG 웹훅 수신 - 받은 뒤 7단계로 처리한다.","operationId":"receive_webhook_v1_billing_webhooks__provider__post","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"enum":["sandbox","real_test","production"],"type":"string"},{"type":"null"}],"description":"외부 PG 가 보내는 환경 힌트입니다(필수가 아닙니다). 값은 production, real_test, sandbox 중 하나이고, 보내면 그 환경의 서명만 검증합니다. 보내지 않으면 production, real_test, sandbox 순서로 시도해 서명이 맞는 환경을 고릅니다. 목록 밖의 값은 HTTP 400 WEBHOOK_PAYLOAD_INVALID 로 거절합니다.","title":"X-Env-Scope"},"description":"외부 PG 가 보내는 환경 힌트입니다(필수가 아닙니다). 값은 production, real_test, sandbox 중 하나이고, 보내면 그 환경의 서명만 검증합니다. 보내지 않으면 production, real_test, sandbox 순서로 시도해 서명이 맞는 환경을 고릅니다. 목록 밖의 값은 HTTP 400 WEBHOOK_PAYLOAD_INVALID 로 거절합니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookAckResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/products":{"post":{"tags":["Product Catalog"],"summary":"Create Product","operationId":"create_product_v1_products_post","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Product Catalog"],"summary":"List Products","operationId":"list_products_v1_products_get","parameters":[{"name":"query","in":"query","required":true,"schema":{"$ref":"#/components/schemas/ProductListQuery"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageEnvelope_ProductListItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/products/by-website-slug/{website_slug}":{"get":{"tags":["Product Catalog"],"summary":"Get Product By Website Slug","operationId":"get_product_by_website_slug_v1_products_by_website_slug__website_slug__get","parameters":[{"name":"website_slug","in":"path","required":true,"schema":{"type":"string","title":"Website Slug"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/products/{product_id}":{"get":{"tags":["Product Catalog"],"summary":"Get Product","operationId":"get_product_v1_products__product_id__get","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}},{"name":"include_deleted","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Deleted"}},{"name":"include_versions","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Versions"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Product Catalog"],"summary":"Update Product","operationId":"update_product_v1_products__product_id__patch","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Product Catalog"],"summary":"Delete Product","operationId":"delete_product_v1_products__product_id__delete","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ProductDeleteRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductDeleteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/products/{product_id}/plan-mappings":{"get":{"tags":["Product Catalog"],"summary":"List Product Plan Mappings","operationId":"list_product_plan_mappings_v1_products__product_id__plan_mappings_get","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}},{"name":"query","in":"query","required":true,"schema":{"$ref":"#/components/schemas/PlanProductMappingListQuery"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageEnvelope_PlanProductMappingWithPlanItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/products/{product_id}/versions":{"post":{"tags":["Product Catalog Versions"],"summary":"Create Product Version","operationId":"create_product_version_v1_products__product_id__versions_post","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductVersionCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductVersionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Product Catalog Versions"],"summary":"List Product Versions","operationId":"list_product_versions_v1_products__product_id__versions_get","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}},{"name":"query","in":"query","required":true,"schema":{"$ref":"#/components/schemas/ProductVersionListQuery"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageEnvelope_ProductVersionResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/plans/{plan_id}/products":{"get":{"tags":["Product Catalog Plan Mapping"],"summary":"List Plan Product Mappings","operationId":"list_plan_product_mappings_v1_plans__plan_id__products_get","parameters":[{"name":"plan_id","in":"path","required":true,"schema":{"type":"integer","title":"Plan Id"}},{"name":"query","in":"query","required":true,"schema":{"$ref":"#/components/schemas/PlanProductMappingListQuery"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageEnvelope_PlanProductMappingResponseItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Product Catalog Plan Mapping"],"summary":"Create Plan Product Mappings","operationId":"create_plan_product_mappings_v1_plans__plan_id__products_post","parameters":[{"name":"plan_id","in":"path","required":true,"schema":{"type":"integer","title":"Plan Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanProductMappingCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanProductMappingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/plans/{plan_id}/products/{product_id}":{"delete":{"tags":["Product Catalog Plan Mapping"],"summary":"Delete Plan Product Mapping","description":"요금제에서 상품 하나를 **내린다**(매핑 해제) - 운영자의 유일한 해제 경로.\n\n왜 생겼나(admin 실측 DE-20 뒤 설계 공백 · 내 판단 편지 1a1329df9ee): 활성 요금제 매핑이\n있는 상품의 삭제를 409 로 막은 뒤(5c743fba0) 운영자가 그 매핑을 내릴 길이 **0** 이어서\n빠져나갈 수 없는 거절이 됐다. 저장소의 ``soft_delete_mapping`` 을 부르던 자리 셋은 다\n교체의 부작용이거나 MCP 묶음 삭제였다.\n\n모양은 나란한 삭제(``DELETE /v1/products/{product_id}``)를 그대로 따른다 - 멱등키 필수 ·\n운영자 쓰기 권한 · 200 과 본문 · 없으면 404(원칙 3). 감사는 교체가 쓰던\n``record_plan_product_mapping_deleted`` 를 그대로 쓴다(원칙 1 - 같은 사실이다).","operationId":"delete_plan_product_mapping_v1_plans__plan_id__products__product_id__delete","parameters":[{"name":"plan_id","in":"path","required":true,"schema":{"type":"integer","title":"Plan Id"}},{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanProductMappingDeleteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/products/{product_id}/page-content":{"get":{"tags":["Product Catalog Page Content"],"summary":"Get Product Page Content","operationId":"get_product_page_content_v1_products__product_id__page_content_get","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductPageContentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Product Catalog Page Content"],"summary":"Put Product Page Content","operationId":"put_product_page_content_v1_products__product_id__page_content_put","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductPageContentPutRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductPageContentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"tags":["시스템"],"summary":"시스템상태 확인 (API 서버 상태 확인)","description":"시스템상태 확인 (API 서버 상태 확인)","operationId":"system_health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/hometax/products/v1/a/s1/health":{"get":{"tags":["시스템"],"summary":"헬스체크","description":"헬스체크 (Tier B AuthPolicy — job_read, no provider/action).","operationId":"health_check_hometax_products_v1_a_s1_health_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API Key","default":"","title":"X-Api-Key"},"description":"API Key"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mcp":{"post":{"tags":["MCP"],"summary":"MCP (Model Context Protocol) — Streamable HTTP","description":"MCP JSON-RPC 2.0 엔드포인트.\n\n인증: `Authorization: Basic <base64(client_id:client_secret)>`\nToken/API-key 전용 클라이언트는 동일 base64 값을 `Authorization: Bearer <값>` 으로 보내도 됩니다 (MCP 진입점에서 Basic 으로 정규화).\n\n환경: 헤더가 없으면 계정의 레인에서 돈다 — 라이트 요금제는 `real_test` (REST 와 동일 카운터), 라이트, 스탠다드, PRO 또는 멀티계정 요금제는 `production`. `X-MCP-Env-Scope` 를 보내면 그 값이 우선한다. tools/list 결과 `_meta[\"xdata.kr/lane\"]` 가 실제 레인을 알려 준다.\n\n지원 메서드: `initialize`, `tools/list`, `tools/call`, `ping`\n\ntools/call Option A (JSON): default Accept — no progress events\ntools/call Option B (SSE, recommended for products): `Accept: text/event-stream` — `notifications/progress` + keepalive","operationId":"mcp_handler_mcp_post","responses":{"200":{"description":"JSON-RPC 2.0 봉투. `Accept: text/event-stream` 으로 협상하면 같은 200 이 SSE 스트림이고, **이 모양은 그 스트림의 마지막 `data:` 프레임**이다 (`result` 또는 `error` 를 든 프레임). 그 앞의 프레임은 모양이 다르다 - `method: notifications/progress` 와 `params` 를 들고 `result`·`error`·`id` 가 없으며, keepalive 는 `:` 로 시작하는 주석 줄이라 JSON 이 아니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpJsonRpcResponse"}}}}}}},"/v1/me/mcp/oauth/authorization-requests/{request_id}":{"get":{"tags":["MCP OAuth"],"summary":"Get Oauth Authorization Request","operationId":"get_oauth_authorization_request_v1_me_mcp_oauth_authorization_requests__request_id__get","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/mcp/oauth/authorization-requests/{request_id}/approve":{"post":{"tags":["MCP OAuth"],"summary":"Approve Oauth Authorization Request","operationId":"approve_oauth_authorization_request_v1_me_mcp_oauth_authorization_requests__request_id__approve_post","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthApproveBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/mcp/oauth/authorization-requests/{request_id}/deny":{"post":{"tags":["MCP OAuth"],"summary":"Deny Oauth Authorization Request","operationId":"deny_oauth_authorization_request_v1_me_mcp_oauth_authorization_requests__request_id__deny_post","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/mcp/oauth/grants":{"get":{"tags":["MCP OAuth"],"summary":"List Mcp Oauth Grants","operationId":"list_mcp_oauth_grants_v1_me_mcp_oauth_grants_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/mcp/oauth/grants/{grant_id}":{"delete":{"tags":["MCP OAuth"],"summary":"Revoke Mcp Oauth Grant","operationId":"revoke_mcp_oauth_grant_v1_me_mcp_oauth_grants__grant_id__delete","parameters":[{"name":"grant_id","in":"path","required":true,"schema":{"type":"string","title":"Grant Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/packs":{"post":{"tags":["CompositePack"],"summary":"묶음 실행 제출 (202 + 폴링)","description":"묶음 실행을 접수하고 **바로 돌려준다**(기관 호출이 끝나기를 기다리지 않는다).\n\n새로 접수하면 202, 같은 `Idempotency-Key` 와 같은 본문으로 다시 보내면 200 으로 그 실행의 지금 상태를\n돌려준다(단일 작업 제출과 같은 규칙이다). 접수한 뒤에는 `GET /v1/packs/{pack_run_id}` 로 끝날 때까지\n조회한다.","operationId":"submit_pack_v1_v1_packs_post","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}},{"name":"User-Agent","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User-Agent"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackRunSubmitRequest"}}}},"responses":{"200":{"description":"같은 멱등키와 같은 본문으로 다시 보낸 요청 - 그 실행의 지금 상태다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackRunResponse"}}}},"202":{"description":"새 접수 - 묶음 실행이 시작됐다. 이어서 상태 조회로 끝날 때까지 확인한다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackRunResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/packs/{pack_run_id}":{"get":{"tags":["CompositePack"],"summary":"묶음 실행 조회 - 이 호출이 단계를 한 칸 민다","description":"묶음 실행의 지금 상태를 읽는다. **이 호출이 아직 끝나지 않은 실행을 한 단계 진행시킨다**(기다리지\n않고 지금 상태를 돌려준다). 끝날 때까지 이 주소를 폴링한다.\n\n끝난 실행은 진행시키지 않고 읽어서 그대로 돌려준다.","operationId":"get_pack_run_v1_v1_packs__pack_run_id__get","parameters":[{"name":"pack_run_id","in":"path","required":true,"schema":{"type":"string","title":"Pack Run Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"User-Agent","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User-Agent"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackRunResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/packs/{pack_run_id}/artifacts":{"delete":{"tags":["CompositePack"],"summary":"묶음 실행 결과 파일 삭제","description":"끝난 묶음 실행의 결과 파일을 보관 기간이 지나기 전에 지운다. 단일 작업의 결과 파일 삭제와 같은 모양이다.\n\n실행을 진행시키지 않는다 - 지우기는 읽기도 실행도 아니다.\n\n응답 분기:\n    - 실행이 없거나 다른 조직이나 환경의 것이면 → 404 RESOURCE_NOT_FOUND (상태 조회와 같은 코드)\n    - 상태가 SUCCEEDED 가 아니면                 → 409 RESOURCE_CONFLICT\n    - 상태가 SUCCEEDED 이면                      → 200 OK + `deleted_count` (다시 부르면 0)\n    - 정책 거부                                  → 401, 403, 429 등\n    - pack_run_id 형식 오류                      → 400 VALIDATION_INVALID_FIELD","operationId":"delete_pack_run_artifacts_v1_v1_packs__pack_run_id__artifacts_delete","parameters":[{"name":"pack_run_id","in":"path","required":true,"schema":{"type":"string","title":"Pack Run Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackArtifactsDeleteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/offline-billing/profile":{"get":{"tags":["Offline Billing Bridge"],"summary":"Get Offline Billing Profile","description":"세금계산서·입금자명 프로필 조회 (없으면 조직 기본값 반환).","operationId":"get_offline_billing_profile_v1_offline_billing_profile_get","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfflineBillingProfileResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Offline Billing Bridge"],"summary":"Upsert Offline Billing Profile","description":"세금계산서·입금자명 프로필 저장 (없으면 INSERT, 있으면 UPDATE).","operationId":"upsert_offline_billing_profile_v1_offline_billing_profile_put","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfflineBillingProfileUpsertRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfflineBillingProfileResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/offline-billing/orders":{"post":{"tags":["Offline Billing Bridge"],"summary":"Create Order","description":"무통장 주문 생성 (T1 + offline_billing_orders 생성).","operationId":"create_order_v1_offline_billing_orders_post","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfflineOrderCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfflineOrderResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/offline-billing/orders/active":{"get":{"tags":["Offline Billing Bridge"],"summary":"Get Active Order","description":"현재 진행중 주문 조회 (AWAITING_DEPOSIT). 없으면 null.","operationId":"get_active_order_v1_offline_billing_orders_active_get","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/OfflineOrderResponse"},{"type":"null"}],"title":"Response Get Active Order V1 Offline Billing Orders Active Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/offline-billing/renewal-offer":{"get":{"tags":["Offline Billing Bridge"],"summary":"Get Offline Renewal Offer","description":"지금 이 조직이 무통장 구독을 연장할 수 있는가(서버가 정한다) + 연장하면 새 기간 끝 · 금액. 못 하면 ``eligible=false`` + 이유.","operationId":"get_offline_renewal_offer_v1_offline_billing_renewal_offer_get","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfflineRenewalOfferResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/offline-billing/renewal-orders":{"post":{"tags":["Offline Billing Bridge"],"summary":"Create Renewal Order","description":"무통장 연장 주문 - 갱신 청구서 + 입금 대기 주문을 만든다. 구독은 건드리지 않는다(입금 확인이 기간 끝을 민다).","operationId":"create_renewal_order_v1_offline_billing_renewal_orders_post","parameters":[{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfflineRenewalOrderCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfflineOrderResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/offline-billing/orders/{order_id}":{"delete":{"tags":["Offline Billing Bridge"],"summary":"Cancel Order","description":"입금 전 고객 취소.","operationId":"cancel_order_v1_offline_billing_orders__order_id__delete","parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}},{"name":"env_scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"Env Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Env-Scope","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.","enum":["production","real_test","sandbox"],"title":"X-Env-Scope"},"description":"환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cancel Order V1 Offline Billing Orders  Order Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"security":[{"basicClientCredential":[]},{"mcpOAuth2":[]}]}