ADRO Plans API

The plans API from ADRO — 16 operation(s) for plans.

Operations 16

GET /plans/ 플랜 목록 #
GET /plans/{code}/ 플랜 단건 조회 #
POST /plans/{code}/downgrade/ 플랜 다운그레이드 예약 — 사이클 종료 시 적용 #
POST /plans/{code}/subscribe/ 구독 시작 — 빌링키 첫 결제 후 ACTIVE 전환 + SUBSCRIPTION credit 발급 #
POST /plans/{code}/upgrade/ 플랜 업그레이드 — 즉시 권한 + 차액 결제 + 실제 청구 견적 반환 #
GET /plans/{code}/upgrade-quote/ 플랜 업그레이드 사전 견적 — 백엔드 일할 계산/부가세/청구액 SOT #
GET /subscriptions/ 팀 구독 조회 — 활성/예약/만료 분리해 반환 #
POST /subscriptions/cancel/ 구독 해지 예약 — 사이클 종료 시 EXPIRED #
GET /subscriptions/cycles/ 팀의 구독 사이클 이력 #
GET /subscriptions/plan-gate/ 팀의 실행 가능 플랜 여부 #
POST /subscriptions/resume/ 구독 해지 예약 취소 — CANCELLED → ACTIVE #
GET /subscriptions/solver-access/ 팀의 현재 Solver 권한 (실시간 조회) #
GET /subscriptions/storage-addon/ 팀 스토리지 애드온 조회 #
POST /subscriptions/storage-addon/change/ 팀 스토리지 애드온 감량 또는 해지 예약 (다음 결제 주기 적용) #
POST /subscriptions/storage-addon/purchase/ 팀 스토리지 애드온 즉시 구매 (현재 구독 주기 종료일까지 일할 청구) #
GET /subscriptions/storage-addon/quote/ 팀 스토리지 애드온 일할 견적 #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/adro1b33-plans-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

adro1b33-plans-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: aox-django-backend Plans API
  version: 1.0.0
