openapi: 3.0.1
info:
  title: Reseller API
  description: >
    API allowing resellers to create and manage contracts
  version: '2.0'
servers:
  - url: /reseller/v2
tags:
  - name: Admin
  - name: Contract
  - name: /
paths:
  /contracts/{contractNumber}/admins:
    get:
      tags:
        - Admin
      summary: Get all admin users of the contract
      description: You can retrieve a complete list of admin users of the contract
      operationId: findAllAdmins
      parameters:
        - name: contractNumber
          in: path
          required: true
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/UserResponseResource'
        default:
          description: >-
            Any erroneous status code: 400 (parse error), 401 (auth error), 403
            (insufficient privileges), 404 (not found), 405 (unsupported HTTP
            method), 415 (unsupported content type, 422 (validation error), 429
            (request rate limit exceeded), 500 (server error), or 503
            (maintenance).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - BasicAuthentication: []
        - TokenAuthentication: []
    post:
      tags:
        - Admin
      summary: Create new admin user for contract
      operationId: createAdmin
      parameters:
        - name: contractNumber
          in: path
          required: true
          schema:
            type: integer
            format: int64
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UserRequestResource'
        required: false
      responses:
        '201':
          description: Success
          headers:
            Location:
              description: URL of newly created admin user
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserResponseResource'
        default:
          description: >-
            Any erroneous status code: 400 (parse error), 401 (auth error), 403
            (insufficient privileges), 404 (not found), 405 (unsupported HTTP
            method), 415 (unsupported content type, 422 (validation error), 429
            (request rate limit exceeded), 500 (server error), or 503
            (maintenance).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - BasicAuthentication: []
        - TokenAuthentication: []
      x-codegen-request-body-name: body
  /contracts/{contractNumber}/admins/{adminId}:
    get:
      tags:
        - Admin
      summary: Find admin by ID
      operationId: findAdminById
      parameters:
        - name: contractNumber
          in: path
          required: true
          schema:
            type: integer
            format: int64
        - name: adminId
          in: path
          required: true
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserResponseResource'
        default:
          description: >-
            Any erroneous status code: 400 (parse error), 401 (auth error), 403
            (insufficient privileges), 404 (not found), 405 (unsupported HTTP
            method), 415 (unsupported content type, 422 (validation error), 429
            (request rate limit exceeded), 500 (server error), or 503
            (maintenance).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - BasicAuthentication: []
        - TokenAuthentication: []
    delete:
      tags:
        - Admin
      summary: Delete admin user
      description: >-
        This method call will remove admin user from the contract. This is a
        highly destructive method and must be used with caution.
      operationId: deleteAdmin
      parameters:
        - name: contractNumber
          in: path
          required: true
          schema:
            type: integer
            format: int64
        - name: adminId
          in: path
          required: true
          schema:
            type: integer
            format: int64
      responses:
        '204':
          description: Success
          content:
            application/json:
              schema:
                type: object
        default:
          description: >-
            Any erroneous status code: 400 (parse error), 401 (auth error), 403
            (insufficient privileges), 404 (not found), 405 (unsupported HTTP
            method), 415 (unsupported content type, 422 (validation error), 429
            (request rate limit exceeded), 500 (server error), or 503
            (maintenance).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - BasicAuthentication: []
        - TokenAuthentication: []
    patch:
      tags:
        - Admin
      summary: Partially update admin user
      description: >-
        You can use this method to partially update admin user properties
        (firstName and/or lastName and/or email)
      operationId: updateAdmin
      parameters:
        - name: contractNumber
          in: path
          required: true
          schema:
            type: integer
            format: int64
        - name: adminId
          in: path
          required: true
          schema:
            type: integer
            format: int64
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UserUpdateRequestResource'
        required: false
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserResponseResource'
        default:
          description: >-
            Any erroneous status code: 400 (parse error), 401 (auth error), 403
            (insufficient privileges), 404 (not found), 405 (unsupported HTTP
            method), 415 (unsupported content type, 422 (validation error), 429
            (request rate limit exceeded), 500 (server error), or 503
            (maintenance).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - BasicAuthentication: []
        - TokenAuthentication: []
      x-codegen-request-body-name: body
  /contracts:
    get:
      tags:
        - Contract
      summary: Get all contracts
      description: >-
        Retrieve a paginated list of contracts, provisioned under the Master
        Reseller contract. Default limit is the first 50 items; use pagination
        query parameters for listing more items.
      operationId: findAll
      parameters:
        - name: offset
          in: query
          description: >-
            The first element (from the complete list of the elements) to
            include in the response (used together with <b><i>limit</i></b> for
            pagination).
          schema:
            minimum: 0
            type: integer
            format: int32
            default: 0
        - name: limit
          in: query
          description: >-
            The maximum number of elements to return (use together with offset
            for pagination).
          schema:
            maximum: 5000
            minimum: 1
            type: integer
            format: int32
            default: 50
        - name: filter.status
          in: query
          description: Filter the list by contract status [BILLABLE, CEASED, REJECTED].
          schema:
            type: string
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedContractResponseResource'
        default:
          description: >-
            Any erroneous status code: 400 (parse error), 401 (auth error), 403
            (insufficient privileges), 404 (not found), 405 (unsupported HTTP
            method), 415 (unsupported content type, 422 (validation error), 429
            (request rate limit exceeded), 500 (server error), or 503
            (maintenance).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - BasicAuthentication: []
        - TokenAuthentication: []
    post:
      tags:
        - Contract
      summary: Create new contract
      operationId: createContract
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ContractRequestResource'
        required: false
      responses:
        '201':
          description: Success
          headers:
            Location:
              description: URL of newly created contract
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ContractResponseResource'
        default:
          description: >-
            Any erroneous status code: 400 (parse error), 401 (auth error), 403
            (insufficient privileges), 404 (not found), 405 (unsupported HTTP
            method), 415 (unsupported content type, 422 (validation error), 429
            (request rate limit exceeded), 500 (server error), or 503
            (maintenance).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - BasicAuthentication: []
        - TokenAuthentication: []
      x-codegen-request-body-name: body
  /contracts/{contractNumber}/name:
    put:
      tags:
        - Contract
      summary: Update contract name
      operationId: updateName
      parameters:
        - name: contractNumber
          in: path
          required: true
          schema:
            type: integer
            format: int64
      requestBody:
        content:
          text/plain:
            schema:
              type: string
        required: false
      responses:
        '200':
          description: Success
          headers:
            Content-Location:
              description: URL of modified contract
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ContractResponseResource'
        default:
          description: >-
            Any erroneous status code: 400 (parse error), 401 (auth error), 403
            (insufficient privileges), 404 (not found), 405 (unsupported HTTP
            method), 415 (unsupported content type, 422 (validation error), 429
            (request rate limit exceeded), 500 (server error), or 503
            (maintenance).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - BasicAuthentication: []
        - TokenAuthentication: []
      x-codegen-request-body-name: body
  /contracts/{contractNumber}/resourcelimits:
    put:
      tags:
        - Contract
      summary: Update resource limits for contract
      operationId: updateContractResourceLimits
      parameters:
        - name: contractNumber
          in: path
          required: true
          schema:
            type: integer
            format: int64
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ResourceLimits'
        required: false
      responses:
        '200':
          description: Success
          headers:
            Content-Location:
              description: URL of modified contract
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ContractResponseResource'
        default:
          description: >-
            Any erroneous status code: 400 (parse error), 401 (auth error), 403
            (insufficient privileges), 404 (not found), 405 (unsupported HTTP
            method), 415 (unsupported content type, 422 (validation error), 429
            (request rate limit exceeded), 500 (server error), or 503
            (maintenance).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - BasicAuthentication: []
        - TokenAuthentication: []
      x-codegen-request-body-name: body
  /contracts/{contractNumber}:
    get:
      tags:
        - Contract
      summary: Find contract by ID
      operationId: findById
      parameters:
        - name: contractNumber
          in: path
          required: true
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ContractResponseResource'
        default:
          description: >-
            Any erroneous status code: 400 (parse error), 401 (auth error), 403
            (insufficient privileges), 404 (not found), 405 (unsupported HTTP
            method), 415 (unsupported content type, 422 (validation error), 429
            (request rate limit exceeded), 500 (server error), or 503
            (maintenance).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - BasicAuthentication: []
        - TokenAuthentication: []
    put:
      tags:
        - Contract
      summary: Update contract
      operationId: updateContract
      parameters:
        - name: contractNumber
          in: path
          required: true
          schema:
            type: integer
            format: int64
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ContractRequestResource'
        required: false
      responses:
        '200':
          description: Success
          headers:
            Content-Location:
              description: URL of modified contract
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ContractResponseResource'
        default:
          description: >-
            Any erroneous status code: 400 (parse error), 401 (auth error), 403
            (insufficient privileges), 404 (not found), 405 (unsupported HTTP
            method), 415 (unsupported content type, 422 (validation error), 429
            (request rate limit exceeded), 500 (server error), or 503
            (maintenance).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - BasicAuthentication: []
        - TokenAuthentication: []
      x-codegen-request-body-name: body
components:
  schemas:
    UserResponseResource:
      type: object
      properties:
        id:
          type: string
          description: The resource's unique identifier
          readOnly: true
          example: '15514'
        href:
          type: string
          description: URI for specific Admin in a Contract
          format: uri
          readOnly: true
          example: https://api.ionos.com/reseller/v2/contract/15514/admin/5533
        firstName:
          type: string
          description: first name of the user
          readOnly: true
        lastName:
          type: string
          description: last name of the user
          readOnly: true
        email:
          type: string
          description: email of the user
          readOnly: true
    UserRequestResource:
      required:
        - email
        - firstName
        - lastName
        - password
      type: object
      properties:
        firstName:
          type: string
          description: first name of the user
        lastName:
          type: string
          description: last name of the user
        email:
          type: string
          description: email of the user
        password:
          type: string
          description: password of the user
    UserUpdateRequestResource:
      required:
        - email
        - firstName
        - lastName
      type: object
      properties:
        firstName:
          type: string
          description: first name of the user
        lastName:
          type: string
          description: last name of the user
        email:
          type: string
          description: email of the user
    PaginatedContractResponseResource:
      type: object
      properties:
        items:
          type: array
          description: Array of items in the collection.
          readOnly: true
          items:
            $ref: '#/components/schemas/ContractResponseResource'
        offset:
          $ref: '#/components/schemas/PaginationOffsetOptional'
        limit:
          $ref: '#/components/schemas/PaginationLimitOptional'
        _links:
          $ref: '#/components/schemas/PaginationLinks'
    ContractResponseResource:
      type: object
      properties:
        id:
          type: string
          description: The resource's unique identifier
          readOnly: true
          example: '15514'
        href:
          type: string
          description: URI for specific Contract
          format: uri
          readOnly: true
          example: https://api.ionos.com/reseller/v2/contract/15514
        name:
          type: string
          description: name of the contract
        resellerReference:
          type: string
          description: reseller reference of the contract
        status:
          type: string
          description: status of the contract
        resourceLimits:
          $ref: '#/components/schemas/ResourceLimits'
    ResourceLimits:
      required:
        - cpuContractMax
        - cpuServerMax
        - hddVolumeContractMaxSize
        - hddVolumeMaxSize
        - ips
        - ramContractMax
        - ramServerMax
        - ssdVolumeContractMaxSize
        - ssdVolumeMaxSize
      type: object
      properties:
        ramServerMax:
          type: integer
          description: maximum ram per virtual machine
          format: int32
        cpuServerMax:
          type: integer
          description: maximum number of cpu per virtual machine
          format: int32
        hddVolumeMaxSize:
          type: integer
          description: maximum hdd volume size
          format: int32
        ssdVolumeMaxSize:
          type: integer
          description: maximum ssd volume size
          format: int32
        ramContractMax:
          type: integer
          description: maximum ram per contract
          format: int32
        cpuContractMax:
          type: integer
          description: maximum cpu per contract
          format: int32
        hddVolumeContractMaxSize:
          type: integer
          description: maximum hhd volume per contract
          format: int32
        ssdVolumeContractMaxSize:
          type: integer
          description: maximum ssd volume per contract
          format: int32
        ips:
          type: integer
          description: maximum ips per contract
          format: int32
    ContractRequestResource:
      required:
        - name
        - resourceLimits
      type: object
      properties:
        name:
          type: string
          description: name of the contract
        resellerReference:
          type: string
          description: reseller reference of the contract
        resourceLimits:
          $ref: '#/components/schemas/ResourceLimits'
    Info:
      type: object
      properties:
        href:
          type: string
          description: API entry point
          format: uri
          readOnly: true
        name:
          type: string
          description: Name of the API
          readOnly: true
          example: CLOUD API
        version:
          type: string
          description: Version of the API
          readOnly: true
          example: '1.0'
    ErrorResponse:
      type: object
      properties:
        httpStatus:
          type: integer
          description: HTTP status code of the operation.
          readOnly: true
          example: 400
        messages:
          type: array
          items:
            $ref: '#/components/schemas/ErrorMessage'
    ErrorMessage:
      type: object
      properties:
        errorCode:
          type: string
          description: IONOS Cloud error code.
          example: '303'
        message:
          type: string
          description: Limit must not exceed 5,000.
    PaginationOffsetOptional:
      type: number
      description: The offset (if specified in the request).
      example: 0
    PaginationLimitOptional:
      type: number
      description: The limit (if specified in the request).
      example: 1000
    PaginationLinks:
      type: object
      properties:
        prev:
          type: string
          description: >-
            URL (with offset and limit parameters) of the previous page; only
            present if offset is greater than 0.
          format: uri
          readOnly: true
          example: <PREVIOUS-PAGE-URI>
        self:
          type: string
          description: URL (with offset and limit parameters) of the current page.
          format: uri
          readOnly: true
          example: <THIS-PAGE-URI>
        next:
          type: string
          description: >-
            URL (with offset and limit parameters) of the next page; only
            present if offset + limit is less than the total number of elements.
          format: uri
          readOnly: true
          example: <NEXT-PAGE-URI>
  responses:
    apiError:
      description: >-
        Any erroneous status code: 400 (parse error), 401 (auth error), 403
        (insufficient privileges), 404 (not found), 405 (unsupported HTTP
        method), 415 (unsupported content type, 422 (validation error), 429
        (request rate limit exceeded), 500 (server error), or 503 (maintenance).
      content:
        '*/*':
          schema:
            $ref: '#/components/schemas/ErrorResponse'
  parameters:
    offset:
      name: offset
      in: query
      description: >-
        The first element (from the complete list of the elements) to include in
        the response (used together with <b><i>limit</i></b> for pagination).
      schema:
        minimum: 0
        type: integer
        format: int32
        default: 0
    limit:
      name: limit
      in: query
      description: >-
        The maximum number of elements to return (use together with offset for
        pagination).
      schema:
        maximum: 5000
        minimum: 1
        type: integer
        format: int32
        default: 50
    filter.status:
      name: filter.status
      in: query
      description: Filter the list by contract status [BILLABLE, CEASED, REJECTED].
      schema:
        type: string
  securitySchemes:
    BasicAuthentication:
      type: http
      description: >
        You will need to base64 encode the string containing your credentials.
        <div style="padding: 15px; border: 1px solid #d1ecf1; background-color: #d1ecf1; color: #0c5460; margin-bottom: 15px;">
          <strong>Note:</strong><br/><br/>
           <ul><li><b>Basic Authentication</b> is supported only when <b>2-Factor 
          Authentication</b> is not configured.</li>
          <li>Users with <b>2-Factor 
          Authentication</b> activated must generate new 2FA-secured tokens in the DCD using [Token Manager](https://docs.ionos.com/cloud/set-up-ionos-cloud/management/identity-access-management/token-manager). 
          These tokens do not inherit the <b>2FA-secured</b> property by default.</li><li>Token deletion is only possible using the <b>Token Manager</b>.</li>
        </div>
        Separate your username and password with a colon, i.e., username:password
        and send it as 'Authorization' request header. More details: https://en.wikipedia.org/wiki/Basic_access_authentication
      scheme: basic
    TokenAuthentication:
      type: apiKey
      description: >-
        Please provide header value as 'Bearer <token>' and don't forget to add
        'Bearer' HTTP Authorization Scheme before the token.
      name: Authorization
      in: header
x-original-swagger-version: '2.0'
