---
openapi: 3.0.1
info:
  title: API V1
  version: v1
components:
  schemas:
    error_response:
      type: object
      properties:
        errors:
          type: array
          items:
            type: object
            properties:
              title:
                type: string
              detail:
                type: string
              source:
                type: object
            required:
            - detail
      required:
      - errors
    customer:
      type: object
      properties:
        data:
          type: object
          properties:
            id:
              type: string
              example: '1'
            type:
              type: string
              example: customer
            attributes:
              type: object
              properties:
                id:
                  type: integer
                  example: 1
                enterprise_id:
                  type: integer
                  example: 2
                first_name:
                  type: string
                  nullable: true
                  example: Alice
                last_name:
                  type: string
                  nullable: true
                  example: Springs
                code:
                  type: string
                  nullable: true
                  example: BUYER1
                email:
                  type: string
                  example: alice@example.com
                allow_charges:
                  type: boolean
                  example: false
                tags:
                  type: array
                  items:
                    type: string
                  example:
                  - staff
                  - discount
                terms_and_conditions_accepted_at:
                  type: string
                  format: date-time
                  nullable: true
                  example: '2022-03-12T15:55:00.000+11:00'
                billing_address:
                  type: object
                  nullable: true
                  example:
                shipping_address:
                  type: object
                  nullable: true
                  example:
                    phone: 0404 333 222 111
                    latitude: -37.8173751
                    longitude: 144.964803195704
                    first_name: Alice
                    last_name: Springs
                    street_address_1: 1 Flinders Street
                    street_address_2: ''
                    postal_code: '1234'
                    locality: Melbourne
                    region:
                      code: Vic
                      name: Victoria
                    country:
                      code: AU
                      name: Australia
              required:
              - id
              - enterprise_id
              - first_name
              - last_name
              - code
              - email
              - allow_charges
              - tags
              - terms_and_conditions_accepted_at
              - billing_address
              - shipping_address
            relationships:
              type: object
              properties:
                enterprise:
                  type: object
                  properties:
                    data:
                      type: object
                      properties:
                        id:
                          type: string
                        type:
                          type: string
                          example: enterprise
                    links:
                      type: object
                      properties:
                        related:
                          type: string
        meta:
          type: object
        links:
          type: object
      required:
      - data
    customers_collection:
      type: object
      properties:
        data:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                example: '1'
              type:
                type: string
                example: customer
              attributes:
                type: object
                properties:
                  id:
                    type: integer
                    example: 1
                  enterprise_id:
                    type: integer
                    example: 2
                  first_name:
                    type: string
                    nullable: true
                    example: Alice
                  last_name:
                    type: string
                    nullable: true
                    example: Springs
                  code:
                    type: string
                    nullable: true
                    example: BUYER1
                  email:
                    type: string
                    example: alice@example.com
                  allow_charges:
                    type: boolean
                    example: false
                  tags:
                    type: array
                    items:
                      type: string
                    example:
                    - staff
                    - discount
                  terms_and_conditions_accepted_at:
                    type: string
                    format: date-time
                    nullable: true
                    example: '2022-03-12T15:55:00.000+11:00'
                  billing_address:
                    type: object
                    nullable: true
                    example:
                  shipping_address:
                    type: object
                    nullable: true
                    example:
                      phone: 0404 333 222 111
                      latitude: -37.8173751
                      longitude: 144.964803195704
                      first_name: Alice
                      last_name: Springs
                      street_address_1: 1 Flinders Street
                      street_address_2: ''
                      postal_code: '1234'
                      locality: Melbourne
                      region:
                        code: Vic
                        name: Victoria
                      country:
                        code: AU
                        name: Australia
                  balance:
                    type: number
                    format: double
                required:
                - id
                - enterprise_id
                - first_name
                - last_name
                - code
                - email
                - allow_charges
                - tags
                - terms_and_conditions_accepted_at
                - billing_address
                - shipping_address
              relationships:
                type: object
                properties:
                  enterprise:
                    type: object
                    properties:
                      data:
                        type: object
                        properties:
                          id:
                            type: string
                          type:
                            type: string
                            example: enterprise
                      links:
                        type: object
                        properties:
                          related:
                            type: string
        meta:
          type: object
          properties:
            pagination:
              type: object
              properties:
                results:
                  type: integer
                  example: 250
                pages:
                  type: integer
                  example: 5
                page:
                  type: integer
                  example: 2
                per_page:
                  type: integer
                  example: 50
          required:
          - pagination
        links:
          type: object
          properties:
            self:
              type: string
            first:
              type: string
            prev:
              type: string
              nullable: true
            next:
              type: string
              nullable: true
            last:
              type: string
      required:
      - data
      - meta
      - links
  securitySchemes:
    api_key_header:
      type: apiKey
      name: X-Api-Token
      in: header
      description: Authenticates via API key passed in specified header
    api_key_param:
      type: apiKey
      name: token
      in: query
      description: Authenticates via API key passed in specified query param
    session:
      type: apiKey
      name: _ofn_session_id
      in: cookie
      description: Authenticates using the current user's session if logged in