tags:
- name: Plans
paths:
  /plans/:
    get:
      operationId: plans_list
      summary: 플랜 목록
      parameters:
      - in: query
        name: currency
        schema:
          type: string
      - in: query
        name: include_inactive
        schema:
          type: boolean
      tags:
      - Plans
      security:
      - {}
      responses:
        '200':
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Plan'
          description: ''
  /plans/{code}/:
    get:
      operationId: plans_retrieve
      summary: 플랜 단건 조회
      parameters:
      - in: path
        name: code
        schema:
          type: string
        required: true
      - in: query
        name: currency
        schema:
          type: string
      tags:
      - Plans
      security:
      - {}
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Plan'
          description: ''
  /plans/{code}/downgrade/:
    post:
      operationId: plans_downgrade_create
      summary: 플랜 다운그레이드 예약 — 사이클 종료 시 적용
      parameters:
      - in: path
        name: code
        schema:
          type: string
        required: true
      tags:
      - Plans
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PlanChangeRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PlanChangeRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PlanChangeRequest'
        required: true
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Subscription'
          description: ''
  /plans/{code}/subscribe/:
    post:
      operationId: plans_subscribe_create
      summary: 구독 시작 — 빌링키 첫 결제 후 ACTIVE 전환 + SUBSCRIPTION credit 발급
      parameters:
      - in: path
        name: code
        schema:
          type: string
        required: true
      tags:
      - Plans
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SubscribeRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/SubscribeRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/SubscribeRequest'
        required: true
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Subscription'
          description: ''
  /plans/{code}/upgrade/:
    post:
      operationId: plans_upgrade_create
      summary: 플랜 업그레이드 — 즉시 권한 + 차액 결제 + 실제 청구 견적 반환
      parameters:
      - in: path
        name: code
        schema:
          type: string
        required: true
      tags:
      - Plans
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PlanChangeRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PlanChangeRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PlanChangeRequest'
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UpgradeResponse'
          description: ''
  /plans/{code}/upgrade-quote/:
    get:
      operationId: plans_upgrade_quote_retrieve
      summary: 플랜 업그레이드 사전 견적 — 백엔드 일할 계산/부가세/청구액 SOT
      parameters:
      - in: path
        name: code
        schema:
          type: string
        required: true
      - in: query
        name: currency
        schema:
          type: string
      - in: query
        name: team_id
        schema:
          type: integer
        required: true
      tags:
      - Plans
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UpgradeQuoteResponse'
          description: ''
  /subscriptions/:
    get:
      operationId: subscriptions_list
      summary: 팀 구독 조회 — 활성/예약/만료 분리해 반환
      parameters:
      - in: query
        name: team_id
        schema:
          type: integer
        required: true
      tags:
      - Plans
      responses:
        '200':
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Subscription'
          description: ''
  /subscriptions/cancel/:
    post:
      operationId: subscriptions_cancel_create
      summary: 구독 해지 예약 — 사이클 종료 시 EXPIRED
      tags:
      - Plans
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CancelRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/CancelRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/CancelRequest'
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Subscription'
          description: ''
  /subscriptions/cycles/:
    get:
      operationId: subscriptions_cycles_list
      description: 'TENANT 모드(B2B)에서는 팀 레벨 사이클 이력이 없어 `{"billing_mode": "TENANT", "results": []}` 를 반환한다.'
      summary: 팀의 구독 사이클 이력
      parameters:
      - in: query
        name: limit
        schema:
          type: integer
      - in: query
        name: team_id
        schema:
          type: integer
        required: true
      tags:
      - Plans
      responses:
        '200':
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/SubscriptionCycle'
          description: ''
  /subscriptions/plan-gate/:
    get:
      operationId: subscriptions_plan_gate_retrieve
      description: 가격·견적 정보 없이 현재 팀의 실행 진입 플랜만 판정한다.
      summary: 팀의 실행 가능 플랜 여부
      parameters:
      - in: query
        name: team_id
        schema:
          type: integer
        required: true
      tags:
      - Plans
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PlanGateResponse'
          description: ''
  /subscriptions/resume/:
    post:
      operationId: subscriptions_resume_create
      summary: 구독 해지 예약 취소 — CANCELLED → ACTIVE
      tags:
      - Plans
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CancelRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/CancelRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/CancelRequest'
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Subscription'
          description: ''
  /subscriptions/solver-access/:
    get:
      operationId: subscriptions_solver_access_retrieve
      summary: 팀의 현재 Solver 권한 (실시간 조회)
      parameters:
      - in: query
        name: team_id
        schema:
          type: integer
        required: true
      tags:
      - Plans
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SolverAccessResponse'
          description: ''
  /subscriptions/storage-addon/:
    get:
      operationId: subscriptions_storage_addon_retrieve
      summary: 팀 스토리지 애드온 조회
      parameters:
      - in: query
        name: team_id
        schema:
          type: integer
        required: true
      tags:
      - Plans
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TeamStorageAddon'
          description: ''
  /subscriptions/storage-addon/change/:
    post:
      operationId: subscriptions_storage_addon_change_create
      summary: 팀 스토리지 애드온 감량 또는 해지 예약 (다음 결제 주기 적용)
      tags:
      - Plans
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/StorageAddonChange'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/StorageAddonChange'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/StorageAddonChange'
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TeamStorageAddon'
          description: ''
  /subscriptions/storage-addon/purchase/:
    post:
      operationId: subscriptions_storage_addon_purchase_create
      summary: 팀 스토리지 애드온 즉시 구매 (현재 구독 주기 종료일까지 일할 청구)
      tags:
      - Plans
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/StorageAddonPurchase'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/StorageAddonPurchase'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/StorageAddonPurchase'
        required: true
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TeamStorageAddon'
          description: ''
  /subscriptions/storage-addon/quote/:
    get:
      operationId: subscriptions_storage_addon_quote_retrieve
      summary: 팀 스토리지 애드온 일할 견적
      parameters:
      - in: query
        name: currency
        schema:
          type: string
      - in: query
        name: team_id
        schema:
          type: integer
        required: true
      - in: query
        name: unit_count
        schema:
          type: integer
        required: true
      tags:
      - Plans
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StorageAddonQuote'
          description: ''
components:
  schemas:
    SolverAccessResponse:
      type: object
      description: '`/subscriptions/solver-access/` 응답 — 실시간 조회 결과.'
      properties:
        teamId:
          type: integer
          readOnly: true
        allowedSolvers:
          type: array
          items:
            type: string
          readOnly: true
        sourceSubscriptionId:
          type:
          - integer
          - 'null'
          readOnly: true
        sourceContractId:
          type:
          - integer
          - 'null'
          readOnly: true
      required:
      - allowedSolvers
      - sourceContractId
      - sourceSubscriptionId
      - teamId
    PlanChangeRequest:
      type: object
      properties:
        teamId:
          type: integer
        planCode:
          type: string
          maxLength: 32
        currency:
          type: string
          maxLength: 8
      required:
      - planCode
      - teamId
    UpgradeQuoteResponse:
      type: object
      properties:
        upgradeQuote:
          $ref: '#/components/schemas/UpgradeQuote'
      required:
      - upgradeQuote
    PriceDisplay:
      type: object
      properties:
        supplyAmount:
          type: string
        taxAmount:
          type: string
        totalAmount:
          type: string
        unitPrice:
          type: string
        discountRate:
          type:
          - string
          - 'null'
      required:
      - supplyAmount
      - taxAmount
      - totalAmount
    StorageAddonQuoteDisplay:
      type: object
      description: Backend-formatted UI strings for a storage add-on quote.
      properties:
        monthlySupplyAmount:
          type: string
        monthlyTaxAmount:
          type: string
        monthlyTotalAmount:
          type: string
        chargedSupplyAmount:
          type: string
        chargedTaxAmount:
          type: string
        chargedTotalAmount:
          type: string
      required:
      - chargedSupplyAmount
      - chargedTaxAmount
      - chargedTotalAmount
      - monthlySupplyAmount
      - monthlyTaxAmount
      - monthlyTotalAmount
    UpgradeResponse:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        teamId:
          type: integer
          readOnly: true
        teamName:
          type: string
          readOnly: true
        plan:
          type: integer
        planCode:
          type: string
          readOnly: true
        planName:
          type: string
          readOnly: true
        billingKey:
          type: string
          readOnly: true
        source:
          enum:
          - SELF_SERVE
          - ADMIN_ASSIGNED
          type: string
          description: '* `SELF_SERVE` - 자가 결제

            * `ADMIN_ASSIGNED` - 관리자 할당'
          x-spec-enum-id: daef43a6d8659a7a
        status:
          enum:
          - ACTIVE
          - PAST_DUE
          - CANCELLED
          - EXPIRED
          - SCHEDULED
          type: string
          description: '* `ACTIVE` - 활성

            * `PAST_DUE` - 재결제 실패 대기

            * `CANCELLED` - 해지 예약(사이클 종료 시 EXPIRED)

            * `EXPIRED` - 만료

            * `SCHEDULED` - 다음 사이클 적용 예약(다운그레이드)'
          x-spec-enum-id: 44ba4537fdae9638
        startedAt:
          type: string
          format: date-time
        anchorDay:
          type: integer
          maximum: 32767
          minimum: 0
        currentCycleStartedAt:
          type: string
          format: date-time
        currentCycleEndsAt:
          type: string
          format: date-time
        nextBillingAttemptAt:
          type: string
          format: date-time
        nextBilling:
          allOf:
          - $ref: '#/components/schemas/NextBilling'
          readOnly: true
        cancelAtPeriodEnd:
          type: boolean
        failedAttemptCount:
          type: integer
          maximum: 32767
          minimum: 0
        lastFailedAt:
          type:
          - string
          - 'null'
          format: date-time
        expiredAt:
          type:
          - string
          - 'null'
          format: date-time
        createdAt:
          type: string
          format: date-time
          readOnly: true
        updatedAt:
          type: string
          format: date-time
          readOnly: true
        upgradeQuote:
          allOf:
          - $ref: '#/components/schemas/UpgradeQuote'
      required:
      - anchorDay
      - billingKey
      - createdAt
      - currentCycleEndsAt
      - currentCycleStartedAt
      - id
      - nextBilling
      - nextBillingAttemptAt
      - plan
      - planCode
      - planName
      - startedAt
      - teamId
      - teamName
      - updatedAt
    PriceEntry:
      type: object
      properties:
        currency:
          type: string
        supplyAmountMinor:
          type: integer
        taxAmountMinor:
          type: integer
        totalAmountMinor:
          type: integer
        display:
          $ref: '#/components/schemas/PriceDisplay'
      required:
      - currency
      - display
      - supplyAmountMinor
      - taxAmountMinor
      - totalAmountMinor
    UpgradeQuotePlan:
      type: object
      properties:
        id:
          type: integer
        code:
          type: string
        name:
          type: string
      required:
      - code
      - id
      - name
    TeamStorageAddon:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        teamId:
          type: integer
          readOnly: true
        subscriptionId:
          type: integer
          readOnly: true
        unitCount:
          type: integer
          maximum: 2147483647
          minimum: 0
        addonBytes:
          type: integer
          readOnly: true
        scheduledUnitCount:
          type:
          - integer
          - 'null'
          maximum: 2147483647
          minimum: 0
        currency:
          type: string
          maxLength: 8
        status:
          enum:
          - ACTIVE
          - EXPIRED
          type: string
          description: '* `ACTIVE` - 활성

            * `EXPIRED` - 만료'
          x-spec-enum-id: fee46434bd68355a
        currentCycleStartedAt:
          type: string
          format: date-time
        currentCycleEndsAt:
          type: string
          format: date-time
        nextBillingAttemptAt:
          type: string
          format: date-time
        failedAttemptCount:
          type: integer
          maximum: 32767
          minimum: 0
        lastFailedAt:
          type:
          - string
          - 'null'
          format: date-time
        expiredAt:
          type:
          - string
          - 'null'
          format: date-time
        cycles:
          type: array
          items:
            $ref: '#/components/schemas/StorageAddonCycle'
          readOnly: true
      required:
      - addonBytes
      - currentCycleEndsAt
      - currentCycleStartedAt
      - cycles
      - id
      - nextBillingAttemptAt
      - subscriptionId
      - teamId
      - unitCount
    PlanGateResponse:
      type: object
      description: '`/subscriptions/plan-gate/` 응답 — 실행 진입용 구독 판정.'
      properties:
        teamId:
          type: integer
          readOnly: true
        hasCurrentPlan:
          type: boolean
          readOnly: true
      required:
      - hasCurrentPlan
      - teamId
    NextBillingPlan:
      type: object
      description: 다음 결제될 플랜 식별 정보.
      properties:
        id:
          type: integer
        code:
          type: string
        name:
          type: string
      required:
      - code
      - id
      - name
    Subscription:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        teamId:
          type: integer
          readOnly: true
        teamName:
          type: string
          readOnly: true
        plan:
          type: integer
        planCode:
          type: string
          readOnly: true
        planName:
          type: string
          readOnly: true
        billingKey:
          type: string
          readOnly: true
        source:
          enum:
          - SELF_SERVE
          - ADMIN_ASSIGNED
          type: string
          description: '* `SELF_SERVE` - 자가 결제

            * `ADMIN_ASSIGNED` - 관리자 할당'
          x-spec-enum-id: daef43a6d8659a7a
        status:
          enum:
          - ACTIVE
          - PAST_DUE
          - CANCELLED
          - EXPIRED
          - SCHEDULED
          type: string
          description: '* `ACTIVE` - 활성

            * `PAST_DUE` - 재결제 실패 대기

            * `CANCELLED` - 해지 예약(사이클 종료 시 EXPIRED)

            * `EXPIRED` - 만료

            * `SCHEDULED` - 다음 사이클 적용 예약(다운그레이드)'
          x-spec-enum-id: 44ba4537fdae9638
        startedAt:
          type: string
          format: date-time
        anchorDay:
          type: integer
          maximum: 32767
          minimum: 0
        currentCycleStartedAt:
          type: string
          format: date-time
        currentCycleEndsAt:
          type: string
          format: date-time
        nextBillingAttemptAt:
          type: string
          format: date-time
        nextBilling:
          allOf:
          - $ref: '#/components/schemas/NextBilling'
          readOnly: true
        cancelAtPeriodEnd:
          type: boolean
        failedAttemptCount:
          type: integer
          maximum: 32767
          minimum: 0
        lastFailedAt:
          type:
          - string
          - 'null'
          format: date-time
        expiredAt:
          type:
          - string
          - 'null'
          format: date-time
        createdAt:
          type: string
          format: date-time
          readOnly: true
        updatedAt:
          type: string
          format: date-time
          readOnly: true
      required:
      - anchorDay
      - billingKey
      - createdAt
      - currentCycleEndsAt
      - currentCycleStartedAt
      - id
      - nextBilling
      - nextBillingAttemptAt
      - plan
      - planCode
      - planName
      - startedAt
      - teamId
      - teamName
      - updatedAt
    Plan:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        code:
          enum:
          - beginner
          - engineer
          - turbo
          - professional
          - oem
          - promotion
          type: string
          description: '* `beginner` - Beginner

            * `engineer` - Engineer

            * `turbo` - Turbo

            * `professional` - Professional

            * `oem` - OEM

            * `promotion` - Promotion'
          x-spec-enum-id: 790e8ec979be1b98
        name:
          type: string
          maxLength: 64
        description:
          type: string
        itemCode:
          type: string
          maxLength: 10
        price:
          allOf:
          - $ref: '#/components/schemas/PriceEntry'
          readOnly: true
        monthlyCredits:
          type: integer
          maximum: 2147483647
          minimum: 0
        storageQuotaBytes:
          type:
          - integer
          - 'null'
          maximum: 9223372036854775807
          minimum: 0
          format: int64
          description: Storage entitlement in bytes. Null means the catalogue has no numeric quota.
        storageAddonMaxBytes:
          type: integer
          maximum: 9223372036854775807
          minimum: 0
          format: int64
          description: Maximum cumulative self-service storage add-on entitlement in bytes.
        storageAddonPrices:
          type: array
          items:
            $ref: '#/components/schemas/StorageAddonPrice'
          readOnly: true
        allowedSolvers:
          type: array
          items:
            type: string
          readOnly: true
        isActive:
          type: boolean
        isCustomPricing:
          type: boolean
        isPromotional:
          type: boolean
        sortOrder:
          type: integer
          maximum: 2147483647
          minimum: 0
        createdAt:
          type: string
          format: date-time
          readOnly: true
        updatedAt:
          type: string
          format: date-time
          readOnly: true
      required:
      - allowedSolvers
      - code
      - createdAt
      - id
      - name
      - price
      - storageAddonPrices
      - updatedAt
    SubscribeRequest:
      type: object
      properties:
        teamId:
          type: integer
        billingKeyId:
          type: string
          maxLength: 128
        currency:
          type: string
          maxLength: 8
        paymentId:
          type: string
          maxLength: 128
      required:
      - teamId
    NextBilling:
      type: object
      description: 다음 사이클에 청구될 플랜 + 금액. `price` 는 플랜 리스트의 가격 객체와 동일 구조.
      properties:
        plan:
          $ref: '#/components/schemas/NextBillingPlan'
        price:
          $ref: '#/components/schemas/PriceEntry'
      required:
      - plan
      - price
    SubscriptionCycle:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        subscription:
          type: integer
        planSnapshotCode:
          type: string
          maxLength: 32
        planSnapshotMonthlyCredits:
          type: integer
          maximum: 2147483647
          minimum: 0
        cycleStartedAt:
          type: string
          format: date-time
        cycleEndsAt:
          type: string
          format: date-time
        status:
          enum:
          - PENDING
          - PAID
          - FAILED
          - PRORATED
          type: string
          description: '* `PENDING` - 결제 시도 중

            * `PAID` - 결제 성공

            * `FAILED` - 결제 실패

            * `PRORATED` - 업그레이드 일할 지급'
          x-spec-enum-id: 4bf9b922a073ba54
          default: PENDING
        paymentId:
          type:
          - string
          - 'null'
          readOnly: true
        creditBucketId:
          type:
          - integer
          - 'null'
          readOnly: true
        note:
          type: string
          maxLength: 200
        createdAt:
          type: string
          format: date-time
          readOnly: true
      required:
      - createdAt
      - creditBucketId
      - cycleEndsAt
      - cycleStartedAt
      - id
      - paymentId
      - planSnapshotCode
      - subscription
    CancelRequest:
      type: object
      properties:
        teamId:
          type: integer
      required:
      - teamId
    StorageAddonQuote:
      type: object
      properties:
        currency:
          type: string
        unitCount:
          type: integer
        unitBytes:
          type: integer
        addedBytes:
          type: integer
        monthlySupplyAmountMinor:
          type: integer
        monthlyTaxAmountMinor:
          type: integer
        monthlyTotalAmountMinor:
          type: integer
        chargedSupplyAmountMinor:
          type: integer
        chargedTaxAmountMinor:
          type: integer
        chargedTotalAmountMinor:
          type: integer
        cycleStartedAt:
          type: string
          format: date-time
        cycleEndsAt:
          type: string
          format: date-time
        remainingDays:
          type: integer
        totalDays:
          type: integer
        prorationRatio:
          type: string
        display:
          allOf:
          - $ref: '#/components/schemas/StorageAddonQuoteDisplay'
          readOnly: true
          description: Backend-formatted currency strings; do not recalculate client-side.
      required:
      - addedBytes
      - chargedSupplyAmountMinor
      - chargedTaxAmountMinor
      - chargedTotalAmountMinor
      - currency
      - cycleEndsAt
      - cycleStartedAt
      - display
      - monthlySupplyAmountMinor
      - monthlyTaxAmountMinor
      - monthlyTotalAmountMinor
      - prorationRatio
      - remainingDays
      - totalDays
      - unitBytes
      - unitCount
    UpgradeQuote:
      type: object
      description: 업그레이드 견적 — 결제에 사용되는 백엔드 계산 결과를 그대로 노출.
      properties:
        quotedAt:
          type: string
          format: date-time
        currency:
          type: string
        currentPlan:
          $ref: '#/components/schemas/UpgradeQuotePlan'
        newPlan:
          $ref: '#/components/schemas/UpgradeQuotePlan'
        currentPlanPrice:
          $ref: '#/components/schemas/PriceEntry'
        newPlanPrice:
          $ref: '#/components/schemas/PriceEntry'
        differenceSupplyAmountMinor:
          type: integer
        differenceTaxAmountMinor:
          type: integer
        differenceTotalAmountMinor:
          type: integer
        cycleStartedAt:
          type: string
          format: date-time
        cycleEndsAt:
          type: string
          format: date-time
        usedDays:
          type: integer
        remainingDays:
          type: integer
        totalDays:
          type: integer
        prorationRatio:
          type: string
        subtotalAmountMinor:
          type: integer
        vatAmountMinor:
          type: integer
        totalChargedAmountMinor:
          type: integer
        display:
          type: object
          additionalProperties: {}
        monthlyCreditDifference:
          type: integer
        proratedCredits:
          type: integer
      required:
      - currency
      - currentPlan
      - currentPlanPrice
      - cycleEndsAt
      - cycleStartedAt
      - differenceSupplyAmountMinor
      - differenceTaxAmountMinor
      - differenceTotalAmountMinor
      - display
      - monthlyCreditDifference
      - newPlan
      - newPlanPrice
      - proratedCredits
      - prorationRatio
      - quotedAt
      - remainingDays
      - subtotalAmountMinor
      - totalChargedAmountMinor
      - totalDays
      - usedDays
      - vatAmountMinor
    StorageAddonPrice:
      type: object
      properties:
        currency:
          type: string
        supplyAmountMinor:
          type: integer
        taxAmountMinor:
          type: integer
        totalAmountMinor:
          type: integer
        isActive:
          type: boolean
      required:
      - currency
      - isActive
      - supplyAmountMinor
      - taxAmountMinor
      - totalAmountMinor
    StorageAddonPurchase:
      type: object
      properties:
        teamId:
          type: integer
        unitCount:
          type: integer
          minimum: 1
        currency:
          type: string
          maxLength: 8
      required:
      - teamId
      - unitCount
    StorageAddonCycle:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        unitCountSnapshot:
          type: integer
          maximum: 2147483647
          minimum: 0
        unitBytesSnapshot:
          type: integer
          maximum: 9223372036854775807
          minimum: 0
          format: int64
        currency:
          type: string
          maxLength: 8
        supplyAmountSnapshot:
          type: integer
          maximum: 2147483647
          minimum: 0
        taxAmountSnapshot:
          type: integer
          maximum: 2147483647
          minimum: 0
        totalAmountSnapshot:
          type: integer
          maximum: 2147483647
          minimum: 0
        cycleStartedAt:
          type: string
          format: date-time
        cycleEndsAt:
          type: string
          format: date-time
        status:
          enum:
          - PENDING
          - PAID
          - FAILED
          - PRORATED
          type: string
          description: '* `PENDING` - 결제 시도 중

            * `PAID` - 결제 성공

            * `FAILED` - 결제 실패

            * `PRORATED` - 업그레이드 일할 지급'
          x-spec-enum-id: 4bf9b922a073ba54
        paymentId:
          type:
          - string
          - 'null'
          readOnly: true
        note:
          type: string
          maxLength: 200
        createdAt:
          type: string
          format: date-time
          readOnly: true
      required:
      - createdAt
      - currency
      - cycleEndsAt
      - cycleStartedAt
      - id
      - paymentId
      - supplyAmountSnapshot
      - taxAmountSnapshot
      - totalAmountSnapshot
      - unitBytesSnapshot
      - unitCountSnapshot
    StorageAddonChange:
      type: object
      properties:
        teamId:
          type: integer
        unitCount:
          type: integer
          minimum: 0
      required:
      - teamId
      - unitCount