paths:
  "/api/v1/customers":
    get:
      summary: List customers
      tags:
      - Customers
      parameters:
      - name: enterprise_id
        in: query
        schema:
          type: string
      - name: extra_fields[customer]
        in: query
        example: balance
        description: Add extra fields to each customer
        schema:
          type: string
      responses:
        '200':
          description: Customers list
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/customers_collection"
    post:
      summary: Create customer
      tags:
      - Customers
      parameters: []
      responses:
        '201':
          description: Example customer created
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/customer"
        '422':
          description: Unprocessable entity
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/error_response"
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                enterprise_id:
                  type: integer
                  example: 2
                first_name:
                  type: string
                  nullable: true
                  example: Alice
                last_name:
                  type: string
                  nullable: true
                  example: Springs
                code:
                  type: string
                  nullable: true
                  example: BUYER1
                email:
                  type: string
                  example: alice@example.com
                tags:
                  type: array
                  items:
                    type: string
                  example:
                  - staff
                  - discount
                billing_address:
                  type: object
                  nullable: true
                  example:
                shipping_address:
                  type: object
                  nullable: true
                  example:
                    phone: 0404 333 222 111
                    latitude: -37.8173751
                    longitude: 144.964803195704
                    first_name: Alice
                    last_name: Springs
                    street_address_1: 1 Flinders Street
                    street_address_2: ''
                    postal_code: '1234'
                    locality: Melbourne
                    region:
                      code: Vic
                      name: Victoria
                    country:
                      code: AU
                      name: Australia
              required:
              - enterprise_id
              - email
  "/api/v1/customers/{id}":
    get:
      summary: Show customer
      tags:
      - Customers
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Customer
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      id:
                        type: string
                        example: '1'
                      type:
                        type: string
                        example: customer
                      attributes:
                        type: object
                        properties:
                          id:
                            type: integer
                            example: 1
                          enterprise_id:
                            type: integer
                            example: 2
                          first_name:
                            type: string
                            nullable: true
                            example: Alice
                          last_name:
                            type: string
                            nullable: true
                            example: Springs
                          code:
                            type: string
                            nullable: true
                            example: BUYER1
                          email:
                            type: string
                            example: alice@example.com
                          allow_charges:
                            type: boolean
                            example: false
                          tags:
                            type: array
                            items:
                              type: string
                            example:
                            - staff
                            - discount
                          terms_and_conditions_accepted_at:
                            type: string
                            format: date-time
                            nullable: true
                            example: '2022-03-12T15:55:00.000+11:00'
                          billing_address:
                            type: object
                            nullable: true
                            example:
                          shipping_address:
                            type: object
                            nullable: true
                            example:
                              phone: 0404 333 222 111
                              latitude: -37.8173751
                              longitude: 144.964803195704
                              first_name: Alice
                              last_name: Springs
                              street_address_1: 1 Flinders Street
                              street_address_2: ''
                              postal_code: '1234'
                              locality: Melbourne
                              region:
                                code: Vic
                                name: Victoria
                              country:
                                code: AU
                                name: Australia
                          balance:
                            type: number
                            format: double
                        required:
                        - id
                        - enterprise_id
                        - first_name
                        - last_name
                        - code
                        - email
                        - allow_charges
                        - tags
                        - terms_and_conditions_accepted_at
                        - billing_address
                        - shipping_address
                        - balance
                      relationships:
                        type: object
                        properties:
                          enterprise:
                            type: object
                            properties:
                              data:
                                type: object
                                properties:
                                  id:
                                    type: string
                                  type:
                                    type: string
                                    example: enterprise
                              links:
                                type: object
                                properties:
                                  related:
                                    type: string
                  meta:
                    type: object
                  links:
                    type: object
                required:
                - data
        '404':
          description: Not found
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/error_response"
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/error_response"
    put:
      summary: Update customer
      tags:
      - Customers
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Customer updated
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/customer"
        '422':
          description: Unprocessable entity
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/error_response"
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                enterprise_id:
                  type: integer
                  example: 2
                first_name:
                  type: string
                  nullable: true
                  example: Alice
                last_name:
                  type: string
                  nullable: true
                  example: Springs
                code:
                  type: string
                  nullable: true
                  example: BUYER1
                email:
                  type: string
                  example: alice@example.com
                tags:
                  type: array
                  items:
                    type: string
                  example:
                  - staff
                  - discount
                billing_address:
                  type: object
                  nullable: true
                  example:
                shipping_address:
                  type: object
                  nullable: true
                  example:
                    phone: 0404 333 222 111
                    latitude: -37.8173751
                    longitude: 144.964803195704
                    first_name: Alice
                    last_name: Springs
                    street_address_1: 1 Flinders Street
                    street_address_2: ''
                    postal_code: '1234'
                    locality: Melbourne
                    region:
                      code: Vic
                      name: Victoria
                    country:
                      code: AU
                      name: Australia
              required:
              - enterprise_id
              - email
    delete:
      summary: Delete customer
      tags:
      - Customers
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Customer deleted
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/customer"
  "/api/v1/enterprises/{enterprise_id}/customers":
    get:
      summary: List customers of an enterprise
      tags:
      - Customers
      - Enterprises
      parameters:
      - name: enterprise_id
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Customers list
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/customers_collection"
servers:
- url: "/"
