openapi: 3.0.1
info:
  version: 1.0.0
  title: 'Harvestapp API'
  license:
    name: MIT
externalDocs:
  description: 'Learn more about the Harvest Web API'
  url: 'https://help.getharvest.com/api-v2/'
servers:
  -
    url: 'https://api.harvestapp.com/v2'
components:
  securitySchemes:
    BearerAuth:
      type: apiKey
      in: header
      name: Authorization
    AccountAuth:
      type: apiKey
      in: header
      name: Harvest-Account-Id
  schemas:
    Contact:
      type: object
      externalDocs:
        description: contact
        url: 'https://help.getharvest.com/api-v2/clients-api/clients/contacts/#the-contact-object'
      properties:
        id:
          type: integer
          description: 'Unique ID for the contact.'
          nullable: true
          format: int32
        client:
          type: object
          description: 'An object containing the contact’s client id and name.'
          nullable: true
          properties:
            id:
              type: integer
              nullable: true
            name:
              type: string
              nullable: true
        title:
          type: string
          description: 'The title of the contact.'
          nullable: true
        first_name:
          type: string
          description: 'The first name of the contact.'
          nullable: true
        last_name:
          type: string
          description: 'The last name of the contact.'
          nullable: true
        email:
          type: string
          description: 'The contact’s email address.'
          nullable: true
          format: email
        phone_office:
          type: string
          description: 'The contact’s office phone number.'
          nullable: true
        phone_mobile:
          type: string
          description: 'The contact’s mobile phone number.'
          nullable: true
        fax:
          type: string
          description: 'The contact’s fax number.'
          nullable: true
        created_at:
          type: string
          description: 'Date and time the contact was created.'
          nullable: true
          format: date-time
        updated_at:
          type: string
          description: 'Date and time the contact was last updated.'
          nullable: true
          format: date-time
    Client:
      type: object
      externalDocs:
        description: client
        url: 'https://help.getharvest.com/api-v2/clients-api/clients/clients/#the-client-object'
      properties:
        id:
          type: integer
          description: 'Unique ID for the client.'
          nullable: true
          format: int32
        name:
          type: string
          description: 'A textual description of the client.'
          nullable: true
        is_active:
          type: boolean
          description: 'Whether the client is active or archived.'
          nullable: true
        address:
          type: string
          description: 'The physical address for the client.'
          nullable: true
        statement_key:
          type: string
          description: 'Used to build a URL to your client’s invoice dashboard:https://{ACCOUNT_SUBDOMAIN}.harvestapp.com/client/statements/{STATEMENT_KEY}'
          nullable: true
        currency:
          type: string
          description: 'The currency code associated with this client.'
          nullable: true
        created_at:
          type: string
          description: 'Date and time the client was created.'
          nullable: true
          format: date-time
        updated_at:
          type: string
          description: 'Date and time the client was last updated.'
          nullable: true
          format: date-time
    Company:
      type: object
      externalDocs:
        description: company
        url: 'https://help.getharvest.com/api-v2/company-api/company/company/#the-company-object'
      properties:
        base_uri:
          type: string
          description: 'The Harvest URL for the company.'
          nullable: true
        full_domain:
          type: string
          description: 'The Harvest domain for the company.'
          nullable: true
        name:
          type: string
          description: 'The name of the company.'
          nullable: true
        is_active:
          type: boolean
          description: 'Whether the company is active or archived.'
          nullable: true
        week_start_day:
          type: string
          description: 'The weekday used as the start of the week. Returns one of: Saturday, Sunday, or Monday.'
          nullable: true
        wants_timestamp_timers:
          type: boolean
          description: 'Whether time is tracked via duration or start and end times.'
          nullable: true
        time_format:
          type: string
          description: 'The format used to display time in Harvest. Returns either decimal or hours_minutes.'
          nullable: true
        date_format:
          type: string
          description: 'The format used to display date in Harvest. Returns one of: %m/%d/%Y, %d/%m/%Y, %Y-%m-%d, %d.%m.%Y,.%Y.%m.%d or %Y/%m/%d.'
          nullable: true
        plan_type:
          type: string
          description: 'The type of plan the company is on. Examples: trial, free, or simple-v4'
          nullable: true
        clock:
          type: string
          description: 'Used to represent whether the company is using a 12-hour or 24-hour clock. Returns either 12h or 24h.'
          nullable: true
        currency_code_display:
          type: string
          description: 'How to display the currency code when formatting currency. Returns one of: iso_code_none, iso_code_before, or iso_code_after.'
          nullable: true
        currency_symbol_display:
          type: string
          description: 'How to display the currency symbol when formatting currency. Returns one of: symbol_none, symbol_before, or symbol_after.'
          nullable: true
        decimal_symbol:
          type: string
          description: 'Symbol used when formatting decimals.'
          nullable: true
        thousands_separator:
          type: string
          description: 'Separator used when formatting numbers.'
          nullable: true
        color_scheme:
          type: string
          description: 'The color scheme being used in the Harvest web client.'
          nullable: true
        weekly_capacity:
          type: integer
          description: 'The weekly capacity in seconds.'
          nullable: true
          format: int32
        expense_feature:
          type: boolean
          description: 'Whether the expense module is enabled.'
          nullable: true
        invoice_feature:
          type: boolean
          description: 'Whether the invoice module is enabled.'
          nullable: true
        estimate_feature:
          type: boolean
          description: 'Whether the estimate module is enabled.'
          nullable: true
        approval_feature:
          type: boolean
          description: 'Whether the approval module is enabled.'
          nullable: true
        team_feature:
          type: boolean
          description: 'Whether the team module is enabled.'
          nullable: true
    InvoiceMessage:
      type: object
      externalDocs:
        description: invoice-message
        url: 'https://help.getharvest.com/api-v2/invoices-api/invoices/invoice-messages/#the-invoice-message-object'
      properties:
        id:
          type: integer
          description: 'Unique ID for the message.'
          nullable: true
          format: int32
        sent_by:
          type: string
          description: 'Name of the user that created the message.'
          nullable: true
        sent_by_email:
          type: string
          description: 'Email of the user that created the message.'
          nullable: true
        sent_from:
          type: string
          description: 'Name of the user that the message was sent from.'
          nullable: true
        sent_from_email:
          type: string
          description: 'Email of the user that message was sent from.'
          nullable: true
        recipients:
          type: array
          description: 'Array of invoice message recipients.'
          nullable: true
          items:
            $ref: '#/components/schemas/InvoiceMessageRecipient'
        subject:
          type: string
          description: 'The message subject.'
          nullable: true
        body:
          type: string
          description: 'The message body.'
          nullable: true
        include_link_to_client_invoice:
          type: boolean
          description: 'DEPRECATED This will be true when payment_options are assigned to the invoice and false when there are no payment_options.'
          nullable: true
          deprecated: true
        attach_pdf:
          type: boolean
          description: 'Whether to attach the invoice PDF to the message email.'
          nullable: true
        send_me_a_copy:
          type: boolean
          description: 'Whether to email a copy of the message to the current user.'
          nullable: true
        thank_you:
          type: boolean
          description: 'Whether this is a thank you message.'
          nullable: true
        event_type:
          type: string
          description: 'The type of invoice event that occurred with the message: close, draft, re-open, or send (marked the invoice as sent). If event_type was omitted in the request, a null value is returned, meaning the invoice was sent.'
          nullable: true
        reminder:
          type: boolean
          description: 'Whether this is a reminder message.'
          nullable: true
        send_reminder_on:
          type: string
          description: 'The date the reminder email will be sent.'
          nullable: true
          format: date
        created_at:
          type: string
          description: 'Date and time the message was created.'
          nullable: true
          format: date-time
        updated_at:
          type: string
          description: 'Date and time the message was last updated.'
          nullable: true
          format: date-time
    InvoiceMessageRecipient:
      type: object
      externalDocs:
        description: invoice-message-recipient
        url: 'https://help.getharvest.com/api-v2/invoices-api/invoices/invoice-messages/#the-invoice-message-recipient-object'
      properties:
        name:
          type: string
          description: 'Name of the message recipient.'
          nullable: true
        email:
          type: string
          description: 'Email of the message recipient.'
          nullable: true
          format: email
    InvoicePayment:
      type: object
      externalDocs:
        description: invoice-payment
        url: 'https://help.getharvest.com/api-v2/invoices-api/invoices/invoice-payments/#the-invoice-payment-object'
      properties:
        id:
          type: integer
          description: 'Unique ID for the payment.'
          nullable: true
          format: int32
        amount:
          type: number
          description: 'The amount of the payment.'
          nullable: true
          format: float
        paid_at:
          type: string
          description: 'Date and time the payment was made.'
          nullable: true
          format: date-time
        paid_date:
          type: string
          description: 'Date the payment was made.'
          nullable: true
          format: date
        recorded_by:
          type: string
          description: 'The name of the person who recorded the payment.'
          nullable: true
        recorded_by_email:
          type: string
          description: 'The email of the person who recorded the payment.'
          nullable: true
        notes:
          type: string
          description: 'Any notes associated with the payment.'
          nullable: true
        transaction_id:
          type: string
          description: 'Either the card authorization or PayPal transaction ID.'
          nullable: true
        payment_gateway:
          type: object
          description: 'The payment gateway id and name used to process the payment.'
          nullable: true
          properties:
            id:
              type: integer
              nullable: true
            name:
              type: string
              nullable: true
        created_at:
          type: string
          description: 'Date and time the payment was recorded.'
          nullable: true
          format: date-time
        updated_at:
          type: string
          description: 'Date and time the payment was last updated.'
          nullable: true
          format: date-time
    Invoice:
      type: object
      externalDocs:
        description: invoice
        url: 'https://help.getharvest.com/api-v2/invoices-api/invoices/invoices/#the-invoice-object'
      properties:
        id:
          type: integer
          description: 'Unique ID for the invoice.'
          nullable: true
          format: int32
        client:
          type: object
          description: 'An object containing invoice’s client id and name.'
          nullable: true
          properties:
            id:
              type: integer
              nullable: true
            name:
              type: string
              nullable: true
        line_items:
          type: array
          description: 'Array of invoice line items.'
          nullable: true
          items:
            $ref: '#/components/schemas/InvoiceLineItem'
        estimate:
          type: object
          description: 'An object containing the associated estimate’s id.'
          nullable: true
          properties:
            id:
              type: integer
              nullable: true
        retainer:
          type: object
          description: 'An object containing the associated retainer’s id.'
          nullable: true
          properties:
            id:
              type: integer
              nullable: true
        creator:
          type: object
          description: 'An object containing the id and name of the person that created the invoice.'
          nullable: true
          properties:
            id:
              type: integer
              nullable: true
            name:
              type: string
              nullable: true
        client_key:
          type: string
          description: 'Used to build a URL to the public web invoice for your client by adding /client/invoices/{CLIENT_KEY} to your account URL https://{SUBDOMAIN}.harvestapp.com/ Note: you can also add .pdf to the end of this URL to access a PDF version of the invoice.'
          nullable: true
        number:
          type: string
          description: 'If no value is set, the number will be automatically generated.'
          nullable: true
        purchase_order:
          type: string
          description: 'The purchase order number.'
          nullable: true
        amount:
          type: number
          description: 'The total amount for the invoice, including any discounts and taxes.'
          nullable: true
          format: float
        due_amount:
          type: number
          description: 'The total amount due at this time for this invoice.'
          nullable: true
          format: float
        tax:
          type: number
          description: 'This percentage is applied to the subtotal, including line items and discounts.'
          nullable: true
          format: float
        tax_amount:
          type: number
          description: 'The first amount of tax included, calculated from tax. If no tax is defined, this value will be null.'
          nullable: true
          format: float
        tax2:
          type: number
          description: 'This percentage is applied to the subtotal, including line items and discounts.'
          nullable: true
          format: float
        tax2_amount:
          type: number
          description: 'The amount calculated from tax2.'
          nullable: true
          format: float
        discount:
          type: number
          description: 'This percentage is subtracted from the subtotal.'
          nullable: true
          format: float
        discount_amount:
          type: number
          description: 'The amount calculated from discount.'
          nullable: true
          format: float
        subject:
          type: string
          description: 'The invoice subject.'
          nullable: true
        notes:
          type: string
          description: 'Any additional notes included on the invoice.'
          nullable: true
        currency:
          type: string
          description: 'The currency code associated with this invoice.'
          nullable: true
        state:
          type: string
          description: 'The current state of the invoice: draft, open, paid, or closed.'
          nullable: true
        period_start:
          type: string
          description: 'Start of the period during which time entries were added to this invoice.'
          nullable: true
          format: date
        period_end:
          type: string
          description: 'End of the period during which time entries were added to this invoice.'
          nullable: true
          format: date
        issue_date:
          type: string
          description: 'Date the invoice was issued.'
          nullable: true
          format: date
        due_date:
          type: string
          description: 'Date the invoice is due.'
          nullable: true
          format: date
        payment_term:
          type: string
          description: 'The timeframe in which the invoice should be paid. Options: upon receipt, net 15, net 30, net 45, net 60, or custom.'
          nullable: true
        payment_options:
          type: array
          description: 'The list of payment options enabled for the invoice. Options: [ach, credit_card, paypal]'
          nullable: true
          items:
            type: string
            enum:
              - ach
              - credit_card
              - paypal
        sent_at:
          type: string
          description: 'Date and time the invoice was sent.'
          nullable: true
          format: date-time
        paid_at:
          type: string
          description: 'Date and time the invoice was paid.'
          nullable: true
          format: date-time
        paid_date:
          type: string
          description: 'Date the invoice was paid.'
          nullable: true
          format: date
        closed_at:
          type: string
          description: 'Date and time the invoice was closed.'
          nullable: true
          format: date-time
        recurring_invoice_id:
          type: integer
          description: 'Unique ID of the associated recurring invoice.'
          nullable: true
          format: int32
        created_at:
          type: string
          description: 'Date and time the invoice was created.'
          nullable: true
          format: date-time
        updated_at:
          type: string
          description: 'Date and time the invoice was last updated.'
          nullable: true
          format: date-time
    InvoiceLineItem:
      type: object
      externalDocs:
        description: invoice-line-item
        url: 'https://help.getharvest.com/api-v2/invoices-api/invoices/invoices/#the-invoice-line-item-object'
      properties:
        id:
          type: integer
          description: 'Unique ID for the line item.'
          nullable: true
          format: int32
        project:
          type: object
          description: 'An object containing the associated project’s id, name, and code.'
          nullable: true
          properties:
            id:
              type: integer
              nullable: true
            name:
              type: string
              nullable: true
            code:
              type: string
              nullable: true
        kind:
          type: string
          description: 'The name of an invoice item category.'
          nullable: true
        description:
          type: string
          description: 'Text description of the line item.'
          nullable: true
        quantity:
          type: number
          description: 'The unit quantity of the item.'
          nullable: true
          format: float
        unit_price:
          type: number
          description: 'The individual price per unit.'
          nullable: true
          format: float
        amount:
          type: number
          description: 'The line item subtotal (quantity * unit_price).'
          nullable: true
          format: float
        taxed:
          type: boolean
          description: 'Whether the invoice’s tax percentage applies to this line item.'
          nullable: true
        taxed2:
          type: boolean
          description: 'Whether the invoice’s tax2 percentage applies to this line item.'
          nullable: true
    InvoiceItemCategory:
      type: object
      externalDocs:
        description: invoice-item-category
        url: 'https://help.getharvest.com/api-v2/invoices-api/invoices/invoice-item-categories/#the-invoice-item-category-object'
      properties:
        id:
          type: integer
          description: 'Unique ID for the invoice item category.'
          nullable: true
          format: int32
        name:
          type: string
          description: 'The name of the invoice item category.'
          nullable: true
        use_as_service:
          type: boolean
          description: 'Whether this invoice item category is used for billable hours when generating an invoice.'
          nullable: true
        use_as_expense:
          type: boolean
          description: 'Whether this invoice item category is used for expenses when generating an invoice.'
          nullable: true
        created_at:
          type: string
          description: 'Date and time the invoice item category was created.'
          nullable: true
          format: date-time
        updated_at:
          type: string
          description: 'Date and time the invoice item category was last updated.'
          nullable: true
          format: date-time
    EstimateMessage:
      type: object
      externalDocs:
        description: estimate-message
        url: 'https://help.getharvest.com/api-v2/estimates-api/estimates/estimate-messages/#the-estimate-message-object'
      properties:
        id:
          type: integer
          description: 'Unique ID for the message.'
          nullable: true
          format: int32
        sent_by:
          type: string
          description: 'Name of the user that created the message.'
          nullable: true
        sent_by_email:
          type: string
          description: 'Email of the user that created the message.'
          nullable: true
        sent_from:
          type: string
          description: 'Name of the user that the message was sent from.'
          nullable: true
        sent_from_email:
          type: string
          description: 'Email of the user that message was sent from.'
          nullable: true
        recipients:
          type: array
          description: 'Array of estimate message recipients.'
          nullable: true
          items:
            $ref: '#/components/schemas/EstimateMessageRecipient'
        subject:
          type: string
          description: 'The message subject.'
          nullable: true
        body:
          type: string
          description: 'The message body.'
          nullable: true
        send_me_a_copy:
          type: boolean
          description: 'Whether to email a copy of the message to the current user.'
          nullable: true
        event_type:
          type: string
          description: 'The type of estimate event that occurred with the message: send, accept, decline, re-open, view, or invoice.'
          nullable: true
        created_at:
          type: string
          description: 'Date and time the message was created.'
          nullable: true
          format: date-time
        updated_at:
          type: string
          description: 'Date and time the message was last updated.'
          nullable: true
          format: date-time
    EstimateMessageRecipient:
      type: object
      externalDocs:
        description: estimate-message-recipient
        url: 'https://help.getharvest.com/api-v2/estimates-api/estimates/estimate-messages/#the-estimate-message-recipient-object'
      properties:
        name:
          type: string
          description: 'Name of the message recipient.'
          nullable: true
        email:
          type: string
          description: 'Email of the message recipient.'
          nullable: true
          format: email
    Estimate:
      type: object
      externalDocs:
        description: estimate
        url: 'https://help.getharvest.com/api-v2/estimates-api/estimates/estimates/#the-estimate-object'
      properties:
        id:
          type: integer
          description: 'Unique ID for the estimate.'
          nullable: true
          format: int32
        client:
          type: object
          description: 'An object containing estimate’s client id and name.'
          nullable: true
          properties:
            id:
              type: integer
              nullable: true
            name:
              type: string
              nullable: true
        line_items:
          type: array
          description: 'Array of estimate line items.'
          nullable: true
          items:
            $ref: '#/components/schemas/EstimateLineItem'
        creator:
          type: object
          description: 'An object containing the id and name of the person that created the estimate.'
          nullable: true
          properties:
            id:
              type: integer
              nullable: true
            name:
              type: string
              nullable: true
        client_key:
          type: string
          description: 'Used to build a URL to the public web invoice for your client:https://{ACCOUNT_SUBDOMAIN}.harvestapp.com/client/estimates/abc123456'
          nullable: true
        number:
          type: string
          description: 'If no value is set, the number will be automatically generated.'
          nullable: true
        purchase_order:
          type: string
          description: 'The purchase order number.'
          nullable: true
        amount:
          type: number
          description: 'The total amount for the estimate, including any discounts and taxes.'
          nullable: true
          format: float
        tax:
          type: number
          description: 'This percentage is applied to the subtotal, including line items and discounts.'
          nullable: true
          format: float
        tax_amount:
          type: number
          description: 'The first amount of tax included, calculated from tax. If no tax is defined, this value will be null.'
          nullable: true
          format: float
        tax2:
          type: number
          description: 'This percentage is applied to the subtotal, including line items and discounts.'
          nullable: true
          format: float
        tax2_amount:
          type: number
          description: 'The amount calculated from tax2.'
          nullable: true
          format: float
        discount:
          type: number
          description: 'This percentage is subtracted from the subtotal.'
          nullable: true
          format: float
        discount_amount:
          type: number
          description: 'The amount calculated from discount.'
          nullable: true
          format: float
        subject:
          type: string
          description: 'The estimate subject.'
          nullable: true
        notes:
          type: string
          description: 'Any additional notes included on the estimate.'
          nullable: true
        currency:
          type: string
          description: 'The currency code associated with this estimate.'
          nullable: true
        state:
          type: string
          description: 'The current state of the estimate: draft, sent, accepted, or declined.'
          nullable: true
        issue_date:
          type: string
          description: 'Date the estimate was issued.'
          nullable: true
          format: date
        sent_at:
          type: string
          description: 'Date and time the estimate was sent.'
          nullable: true
          format: date-time
        accepted_at:
          type: string
          description: 'Date and time the estimate was accepted.'
          nullable: true
          format: date-time
        declined_at:
          type: string
          description: 'Date and time the estimate was declined.'
          nullable: true
          format: date-time
        created_at:
          type: string
          description: 'Date and time the estimate was created.'
          nullable: true
          format: date-time
        updated_at:
          type: string
          description: 'Date and time the estimate was last updated.'
          nullable: true
          format: date-time
    EstimateLineItem:
      type: object
      externalDocs:
        description: estimate-line-item
        url: 'https://help.getharvest.com/api-v2/estimates-api/estimates/estimates/#the-estimate-line-item-object'
      properties:
        id:
          type: integer
          description: 'Unique ID for the line item.'
          nullable: true
          format: int32
        kind:
          type: string
          description: 'The name of an estimate item category.'
          nullable: true
        description:
          type: string
          description: 'Text description of the line item.'
          nullable: true
        quantity:
          type: number
          description: 'The unit quantity of the item.'
          nullable: true
          format: float
        unit_price:
          type: number
          description: 'The individual price per unit.'
          nullable: true
          format: float
        amount:
          type: number
          description: 'The line item subtotal (quantity * unit_price).'
          nullable: true
          format: float
        taxed:
          type: boolean
          description: 'Whether the estimate’s tax percentage applies to this line item.'
          nullable: true
        taxed2:
          type: boolean
          description: 'Whether the estimate’s tax2 percentage applies to this line item.'
          nullable: true
    EstimateItemCategory:
      type: object
      externalDocs:
        description: estimate-item-category
        url: 'https://help.getharvest.com/api-v2/estimates-api/estimates/estimate-item-categories/#the-estimate-item-category-object'
      properties:
        id:
          type: integer
          description: 'Unique ID for the estimate item category.'
          nullable: true
          format: int32
        name:
          type: string
          description: 'The name of the estimate item category.'
          nullable: true
        created_at:
          type: string
          description: 'Date and time the estimate item category was created.'
          nullable: true
          format: date-time
        updated_at:
          type: string
          description: 'Date and time the estimate item category was last updated.'
          nullable: true
          format: date-time
    Expense:
      type: object
      externalDocs:
        description: expense
        url: 'https://help.getharvest.com/api-v2/expenses-api/expenses/expenses/#the-expense-object'
      properties:
        id:
          type: integer
          description: 'Unique ID for the expense.'
          nullable: true
          format: int32
        client:
          type: object
          description: 'An object containing the expense’s client id, name, and currency.'
          nullable: true
          properties:
            id:
              type: integer
              nullable: true
            name:
              type: string
              nullable: true
            currency:
              type: string
              nullable: true
        project:
          type: object
          description: 'An object containing the expense’s project id, name, and code.'
          nullable: true
          properties:
            id:
              type: integer
              nullable: true
            name:
              type: string
              nullable: true
            code:
              type: string
              nullable: true
        expense_category:
          type: object
          description: 'An object containing the expense’s expense category id, name, unit_price, and unit_name.'
          nullable: true
          properties:
            id:
              type: integer
              nullable: true
            name:
              type: string
              nullable: true
            unit_price:
              type: string
              nullable: true
            unit_name:
              type: string
              nullable: true
        user:
          type: object
          description: 'An object containing the id and name of the user that recorded the expense.'
          nullable: true
          properties:
            id:
              type: integer
              nullable: true
            name:
              type: string
              nullable: true
        user_assignment:
          description: 'A user assignment object of the user that recorded the expense.'
          nullable: true
          anyOf:
            -
              type: object
              $ref: '#/components/schemas/UserAssignment'
            -
              type: 'null'
        receipt:
          type: object
          description: 'An object containing the expense’s receipt URL and file name.'
          nullable: true
          properties:
            url:
              type: string
              nullable: true
            file_name:
              type: string
              nullable: true
            file_size:
              type: integer
              format: int32
              nullable: true
            content_type:
              type: string
              nullable: true
        invoice:
          type: object
          description: 'Once the expense has been invoiced, this field will include the associated invoice’s id and number.'
          nullable: true
          properties:
            id:
              type: integer
              nullable: true
            number:
              type: string
              nullable: true
        notes:
          type: string
          description: 'Textual notes used to describe the expense.'
          nullable: true
        units:
          type: integer
          description: 'The quantity of units used to calculate the total_cost of the expense.'
          nullable: true
          format: int32
        total_cost:
          type: number
          description: 'The total amount of the expense.'
          nullable: true
          format: float
        billable:
          type: boolean
          description: 'Whether the expense is billable or not.'
          nullable: true
        is_closed:
          type: boolean
          description: 'Whether the expense has been approved or not.'
          nullable: true
        is_locked:
          type: boolean
          description: 'Whether the expense has been been invoiced, approved, or the project or person related to the expense is archived.'
          nullable: true
        is_billed:
          type: boolean
          description: 'Whether or not the expense has been marked as invoiced.'
          nullable: true
        locked_reason:
          type: string
          description: 'An explanation of why the expense has been locked.'
          nullable: true
        spent_date:
          type: string
          description: 'Date the expense occurred.'
          nullable: true
          format: date
        created_at:
          type: string
          description: 'Date and time the expense was created.'
          nullable: true
          format: date-time
        updated_at:
          type: string
          description: 'Date and time the expense was last updated.'
          nullable: true
          format: date-time
    ExpenseCategory:
      type: object
      externalDocs:
        description: expense-category
        url: 'https://help.getharvest.com/api-v2/expenses-api/expenses/expense-categories/#the-expense-category-object'
      properties:
        id:
          type: integer
          description: 'Unique ID for the expense category.'
          nullable: true
          format: int32
        name:
          type: string
          description: 'The name of the expense category.'
          nullable: true
        unit_name:
          type: string
          description: 'The unit name of the expense category.'
          nullable: true
        unit_price:
          type: number
          description: 'The unit price of the expense category.'
          nullable: true
          format: float
        is_active:
          type: boolean
          description: 'Whether the expense category is active or archived.'
          nullable: true
        created_at:
          type: string
          description: 'Date and time the expense category was created.'
          nullable: true
          format: date-time
        updated_at:
          type: string
          description: 'Date and time the expense category was last updated.'
          nullable: true
          format: date-time
    Task:
      type: object
      externalDocs:
        description: task
        url: 'https://help.getharvest.com/api-v2/tasks-api/tasks/tasks/#the-task-object'
      properties:
        id:
          type: integer
          description: 'Unique ID for the task.'
          nullable: true
          format: int32
        name:
          type: string
          description: 'The name of the task.'
          nullable: true
        billable_by_default:
          type: boolean
          description: 'Used in determining whether default tasks should be marked billable when creating a new project.'
          nullable: true
        default_hourly_rate:
          type: number
          description: 'The hourly rate to use for this task when it is added to a project.'
          nullable: true
          format: float
        is_default:
          type: boolean
          description: 'Whether this task should be automatically added to future projects.'
          nullable: true
        is_active:
          type: boolean
          description: 'Whether this task is active or archived.'
          nullable: true
        created_at:
          type: string
          description: 'Date and time the task was created.'
          nullable: true
          format: date-time
        updated_at:
          type: string
          description: 'Date and time the task was last updated.'
          nullable: true
          format: date-time
    TimeEntry:
      type: object
      externalDocs:
        description: time-entry
        url: 'https://help.getharvest.com/api-v2/timesheets-api/timesheets/time-entries/#the-time-entry-object'
      properties:
        id:
          type: integer
          description: 'Unique ID for the time entry.'
          nullable: true
        spent_date:
          type: string
          description: 'Date of the time entry.'
          nullable: true
          format: date
        user:
          type: object
          description: 'An object containing the id and name of the associated user.'
          nullable: true
          properties:
            id:
              type: integer
              nullable: true
            name:
              type: string
              nullable: true
        user_assignment:
          description: 'A user assignment object of the associated user.'
          nullable: true
          anyOf:
            -
              type: object
              $ref: '#/components/schemas/UserAssignment'
            -
              type: 'null'
        client:
          type: object
          description: 'An object containing the id and name of the associated client.'
          nullable: true
          properties:
            id:
              type: integer
              nullable: true
            name:
              type: string
              nullable: true
        project:
          type: object
          description: 'An object containing the id and name of the associated project.'
          nullable: true
          properties:
            id:
              type: integer
              nullable: true
            name:
              type: string
              nullable: true
        task:
          type: object
          description: 'An object containing the id and name of the associated task.'
          nullable: true
          properties:
            id:
              type: integer
              nullable: true
            name:
              type: string
              nullable: true
        task_assignment:
          description: 'A task assignment object of the associated task.'
          nullable: true
          anyOf:
            -
              type: object
              $ref: '#/components/schemas/TaskAssignment'
            -
              type: 'null'
        external_reference:
          type: object
          description: 'An object containing the id, group_id, account_id, permalink, service, and service_icon_url of the associated external reference.'
          nullable: true
          properties:
            id:
              type: string
              nullable: true
            group_id:
              type: string
              nullable: true
            account_id:
              type: string
              nullable: true
            permalink:
              type: string
              nullable: true
            service:
              type: string
              nullable: true
            service_icon_url:
              type: string
              nullable: true
        invoice:
          type: object
          description: 'Once the time entry has been invoiced, this field will include the associated invoice’s id and number.'
          nullable: true
          properties:
            id:
              type: integer
              nullable: true
            number:
              type: string
              nullable: true
        hours:
          type: number
          description: 'Number of (decimal time) hours tracked in this time entry.'
          nullable: true
          format: float
        hours_without_timer:
          type: number
          description: 'Number of (decimal time) hours already tracked in this time entry, before the timer was last started.'
          nullable: true
          format: float
        rounded_hours:
          type: number
          description: 'Number of (decimal time) hours tracked in this time entry used in summary reports and invoices. This value is rounded according to the Time Rounding setting in your Preferences.'
          nullable: true
          format: float
        notes:
          type: string
          description: 'Notes attached to the time entry.'
          nullable: true
        is_locked:
          type: boolean
          description: 'Whether or not the time entry has been locked.'
          nullable: true
        locked_reason:
          type: string
          description: 'Why the time entry has been locked.'
          nullable: true
        is_closed:
          type: boolean
          description: 'Whether or not the time entry has been approved via Timesheet Approval.'
          nullable: true
        is_billed:
          type: boolean
          description: 'Whether or not the time entry has been marked as invoiced.'
          nullable: true
        timer_started_at:
          type: string
          description: 'Date and time the running timer was started (if tracking by duration). Use the ISO 8601 Format. Returns null for stopped timers.'
          nullable: true
          format: date-time
        started_time:
          type: string
          description: 'Time the time entry was started (if tracking by start/end times).'
          nullable: true
        ended_time:
          type: string
          description: 'Time the time entry was ended (if tracking by start/end times).'
          nullable: true
        is_running:
          type: boolean
          description: 'Whether or not the time entry is currently running.'
          nullable: true
        billable:
          type: boolean
          description: 'Whether or not the time entry is billable.'
          nullable: true
        budgeted:
          type: boolean
          description: 'Whether or not the time entry counts towards the project budget.'
          nullable: true
        billable_rate:
          type: number
          description: 'The billable rate for the time entry.'
          nullable: true
          format: float
        cost_rate:
          type: number
          description: 'The cost rate for the time entry.'
          nullable: true
          format: float
        created_at:
          type: string
          description: 'Date and time the time entry was created. Use the ISO 8601 Format.'
          nullable: true
          format: date-time
        updated_at:
          type: string
          description: 'Date and time the time entry was last updated. Use the ISO 8601 Format.'
          nullable: true
          format: date-time
    UserAssignment:
      type: object
      externalDocs:
        description: user-assignment
        url: 'https://help.getharvest.com/api-v2/projects-api/projects/user-assignments/#the-user-assignment-object'
      properties:
        id:
          type: integer
          description: 'Unique ID for the user assignment.'
          nullable: true
          format: int32
        project:
          type: object
          description: 'An object containing the id, name, and code of the associated project.'
          nullable: true
          properties:
            id:
              type: integer
              nullable: true
            name:
              type: string
              nullable: true
            code:
              type: string
              nullable: true
        user:
          type: object
          description: 'An object containing the id and name of the associated user.'
          nullable: true
          properties:
            id:
              type: integer
              nullable: true
            name:
              type: string
              nullable: true
        is_active:
          type: boolean
          description: 'Whether the user assignment is active or archived.'
          nullable: true
        is_project_manager:
          type: boolean
          description: 'Determines if the user has Project Manager permissions for the project.'
          nullable: true
        use_default_rates:
          type: boolean
          description: 'Determines which billable rate(s) will be used on the project for this user when bill_by is People. When true, the project will use the user’s default billable rates. When false, the project will use the custom rate defined on this user assignment.'
          nullable: true
        hourly_rate:
          type: number
          description: 'Custom rate used when the project’s bill_by is People and use_default_rates is false.'
          nullable: true
          format: float
        budget:
          type: number
          description: 'Budget used when the project’s budget_by is person.'
          nullable: true
          format: float
        created_at:
          type: string
          description: 'Date and time the user assignment was created.'
          nullable: true
          format: date-time
        updated_at:
          type: string
          description: 'Date and time the user assignment was last updated.'
          nullable: true
          format: date-time
    TaskAssignment:
      type: object
      externalDocs:
        description: task-assignment
        url: 'https://help.getharvest.com/api-v2/projects-api/projects/task-assignments/#the-task-assignment-object'
      properties:
        id:
          type: integer
          description: 'Unique ID for the task assignment.'
          nullable: true
          format: int32
        project:
          type: object
          description: 'An object containing the id, name, and code of the associated project.'
          nullable: true
          properties:
            id:
              type: integer
              nullable: true
            name:
              type: string
              nullable: true
            code:
              type: string
              nullable: true
        task:
          type: object
          description: 'An object containing the id and name of the associated task.'
          nullable: true
          properties:
            id:
              type: integer
              nullable: true
            name:
              type: string
              nullable: true
        is_active:
          type: boolean
          description: 'Whether the task assignment is active or archived.'
          nullable: true
        billable:
          type: boolean
          description: 'Whether the task assignment is billable or not. For example: if set to true, all time tracked on this project for the associated task will be marked as billable.'
          nullable: true
        hourly_rate:
          type: number
          description: 'Rate used when the project’s bill_by is Tasks.'
          nullable: true
          format: float
        budget:
          type: number
          description: 'Budget used when the project’s budget_by is task or task_fees.'
          nullable: true
          format: float
        created_at:
          type: string
          description: 'Date and time the task assignment was created.'
          nullable: true
          format: date-time
        updated_at:
          type: string
          description: 'Date and time the task assignment was last updated.'
          nullable: true
          format: date-time
    Project:
      type: object
      externalDocs:
        description: project
        url: 'https://help.getharvest.com/api-v2/projects-api/projects/projects/#the-project-object'
      properties:
        id:
          type: integer
          description: 'Unique ID for the project.'
          nullable: true
          format: int32
        client:
          type: object
          description: 'An object containing the project’s client id, name, and currency.'
          nullable: true
          properties:
            id:
              type: integer
              nullable: true
            name:
              type: string
              nullable: true
            currency:
              type: string
              nullable: true
        name:
          type: string
          description: 'Unique name for the project.'
          nullable: true
        code:
          type: string
          description: 'The code associated with the project.'
          nullable: true
        is_active:
          type: boolean
          description: 'Whether the project is active or archived.'
          nullable: true
        is_billable:
          type: boolean
          description: 'Whether the project is billable or not.'
          nullable: true
        is_fixed_fee:
          type: boolean
          description: 'Whether the project is a fixed-fee project or not.'
          nullable: true
        bill_by:
          type: string
          description: 'The method by which the project is invoiced.'
          nullable: true
        hourly_rate:
          type: number
          description: 'Rate for projects billed by Project Hourly Rate.'
          nullable: true
          format: float
        budget:
          type: number
          description: 'The budget in hours for the project when budgeting by time.'
          nullable: true
          format: float
        budget_by:
          type: string
          description: 'The method by which the project is budgeted.'
          nullable: true
        budget_is_monthly:
          type: boolean
          description: 'Option to have the budget reset every month.'
          nullable: true
        notify_when_over_budget:
          type: boolean
          description: 'Whether Project Managers should be notified when the project goes over budget.'
          nullable: true
        over_budget_notification_percentage:
          type: number
          description: 'Percentage value used to trigger over budget email alerts.'
          nullable: true
          format: float
        over_budget_notification_date:
          type: string
          description: 'Date of last over budget notification. If none have been sent, this will be null.'
          nullable: true
          format: date
        show_budget_to_all:
          type: boolean
          description: 'Option to show project budget to all employees. Does not apply to Total Project Fee projects.'
          nullable: true
        cost_budget:
          type: number
          description: 'The monetary budget for the project when budgeting by money.'
          nullable: true
          format: float
        cost_budget_include_expenses:
          type: boolean
          description: 'Option for budget of Total Project Fees projects to include tracked expenses.'
          nullable: true
        fee:
          type: number
          description: 'The amount you plan to invoice for the project. Only used by fixed-fee projects.'
          nullable: true
          format: float
        notes:
          type: string
          description: 'Project notes.'
          nullable: true
        starts_on:
          type: string
          description: 'Date the project was started.'
          nullable: true
          format: date
        ends_on:
          type: string
          description: 'Date the project will end.'
          nullable: true
          format: date
        created_at:
          type: string
          description: 'Date and time the project was created.'
          nullable: true
          format: date-time
        updated_at:
          type: string
          description: 'Date and time the project was last updated.'
          nullable: true
          format: date-time
    Role:
      type: object
      externalDocs:
        description: role
        url: 'https://help.getharvest.com/api-v2/roles-api/roles/roles/#the-role-object'
      properties:
        id:
          type: integer
          description: 'Unique ID for the role.'
          nullable: true
          format: int32
        name:
          type: string
          description: 'The name of the role.'
          nullable: true
        user_ids:
          type: array
          description: 'The IDs of the users assigned to this role.'
          nullable: true
          items:
            type: integer
        created_at:
          type: string
          description: 'Date and time the role was created.'
          nullable: true
          format: date-time
        updated_at:
          type: string
          description: 'Date and time the role was last updated.'
          nullable: true
          format: date-time
    Teammate:
      type: object
      externalDocs:
        description: teammate
        url: 'https://help.getharvest.com/api-v2/users-api/users/teammates/#the-teammate-object'
      properties:
        id:
          type: integer
          description: 'Unique ID for the teammate'
          nullable: true
        first_name:
          type: string
          description: 'The first name of the teammate'
          nullable: true
        last_name:
          type: string
          description: 'The last name of the teammate'
          nullable: true
        email:
          type: string
          description: 'The email of the teammate'
          nullable: true
          format: email
    BillableRate:
      type: object
      externalDocs:
        description: billable-rate
        url: 'https://help.getharvest.com/api-v2/users-api/users/billable-rates/#the-billable-rate-object'
      properties:
        id:
          type: integer
          description: 'Unique ID for the billable rate.'
          nullable: true
          format: int32
        amount:
          type: number
          description: 'The amount of the billable rate.'
          nullable: true
          format: float
        start_date:
          type: string
          description: 'The date the billable rate is effective.'
          nullable: true
          format: date
        end_date:
          type: string
          description: 'The date the billable rate is no longer effective. This date is calculated by Harvest.'
          nullable: true
          format: date
        created_at:
          type: string
          description: 'Date and time the billable rate was created.'
          nullable: true
          format: date-time
        updated_at:
          type: string
          description: 'Date and time the billable rate was last updated.'
          nullable: true
          format: date-time
    CostRate:
      type: object
      externalDocs:
        description: cost-rate
        url: 'https://help.getharvest.com/api-v2/users-api/users/cost-rates/#the-cost-rate-object'
      properties:
        id:
          type: integer
          description: 'Unique ID for the cost rate.'
          nullable: true
          format: int32
        amount:
          type: number
          description: 'The amount of the cost rate.'
          nullable: true
          format: float
        start_date:
          type: string
          description: 'The date the cost rate is effective.'
          nullable: true
          format: date
        end_date:
          type: string
          description: 'The date the cost rate is no longer effective. This date is calculated by Harvest.'
          nullable: true
          format: date
        created_at:
          type: string
          description: 'Date and time the cost rate was created.'
          nullable: true
          format: date-time
        updated_at:
          type: string
          description: 'Date and time the cost rate was last updated.'
          nullable: true
          format: date-time
    ProjectAssignment:
      type: object
      externalDocs:
        description: project-assignment
        url: 'https://help.getharvest.com/api-v2/users-api/users/project-assignments/#the-project-assignment-object'
      properties:
        id:
          type: integer
          description: 'Unique ID for the project assignment.'
          nullable: true
          format: int32
        is_active:
          type: boolean
          description: 'Whether the project assignment is active or archived.'
          nullable: true
        is_project_manager:
          type: boolean
          description: 'Determines if the user has Project Manager permissions for the project.'
          nullable: true
        use_default_rates:
          type: boolean
          description: 'Determines which billable rate(s) will be used on the project for this user when bill_by is People. When true, the project will use the user’s default billable rates. When false, the project will use the custom rate defined on this user assignment.'
          nullable: true
        hourly_rate:
          type: number
          description: 'Custom rate used when the project’s bill_by is People and use_default_rates is false.'
          nullable: true
          format: float
        budget:
          type: number
          description: 'Budget used when the project’s budget_by is person.'
          nullable: true
          format: float
        created_at:
          type: string
          description: 'Date and time the project assignment was created.'
          nullable: true
          format: date-time
        updated_at:
          type: string
          description: 'Date and time the project assignment was last updated.'
          nullable: true
          format: date-time
        project:
          type: object
          description: 'An object containing the assigned project id, name, and code.'
          nullable: true
          properties:
            id:
              type: integer
              nullable: true
            name:
              type: string
              nullable: true
            code:
              type: string
              nullable: true
        client:
          type: object
          description: 'An object containing the project’s client id and name.'
          nullable: true
          properties:
            id:
              type: integer
              nullable: true
            name:
              type: string
              nullable: true
        task_assignments:
          type: array
          description: 'Array of task assignment objects associated with the project.'
          nullable: true
          items:
            $ref: '#/components/schemas/TaskAssignment'
    User:
      type: object
      externalDocs:
        description: user
        url: 'https://help.getharvest.com/api-v2/users-api/users/users/#the-user-object'
      properties:
        id:
          type: integer
          description: 'Unique ID for the user.'
          nullable: true
          format: int32
        first_name:
          type: string
          description: 'The first name of the user.'
          nullable: true
        last_name:
          type: string
          description: 'The last name of the user.'
          nullable: true
        email:
          type: string
          description: 'The email address of the user.'
          nullable: true
          format: email
        telephone:
          type: string
          description: 'The user’s telephone number.'
          nullable: true
        timezone:
          type: string
          description: 'The user’s timezone.'
          nullable: true
        has_access_to_all_future_projects:
          type: boolean
          description: 'Whether the user should be automatically added to future projects.'
          nullable: true
        is_contractor:
          type: boolean
          description: 'Whether the user is a contractor or an employee.'
          nullable: true
        is_active:
          type: boolean
          description: 'Whether the user is active or archived.'
          nullable: true
        weekly_capacity:
          type: integer
          description: 'The number of hours per week this person is available to work in seconds, in half hour increments. For example, if a person’s capacity is 35 hours, the API will return 126000 seconds.'
          nullable: true
          format: int32
        default_hourly_rate:
          type: number
          description: 'The billable rate to use for this user when they are added to a project.'
          nullable: true
          format: float
        cost_rate:
          type: number
          description: 'The cost rate to use for this user when calculating a project’s costs vs billable amount.'
          nullable: true
          format: float
        roles:
          type: array
          description: 'Descriptive names of the business roles assigned to this person. They can be used for filtering reports, and have no effect in their permissions in Harvest.'
          nullable: true
          items:
            type: string
        access_roles:
          type: array
          description: 'Access role(s) that determine the user’s permissions in Harvest. Possible values: administrator, manager or member. Users with the manager role can additionally be granted one or more of these roles: project_creator, billable_rates_manager, managed_projects_invoice_drafter, managed_projects_invoice_manager, client_and_task_manager, time_and_expenses_manager, estimates_manager.'
          nullable: true
          items:
            type: string
        avatar_url:
          type: string
          description: 'The URL to the user’s avatar image.'
          nullable: true
        created_at:
          type: string
          description: 'Date and time the user was created.'
          nullable: true
          format: date-time
        updated_at:
          type: string
          description: 'Date and time the user was last updated.'
          nullable: true
          format: date-time
    ExpenseReportsResult:
      type: object
      externalDocs:
        description: result
        url: 'https://help.getharvest.com/api-v2/reports-api/reports/expense-reports/#the-result-object'
      properties:
        client_id:
          type: integer
          description: 'The ID of the client associated with the reported expenses. Only returned in the Client and Project reports.'
          nullable: true
          format: int32
        client_name:
          type: string
          description: 'The name of the client associated with the reported expenses. Only returned in the Client and Project reports.'
          nullable: true
        project_id:
          type: integer
          description: 'The ID of the project associated with the reported expenses. Only returned in the Client and Project reports.'
          nullable: true
          format: int32
        project_name:
          type: string
          description: 'The name of the project associated with the reported expenses. Only returned in the Client and Project reports.'
          nullable: true
        expense_category_id:
          type: integer
          description: 'The ID of the expense category associated with the reported expenses. Only returned in the Expense Category report.'
          nullable: true
          format: int32
        expense_category_name:
          type: string
          description: 'The name of the expense category associated with the reported expenses. Only returned in the Expense Category report.'
          nullable: true
        user_id:
          type: integer
          description: 'The ID of the user associated with the reported expenses. Only returned in the Team report.'
          nullable: true
          format: int32
        user_name:
          type: string
          description: 'The name of the user associated with the reported expenses. Only returned in the Team report.'
          nullable: true
        is_contractor:
          type: boolean
          description: 'The contractor status of the user associated with the reported expenses. Only returned in the Team report.'
          nullable: true
        total_amount:
          type: number
          description: 'The totaled cost for all expenses for the given timeframe, subject (client, project, expense category, or user), and currency.'
          nullable: true
          format: float
        billable_amount:
          type: number
          description: 'The totaled cost for billable expenses for the given timeframe, subject (client, project, expense category, or user), and currency.'
          nullable: true
          format: float
        currency:
          type: string
          description: 'The currency code associated with the expenses for this result.'
          nullable: true
    UninvoicedReportResult:
      type: object
      externalDocs:
        description: result
        url: 'https://help.getharvest.com/api-v2/reports-api/reports/uninvoiced-report/#the-result-object'
      properties:
        client_id:
          type: integer
          description: 'The ID of the client associated with the reported hours and expenses.'
          nullable: true
          format: int32
        client_name:
          type: string
          description: 'The name of the client associated with the reported hours and expenses.'
          nullable: true
        project_id:
          type: integer
          description: 'The ID of the project associated with the reported hours and expenses.'
          nullable: true
          format: int32
        project_name:
          type: string
          description: 'The name of the project associated with the reported hours and expenses.'
          nullable: true
        currency:
          type: string
          description: 'The currency code associated with the tracked hours for this result.'
          nullable: true
        total_hours:
          type: number
          description: 'The total hours for the given timeframe and project. If Time Rounding is turned on, the hours will be rounded according to your settings.'
          nullable: true
          format: float
        uninvoiced_hours:
          type: number
          description: 'The total hours for the given timeframe and project that have not been invoiced. If Time Rounding is turned on, the hours will be rounded according to your settings.'
          nullable: true
          format: float
        uninvoiced_expenses:
          type: number
          description: 'The total amount for billable expenses for the timeframe and project that have not been invoiced.'
          nullable: true
          format: float
        uninvoiced_amount:
          type: number
          description: 'The total amount (time and expenses) for the timeframe and project that have not been invoiced.'
          nullable: true
          format: float
    TimeReportsResult:
      type: object
      externalDocs:
        description: result
        url: 'https://help.getharvest.com/api-v2/reports-api/reports/time-reports/#the-result-object'
      properties:
        client_id:
          type: integer
          description: 'The ID of the client associated with the reported hours. Only returned in the Client and Project reports.'
          nullable: true
          format: int32
        client_name:
          type: string
          description: 'The name of the client associated with the reported hours. Only returned in the Client and Project reports.'
          nullable: true
        project_id:
          type: integer
          description: 'The ID of the project associated with the reported hours. Only returned in the Client and Project reports.'
          nullable: true
          format: int32
        project_name:
          type: string
          description: 'The name of the project associated with the reported hours. Only returned in the Client and Project reports.'
          nullable: true
        task_id:
          type: integer
          description: 'The ID of the task associated with the reported hours. Only returned in the Task report.'
          nullable: true
          format: int32
        task_name:
          type: string
          description: 'The name of the task associated with the reported hours. Only returned in the Task report.'
          nullable: true
        user_id:
          type: integer
          description: 'The ID of the user associated with the reported hours. Only returned in the Team report.'
          nullable: true
          format: int32
        user_name:
          type: string
          description: 'The name of the user associated with the reported hours. Only returned in the Team report.'
          nullable: true
        weekly_capacity:
          type: integer
          description: 'The number of hours per week this person is available to work in seconds, in half hour increments. For example, if a person’s capacity is 35 hours, the API will return 126000 seconds. Only returned in the Team report.'
          nullable: true
          format: int32
        avatar_url:
          type: string
          description: 'The URL to the user’s avatar image. Only returned in the Team report.'
          nullable: true
        is_contractor:
          type: boolean
          description: 'The contractor status of the user associated with the reported hours. Only returned in the Team report.'
          nullable: true
        total_hours:
          type: number
          description: 'The totaled hours for the given timeframe, subject (client, project, task, or user), and currency. If Time Rounding is turned on, the hours will be rounded according to your settings.'
          nullable: true
          format: float
        billable_hours:
          type: number
          description: 'The totaled billable hours for the given timeframe, subject (client, project, task, or user), and currency. If Time Rounding is turned on, the hours will be rounded according to your settings.'
          nullable: true
          format: float
        currency:
          type: string
          description: 'The currency code associated with the tracked hours for this result. Only visible to Administrators and Project Managers with the View billable rates and amounts permission.'
          nullable: true
        billable_amount:
          type: number
          description: 'The totaled billable amount for the billable hours above. Only visible to Administrators and Project Managers with the View billable rates and amounts permission.'
          nullable: true
          format: float
    ProjectBudgetReportResult:
      type: object
      externalDocs:
        description: result
        url: 'https://help.getharvest.com/api-v2/reports-api/reports/project-budget-report/#the-result-object'
      properties:
        client_id:
          type: integer
          description: 'The ID of the client associated with this project.'
          nullable: true
          format: int32
        client_name:
          type: string
          description: 'The name of the client associated with this project.'
          nullable: true
        project_id:
          type: integer
          description: 'The ID of the project.'
          nullable: true
          format: int32
        project_name:
          type: string
          description: 'The name of the project.'
          nullable: true
        budget_is_monthly:
          type: boolean
          description: 'Whether the budget is reset every month.'
          nullable: true
        budget_by:
          type: string
          description: 'The method by which the project is budgeted. Options: project (Hours Per Project), project_cost (Total Project Fees), task (Hours Per Task), task_fees (Fees Per Task), person (Hours Per Person), none (No Budget).'
          nullable: true
        is_active:
          type: boolean
          description: 'Whether the project is active or archived.'
          nullable: true
        budget:
          type: number
          description: 'The budget in hours or money for the project when budgeting by time. If the project is budgeted by money, this value will only be visible to Administrators and Project Managers with the View billable rates and amounts permission.'
          nullable: true
          format: float
        budget_spent:
          type: number
          description: 'The total hours or money spent against the project’s budget. If Time Rounding is turned on, the hours will be rounded according to your settings. If the project is budgeted by money, this value will only be visible to Administrators and Project Managers with the View billable rates and amounts permission.'
          nullable: true
          format: float
        budget_remaining:
          type: number
          description: 'The total hours or money remaining in the project’s budget. If Time Rounding is turned on, the hours will be rounded according to your settings. If the project is budgeted by money, this value will only be visible to Administrators and Project Managers with the View billable rates and amounts permission.'
          nullable: true
          format: float
    Contacts:
      type: object
      required:
        - contacts
        - per_page
        - total_pages
        - total_entries
        - next_page
        - previous_page
        - page
        - links
      properties:
        contacts:
          type: array
          items:
            $ref: '#/components/schemas/Contact'
        per_page:
          type: integer
          format: int64
        total_pages:
          type: integer
          format: int64
        total_entries:
          type: integer
          format: int64
        next_page:
          type: integer
          format: int64
          nullable: true
        previous_page:
          type: integer
          format: int64
          nullable: true
        page:
          type: integer
          format: int64
        links:
          $ref: '#/components/schemas/PaginationLinks'
    Clients:
      type: object
      required:
        - clients
        - per_page
        - total_pages
        - total_entries
        - next_page
        - previous_page
        - page
        - links
      properties:
        clients:
          type: array
          items:
            $ref: '#/components/schemas/Client'
        per_page:
          type: integer
          format: int64
        total_pages:
          type: integer
          format: int64
        total_entries:
          type: integer
          format: int64
        next_page:
          type: integer
          format: int64
          nullable: true
        previous_page:
          type: integer
          format: int64
          nullable: true
        page:
          type: integer
          format: int64
        links:
          $ref: '#/components/schemas/PaginationLinks'
    Companies:
      type: object
      required:
        - companies
        - per_page
        - total_pages
        - total_entries
        - next_page
        - previous_page
        - page
        - links
      properties:
        companies:
          type: array
          items:
            $ref: '#/components/schemas/Company'
        per_page:
          type: integer
          format: int64
        total_pages:
          type: integer
          format: int64
        total_entries:
          type: integer
          format: int64
        next_page:
          type: integer
          format: int64
          nullable: true
        previous_page:
          type: integer
          format: int64
          nullable: true
        page:
          type: integer
          format: int64
        links:
          $ref: '#/components/schemas/PaginationLinks'
    InvoiceMessages:
      type: object
      required:
        - invoice_messages
        - per_page
        - total_pages
        - total_entries
        - next_page
        - previous_page
        - page
        - links
      properties:
        invoice_messages:
          type: array
          items:
            $ref: '#/components/schemas/InvoiceMessage'
        per_page:
          type: integer
          format: int64
        total_pages:
          type: integer
          format: int64
        total_entries:
          type: integer
          format: int64
        next_page:
          type: integer
          format: int64
          nullable: true
        previous_page:
          type: integer
          format: int64
          nullable: true
        page:
          type: integer
          format: int64
        links:
          $ref: '#/components/schemas/PaginationLinks'
    InvoiceMessageRecipients:
      type: object
      required:
        - invoice_message_recipients
        - per_page
        - total_pages
        - total_entries
        - next_page
        - previous_page
        - page
        - links
      properties:
        invoice_message_recipients:
          type: array
          items:
            $ref: '#/components/schemas/InvoiceMessageRecipient'
        per_page:
          type: integer
          format: int64
        total_pages:
          type: integer
          format: int64
        total_entries:
          type: integer
          format: int64
        next_page:
          type: integer
          format: int64
          nullable: true
        previous_page:
          type: integer
          format: int64
          nullable: true
        page:
          type: integer
          format: int64
        links:
          $ref: '#/components/schemas/PaginationLinks'
    InvoicePayments:
      type: object
      required:
        - invoice_payments
        - per_page
        - total_pages
        - total_entries
        - next_page
        - previous_page
        - page
        - links
      properties:
        invoice_payments:
          type: array
          items:
            $ref: '#/components/schemas/InvoicePayment'
        per_page:
          type: integer
          format: int64
        total_pages:
          type: integer
          format: int64
        total_entries:
          type: integer
          format: int64
        next_page:
          type: integer
          format: int64
          nullable: true
        previous_page:
          type: integer
          format: int64
          nullable: true
        page:
          type: integer
          format: int64
        links:
          $ref: '#/components/schemas/PaginationLinks'
    Invoices:
      type: object
      required:
        - invoices
        - per_page
        - total_pages
        - total_entries
        - next_page
        - previous_page
        - page
        - links
      properties:
        invoices:
          type: array
          items:
            $ref: '#/components/schemas/Invoice'
        per_page:
          type: integer
          format: int64
        total_pages:
          type: integer
          format: int64
        total_entries:
          type: integer
          format: int64
        next_page:
          type: integer
          format: int64
          nullable: true
        previous_page:
          type: integer
          format: int64
          nullable: true
        page:
          type: integer
          format: int64
        links:
          $ref: '#/components/schemas/PaginationLinks'
    InvoiceLineItems:
      type: object
      required:
        - invoice_line_items
        - per_page
        - total_pages
        - total_entries
        - next_page
        - previous_page
        - page
        - links
      properties:
        invoice_line_items:
          type: array
          items:
            $ref: '#/components/schemas/InvoiceLineItem'
        per_page:
          type: integer
          format: int64
        total_pages:
          type: integer
          format: int64
        total_entries:
          type: integer
          format: int64
        next_page:
          type: integer
          format: int64
          nullable: true
        previous_page:
          type: integer
          format: int64
          nullable: true
        page:
          type: integer
          format: int64
        links:
          $ref: '#/components/schemas/PaginationLinks'
    InvoiceItemCategories:
      type: object
      required:
        - invoice_item_categories
        - per_page
        - total_pages
        - total_entries
        - next_page
        - previous_page
        - page
        - links
      properties:
        invoice_item_categories:
          type: array
          items:
            $ref: '#/components/schemas/InvoiceItemCategory'
        per_page:
          type: integer
          format: int64
        total_pages:
          type: integer
          format: int64
        total_entries:
          type: integer
          format: int64
        next_page:
          type: integer
          format: int64
          nullable: true
        previous_page:
          type: integer
          format: int64
          nullable: true
        page:
          type: integer
          format: int64
        links:
          $ref: '#/components/schemas/PaginationLinks'
    EstimateMessages:
      type: object
      required:
        - estimate_messages
        - per_page
        - total_pages
        - total_entries
        - next_page
        - previous_page
        - page
        - links
      properties:
        estimate_messages:
          type: array
          items:
            $ref: '#/components/schemas/EstimateMessage'
        per_page:
          type: integer
          format: int64
        total_pages:
          type: integer
          format: int64
        total_entries:
          type: integer
          format: int64
        next_page:
          type: integer
          format: int64
          nullable: true
        previous_page:
          type: integer
          format: int64
          nullable: true
        page:
          type: integer
          format: int64
        links:
          $ref: '#/components/schemas/PaginationLinks'
    EstimateMessageRecipients:
      type: object
      required:
        - estimate_message_recipients
        - per_page
        - total_pages
        - total_entries
        - next_page
        - previous_page
        - page
        - links
      properties:
        estimate_message_recipients:
          type: array
          items:
            $ref: '#/components/schemas/EstimateMessageRecipient'
        per_page:
          type: integer
          format: int64
        total_pages:
          type: integer
          format: int64
        total_entries:
          type: integer
          format: int64
        next_page:
          type: integer
          format: int64
          nullable: true
        previous_page:
          type: integer
          format: int64
          nullable: true
        page:
          type: integer
          format: int64
        links:
          $ref: '#/components/schemas/PaginationLinks'
    Estimates:
      type: object
      required:
        - estimates
        - per_page
        - total_pages
        - total_entries
        - next_page
        - previous_page
        - page
        - links
      properties:
        estimates:
          type: array
          items:
            $ref: '#/components/schemas/Estimate'
        per_page:
          type: integer
          format: int64
        total_pages:
          type: integer
          format: int64
        total_entries:
          type: integer
          format: int64
        next_page:
          type: integer
          format: int64
          nullable: true
        previous_page:
          type: integer
          format: int64
          nullable: true
        page:
          type: integer
          format: int64
        links:
          $ref: '#/components/schemas/PaginationLinks'
    EstimateLineItems:
      type: object
      required:
        - estimate_line_items
        - per_page
        - total_pages
        - total_entries
        - next_page
        - previous_page
        - page
        - links
      properties:
        estimate_line_items:
          type: array
          items:
            $ref: '#/components/schemas/EstimateLineItem'
        per_page:
          type: integer
          format: int64
        total_pages:
          type: integer
          format: int64
        total_entries:
          type: integer
          format: int64
        next_page:
          type: integer
          format: int64
          nullable: true
        previous_page:
          type: integer
          format: int64
          nullable: true
        page:
          type: integer
          format: int64
        links:
          $ref: '#/components/schemas/PaginationLinks'
    EstimateItemCategories:
      type: object
      required:
        - estimate_item_categories
        - per_page
        - total_pages
        - total_entries
        - next_page
        - previous_page
        - page
        - links
      properties:
        estimate_item_categories:
          type: array
          items:
            $ref: '#/components/schemas/EstimateItemCategory'
        per_page:
          type: integer
          format: int64
        total_pages:
          type: integer
          format: int64
        total_entries:
          type: integer
          format: int64
        next_page:
          type: integer
          format: int64
          nullable: true
        previous_page:
          type: integer
          format: int64
          nullable: true
        page:
          type: integer
          format: int64
        links:
          $ref: '#/components/schemas/PaginationLinks'
    Expenses:
      type: object
      required:
        - expenses
        - per_page
        - total_pages
        - total_entries
        - next_page
        - previous_page
        - page
        - links
      properties:
        expenses:
          type: array
          items:
            $ref: '#/components/schemas/Expense'
        per_page:
          type: integer
          format: int64
        total_pages:
          type: integer
          format: int64
        total_entries:
          type: integer
          format: int64
        next_page:
          type: integer
          format: int64
          nullable: true
        previous_page:
          type: integer
          format: int64
          nullable: true
        page:
          type: integer
          format: int64
        links:
          $ref: '#/components/schemas/PaginationLinks'
    ExpenseCategories:
      type: object
      required:
        - expense_categories
        - per_page
        - total_pages
        - total_entries
        - next_page
        - previous_page
        - page
        - links
      properties:
        expense_categories:
          type: array
          items:
            $ref: '#/components/schemas/ExpenseCategory'
        per_page:
          type: integer
          format: int64
        total_pages:
          type: integer
          format: int64
        total_entries:
          type: integer
          format: int64
        next_page:
          type: integer
          format: int64
          nullable: true
        previous_page:
          type: integer
          format: int64
          nullable: true
        page:
          type: integer
          format: int64
        links:
          $ref: '#/components/schemas/PaginationLinks'
    Tasks:
      type: object
      required:
        - tasks
        - per_page
        - total_pages
        - total_entries
        - next_page
        - previous_page
        - page
        - links
      properties:
        tasks:
          type: array
          items:
            $ref: '#/components/schemas/Task'
        per_page:
          type: integer
          format: int64
        total_pages:
          type: integer
          format: int64
        total_entries:
          type: integer
          format: int64
        next_page:
          type: integer
          format: int64
          nullable: true
        previous_page:
          type: integer
          format: int64
          nullable: true
        page:
          type: integer
          format: int64
        links:
          $ref: '#/components/schemas/PaginationLinks'
    TimeEntries:
      type: object
      required:
        - time_entries
        - per_page
        - total_pages
        - total_entries
        - next_page
        - previous_page
        - page
        - links
      properties:
        time_entries:
          type: array
          items:
            $ref: '#/components/schemas/TimeEntry'
        per_page:
          type: integer
          format: int64
        total_pages:
          type: integer
          format: int64
        total_entries:
          type: integer
          format: int64
        next_page:
          type: integer
          format: int64
          nullable: true
        previous_page:
          type: integer
          format: int64
          nullable: true
        page:
          type: integer
          format: int64
        links:
          $ref: '#/components/schemas/PaginationLinks'
    UserAssignments:
      type: object
      required:
        - user_assignments
        - per_page
        - total_pages
        - total_entries
        - next_page
        - previous_page
        - page
        - links
      properties:
        user_assignments:
          type: array
          items:
            $ref: '#/components/schemas/UserAssignment'
        per_page:
          type: integer
          format: int64
        total_pages:
          type: integer
          format: int64
        total_entries:
          type: integer
          format: int64
        next_page:
          type: integer
          format: int64
          nullable: true
        previous_page:
          type: integer
          format: int64
          nullable: true
        page:
          type: integer
          format: int64
        links:
          $ref: '#/components/schemas/PaginationLinks'
    TaskAssignments:
      type: object
      required:
        - task_assignments
        - per_page
        - total_pages
        - total_entries
        - next_page
        - previous_page
        - page
        - links
      properties:
        task_assignments:
          type: array
          items:
            $ref: '#/components/schemas/TaskAssignment'
        per_page:
          type: integer
          format: int64
        total_pages:
          type: integer
          format: int64
        total_entries:
          type: integer
          format: int64
        next_page:
          type: integer
          format: int64
          nullable: true
        previous_page:
          type: integer
          format: int64
          nullable: true
        page:
          type: integer
          format: int64
        links:
          $ref: '#/components/schemas/PaginationLinks'
    Projects:
      type: object
      required:
        - projects
        - per_page
        - total_pages
        - total_entries
        - next_page
        - previous_page
        - page
        - links
      properties:
        projects:
          type: array
          items:
            $ref: '#/components/schemas/Project'
        per_page:
          type: integer
          format: int64
        total_pages:
          type: integer
          format: int64
        total_entries:
          type: integer
          format: int64
        next_page:
          type: integer
          format: int64
          nullable: true
        previous_page:
          type: integer
          format: int64
          nullable: true
        page:
          type: integer
          format: int64
        links:
          $ref: '#/components/schemas/PaginationLinks'
    Roles:
      type: object
      required:
        - roles
        - per_page
        - total_pages
        - total_entries
        - next_page
        - previous_page
        - page
        - links
      properties:
        roles:
          type: array
          items:
            $ref: '#/components/schemas/Role'
        per_page:
          type: integer
          format: int64
        total_pages:
          type: integer
          format: int64
        total_entries:
          type: integer
          format: int64
        next_page:
          type: integer
          format: int64
          nullable: true
        previous_page:
          type: integer
          format: int64
          nullable: true
        page:
          type: integer
          format: int64
        links:
          $ref: '#/components/schemas/PaginationLinks'
    Teammates:
      type: object
      required:
        - teammates
        - per_page
        - total_pages
        - total_entries
        - next_page
        - previous_page
        - page
        - links
      properties:
        teammates:
          type: array
          items:
            $ref: '#/components/schemas/Teammate'
        per_page:
          type: integer
          format: int64
        total_pages:
          type: integer
          format: int64
        total_entries:
          type: integer
          format: int64
        next_page:
          type: integer
          format: int64
          nullable: true
        previous_page:
          type: integer
          format: int64
          nullable: true
        page:
          type: integer
          format: int64
        links:
          $ref: '#/components/schemas/PaginationLinks'
    BillableRates:
      type: object
      required:
        - billable_rates
        - per_page
        - total_pages
        - total_entries
        - next_page
        - previous_page
        - page
        - links
      properties:
        billable_rates:
          type: array
          items:
            $ref: '#/components/schemas/BillableRate'
        per_page:
          type: integer
          format: int64
        total_pages:
          type: integer
          format: int64
        total_entries:
          type: integer
          format: int64
        next_page:
          type: integer
          format: int64
          nullable: true
        previous_page:
          type: integer
          format: int64
          nullable: true
        page:
          type: integer
          format: int64
        links:
          $ref: '#/components/schemas/PaginationLinks'
    CostRates:
      type: object
      required:
        - cost_rates
        - per_page
        - total_pages
        - total_entries
        - next_page
        - previous_page
        - page
        - links
      properties:
        cost_rates:
          type: array
          items:
            $ref: '#/components/schemas/CostRate'
        per_page:
          type: integer
          format: int64
        total_pages:
          type: integer
          format: int64
        total_entries:
          type: integer
          format: int64
        next_page:
          type: integer
          format: int64
          nullable: true
        previous_page:
          type: integer
          format: int64
          nullable: true
        page:
          type: integer
          format: int64
        links:
          $ref: '#/components/schemas/PaginationLinks'
    ProjectAssignments:
      type: object
      required:
        - project_assignments
        - per_page
        - total_pages
        - total_entries
        - next_page
        - previous_page
        - page
        - links
      properties:
        project_assignments:
          type: array
          items:
            $ref: '#/components/schemas/ProjectAssignment'
        per_page:
          type: integer
          format: int64
        total_pages:
          type: integer
          format: int64
        total_entries:
          type: integer
          format: int64
        next_page:
          type: integer
          format: int64
          nullable: true
        previous_page:
          type: integer
          format: int64
          nullable: true
        page:
          type: integer
          format: int64
        links:
          $ref: '#/components/schemas/PaginationLinks'
    Users:
      type: object
      required:
        - users
        - per_page
        - total_pages
        - total_entries
        - next_page
        - previous_page
        - page
        - links
      properties:
        users:
          type: array
          items:
            $ref: '#/components/schemas/User'
        per_page:
          type: integer
          format: int64
        total_pages:
          type: integer
          format: int64
        total_entries:
          type: integer
          format: int64
        next_page:
          type: integer
          format: int64
          nullable: true
        previous_page:
          type: integer
          format: int64
          nullable: true
        page:
          type: integer
          format: int64
        links:
          $ref: '#/components/schemas/PaginationLinks'
    ExpenseReportsResults:
      type: object
      required:
        - results
        - per_page
        - total_pages
        - total_entries
        - next_page
        - previous_page
        - page
        - links
      properties:
        results:
          type: array
          items:
            $ref: '#/components/schemas/ExpenseReportsResult'
        per_page:
          type: integer
          format: int64
        total_pages:
          type: integer
          format: int64
        total_entries:
          type: integer
          format: int64
        next_page:
          type: integer
          format: int64
          nullable: true
        previous_page:
          type: integer
          format: int64
          nullable: true
        page:
          type: integer
          format: int64
        links:
          $ref: '#/components/schemas/PaginationLinks'
    UninvoicedReportResults:
      type: object
      required:
        - results
        - per_page
        - total_pages
        - total_entries
        - next_page
        - previous_page
        - page
        - links
      properties:
        results:
          type: array
          items:
            $ref: '#/components/schemas/UninvoicedReportResult'
        per_page:
          type: integer
          format: int64
        total_pages:
          type: integer
          format: int64
        total_entries:
          type: integer
          format: int64
        next_page:
          type: integer
          format: int64
          nullable: true
        previous_page:
          type: integer
          format: int64
          nullable: true
        page:
          type: integer
          format: int64
        links:
          $ref: '#/components/schemas/PaginationLinks'
    TimeReportsResults:
      type: object
      required:
        - results
        - per_page
        - total_pages
        - total_entries
        - next_page
        - previous_page
        - page
        - links
      properties:
        results:
          type: array
          items:
            $ref: '#/components/schemas/TimeReportsResult'
        per_page:
          type: integer
          format: int64
        total_pages:
          type: integer
          format: int64
        total_entries:
          type: integer
          format: int64
        next_page:
          type: integer
          format: int64
          nullable: true
        previous_page:
          type: integer
          format: int64
          nullable: true
        page:
          type: integer
          format: int64
        links:
          $ref: '#/components/schemas/PaginationLinks'
    ProjectBudgetReportResults:
      type: object
      required:
        - results
        - per_page
        - total_pages
        - total_entries
        - next_page
        - previous_page
        - page
        - links
      properties:
        results:
          type: array
          items:
            $ref: '#/components/schemas/ProjectBudgetReportResult'
        per_page:
          type: integer
          format: int64
        total_pages:
          type: integer
          format: int64
        total_entries:
          type: integer
          format: int64
        next_page:
          type: integer
          format: int64
          nullable: true
        previous_page:
          type: integer
          format: int64
          nullable: true
        page:
          type: integer
          format: int64
        links:
          $ref: '#/components/schemas/PaginationLinks'
    Error:
      type: object
      properties:
        code:
          type: integer
        message:
          type: string
    InvoiceMessageSubjectAndBody:
      type: object
      required:
        - invoice_id
        - subject
        - body
        - reminder
        - thank_you
      properties:
        invoice_id:
          type: integer
          format: int32
        subject:
          type: string
        body:
          type: string
        reminder:
          type: boolean
        thank_you:
          type: boolean
    PaginationLinks:
      type: object
      required:
        - first
        - last
      properties:
        first:
          type: string
          format: url
          description: 'First page'
        last:
          type: string
          format: url
          description: 'Last page'
        previous:
          type: string
          format: url
          description: 'Previous page'
          nullable: true
        next:
          type: string
          format: url
          description: 'Next page'
          nullable: true
    TeammatesPatchResponse:
      type: object
      required:
        - teammates
      properties:
        teammates:
          type: array
          items:
            $ref: '#/components/schemas/Teammate'
security:
  -
    BearerAuth: []
    AccountAuth: []
paths:
  /clients:
    get:
      summary: 'List all clients'
      operationId: listClients
      description: "Returns a list of your clients. The clients are returned sorted by creation date, with the most recently created clients appearing first.\n\nThe response contains an object with a clients property that contains an array of up to per_page clients. Each entry in the array is a separate client object. If no more clients are available, the resulting array will be empty. Several additional pagination properties are included in the response to simplify paginating your clients."
      externalDocs:
        description: 'List all clients'
        url: 'https://help.getharvest.com/api-v2/clients-api/clients/clients/#list-all-clients'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'List all clients'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Clients'
              example:
                clients:
                  -
                    id: 5735776
                    name: '123 Industries'
                    is_active: true
                    address: "123 Main St.\r\nAnytown, LA 71223"
                    statement_key: 0a39d3e33c8058cf7c3f8097d854c64e
                    created_at: '2017-06-26T21:02:12Z'
                    updated_at: '2017-06-26T21:34:11Z'
                    currency: EUR
                  -
                    id: 5735774
                    name: 'ABC Corp'
                    is_active: true
                    address: "456 Main St.\r\nAnytown, CT 06467"
                    statement_key: e42aa2cb60e85925ffe5d13ee7ee8706
                    created_at: '2017-06-26T21:01:52Z'
                    updated_at: '2017-06-26T21:27:07Z'
                    currency: USD
                per_page: 2000
                total_pages: 1
                total_entries: 2
                next_page: null
                previous_page: null
                page: 1
                links:
                  first: 'https://api.harvestapp.com/v2/clients?page=1&per_page=2000'
                  next: null
                  previous: null
                  last: 'https://api.harvestapp.com/v2/clients?page=1&per_page=2000'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: is_active
          description: 'Pass true to only return active clients and false to return inactive clients.'
          required: false
          in: query
          schema:
            type: boolean
        -
          name: updated_since
          description: 'Only return clients that have been updated since the given date and time.'
          required: false
          in: query
          schema:
            type: string
        -
          name: page
          description: 'DEPRECATED The page number to use in pagination. For instance, if you make a list request and receive 2000 records, your subsequent call can include page=2 to retrieve the next page of the list. (Default: 1)'
          required: false
          in: query
          schema:
            type: integer
          deprecated: true
        -
          name: cursor
          description: 'Pagination cursor'
          required: false
          in: query
          schema:
            type: string
        -
          name: per_page
          description: 'The number of records to return per page. Can range between 1 and 2000. (Default: 2000)'
          required: false
          in: query
          schema:
            type: integer
    post:
      summary: 'Create a client'
      operationId: createClient
      description: 'Creates a new client object. Returns a client object and a 201 Created response code if the call succeeded.'
      externalDocs:
        description: 'Create a client'
        url: 'https://help.getharvest.com/api-v2/clients-api/clients/clients/#create-a-client'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        201:
          description: 'Create a client'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Client'
              example:
                id: 5737336
                name: 'Your New Client'
                is_active: true
                address: null
                statement_key: 82455699ad085d8cffc3e9a4e43ff7b8
                created_at: '2017-06-26T21:39:35Z'
                updated_at: '2017-06-26T21:39:35Z'
                currency: EUR
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      requestBody:
        description: 'json payload'
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'A textual description of the client.'
                  nullable: true
                is_active:
                  type: boolean
                  description: 'Whether the client is active, or archived. Defaults to true.'
                  nullable: true
                address:
                  type: string
                  description: 'A textual representation of the client’s physical address. May include new line characters.'
                  nullable: true
                currency:
                  type: string
                  description: 'The currency used by the client. If not provided, the company’s currency will be used. See a list of supported currencies'
                  nullable: true
              required:
                - name
  '/clients/{clientId}':
    delete:
      summary: 'Delete a client'
      operationId: deleteClient
      description: 'Delete a client. Deleting a client is only possible if it has no projects, invoices, or estimates associated with it. Returns a 200 OK response code if the call succeeded.'
      externalDocs:
        description: 'Delete a client'
        url: 'https://help.getharvest.com/api-v2/clients-api/clients/clients/#delete-a-client'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Delete a client'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: clientId
          required: true
          in: path
          schema:
            type: string
    get:
      summary: 'Retrieve a client'
      operationId: retrieveClient
      description: 'Retrieves the client with the given ID. Returns a client object and a 200 OK response code if a valid identifier was provided.'
      externalDocs:
        description: 'Retrieve a client'
        url: 'https://help.getharvest.com/api-v2/clients-api/clients/clients/#retrieve-a-client'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Retrieve a client'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Client'
              example:
                id: 5735776
                name: '123 Industries'
                is_active: true
                address: "123 Main St.\r\nAnytown, LA 71223"
                statement_key: 0a39d3e33c8058cf7c3f8097d854c64e
                created_at: '2017-06-26T21:02:12Z'
                updated_at: '2017-06-26T21:34:11Z'
                currency: EUR
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: clientId
          required: true
          in: path
          schema:
            type: string
    patch:
      summary: 'Update a client'
      operationId: updateClient
      description: 'Updates the specific client by setting the values of the parameters passed. Any parameters not provided will be left unchanged. Returns a client object and a 200 OK response code if the call succeeded.'
      externalDocs:
        description: 'Update a client'
        url: 'https://help.getharvest.com/api-v2/clients-api/clients/clients/#update-a-client'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Update a client'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Client'
              example:
                id: 5737336
                name: 'Your New Client'
                is_active: false
                address: null
                statement_key: 82455699ad085d8cffc3e9a4e43ff7b8
                created_at: '2017-06-26T21:39:35Z'
                updated_at: '2017-06-26T21:41:18Z'
                currency: EUR
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: clientId
          required: true
          in: path
          schema:
            type: string
      requestBody:
        description: 'json payload'
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'A textual description of the client.'
                  nullable: true
                is_active:
                  type: boolean
                  description: 'Whether the client is active, or archived.'
                  nullable: true
                address:
                  type: string
                  description: 'A textual representation of the client’s physical address. May include new line characters.'
                  nullable: true
                currency:
                  type: string
                  description: 'The currency used by the client. See a list of supported currencies'
                  nullable: true
  /company:
    get:
      summary: 'Retrieve a company'
      operationId: retrieveCompany
      description: "Retrieves the company for the currently authenticated user. Returns a\ncompany object and a 200 OK response code."
      externalDocs:
        description: 'Retrieve a company'
        url: 'https://help.getharvest.com/api-v2/company-api/company/company/#retrieve-a-company'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Retrieve a company'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Company'
              example:
                base_uri: 'https://{ACCOUNT_SUBDOMAIN}.harvestapp.com'
                full_domain: '{ACCOUNT_SUBDOMAIN}.harvestapp.com'
                name: 'API Examples'
                is_active: true
                week_start_day: Monday
                wants_timestamp_timers: true
                time_format: hours_minutes
                date_format: '%Y-%m-%d'
                plan_type: sponsored
                expense_feature: true
                invoice_feature: true
                estimate_feature: true
                approval_feature: true
                clock: 12h
                currency_code_display: iso_code_none
                currency_symbol_display: symbol_before
                decimal_symbol: .
                thousands_separator: ','
                color_scheme: orange
                weekly_capacity: 126000
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
    patch:
      summary: 'Update a company'
      operationId: updateCompany
      description: 'Updates the company setting the values of the parameters passed. Any parameters not provided will be left unchanged. Returns a company object and a 200 OK response code if the call succeeded.'
      externalDocs:
        description: 'Update a company'
        url: 'https://help.getharvest.com/api-v2/company-api/company/company/#update-a-company'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Update a company'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Company'
              example:
                base_uri: 'https://{ACCOUNT_SUBDOMAIN}.harvestapp.com'
                full_domain: '{ACCOUNT_SUBDOMAIN}.harvestapp.com'
                name: 'API Examples'
                is_active: true
                week_start_day: Monday
                wants_timestamp_timers: false
                time_format: hours_minutes
                date_format: '%Y-%m-%d'
                plan_type: sponsored
                expense_feature: true
                invoice_feature: true
                estimate_feature: true
                approval_feature: true
                clock: 12h
                currency_code_display: iso_code_none
                currency_symbol_display: symbol_before
                decimal_symbol: .
                thousands_separator: ','
                color_scheme: orange
                weekly_capacity: 108000
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      requestBody:
        description: 'json payload'
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                wants_timestamp_timers:
                  type: boolean
                  description: 'Whether time is tracked via duration or start and end times.'
                  nullable: true
                weekly_capacity:
                  type: integer
                  description: 'The weekly capacity in seconds.'
                  nullable: true
                  format: int32
  /contacts:
    get:
      summary: 'List all contacts'
      operationId: listContacts
      description: "Returns a list of your contacts. The contacts are returned sorted by creation date, with the most recently created contacts appearing first.\n\nThe response contains an object with a contacts property that contains an array of up to per_page contacts. Each entry in the array is a separate contact object. If no more contacts are available, the resulting array will be empty. Several additional pagination properties are included in the response to simplify paginating your contacts."
      externalDocs:
        description: 'List all contacts'
        url: 'https://help.getharvest.com/api-v2/clients-api/clients/contacts/#list-all-contacts'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'List all contacts'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Contacts'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: client_id
          description: 'Only return contacts belonging to the client with the given ID.'
          required: false
          in: query
          schema:
            type: integer
        -
          name: updated_since
          description: 'Only return contacts that have been updated since the given date and time.'
          required: false
          in: query
          schema:
            type: string
        -
          name: page
          description: 'DEPRECATED The page number to use in pagination. For instance, if you make a list request and receive 2000 records, your subsequent call can include page=2 to retrieve the next page of the list. (Default: 1)'
          required: false
          in: query
          schema:
            type: integer
          deprecated: true
        -
          name: cursor
          description: 'Pagination cursor'
          required: false
          in: query
          schema:
            type: string
        -
          name: per_page
          description: 'The number of records to return per page. Can range between 1 and 2000. (Default: 2000)'
          required: false
          in: query
          schema:
            type: integer
    post:
      summary: 'Create a contact'
      operationId: createContact
      description: 'Creates a new contact object. Returns a contact object and a 201 Created response code if the call succeeded.'
      externalDocs:
        description: 'Create a contact'
        url: 'https://help.getharvest.com/api-v2/clients-api/clients/contacts/#create-a-contact'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        201:
          description: 'Create a contact'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Contact'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      requestBody:
        description: 'json payload'
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                client_id:
                  type: integer
                  description: 'The ID of the client associated with this contact.'
                  nullable: true
                  format: int32
                title:
                  type: string
                  description: 'The title of the contact.'
                  nullable: true
                first_name:
                  type: string
                  description: 'The first name of the contact.'
                  nullable: true
                last_name:
                  type: string
                  description: 'The last name of the contact.'
                  nullable: true
                email:
                  type: string
                  description: 'The contact’s email address.'
                  nullable: true
                  format: email
                phone_office:
                  type: string
                  description: 'The contact’s office phone number.'
                  nullable: true
                phone_mobile:
                  type: string
                  description: 'The contact’s mobile phone number.'
                  nullable: true
                fax:
                  type: string
                  description: 'The contact’s fax number.'
                  nullable: true
              required:
                - client_id
                - first_name
  '/contacts/{contactId}':
    delete:
      summary: 'Delete a contact'
      operationId: deleteContact
      description: 'Delete a contact. Returns a 200 OK response code if the call succeeded.'
      externalDocs:
        description: 'Delete a contact'
        url: 'https://help.getharvest.com/api-v2/clients-api/clients/contacts/#delete-a-contact'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Delete a contact'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: contactId
          required: true
          in: path
          schema:
            type: string
    get:
      summary: 'Retrieve a contact'
      operationId: retrieveContact
      description: 'Retrieves the contact with the given ID. Returns a contact object and a 200 OK response code if a valid identifier was provided.'
      externalDocs:
        description: 'Retrieve a contact'
        url: 'https://help.getharvest.com/api-v2/clients-api/clients/contacts/#retrieve-a-contact'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Retrieve a contact'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Contact'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: contactId
          required: true
          in: path
          schema:
            type: string
    patch:
      summary: 'Update a contact'
      operationId: updateContact
      description: 'Updates the specific contact by setting the values of the parameters passed. Any parameters not provided will be left unchanged. Returns a contact object and a 200 OK response code if the call succeeded.'
      externalDocs:
        description: 'Update a contact'
        url: 'https://help.getharvest.com/api-v2/clients-api/clients/contacts/#update-a-contact'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Update a contact'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Contact'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: contactId
          required: true
          in: path
          schema:
            type: string
      requestBody:
        description: 'json payload'
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                client_id:
                  type: integer
                  description: 'The ID of the client associated with this contact.'
                  nullable: true
                  format: int32
                title:
                  type: string
                  description: 'The title of the contact.'
                  nullable: true
                first_name:
                  type: string
                  description: 'The first name of the contact.'
                  nullable: true
                last_name:
                  type: string
                  description: 'The last name of the contact.'
                  nullable: true
                email:
                  type: string
                  description: 'The contact’s email address.'
                  nullable: true
                  format: email
                phone_office:
                  type: string
                  description: 'The contact’s office phone number.'
                  nullable: true
                phone_mobile:
                  type: string
                  description: 'The contact’s mobile phone number.'
                  nullable: true
                fax:
                  type: string
                  description: 'The contact’s fax number.'
                  nullable: true
  /estimate_item_categories:
    get:
      summary: 'List all estimate item categories'
      operationId: listEstimateItemCategories
      description: "Returns a list of your estimate item categories. The estimate item categories are returned sorted by creation date, with the most recently created estimate item categories appearing first.\n\nThe response contains an object with a estimate_item_categories property that contains an array of up to per_page estimate item categories. Each entry in the array is a separate estimate item category object. If no more estimate item categories are available, the resulting array will be empty. Several additional pagination properties are included in the response to simplify paginating your estimate item categories."
      externalDocs:
        description: 'List all estimate item categories'
        url: 'https://help.getharvest.com/api-v2/estimates-api/estimates/estimate-item-categories/#list-all-estimate-item-categories'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'List all estimate item categories'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EstimateItemCategories'
              example:
                estimate_item_categories:
                  -
                    id: 1378704
                    name: Product
                    created_at: '2017-06-26T20:41:00Z'
                    updated_at: '2017-06-26T20:41:00Z'
                  -
                    id: 1378703
                    name: Service
                    created_at: '2017-06-26T20:41:00Z'
                    updated_at: '2017-06-26T20:41:00Z'
                per_page: 2000
                total_pages: 1
                total_entries: 2
                next_page: null
                previous_page: null
                page: 1
                links:
                  first: 'https://api.harvestapp.com/v2/estimate_item_categories?page=1&per_page=2000'
                  next: null
                  previous: null
                  last: 'https://api.harvestapp.com/v2/estimate_item_categories?page=1&per_page=2000'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: updated_since
          description: 'Only return estimate item categories that have been updated since the given date and time.'
          required: false
          in: query
          schema:
            type: string
        -
          name: page
          description: 'DEPRECATED The page number to use in pagination. For instance, if you make a list request and receive 2000 records, your subsequent call can include page=2 to retrieve the next page of the list. (Default: 1)'
          required: false
          in: query
          schema:
            type: integer
          deprecated: true
        -
          name: cursor
          description: 'Pagination cursor'
          required: false
          in: query
          schema:
            type: string
        -
          name: per_page
          description: 'The number of records to return per page. Can range between 1 and 2000. (Default: 2000)'
          required: false
          in: query
          schema:
            type: integer
    post:
      summary: 'Create an estimate item category'
      operationId: createEstimateItemCategory
      description: 'Creates a new estimate item category object. Returns an estimate item category object and a 201 Created response code if the call succeeded.'
      externalDocs:
        description: 'Create an estimate item category'
        url: 'https://help.getharvest.com/api-v2/estimates-api/estimates/estimate-item-categories/#create-an-estimate-item-category'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        201:
          description: 'Create an estimate item category'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EstimateItemCategory'
              example:
                id: 1379244
                name: Hosting
                created_at: '2017-06-27T16:06:35Z'
                updated_at: '2017-06-27T16:06:35Z'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      requestBody:
        description: 'json payload'
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'The name of the estimate item category.'
                  nullable: true
              required:
                - name
  '/estimate_item_categories/{estimateItemCategoryId}':
    delete:
      summary: 'Delete an estimate item category'
      operationId: deleteEstimateItemCategory
      description: 'Delete an estimate item category. Returns a 200 OK response code if the call succeeded.'
      externalDocs:
        description: 'Delete an estimate item category'
        url: 'https://help.getharvest.com/api-v2/estimates-api/estimates/estimate-item-categories/#delete-an-estimate-item-category'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Delete an estimate item category'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: estimateItemCategoryId
          required: true
          in: path
          schema:
            type: string
    get:
      summary: 'Retrieve an estimate item category'
      operationId: retrieveEstimateItemCategory
      description: 'Retrieves the estimate item category with the given ID. Returns an estimate item category object and a 200 OK response code if a valid identifier was provided.'
      externalDocs:
        description: 'Retrieve an estimate item category'
        url: 'https://help.getharvest.com/api-v2/estimates-api/estimates/estimate-item-categories/#retrieve-an-estimate-item-category'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Retrieve an estimate item category'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EstimateItemCategory'
              example:
                id: 1378704
                name: Product
                created_at: '2017-06-26T20:41:00Z'
                updated_at: '2017-06-26T20:41:00Z'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: estimateItemCategoryId
          required: true
          in: path
          schema:
            type: string
    patch:
      summary: 'Update an estimate item category'
      operationId: updateEstimateItemCategory
      description: 'Updates the specific estimate item category by setting the values of the parameters passed. Any parameters not provided will be left unchanged. Returns an estimate item category object and a 200 OK response code if the call succeeded.'
      externalDocs:
        description: 'Update an estimate item category'
        url: 'https://help.getharvest.com/api-v2/estimates-api/estimates/estimate-item-categories/#update-an-estimate-item-category'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Update an estimate item category'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EstimateItemCategory'
              example:
                id: 1379244
                name: Transportation
                created_at: '2017-06-27T16:06:35Z'
                updated_at: '2017-06-27T16:07:05Z'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: estimateItemCategoryId
          required: true
          in: path
          schema:
            type: string
      requestBody:
        description: 'json payload'
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'The name of the estimate item category.'
                  nullable: true
  /estimates:
    get:
      summary: 'List all estimates'
      operationId: listEstimates
      description: "Returns a list of your estimates. The estimates are returned sorted by issue date, with the most recently issued estimates appearing first.\n\nThe response contains an object with a estimates property that contains an array of up to per_page estimates. Each entry in the array is a separate estimate object. If no more estimates are available, the resulting array will be empty. Several additional pagination properties are included in the response to simplify paginating your estimates."
      externalDocs:
        description: 'List all estimates'
        url: 'https://help.getharvest.com/api-v2/estimates-api/estimates/estimates/#list-all-estimates'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'List all estimates'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Estimates'
              example:
                estimates:
                  -
                    id: 1439818
                    client_key: 13dc088aa7d51ec687f186b146730c3c75dc7423
                    number: '1001'
                    purchase_order: '5678'
                    amount: 9630.0
                    tax: 5.0
                    tax_amount: 450.0
                    tax2: 2.0
                    tax2_amount: 180.0
                    discount: 10.0
                    discount_amount: 1000.0
                    subject: 'Online Store - Phase 2'
                    notes: 'Some notes about the estimate'
                    state: sent
                    issue_date: '2017-06-01'
                    sent_at: '2017-06-27T16:11:33Z'
                    created_at: '2017-06-27T16:11:24Z'
                    updated_at: '2017-06-27T16:13:56Z'
                    accepted_at: null
                    declined_at: null
                    currency: USD
                    client:
                      id: 5735776
                      name: '123 Industries'
                    creator:
                      id: 1782884
                      name: 'Bob Powell'
                    line_items:
                      -
                        id: 53334195
                        kind: Service
                        description: 'Phase 2 of the Online Store'
                        quantity: 100
                        unit_price: 100
                        amount: 10000
                        taxed: true
                        taxed2: true
                  -
                    id: 1439814
                    client_key: a5ffaeb30c55776270fcd3992b70332d769f97e7
                    number: '1000'
                    purchase_order: '1234'
                    amount: 21000.0
                    tax: 5.0
                    tax_amount: 1000.0
                    tax2: null
                    tax2_amount: 0.0
                    discount: null
                    discount_amount: 0.0
                    subject: 'Online Store - Phase 1'
                    notes: 'Some notes about the estimate'
                    state: accepted
                    issue_date: '2017-01-01'
                    sent_at: '2017-06-27T16:10:30Z'
                    created_at: '2017-06-27T16:09:33Z'
                    updated_at: '2017-06-27T16:12:00Z'
                    accepted_at: '2017-06-27T16:10:32Z'
                    declined_at: null
                    currency: USD
                    client:
                      id: 5735776
                      name: '123 Industries'
                    creator:
                      id: 1782884
                      name: 'Bob Powell'
                    line_items:
                      -
                        id: 57531966
                        kind: Service
                        description: 'Phase 1 of the Online Store'
                        quantity: 1
                        unit_price: 20000
                        amount: 20000
                        taxed: true
                        taxed2: false
                per_page: 2000
                total_pages: 1
                total_entries: 2
                next_page: null
                previous_page: null
                page: 1
                links:
                  first: 'https://api.harvestapp.com/v2/estimates?page=1&per_page=2000'
                  next: null
                  previous: null
                  last: 'https://api.harvestapp.com/v2/estimates?page=1&per_page=2000'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: client_id
          description: 'Only return estimates belonging to the client with the given ID.'
          required: false
          in: query
          schema:
            type: integer
        -
          name: updated_since
          description: 'Only return estimates that have been updated since the given date and time.'
          required: false
          in: query
          schema:
            type: string
        -
          name: from
          description: 'Only return estimates with an issue_date on or after the given date.'
          required: false
          in: query
          schema:
            type: string
        -
          name: to
          description: 'Only return estimates with an issue_date on or before the given date.'
          required: false
          in: query
          schema:
            type: string
        -
          name: state
          description: 'Only return estimates with a state matching the value provided. Options: draft, sent, accepted, or declined.'
          required: false
          in: query
          schema:
            type: string
        -
          name: page
          description: 'The page number to use in pagination. For instance, if you make a list request and receive 2000 records, your subsequent call can include page=2 to retrieve the next page of the list. (Default: 1)'
          required: false
          in: query
          schema:
            type: integer
        -
          name: per_page
          description: 'The number of records to return per page. Can range between 1 and 2000. (Default: 2000)'
          required: false
          in: query
          schema:
            type: integer
    post:
      summary: 'Create an estimate'
      operationId: createEstimate
      description: 'Creates a new estimate object. Returns an estimate object and a 201 Created response code if the call succeeded.'
      externalDocs:
        description: 'Create an estimate'
        url: 'https://help.getharvest.com/api-v2/estimates-api/estimates/estimates/#create-an-estimate'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        201:
          description: 'Create an estimate'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Estimate'
              example:
                id: 1439827
                client_key: ddd4504a68fb7339138d0c2ea89ba05a3cf12aa8
                number: '1002'
                purchase_order: null
                amount: 5000.0
                tax: null
                tax_amount: 0.0
                tax2: null
                tax2_amount: 0.0
                discount: null
                discount_amount: 0.0
                subject: 'Project Quote'
                notes: null
                state: draft
                issue_date: null
                sent_at: null
                created_at: '2017-06-27T16:16:24Z'
                updated_at: '2017-06-27T16:16:24Z'
                accepted_at: null
                declined_at: null
                currency: USD
                client:
                  id: 5735774
                  name: 'ABC Corp'
                creator:
                  id: 1782884
                  name: 'Bob Powell'
                line_items:
                  -
                    id: 53339199
                    kind: Service
                    description: 'Project Description'
                    quantity: 1.0
                    unit_price: 5000.0
                    amount: 5000.0
                    taxed: false
                    taxed2: false
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      requestBody:
        description: 'json payload'
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                client_id:
                  type: integer
                  description: 'The ID of the client this estimate belongs to.'
                  nullable: true
                  format: int32
                number:
                  type: string
                  description: 'If no value is set, the number will be automatically generated.'
                  nullable: true
                purchase_order:
                  type: string
                  description: 'The purchase order number.'
                  nullable: true
                tax:
                  type: number
                  description: 'This percentage is applied to the subtotal, including line items and discounts. Example: use 10.0 for 10.0%.'
                  nullable: true
                  format: float
                tax2:
                  type: number
                  description: 'This percentage is applied to the subtotal, including line items and discounts. Example: use 10.0 for 10.0%.'
                  nullable: true
                  format: float
                discount:
                  type: number
                  description: 'This percentage is subtracted from the subtotal. Example: use 10.0 for 10.0%.'
                  nullable: true
                  format: float
                subject:
                  type: string
                  description: 'The estimate subject.'
                  nullable: true
                notes:
                  type: string
                  description: 'Any additional notes to include on the estimate.'
                  nullable: true
                currency:
                  type: string
                  description: 'The currency used by the estimate. If not provided, the client’s currency will be used. See a list of supported currencies'
                  nullable: true
                issue_date:
                  type: string
                  description: 'Date the estimate was issued. Defaults to today’s date.'
                  nullable: true
                  format: date
                line_items:
                  type: array
                  description: 'Array of line item parameters'
                  nullable: true
                  items:
                    type: object
                    required:
                      - kind
                      - unit_price
                    properties:
                      kind:
                        description: 'The name of an estimate item category.'
                        type: string
                      description:
                        description: 'Text description of the line item.'
                        type: string
                      quantity:
                        description: 'The unit quantity of the item. Defaults to 1.'
                        type: integer
                        format: int32
                      unit_price:
                        description: 'The individual price per unit.'
                        type: number
                        format: float
                      taxed:
                        description: 'Whether the estimate’s tax percentage applies to this line item. Defaults to false.'
                        type: boolean
                      taxed2:
                        description: 'Whether the estimate’s tax2 percentage applies to this line item. Defaults to false.'
                        type: boolean
              required:
                - client_id
  '/estimates/{estimateId}':
    delete:
      summary: 'Delete an estimate'
      operationId: deleteEstimate
      description: 'Delete an estimate. Returns a 200 OK response code if the call succeeded.'
      externalDocs:
        description: 'Delete an estimate'
        url: 'https://help.getharvest.com/api-v2/estimates-api/estimates/estimates/#delete-an-estimate'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Delete an estimate'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: estimateId
          required: true
          in: path
          schema:
            type: string
    get:
      summary: 'Retrieve an estimate'
      operationId: retrieveEstimate
      description: 'Retrieves the estimate with the given ID. Returns an estimate object and a 200 OK response code if a valid identifier was provided.'
      externalDocs:
        description: 'Retrieve an estimate'
        url: 'https://help.getharvest.com/api-v2/estimates-api/estimates/estimates/#retrieve-an-estimate'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Retrieve an estimate'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Estimate'
              example:
                id: 1439818
                client_key: 13dc088aa7d51ec687f186b146730c3c75dc7423
                number: '1001'
                purchase_order: '5678'
                amount: 9630.0
                tax: 5.0
                tax_amount: 450.0
                tax2: 2.0
                tax2_amount: 180.0
                discount: 10.0
                discount_amount: 1000.0
                subject: 'Online Store - Phase 2'
                notes: 'Some notes about the estimate'
                state: sent
                issue_date: '2017-06-01'
                sent_at: '2017-06-27T16:11:33Z'
                created_at: '2017-06-27T16:11:24Z'
                updated_at: '2017-06-27T16:13:56Z'
                accepted_at: null
                declined_at: null
                currency: USD
                client:
                  id: 5735776
                  name: '123 Industries'
                creator:
                  id: 1782884
                  name: 'Bob Powell'
                line_items:
                  -
                    id: 53334195
                    kind: Service
                    description: 'Phase 2 of the Online Store'
                    quantity: 100.0
                    unit_price: 100.0
                    amount: 10000.0
                    taxed: true
                    taxed2: true
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: estimateId
          required: true
          in: path
          schema:
            type: string
    patch:
      summary: 'Update an estimate'
      operationId: updateEstimate
      description: 'Updates the specific estimate by setting the values of the parameters passed. Any parameters not provided will be left unchanged. Returns an estimate object and a 200 OK response code if the call succeeded.'
      externalDocs:
        description: 'Update an estimate'
        url: 'https://help.getharvest.com/api-v2/estimates-api/estimates/estimates/#update-an-estimate'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Update an estimate'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Estimate'
              example:
                id: 1439827
                client_key: ddd4504a68fb7339138d0c2ea89ba05a3cf12aa8
                number: '1002'
                purchase_order: '2345'
                amount: 5000.0
                tax: null
                tax_amount: 0.0
                tax2: null
                tax2_amount: 0.0
                discount: null
                discount_amount: 0.0
                subject: 'Project Quote'
                notes: null
                state: draft
                issue_date: null
                sent_at: null
                created_at: '2017-06-27T16:16:24Z'
                updated_at: '2017-06-27T16:17:06Z'
                accepted_at: null
                declined_at: null
                currency: USD
                client:
                  id: 5735774
                  name: 'ABC Corp'
                creator:
                  id: 1782884
                  name: 'Bob Powell'
                line_items:
                  -
                    id: 53339199
                    kind: Service
                    description: 'Project Description'
                    quantity: 1.0
                    unit_price: 5000.0
                    amount: 5000.0
                    taxed: false
                    taxed2: false
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: estimateId
          required: true
          in: path
          schema:
            type: string
      requestBody:
        description: 'json payload'
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                client_id:
                  type: integer
                  description: 'The ID of the client this estimate belongs to.'
                  nullable: true
                  format: int32
                number:
                  type: string
                  description: 'If no value is set, the number will be automatically generated.'
                  nullable: true
                purchase_order:
                  type: string
                  description: 'The purchase order number.'
                  nullable: true
                tax:
                  type: number
                  description: 'This percentage is applied to the subtotal, including line items and discounts. Example: use 10.0 for 10.0%.'
                  nullable: true
                  format: float
                tax2:
                  type: number
                  description: 'This percentage is applied to the subtotal, including line items and discounts. Example: use 10.0 for 10.0%.'
                  nullable: true
                  format: float
                discount:
                  type: number
                  description: 'This percentage is subtracted from the subtotal. Example: use 10.0 for 10.0%.'
                  nullable: true
                  format: float
                subject:
                  type: string
                  description: 'The estimate subject.'
                  nullable: true
                notes:
                  type: string
                  description: 'Any additional notes to include on the estimate.'
                  nullable: true
                currency:
                  type: string
                  description: 'The currency used by the estimate. If not provided, the client’s currency will be used. See a list of supported currencies'
                  nullable: true
                issue_date:
                  type: string
                  description: 'Date the estimate was issued.'
                  nullable: true
                  format: date
                line_items:
                  type: array
                  description: 'Array of line item parameters'
                  nullable: true
                  items:
                    type: object
                    properties:
                      id:
                        description: 'Unique ID for the line item.'
                        type: integer
                        format: int32
                      kind:
                        description: 'The name of an estimate item category.'
                        type: string
                      description:
                        description: 'Text description of the line item.'
                        type: string
                      quantity:
                        description: 'The unit quantity of the item. Defaults to 1.'
                        type: integer
                        format: int32
                      unit_price:
                        description: 'The individual price per unit.'
                        type: number
                        format: float
                      taxed:
                        description: 'Whether the estimate’s tax percentage applies to this line item. Defaults to false.'
                        type: boolean
                      taxed2:
                        description: 'Whether the estimate’s tax2 percentage applies to this line item. Defaults to false.'
                        type: boolean
  '/estimates/{estimateId}/messages':
    get:
      summary: 'List all messages for an estimate'
      operationId: listMessagesForEstimate
      description: "Returns a list of messages associated with a given estimate. The estimate messages are returned sorted by creation date, with the most recently created messages appearing first.\n\nThe response contains an object with an estimate_messages property that contains an array of up to per_page messages. Each entry in the array is a separate message object. If no more messages are available, the resulting array will be empty. Several additional pagination properties are included in the response to simplify paginating your messages."
      externalDocs:
        description: 'List all messages for an estimate'
        url: 'https://help.getharvest.com/api-v2/estimates-api/estimates/estimate-messages/#list-all-messages-for-an-estimate'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'List all messages for an estimate'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EstimateMessages'
              example:
                estimate_messages:
                  -
                    id: 2666236
                    sent_by: 'Bob Powell'
                    sent_by_email: bobpowell@example.com
                    sent_from: 'Bob Powell'
                    sent_from_email: bobpowell@example.com
                    send_me_a_copy: true
                    created_at: '2017-08-25T21:23:40Z'
                    updated_at: '2017-08-25T21:23:40Z'
                    recipients:
                      -
                        name: 'Richard Roe'
                        email: richardroe@example.com
                      -
                        name: 'Bob Powell'
                        email: bobpowell@example.com
                    event_type: null
                    subject: 'Estimate #1001 from API Examples'
                    body: "---------------------------------------------\r\nEstimate Summary\r\n---------------------------------------------\r\nEstimate ID: 1001\r\nEstimate Date: 06/01/2017\r\nClient: 123 Industries\r\nP.O. Number: 5678\r\nAmount: $9,630.00\r\n\r\nYou can view the estimate here:\r\n\r\n%estimate_url%\r\n\r\nThank you!\r\n---------------------------------------------"
                per_page: 2000
                total_pages: 1
                total_entries: 1
                next_page: null
                previous_page: null
                page: 1
                links:
                  first: 'https://api.harvestapp.com/v2/estimates/1439818/messages?page=1&per_page=2000'
                  next: null
                  previous: null
                  last: 'https://api.harvestapp.com/v2/estimates/1439818/messages?page=1&per_page=2000'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: estimateId
          required: true
          in: path
          schema:
            type: string
        -
          name: updated_since
          description: 'Only return estimate messages that have been updated since the given date and time.'
          required: false
          in: query
          schema:
            type: string
        -
          name: page
          description: 'DEPRECATED The page number to use in pagination. For instance, if you make a list request and receive 2000 records, your subsequent call can include page=2 to retrieve the next page of the list. (Default: 1)'
          required: false
          in: query
          schema:
            type: integer
          deprecated: true
        -
          name: cursor
          description: 'Pagination cursor'
          required: false
          in: query
          schema:
            type: string
        -
          name: per_page
          description: 'The number of records to return per page. Can range between 1 and 2000. (Default: 2000)'
          required: false
          in: query
          schema:
            type: integer
    post:
      summary: 'Create an estimate message or change estimate status'
      operationId: createEstimateMessage
      description: 'Creates a new estimate message object. Returns an estimate message object and a 201 Created response code if the call succeeded.'
      externalDocs:
        description: 'Create an estimate message'
        url: 'https://help.getharvest.com/api-v2/estimates-api/estimates/estimate-messages/#create-an-estimate-message'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        201:
          description: 'Create an estimate message or change estimate status'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EstimateMessage'
              example:
                id: 2666240
                sent_by: 'Bob Powell'
                sent_by_email: bobpowell@example.com
                sent_from: 'Bob Powell'
                sent_from_email: bobpowell@example.com
                send_me_a_copy: true
                created_at: '2017-08-25T21:27:52Z'
                updated_at: '2017-08-25T21:27:52Z'
                recipients:
                  -
                    name: 'Richard Roe'
                    email: richardroe@example.com
                  -
                    name: 'Bob Powell'
                    email: bobpowell@example.com
                event_type: null
                subject: 'Estimate #1001'
                body: 'Here is our estimate.'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: estimateId
          required: true
          in: path
          schema:
            type: string
      requestBody:
        description: 'json payload'
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                event_type:
                  type: string
                  description: 'If provided, runs an event against the estimate. Options: “accept”, “decline”, “re-open”, or “send”.'
                  nullable: true
                recipients:
                  type: array
                  description: 'Array of recipient parameters. See below for details.'
                  nullable: true
                  items:
                    type: object
                    required:
                      - email
                    properties:
                      name:
                        description: 'Name of the message recipient.'
                        type: string
                      email:
                        description: 'Email of the message recipient.'
                        type: string
                        format: email
                subject:
                  type: string
                  description: 'The message subject.'
                  nullable: true
                body:
                  type: string
                  description: 'The message body.'
                  nullable: true
                send_me_a_copy:
                  type: boolean
                  description: 'If set to true, a copy of the message email will be sent to the current user. Defaults to false.'
                  nullable: true
              required:
                - recipients
  '/estimates/{estimateId}/messages/{messageId}':
    delete:
      summary: 'Delete an estimate message'
      operationId: deleteEstimateMessage
      description: 'Delete an estimate message. Returns a 200 OK response code if the call succeeded.'
      externalDocs:
        description: 'Delete an estimate message'
        url: 'https://help.getharvest.com/api-v2/estimates-api/estimates/estimate-messages/#delete-an-estimate-message'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Delete an estimate message'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: estimateId
          required: true
          in: path
          schema:
            type: string
        -
          name: messageId
          required: true
          in: path
          schema:
            type: string
  /expense_categories:
    get:
      summary: 'List all expense categories'
      operationId: listExpenseCategories
      description: "Returns a list of your expense categories. The expense categories are returned sorted by creation date, with the most recently created expense categories appearing first.\n\nThe response contains an object with a expense_categories property that contains an array of up to per_page expense categories. Each entry in the array is a separate expense category object. If no more expense categories are available, the resulting array will be empty. Several additional pagination properties are included in the response to simplify paginating your expense categories."
      externalDocs:
        description: 'List all expense categories'
        url: 'https://help.getharvest.com/api-v2/expenses-api/expenses/expense-categories/#list-all-expense-categories'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'List all expense categories'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ExpenseCategories'
              example:
                expense_categories:
                  -
                    id: 4197501
                    name: Lodging
                    unit_name: null
                    unit_price: null
                    is_active: true
                    created_at: '2017-06-27T15:01:32Z'
                    updated_at: '2017-06-27T15:01:32Z'
                  -
                    id: 4195930
                    name: Mileage
                    unit_name: mile
                    unit_price: 0.535
                    is_active: true
                    created_at: '2017-06-26T20:41:00Z'
                    updated_at: '2017-06-26T20:41:00Z'
                  -
                    id: 4195928
                    name: Transportation
                    unit_name: null
                    unit_price: null
                    is_active: true
                    created_at: '2017-06-26T20:41:00Z'
                    updated_at: '2017-06-26T20:41:00Z'
                  -
                    id: 4195926
                    name: Meals
                    unit_name: null
                    unit_price: null
                    is_active: true
                    created_at: '2017-06-26T20:41:00Z'
                    updated_at: '2017-06-26T20:41:00Z'
                per_page: 2000
                total_pages: 1
                total_entries: 4
                next_page: null
                previous_page: null
                page: 1
                links:
                  first: 'https://api.harvestapp.com/v2/expense_categories?page=1&per_page=2000'
                  next: null
                  previous: null
                  last: 'https://api.harvestapp.com/v2/expense_categories?page=1&per_page=2000'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: is_active
          description: 'Pass true to only return active expense categories and false to return inactive expense categories.'
          required: false
          in: query
          schema:
            type: boolean
        -
          name: updated_since
          description: 'Only return expense categories that have been updated since the given date and time.'
          required: false
          in: query
          schema:
            type: string
        -
          name: page
          description: 'DEPRECATED The page number to use in pagination. For instance, if you make a list request and receive 2000 records, your subsequent call can include page=2 to retrieve the next page of the list. (Default: 1)'
          required: false
          in: query
          schema:
            type: integer
          deprecated: true
        -
          name: cursor
          description: 'Pagination cursor'
          required: false
          in: query
          schema:
            type: string
        -
          name: per_page
          description: 'The number of records to return per page. Can range between 1 and 2000. (Default: 2000)'
          required: false
          in: query
          schema:
            type: integer
    post:
      summary: 'Create an expense category'
      operationId: createExpenseCategory
      description: 'Creates a new expense category object. Returns an expense category object and a 201 Created response code if the call succeeded.'
      externalDocs:
        description: 'Create an expense category'
        url: 'https://help.getharvest.com/api-v2/expenses-api/expenses/expense-categories/#create-an-expense-category'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        201:
          description: 'Create an expense category'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ExpenseCategory'
              example:
                id: 4197514
                name: Other
                unit_name: null
                unit_price: null
                is_active: true
                created_at: '2017-06-27T15:04:23Z'
                updated_at: '2017-06-27T15:04:23Z'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      requestBody:
        description: 'json payload'
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'The name of the expense category.'
                  nullable: true
                unit_name:
                  type: string
                  description: 'The unit name of the expense category.'
                  nullable: true
                unit_price:
                  type: number
                  description: 'The unit price of the expense category.'
                  nullable: true
                  format: float
                is_active:
                  type: boolean
                  description: 'Whether the expense category is active or archived. Defaults to true.'
                  nullable: true
              required:
                - name
  '/expense_categories/{expenseCategoryId}':
    delete:
      summary: 'Delete an expense category'
      operationId: deleteExpenseCategory
      description: 'Delete an expense category. Returns a 200 OK response code if the call succeeded.'
      externalDocs:
        description: 'Delete an expense category'
        url: 'https://help.getharvest.com/api-v2/expenses-api/expenses/expense-categories/#delete-an-expense-category'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Delete an expense category'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: expenseCategoryId
          required: true
          in: path
          schema:
            type: string
    get:
      summary: 'Retrieve an expense category'
      operationId: retrieveExpenseCategory
      description: 'Retrieves the expense category with the given ID. Returns an expense category object and a 200 OK response code if a valid identifier was provided.'
      externalDocs:
        description: 'Retrieve an expense category'
        url: 'https://help.getharvest.com/api-v2/expenses-api/expenses/expense-categories/#retrieve-an-expense-category'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Retrieve an expense category'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ExpenseCategory'
              example:
                id: 4197501
                name: Lodging
                unit_name: null
                unit_price: null
                is_active: true
                created_at: '2017-06-27T15:01:32Z'
                updated_at: '2017-06-27T15:01:32Z'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: expenseCategoryId
          required: true
          in: path
          schema:
            type: string
    patch:
      summary: 'Update an expense category'
      operationId: updateExpenseCategory
      description: 'Updates the specific expense category by setting the values of the parameters passed. Any parameters not provided will be left unchanged. Returns an expense category object and a 200 OK response code if the call succeeded.'
      externalDocs:
        description: 'Update an expense category'
        url: 'https://help.getharvest.com/api-v2/expenses-api/expenses/expense-categories/#update-an-expense-category'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Update an expense category'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ExpenseCategory'
              example:
                id: 4197514
                name: Other
                unit_name: null
                unit_price: null
                is_active: false
                created_at: '2017-06-27T15:04:23Z'
                updated_at: '2017-06-27T15:04:58Z'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: expenseCategoryId
          required: true
          in: path
          schema:
            type: string
      requestBody:
        description: 'json payload'
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'The name of the expense category.'
                  nullable: true
                unit_name:
                  type: string
                  description: 'The unit name of the expense category.'
                  nullable: true
                unit_price:
                  type: number
                  description: 'The unit price of the expense category.'
                  nullable: true
                  format: float
                is_active:
                  type: boolean
                  description: 'Whether the expense category is active or archived.'
                  nullable: true
  /expenses:
    get:
      summary: 'List all expenses'
      operationId: listExpenses
      description: "Returns a list of your expenses. If accessing this endpoint as an Administrator, all expenses in the account will be returned. If accessing this endpoint as a Manager, all expenses for assigned teammates and managed projects will be returned. The expenses are returned sorted by the spent_at date, with the most recent expenses appearing first.\n\nThe response contains an object with a expenses property that contains an array of up to per_page expenses. Each entry in the array is a separate expense object. If no more expenses are available, the resulting array will be empty. Several additional pagination properties are included in the response to simplify paginating your expenses."
      externalDocs:
        description: 'List all expenses'
        url: 'https://help.getharvest.com/api-v2/expenses-api/expenses/expenses/#list-all-expenses'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'List all expenses'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Expenses'
              example:
                expenses:
                  -
                    id: 15296442
                    notes: 'Lunch with client'
                    total_cost: 33.35
                    units: 1.0
                    is_closed: false
                    is_locked: true
                    is_billed: true
                    locked_reason: 'Expense is invoiced.'
                    spent_date: '2017-03-03'
                    created_at: '2017-06-27T15:09:54Z'
                    updated_at: '2017-06-27T16:47:14Z'
                    billable: true
                    receipt:
                      url: 'https://{ACCOUNT_SUBDOMAIN}.harvestapp.com/expenses/15296442/receipt'
                      file_name: lunch_receipt.gif
                      file_size: 39410
                      content_type: image/gif
                    user:
                      id: 1782959
                      name: 'Kim Allen'
                    user_assignment:
                      id: 125068553
                      is_project_manager: true
                      is_active: true
                      budget: null
                      created_at: '2017-06-26T22:32:52Z'
                      updated_at: '2017-06-26T22:32:52Z'
                      hourly_rate: 100.0
                    project:
                      id: 14307913
                      name: 'Marketing Website'
                      code: MW
                    expense_category:
                      id: 4195926
                      name: Meals
                      unit_price: null
                      unit_name: null
                    client:
                      id: 5735774
                      name: 'ABC Corp'
                      currency: USD
                    invoice:
                      id: 13150403
                      number: '1001'
                  -
                    id: 15296423
                    notes: 'Hotel stay for meeting'
                    total_cost: 100.0
                    units: 1.0
                    is_closed: true
                    is_locked: true
                    is_billed: false
                    locked_reason: 'The project is locked for this time period.'
                    spent_date: '2017-03-01'
                    created_at: '2017-06-27T15:09:17Z'
                    updated_at: '2017-06-27T16:47:14Z'
                    billable: true
                    receipt: null
                    user:
                      id: 1782959
                      name: 'Kim Allen'
                    user_assignment:
                      id: 125068554
                      is_project_manager: true
                      is_active: true
                      budget: null
                      created_at: '2017-06-26T22:32:52Z'
                      updated_at: '2017-06-26T22:32:52Z'
                      hourly_rate: 100.0
                    project:
                      id: 14308069
                      name: 'Online Store - Phase 1'
                      code: OS1
                    expense_category:
                      id: 4197501
                      name: Lodging
                      unit_price: null
                      unit_name: null
                    client:
                      id: 5735776
                      name: '123 Industries'
                      currency: EUR
                    invoice: null
                per_page: 2000
                total_pages: 1
                total_entries: 2
                next_page: null
                previous_page: null
                page: 1
                links:
                  first: 'https://api.harvestapp.com/v2/expenses?page=1&per_page=2000'
                  next: null
                  previous: null
                  last: 'https://api.harvestapp.com/v2/expenses?page=1&per_page=2000'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: user_id
          description: 'Only return expenses belonging to the user with the given ID.'
          required: false
          in: query
          schema:
            type: integer
        -
          name: client_id
          description: 'Only return expenses belonging to the client with the given ID.'
          required: false
          in: query
          schema:
            type: integer
        -
          name: project_id
          description: 'Only return expenses belonging to the project with the given ID.'
          required: false
          in: query
          schema:
            type: integer
        -
          name: is_billed
          description: 'Pass true to only return expenses that have been invoiced and false to return expenses that have not been invoiced.'
          required: false
          in: query
          schema:
            type: boolean
        -
          name: updated_since
          description: 'Only return expenses that have been updated since the given date and time.'
          required: false
          in: query
          schema:
            type: string
        -
          name: from
          description: 'Only return expenses with a spent_date on or after the given date.'
          required: false
          in: query
          schema:
            type: string
        -
          name: to
          description: 'Only return expenses with a spent_date on or before the given date.'
          required: false
          in: query
          schema:
            type: string
        -
          name: page
          description: 'The page number to use in pagination. For instance, if you make a list request and receive 2000 records, your subsequent call can include page=2 to retrieve the next page of the list. (Default: 1)'
          required: false
          in: query
          schema:
            type: integer
        -
          name: per_page
          description: 'The number of records to return per page. Can range between 1 and 2000. (Default: 2000)'
          required: false
          in: query
          schema:
            type: integer
    post:
      summary: 'Create an expense'
      operationId: createExpense
      description: 'Creates a new expense object. Returns an expense object and a 201 Created response code if the call succeeded.'
      externalDocs:
        description: 'Create an expense'
        url: 'https://help.getharvest.com/api-v2/expenses-api/expenses/expenses/#create-an-expense'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        201:
          description: 'Create an expense'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Expense'
              example:
                id: 15297032
                notes: null
                total_cost: 13.59
                units: 1.0
                is_closed: false
                is_locked: false
                is_billed: false
                locked_reason: null
                spent_date: '2017-03-01'
                created_at: '2017-06-27T15:42:27Z'
                updated_at: '2017-06-27T15:42:27Z'
                billable: true
                receipt: null
                user:
                  id: 1782959
                  name: 'Kim Allen'
                user_assignment:
                  id: 125068553
                  is_project_manager: true
                  is_active: true
                  budget: null
                  created_at: '2017-06-26T22:32:52Z'
                  updated_at: '2017-06-26T22:32:52Z'
                  hourly_rate: 100.0
                project:
                  id: 14308069
                  name: 'Online Store - Phase 1'
                  code: OS1
                expense_category:
                  id: 4195926
                  name: Meals
                  unit_price: null
                  unit_name: null
                client:
                  id: 5735776
                  name: '123 Industries'
                  currency: EUR
                invoice: null
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      requestBody:
        description: 'json payload'
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                user_id:
                  type: integer
                  description: 'The ID of the user associated with this expense. Defaults to the ID of the currently authenticated user.'
                  nullable: true
                  format: int32
                project_id:
                  type: integer
                  description: 'The ID of the project associated with this expense.'
                  nullable: true
                  format: int32
                expense_category_id:
                  type: integer
                  description: 'The ID of the expense category this expense is being tracked against.'
                  nullable: true
                  format: int32
                spent_date:
                  type: string
                  description: 'Date the expense occurred.'
                  nullable: true
                  format: date
                units:
                  type: integer
                  description: 'The quantity of units to use in calculating the total_cost of the expense.'
                  nullable: true
                  format: int32
                total_cost:
                  type: number
                  description: 'The total amount of the expense.'
                  nullable: true
                  format: float
                notes:
                  type: string
                  description: 'Textual notes used to describe the expense.'
                  nullable: true
                billable:
                  type: boolean
                  description: 'Whether this expense is billable or not. Defaults to true.'
                  nullable: true
                receipt:
                  type: string
                  description: 'A receipt file to attach to the expense. If including a receipt, you must submit a multipart/form-data request.'
                  nullable: true
              required:
                - project_id
                - expense_category_id
                - spent_date
  '/expenses/{expenseId}':
    delete:
      summary: 'Delete an expense'
      operationId: deleteExpense
      description: 'Delete an expense. Returns a 200 OK response code if the call succeeded.'
      externalDocs:
        description: 'Delete an expense'
        url: 'https://help.getharvest.com/api-v2/expenses-api/expenses/expenses/#delete-an-expense'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Delete an expense'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: expenseId
          required: true
          in: path
          schema:
            type: string
    get:
      summary: 'Retrieve an expense'
      operationId: retrieveExpense
      description: 'Retrieves the expense with the given ID. Returns an expense object and a 200 OK response code if a valid identifier was provided.'
      externalDocs:
        description: 'Retrieve an expense'
        url: 'https://help.getharvest.com/api-v2/expenses-api/expenses/expenses/#retrieve-an-expense'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Retrieve an expense'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Expense'
              example:
                id: 15296442
                notes: 'Lunch with client'
                total_cost: 33.35
                units: 1.0
                is_closed: false
                is_locked: true
                is_billed: true
                locked_reason: 'Expense is invoiced.'
                spent_date: '2017-03-03'
                created_at: '2017-06-27T15:09:54Z'
                updated_at: '2017-06-27T16:47:14Z'
                billable: true
                receipt:
                  url: 'https://{ACCOUNT_SUBDOMAIN}.harvestapp.com/expenses/15296442/receipt'
                  file_name: lunch_receipt.gif
                  file_size: 39410
                  content_type: image/gif
                user:
                  id: 1782959
                  name: 'Kim Allen'
                user_assignment:
                  id: 125068553
                  is_project_manager: true
                  is_active: true
                  budget: null
                  created_at: '2017-06-26T22:32:52Z'
                  updated_at: '2017-06-26T22:32:52Z'
                  hourly_rate: 100.0
                project:
                  id: 14307913
                  name: 'Marketing Website'
                  code: MW
                expense_category:
                  id: 4195926
                  name: Meals
                  unit_price: null
                  unit_name: null
                client:
                  id: 5735774
                  name: 'ABC Corp'
                  currency: USD
                invoice:
                  id: 13150403
                  number: '1001'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: expenseId
          required: true
          in: path
          schema:
            type: string
    patch:
      summary: 'Update an expense'
      operationId: updateExpense
      description: "Updates the specific expense by setting the values of the parameters passed. Any parameters not provided will be left unchanged. Returns an expense object and a 200 OK response code if the call succeeded.\n\nNote that changes to project_id and expense_category_id will be silently dropped if the expense is locked. Users with sufficient permissions are able to update the rest of a locked expense’s attributes."
      externalDocs:
        description: 'Update an expense'
        url: 'https://help.getharvest.com/api-v2/expenses-api/expenses/expenses/#update-an-expense'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Update an expense'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Expense'
              example:
                id: 15297032
                notes: Dinner
                total_cost: 13.59
                units: 1.0
                is_closed: false
                is_locked: false
                is_billed: false
                locked_reason: null
                spent_date: '2017-03-01'
                created_at: '2017-06-27T15:42:27Z'
                updated_at: '2017-06-27T15:45:51Z'
                billable: true
                receipt:
                  url: 'https://{ACCOUNT_SUBDOMAIN}.harvestapp.com/expenses/15297032/receipt'
                  file_name: dinner_receipt.gif
                  file_size: 39410
                  content_type: image/gif
                user:
                  id: 1782959
                  name: 'Kim Allen'
                user_assignment:
                  id: 125068553
                  is_project_manager: true
                  is_active: true
                  budget: null
                  created_at: '2017-06-26T22:32:52Z'
                  updated_at: '2017-06-26T22:32:52Z'
                  hourly_rate: 100.0
                project:
                  id: 14308069
                  name: 'Online Store - Phase 1'
                  code: OS1
                expense_category:
                  id: 4195926
                  name: Meals
                  unit_price: null
                  unit_name: null
                client:
                  id: 5735776
                  name: '123 Industries'
                  currency: EUR
                invoice: null
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: expenseId
          required: true
          in: path
          schema:
            type: string
      requestBody:
        description: 'json payload'
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                project_id:
                  type: integer
                  description: 'The ID of the project associated with this expense.'
                  nullable: true
                  format: int32
                expense_category_id:
                  type: integer
                  description: 'The ID of the expense category this expense is being tracked against.'
                  nullable: true
                  format: int32
                spent_date:
                  type: string
                  description: 'Date the expense occurred.'
                  nullable: true
                  format: date
                units:
                  type: integer
                  description: 'The quantity of units to use in calculating the total_cost of the expense.'
                  nullable: true
                  format: int32
                total_cost:
                  type: number
                  description: 'The total amount of the expense.'
                  nullable: true
                  format: float
                notes:
                  type: string
                  description: 'Textual notes used to describe the expense.'
                  nullable: true
                billable:
                  type: boolean
                  description: 'Whether this expense is billable or not. Defaults to true.'
                  nullable: true
                receipt:
                  type: string
                  description: 'A receipt file to attach to the expense. If including a receipt, you must submit a multipart/form-data request.'
                  nullable: true
                delete_receipt:
                  type: boolean
                  description: 'Whether an attached expense receipt should be deleted. Pass true to delete the expense receipt.'
                  nullable: true
  /invoice_item_categories:
    get:
      summary: 'List all invoice item categories'
      operationId: listInvoiceItemCategories
      description: "Returns a list of your invoice item categories. The invoice item categories are returned sorted by creation date, with the most recently created invoice item categories appearing first.\n\nThe response contains an object with a invoice_item_categories property that contains an array of up to per_page invoice item categories. Each entry in the array is a separate invoice item category object. If no more invoice item categories are available, the resulting array will be empty. Several additional pagination properties are included in the response to simplify paginating your invoice item categories."
      externalDocs:
        description: 'List all invoice item categories'
        url: 'https://help.getharvest.com/api-v2/invoices-api/invoices/invoice-item-categories/#list-all-invoice-item-categories'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'List all invoice item categories'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InvoiceItemCategories'
              example:
                invoice_item_categories:
                  -
                    id: 1466293
                    name: Product
                    use_as_service: false
                    use_as_expense: true
                    created_at: '2017-06-26T20:41:00Z'
                    updated_at: '2017-06-26T20:41:00Z'
                  -
                    id: 1466292
                    name: Service
                    use_as_service: true
                    use_as_expense: false
                    created_at: '2017-06-26T20:41:00Z'
                    updated_at: '2017-06-26T20:41:00Z'
                per_page: 2000
                total_pages: 1
                total_entries: 2
                next_page: null
                previous_page: null
                page: 1
                links:
                  first: 'https://api.harvestapp.com/v2/invoice_item_categories?page=1&per_page=2000'
                  next: null
                  previous: null
                  last: 'https://api.harvestapp.com/v2/invoice_item_categories?page=1&per_page=2000'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: updated_since
          description: 'Only return invoice item categories that have been updated since the given date and time.'
          required: false
          in: query
          schema:
            type: string
        -
          name: page
          description: 'DEPRECATED The page number to use in pagination. For instance, if you make a list request and receive 2000 records, your subsequent call can include page=2 to retrieve the next page of the list. (Default: 1)'
          required: false
          in: query
          schema:
            type: integer
          deprecated: true
        -
          name: cursor
          description: 'Pagination cursor'
          required: false
          in: query
          schema:
            type: string
        -
          name: per_page
          description: 'The number of records to return per page. Can range between 1 and 2000. (Default: 2000)'
          required: false
          in: query
          schema:
            type: integer
    post:
      summary: 'Create an invoice item category'
      operationId: createInvoiceItemCategory
      description: 'Creates a new invoice item category object. Returns an invoice item category object and a 201 Created response code if the call succeeded.'
      externalDocs:
        description: 'Create an invoice item category'
        url: 'https://help.getharvest.com/api-v2/invoices-api/invoices/invoice-item-categories/#create-an-invoice-item-category'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        201:
          description: 'Create an invoice item category'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InvoiceItemCategory'
              example:
                id: 1467098
                name: Hosting
                use_as_service: false
                use_as_expense: false
                created_at: '2017-06-27T16:20:59Z'
                updated_at: '2017-06-27T16:20:59Z'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      requestBody:
        description: 'json payload'
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'The name of the invoice item category.'
                  nullable: true
              required:
                - name
  '/invoice_item_categories/{invoiceItemCategoryId}':
    delete:
      summary: 'Delete an invoice item category'
      operationId: deleteInvoiceItemCategory
      description: 'Delete an invoice item category. Deleting an invoice item category is only possible if use_as_service and use_as_expense are both false. Returns a 200 OK response code if the call succeeded.'
      externalDocs:
        description: 'Delete an invoice item category'
        url: 'https://help.getharvest.com/api-v2/invoices-api/invoices/invoice-item-categories/#delete-an-invoice-item-category'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Delete an invoice item category'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: invoiceItemCategoryId
          required: true
          in: path
          schema:
            type: string
    get:
      summary: 'Retrieve an invoice item category'
      operationId: retrieveInvoiceItemCategory
      description: 'Retrieves the invoice item category with the given ID. Returns an invoice item category object and a 200 OK response code if a valid identifier was provided.'
      externalDocs:
        description: 'Retrieve an invoice item category'
        url: 'https://help.getharvest.com/api-v2/invoices-api/invoices/invoice-item-categories/#retrieve-an-invoice-item-category'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Retrieve an invoice item category'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InvoiceItemCategory'
              example:
                id: 1466293
                name: Product
                use_as_service: false
                use_as_expense: true
                created_at: '2017-06-26T20:41:00Z'
                updated_at: '2017-06-26T20:41:00Z'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: invoiceItemCategoryId
          required: true
          in: path
          schema:
            type: string
    patch:
      summary: 'Update an invoice item category'
      operationId: updateInvoiceItemCategory
      description: 'Updates the specific invoice item category by setting the values of the parameters passed. Any parameters not provided will be left unchanged. Returns an invoice item category object and a 200 OK response code if the call succeeded.'
      externalDocs:
        description: 'Update an invoice item category'
        url: 'https://help.getharvest.com/api-v2/invoices-api/invoices/invoice-item-categories/#update-an-invoice-item-category'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Update an invoice item category'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InvoiceItemCategory'
              example:
                id: 1467098
                name: Expense
                use_as_service: false
                use_as_expense: false
                created_at: '2017-06-27T16:20:59Z'
                updated_at: '2017-06-27T16:21:26Z'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: invoiceItemCategoryId
          required: true
          in: path
          schema:
            type: string
      requestBody:
        description: 'json payload'
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'The name of the invoice item category.'
                  nullable: true
  /invoices:
    get:
      summary: 'List all invoices'
      operationId: listInvoices
      description: "Returns a list of your invoices. The invoices are returned sorted by issue date, with the most recently issued invoices appearing first.\n\nThe response contains an object with a invoices property that contains an array of up to per_page invoices. Each entry in the array is a separate invoice object. If no more invoices are available, the resulting array will be empty. Several additional pagination properties are included in the response to simplify paginating your invoices."
      externalDocs:
        description: 'List all invoices'
        url: 'https://help.getharvest.com/api-v2/invoices-api/invoices/invoices/#list-all-invoices'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'List all invoices'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Invoices'
              example:
                invoices:
                  -
                    id: 13150403
                    client_key: 21312da13d457947a217da6775477afee8c2eba8
                    number: '1001'
                    purchase_order: ''
                    amount: 288.9
                    due_amount: 288.9
                    tax: 5
                    tax_amount: 13.5
                    tax2: 2
                    tax2_amount: 5.4
                    discount: 10
                    discount_amount: 30
                    subject: 'Online Store - Phase 1'
                    notes: 'Some notes about the invoice.'
                    state: open
                    period_start: '2017-03-01'
                    period_end: '2017-03-01'
                    issue_date: '2017-04-01'
                    due_date: '2017-04-01'
                    payment_term: 'upon receipt'
                    sent_at: '2017-08-23T22:25:59Z'
                    paid_at: null
                    paid_date: null
                    closed_at: null
                    recurring_invoice_id: null
                    created_at: '2017-06-27T16:27:16Z'
                    updated_at: '2017-08-23T22:25:59Z'
                    currency: EUR
                    payment_options:
                      - credit_card
                    client:
                      id: 5735776
                      name: '123 Industries'
                    estimate: null
                    retainer: null
                    creator:
                      id: 1782884
                      name: 'Bob Powell'
                    line_items:
                      -
                        id: 53341602
                        kind: Service
                        description: '03/01/2017 - Project Management: [9:00am - 11:00am] Planning meetings'
                        quantity: 2
                        unit_price: 100
                        amount: 200
                        taxed: true
                        taxed2: true
                        project:
                          id: 14308069
                          name: 'Online Store - Phase 1'
                          code: OS1
                      -
                        id: 53341603
                        kind: Service
                        description: '03/01/2017 - Programming: [1:00pm - 2:00pm] Importing products'
                        quantity: 1
                        unit_price: 100
                        amount: 100
                        taxed: true
                        taxed2: true
                        project:
                          id: 14308069
                          name: 'Online Store - Phase 1'
                          code: OS1
                  -
                    id: 13150378
                    client_key: 9e97f4a65c5b83b1fc02f54e5a41c9dc7d458542
                    number: '1000'
                    purchase_order: '1234'
                    amount: 10700.0
                    due_amount: 0.0
                    tax: 5.0
                    tax_amount: 500.0
                    tax2: 2.0
                    tax2_amount: 200.0
                    discount: null
                    discount_amount: 0.0
                    subject: 'Online Store - Phase 1'
                    notes: 'Some notes about the invoice.'
                    state: paid
                    period_start: null
                    period_end: null
                    issue_date: '2017-02-01'
                    due_date: '2017-03-03'
                    payment_term: custom
                    sent_at: '2017-02-01T07:00:00Z'
                    paid_at: '2017-02-21T00:00:00Z'
                    paid_date: '2017-02-21'
                    closed_at: null
                    recurring_invoice_id: null
                    created_at: '2017-06-27T16:24:30Z'
                    updated_at: '2017-06-27T16:24:57Z'
                    currency: USD
                    client:
                      id: 5735776
                      name: '123 Industries'
                    estimate:
                      id: 1439814
                    retainer: null
                    creator:
                      id: 1782884
                      name: 'Bob Powell'
                    line_items:
                      -
                        id: 53341450
                        kind: Service
                        description: '50% of Phase 1 of the Online Store'
                        quantity: 100.0
                        unit_price: 100.0
                        amount: 10000.0
                        taxed: true
                        taxed2: true
                        project:
                          id: 14308069
                          name: 'Online Store - Phase 1'
                          code: OS1
                per_page: 100
                total_pages: 1
                total_entries: 2
                next_page: null
                previous_page: null
                page: 1
                links:
                  first: 'https://api.harvestapp.com/v2/invoices?page=1&per_page=100'
                  next: null
                  previous: null
                  last: 'https://api.harvestapp.com/v2/invoices?page=1&per_page=100'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: client_id
          description: 'Only return invoices belonging to the client with the given ID.'
          required: false
          in: query
          schema:
            type: integer
        -
          name: project_id
          description: 'Only return invoices associated with the project with the given ID.'
          required: false
          in: query
          schema:
            type: integer
        -
          name: updated_since
          description: 'Only return invoices that have been updated since the given date and time.'
          required: false
          in: query
          schema:
            type: string
        -
          name: from
          description: 'Only return invoices with an issue_date on or after the given date.'
          required: false
          in: query
          schema:
            type: string
        -
          name: to
          description: 'Only return invoices with an issue_date on or before the given date.'
          required: false
          in: query
          schema:
            type: string
        -
          name: state
          description: 'Only return invoices with a state matching the value provided. Options: draft, open, paid, or closed.'
          required: false
          in: query
          schema:
            type: string
        -
          name: page
          description: 'The page number to use in pagination. For instance, if you make a list request and receive 100 records, your subsequent call can include page=2 to retrieve the next page of the list. (Default: 1)'
          required: false
          in: query
          schema:
            type: integer
        -
          name: per_page
          description: 'The number of records to return per page. Can range between 1 and 2000. (Default: 100)'
          required: false
          in: query
          schema:
            type: integer
    post:
      summary: 'Create an invoice'
      operationId: createInvoice
      description: 'Creates a new invoice object. Returns an invoice object and a 201 Created response code if the call succeeded.'
      externalDocs:
        description: 'Create a free-form invoice'
        url: 'https://help.getharvest.com/api-v2/invoices-api/invoices/invoices/#create-a-free-form-invoice'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        201:
          description: 'Create an invoice'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Invoice'
              example:
                id: 13150453
                client_key: 8b86437630b6c260c1bfa289f0154960f83b606d
                number: '1002'
                purchase_order: null
                amount: 5000.0
                due_amount: 5000.0
                tax: null
                tax_amount: 0.0
                tax2: null
                tax2_amount: 0.0
                discount: null
                discount_amount: 0.0
                subject: 'ABC Project Quote'
                notes: null
                state: draft
                period_start: null
                period_end: null
                issue_date: '2017-06-27'
                due_date: '2017-07-27'
                payment_term: custom
                sent_at: null
                paid_at: null
                paid_date: null
                closed_at: null
                recurring_invoice_id: null
                created_at: '2017-06-27T16:34:24Z'
                updated_at: '2017-06-27T16:34:24Z'
                currency: USD
                payment_options:
                  - credit_card
                client:
                  id: 5735774
                  name: 'ABC Corp'
                estimate: null
                retainer: null
                creator:
                  id: 1782884
                  name: 'Bob Powell'
                line_items:
                  -
                    id: 53341928
                    kind: Service
                    description: 'ABC Project'
                    quantity: 1.0
                    unit_price: 5000.0
                    amount: 5000.0
                    taxed: false
                    taxed2: false
                    project: null
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      requestBody:
        description: 'json payload'
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                client_id:
                  type: integer
                  description: 'The ID of the client this invoice belongs to.'
                  nullable: true
                  format: int32
                estimate_id:
                  type: integer
                  description: 'The ID of the estimate associated with this invoice.'
                  nullable: true
                  format: int32
                number:
                  type: string
                  description: 'If no value is set, the number will be automatically generated.'
                  nullable: true
                purchase_order:
                  type: string
                  description: 'The purchase order number.'
                  nullable: true
                tax:
                  type: number
                  description: 'This percentage is applied to the subtotal, including line items and discounts. Example: use 10.0 for 10.0%.'
                  nullable: true
                  format: float
                tax2:
                  type: number
                  description: 'This percentage is applied to the subtotal, including line items and discounts. Example: use 10.0 for 10.0%.'
                  nullable: true
                  format: float
                discount:
                  type: number
                  description: 'This percentage is subtracted from the subtotal. Example: use 10.0 for 10.0%.'
                  nullable: true
                  format: float
                subject:
                  type: string
                  description: 'The invoice subject.'
                  nullable: true
                notes:
                  type: string
                  description: 'Any additional notes to include on the invoice.'
                  nullable: true
                currency:
                  type: string
                  description: 'The currency used by the invoice. If not provided, the client’s currency will be used. See a list of supported currencies'
                  nullable: true
                issue_date:
                  type: string
                  description: 'Date the invoice was issued. Defaults to today’s date.'
                  nullable: true
                  format: date
                due_date:
                  type: string
                  description: 'Date the invoice is due. Defaults to the issue_date if no payment_term is specified. To set a custom due_date the payment_term must also be set to custom, otherwise the value supplied in the request for due_date will be ignored and the due_date will be calculated using the issue_date and the payment_term.'
                  nullable: true
                  format: date
                payment_term:
                  type: string
                  description: 'The timeframe in which the invoice should be paid. Defaults to custom. Options: upon receipt, net 15, net 30, net 45, net 60, or custom.'
                  nullable: true
                payment_options:
                  type: array
                  description: 'The payment options available to pay the invoice. Your account must be configured with the appropriate options under Settings > Integrations > Online payment to assign them. Options: [ach, credit_card, paypal]'
                  nullable: true
                  items:
                    type: string
                    enum:
                      - ach
                      - credit_card
                      - paypal
                line_items_import:
                  type: object
                  description: 'An line items import object'
                  nullable: true
                  required:
                    - project_ids
                  properties:
                    project_ids:
                      description: 'An array of the client’s project IDs you’d like to include time/expenses from.'
                      type: array
                      items:
                        type: integer
                    time:
                      description: 'An time import object.'
                      type: object
                      required:
                        - summary_type
                      properties:
                        summary_type:
                          type: string
                          description: 'How to summarize the time entries per line item. Options: project, task, people, or detailed.'
                        from:
                          type: string
                          format: date
                          description: 'Start date for included time entries. Must be provided if to is present. If neither from or to are provided, all unbilled time entries will be included.'
                        to:
                          type: string
                          format: date
                          description: 'End date for included time entries. Must be provided if from is present. If neither from or to are provided, all unbilled time entries will be included.'
                    expenses:
                      description: 'An expense import object.'
                      type: object
                      required:
                        - summary_type
                      properties:
                        summary_type:
                          type: string
                          description: 'How to summarize the expenses per line item. Options: project, category, people, or detailed.'
                        from:
                          type: string
                          format: date
                          description: 'Start date for included expenses. Must be provided if to is present. If neither from or to are provided, all unbilled expenses will be included.'
                        to:
                          type: string
                          format: date
                          description: 'End date for included expenses. Must be provided if from is present. If neither from or to are provided, all unbilled expenses will be included.'
                        attach_receipt:
                          type: boolean
                          description: 'If set to true, a PDF containing an expense report with receipts will be attached to the invoice. Defaults to false.'
                retainer_id:
                  type: integer
                  description: 'The ID of the retainer you want to add funds to with this invoice. Note: retainers cannot be fully used (created, drawn against, closed, etc.) via the API at this time. The only available action is to add funds.'
                  nullable: true
                  format: int32
                line_items:
                  type: array
                  description: 'Array of line item parameters'
                  nullable: true
                  items:
                    type: object
                    required:
                      - kind
                      - unit_price
                    properties:
                      project_id:
                        description: 'The ID of the project associated with this line item.'
                        type: integer
                        format: int32
                      kind:
                        description: 'The name of an invoice item category.'
                        type: string
                      description:
                        description: 'Text description of the line item.'
                        type: string
                      quantity:
                        description: 'The unit quantity of the item. Defaults to 1.'
                        type: number
                        format: float
                      unit_price:
                        description: 'The individual price per unit.'
                        type: number
                        format: float
                      taxed:
                        description: 'Whether the invoice’s tax percentage applies to this line item. Defaults to false.'
                        type: boolean
                      taxed2:
                        description: 'Whether the invoice’s tax2 percentage applies to this line item. Defaults to false.'
                        type: boolean
              required:
                - client_id
  '/invoices/{invoiceId}':
    delete:
      summary: 'Delete an invoice'
      operationId: deleteInvoice
      description: 'Delete an invoice. Returns a 200 OK response code if the call succeeded.'
      externalDocs:
        description: 'Delete an invoice'
        url: 'https://help.getharvest.com/api-v2/invoices-api/invoices/invoices/#delete-an-invoice'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Delete an invoice'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: invoiceId
          required: true
          in: path
          schema:
            type: string
    get:
      summary: 'Retrieve an invoice'
      operationId: retrieveInvoice
      description: 'Retrieves the invoice with the given ID. Returns an invoice object and a 200 OK response code if a valid identifier was provided.'
      externalDocs:
        description: 'Retrieve an invoice'
        url: 'https://help.getharvest.com/api-v2/invoices-api/invoices/invoices/#retrieve-an-invoice'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Retrieve an invoice'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Invoice'
              example:
                id: 13150378
                client_key: 9e97f4a65c5b83b1fc02f54e5a41c9dc7d458542
                number: '1000'
                purchase_order: '1234'
                amount: 10700.0
                due_amount: 0.0
                tax: 5.0
                tax_amount: 500.0
                tax2: 2.0
                tax2_amount: 200.0
                discount: null
                discount_amount: 0.0
                subject: 'Online Store - Phase 1'
                notes: 'Some notes about the invoice.'
                state: paid
                period_start: null
                period_end: null
                issue_date: '2017-02-01'
                due_date: '2017-03-03'
                payment_term: custom
                sent_at: '2017-02-01T07:00:00Z'
                paid_at: '2017-02-21T00:00:00Z'
                paid_date: '2017-02-21'
                closed_at: null
                recurring_invoice_id: null
                created_at: '2017-06-27T16:24:30Z'
                updated_at: '2017-06-27T16:24:57Z'
                currency: USD
                payment_options:
                  - credit_card
                client:
                  id: 5735776
                  name: '123 Industries'
                estimate:
                  id: 1439814
                retainer: null
                creator:
                  id: 1782884
                  name: 'Bob Powell'
                line_items:
                  -
                    id: 53341450
                    kind: Service
                    description: '50% of Phase 1 of the Online Store'
                    quantity: 100.0
                    unit_price: 100.0
                    amount: 10000.0
                    taxed: true
                    taxed2: true
                    project:
                      id: 14308069
                      name: 'Online Store - Phase 1'
                      code: OS1
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: invoiceId
          required: true
          in: path
          schema:
            type: string
    patch:
      summary: 'Update an invoice'
      operationId: updateInvoice
      description: 'Updates the specific invoice by setting the values of the parameters passed. Any parameters not provided will be left unchanged. Returns an invoice object and a 200 OK response code if the call succeeded.'
      externalDocs:
        description: 'Update an invoice'
        url: 'https://help.getharvest.com/api-v2/invoices-api/invoices/invoices/#update-an-invoice'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Update an invoice'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Invoice'
              example:
                id: 13150453
                client_key: 8b86437630b6c260c1bfa289f0154960f83b606d
                number: '1002'
                purchase_order: '2345'
                amount: 5000.0
                due_amount: 5000.0
                tax: null
                tax_amount: 0.0
                tax2: null
                tax2_amount: 0.0
                discount: null
                discount_amount: 0.0
                subject: 'ABC Project Quote'
                notes: null
                state: draft
                period_start: null
                period_end: null
                issue_date: '2017-06-27'
                due_date: '2017-07-27'
                payment_term: custom
                sent_at: null
                paid_at: null
                paid_date: null
                closed_at: null
                recurring_invoice_id: null
                created_at: '2017-06-27T16:34:24Z'
                updated_at: '2017-06-27T16:36:33Z'
                currency: USD
                payment_options:
                  - credit_card
                client:
                  id: 5735774
                  name: 'ABC Corp'
                estimate: null
                retainer: null
                creator:
                  id: 1782884
                  name: 'Bob Powell'
                line_items:
                  -
                    id: 53341928
                    kind: Service
                    description: 'ABC Project'
                    quantity: 1.0
                    unit_price: 5000.0
                    amount: 5000.0
                    taxed: false
                    taxed2: false
                    project: null
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: invoiceId
          required: true
          in: path
          schema:
            type: string
      requestBody:
        description: 'json payload'
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                client_id:
                  type: integer
                  description: 'The ID of the client this invoice belongs to.'
                  nullable: true
                  format: int32
                retainer_id:
                  type: integer
                  description: 'The ID of the retainer associated with this invoice.'
                  nullable: true
                  format: int32
                estimate_id:
                  type: integer
                  description: 'The ID of the estimate associated with this invoice.'
                  nullable: true
                  format: int32
                number:
                  type: string
                  description: 'If no value is set, the number will be automatically generated.'
                  nullable: true
                purchase_order:
                  type: string
                  description: 'The purchase order number.'
                  nullable: true
                tax:
                  type: number
                  description: 'This percentage is applied to the subtotal, including line items and discounts. Example: use 10.0 for 10.0%.'
                  nullable: true
                  format: float
                tax2:
                  type: number
                  description: 'This percentage is applied to the subtotal, including line items and discounts. Example: use 10.0 for 10.0%.'
                  nullable: true
                  format: float
                discount:
                  type: number
                  description: 'This percentage is subtracted from the subtotal. Example: use 10.0 for 10.0%.'
                  nullable: true
                  format: float
                subject:
                  type: string
                  description: 'The invoice subject.'
                  nullable: true
                notes:
                  type: string
                  description: 'Any additional notes to include on the invoice.'
                  nullable: true
                currency:
                  type: string
                  description: 'The currency used by the invoice. If not provided, the client’s currency will be used. See a list of supported currencies'
                  nullable: true
                issue_date:
                  type: string
                  description: 'Date the invoice was issued.'
                  nullable: true
                  format: date
                due_date:
                  type: string
                  description: 'Date the invoice is due.'
                  nullable: true
                  format: date
                payment_term:
                  type: string
                  description: 'The timeframe in which the invoice should be paid. Options: upon receipt, net 15, net 30, net 45, or net 60.'
                  nullable: true
                payment_options:
                  type: array
                  description: 'The payment options available to pay the invoice. Your account must be configured with the appropriate options under Settings > Integrations > Online payment to assign them. Options: [ach, credit_card, paypal]'
                  nullable: true
                  items:
                    type: string
                    enum:
                      - ach
                      - credit_card
                      - paypal
                line_items:
                  type: array
                  description: 'Array of line item parameters'
                  nullable: true
                  items:
                    type: object
                    properties:
                      id:
                        description: 'Unique ID for the line item.'
                        type: integer
                        format: int32
                      project_id:
                        description: 'The ID of the project associated with this line item.'
                        type: integer
                        format: int32
                      kind:
                        description: 'The name of an invoice item category.'
                        type: string
                      description:
                        description: 'Text description of the line item.'
                        type: string
                      quantity:
                        description: 'The unit quantity of the item. Defaults to 1.'
                        type: number
                        format: float
                      unit_price:
                        description: 'The individual price per unit.'
                        type: number
                        format: float
                      taxed:
                        description: 'Whether the invoice’s tax percentage applies to this line item. Defaults to false.'
                        type: boolean
                      taxed2:
                        description: 'Whether the invoice’s tax2 percentage applies to this line item. Defaults to false.'
                        type: boolean
  '/invoices/{invoiceId}/messages':
    get:
      summary: 'List all messages for an invoice'
      operationId: listMessagesForInvoice
      description: "Returns a list of messages associated with a given invoice. The invoice messages are returned sorted by creation date, with the most recently created messages appearing first.\n\nThe response contains an object with an invoice_messages property that contains an array of up to per_page messages. Each entry in the array is a separate message object. If no more messages are available, the resulting array will be empty. Several additional pagination properties are included in the response to simplify paginating your messages."
      externalDocs:
        description: 'List all messages for an invoice'
        url: 'https://help.getharvest.com/api-v2/invoices-api/invoices/invoice-messages/#list-all-messages-for-an-invoice'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'List all messages for an invoice'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InvoiceMessages'
              example:
                invoice_messages:
                  -
                    id: 27835209
                    sent_by: 'Bob Powell'
                    sent_by_email: bobpowell@example.com
                    sent_from: 'Bob Powell'
                    sent_from_email: bobpowell@example.com
                    include_link_to_client_invoice: false
                    send_me_a_copy: false
                    thank_you: false
                    reminder: false
                    send_reminder_on: null
                    created_at: '2017-08-23T22:15:06Z'
                    updated_at: '2017-08-23T22:15:06Z'
                    attach_pdf: true
                    event_type: null
                    recipients:
                      -
                        name: 'Richard Roe'
                        email: richardroe@example.com
                    subject: 'Past due invoice reminder: #1001 from API Examples'
                    body: "Dear Customer,\r\n\r\nThis is a friendly reminder to let you know that Invoice 1001 is 144 days past due. If you have already sent the payment, please disregard this message. If not, we would appreciate your prompt attention to this matter.\r\n\r\nThank you for your business.\r\n\r\nCheers,\r\nAPI Examples"
                  -
                    id: 27835207
                    sent_by: 'Bob Powell'
                    sent_by_email: bobpowell@example.com
                    sent_from: 'Bob Powell'
                    sent_from_email: bobpowell@example.com
                    include_link_to_client_invoice: false
                    send_me_a_copy: true
                    thank_you: false
                    reminder: false
                    send_reminder_on: null
                    created_at: '2017-08-23T22:14:49Z'
                    updated_at: '2017-08-23T22:14:49Z'
                    attach_pdf: true
                    event_type: null
                    recipients:
                      -
                        name: 'Richard Roe'
                        email: richardroe@example.com
                      -
                        name: 'Bob Powell'
                        email: bobpowell@example.com
                    subject: 'Invoice #1001 from API Examples'
                    body: "---------------------------------------------\r\nInvoice Summary\r\n---------------------------------------------\r\nInvoice ID: 1001\r\nIssue Date: 04/01/2017\r\nClient: 123 Industries\r\nP.O. Number: \r\nAmount: €288.90\r\nDue: 04/01/2017 (upon receipt)\r\n\r\nThe detailed invoice is attached as a PDF.\r\n\r\nThank you!\r\n---------------------------------------------"
                per_page: 2000
                total_pages: 1
                total_entries: 2
                next_page: null
                previous_page: null
                page: 1
                links:
                  first: 'https://api.harvestapp.com/api/v2/invoices/13150403/messages?page=1&per_page=2000'
                  next: null
                  previous: null
                  last: 'https://api.harvestapp.com/v2/invoices/13150403/messages?page=1&per_page=2000'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: invoiceId
          required: true
          in: path
          schema:
            type: string
        -
          name: updated_since
          description: 'Only return invoice messages that have been updated since the given date and time.'
          required: false
          in: query
          schema:
            type: string
        -
          name: page
          description: 'DEPRECATED The page number to use in pagination. For instance, if you make a list request and receive 2000 records, your subsequent call can include page=2 to retrieve the next page of the list. (Default: 1)'
          required: false
          in: query
          schema:
            type: integer
          deprecated: true
        -
          name: cursor
          description: 'Pagination cursor'
          required: false
          in: query
          schema:
            type: string
        -
          name: per_page
          description: 'The number of records to return per page. Can range between 1 and 2000. (Default: 2000)'
          required: false
          in: query
          schema:
            type: integer
    post:
      summary: 'Create and send an invoice message'
      operationId: createInvoiceMessage
      description: "Creates a new invoice message object and sends it. Returns an invoice message object and a 201 Created response code if the call succeeded.\n\nA note about the optional event_type parameter: If event_type is omitted in a request, its default value of null means the message will be sent. In such a request, if the recipients array is omitted or empty and send_me_a_copy is also omitted or set to false, the request will fail because the message has no recipients. When omitting event_type to create and send a message, be sure to include a recipients array as a parameter or ensure the send_me_a_copy parameter is included and set to true."
      externalDocs:
        description: 'Create and send an invoice message'
        url: 'https://help.getharvest.com/api-v2/invoices-api/invoices/invoice-messages/#create-and-send-an-invoice-message'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        201:
          description: 'Create and send an invoice message'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InvoiceMessage'
              example:
                id: 27835324
                sent_by: 'Bob Powell'
                sent_by_email: bobpowell@example.com
                sent_from: 'Bob Powell'
                sent_from_email: bobpowell@example.com
                include_link_to_client_invoice: false
                send_me_a_copy: true
                thank_you: false
                reminder: false
                send_reminder_on: null
                created_at: '2017-08-23T22:25:59Z'
                updated_at: '2017-08-23T22:25:59Z'
                attach_pdf: true
                event_type: null
                recipients:
                  -
                    name: 'Richard Roe'
                    email: richardroe@example.com
                  -
                    name: 'Bob Powell'
                    email: bobpowell@example.com
                subject: 'Invoice #1001'
                body: 'The invoice is attached below.'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: invoiceId
          required: true
          in: path
          schema:
            type: string
      requestBody:
        description: 'json payload'
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                event_type:
                  type: string
                  description: 'Omit when intending to create and send a message. If omitted, the default value is null and the message will be sent. See other sections below for including this parameter with the following options: close, draft, re-open, or send (which marks a draft invoice as sent, it does not send the message).'
                  nullable: true
                recipients:
                  type: array
                  description: 'Array of recipient parameters. See below for more details.'
                  nullable: true
                  items:
                    type: object
                    required:
                      - email
                    properties:
                      name:
                        description: 'Name of the message recipient.'
                        type: string
                      email:
                        description: 'Email of the message recipient.'
                        type: string
                        format: email
                subject:
                  type: string
                  description: 'The message subject.'
                  nullable: true
                body:
                  type: string
                  description: 'The message body.'
                  nullable: true
                include_link_to_client_invoice:
                  type: boolean
                  description: 'DEPRECATED A link to the client invoice URL will be automatically included in the message email if payment_options have been assigned to the invoice. Setting to true will be ignored. Setting to false will clear all payment_options on the invoice.'
                  nullable: true
                  deprecated: true
                attach_pdf:
                  type: boolean
                  description: 'If set to true, a PDF of the invoice will be attached to the message email. Defaults to false.'
                  nullable: true
                send_me_a_copy:
                  type: boolean
                  description: 'If set to true, a copy of the message email will be sent to the current user. Defaults to false.'
                  nullable: true
                thank_you:
                  type: boolean
                  description: 'If set to true, a thank you message email will be sent. Defaults to false.'
                  nullable: true
  '/invoices/{invoiceId}/messages/new':
    get:
      summary: 'Retrieve invoice message subject and body for specific invoice'
      operationId: retrieveInvoiceMessageSubjectAndBodyForSpecificInvoice
      description: 'Returns the subject and body text as configured in Harvest of an invoice message for a specific invoice and a 200 OK response code if the call succeeded. Does not create the invoice message. If no parameters are passed, will return the subject and body of a general invoice message for the specific invoice.'
      externalDocs:
        description: 'Retrieve invoice message subject and body for specific invoice'
        url: 'https://help.getharvest.com/api-v2/invoices-api/invoices/invoice-messages/#retrieve-invoice-message-subject-and-body-for-specific-invoice'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Retrieve invoice message subject and body for specific invoice'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InvoiceMessageSubjectAndBody'
              example:
                invoice_id: 13150403
                subject: 'Past due invoice reminder: #1002 from API Examples'
                body: "Dear Customer,\n\nThis is a friendly reminder to let you know that Invoice 1002 is 20 days past due. If you have already sent the payment, please disregard this message. If not, we would appreciate your prompt attention to this matter.\n\nThank you for your business.\n\nCheers,\nAPI Examples\n"
                reminder: false
                thank_you: false
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: invoiceId
          required: true
          in: path
          schema:
            type: string
        -
          name: thank_you
          description: 'Set to true to return the subject and body of a thank-you invoice message for the specific invoice.'
          required: false
          in: query
          schema:
            type: boolean
        -
          name: reminder
          description: 'Set to true to return the subject and body of a reminder invoice message for the specific invoice.'
          required: false
          in: query
          schema:
            type: boolean
  '/invoices/{invoiceId}/messages/{messageId}':
    delete:
      summary: 'Delete an invoice message'
      operationId: deleteInvoiceMessage
      description: 'Delete an invoice message. Returns a 200 OK response code if the call succeeded.'
      externalDocs:
        description: 'Delete an invoice message'
        url: 'https://help.getharvest.com/api-v2/invoices-api/invoices/invoice-messages/#delete-an-invoice-message'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Delete an invoice message'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: invoiceId
          required: true
          in: path
          schema:
            type: string
        -
          name: messageId
          required: true
          in: path
          schema:
            type: string
  '/invoices/{invoiceId}/payments':
    get:
      summary: 'List all payments for an invoice'
      operationId: listPaymentsForInvoice
      description: "Returns a list of payments associate with a given invoice. The payments are returned sorted by creation date, with the most recently created payments appearing first.\n\nThe response contains an object with an invoice_payments property that contains an array of up to per_page payments. Each entry in the array is a separate payment object. If no more payments are available, the resulting array will be empty. Several additional pagination properties are included in the response to simplify paginating your payments."
      externalDocs:
        description: 'List all payments for an invoice'
        url: 'https://help.getharvest.com/api-v2/invoices-api/invoices/invoice-payments/#list-all-payments-for-an-invoice'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'List all payments for an invoice'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InvoicePayments'
              example:
                invoice_payments:
                  -
                    id: 10112854
                    amount: 10700
                    paid_at: '2017-02-21T00:00:00Z'
                    paid_date: '2017-02-21'
                    recorded_by: 'Alice Doe'
                    recorded_by_email: alice@example.com
                    notes: 'Paid via check #4321'
                    transaction_id: null
                    created_at: '2017-06-27T16:24:57Z'
                    updated_at: '2017-06-27T16:24:57Z'
                    payment_gateway:
                      id: 1234
                      name: 'Linkpoint International'
                per_page: 2000
                total_pages: 1
                total_entries: 1
                next_page: null
                previous_page: null
                page: 1
                links:
                  first: 'https://api.harvestapp.com/v2/invoices/13150378/payments?page=1&per_page=2000'
                  next: null
                  previous: null
                  last: 'https://api.harvestapp.com/v2/invoices/13150378/payments?page=1&per_page=2000'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: invoiceId
          required: true
          in: path
          schema:
            type: string
        -
          name: updated_since
          description: 'Only return invoice payments that have been updated since the given date and time.'
          required: false
          in: query
          schema:
            type: string
        -
          name: page
          description: 'DEPRECATED The page number to use in pagination. For instance, if you make a list request and receive 2000 records, your subsequent call can include page=2 to retrieve the next page of the list. (Default: 1)'
          required: false
          in: query
          schema:
            type: integer
          deprecated: true
        -
          name: cursor
          description: 'Pagination cursor'
          required: false
          in: query
          schema:
            type: string
        -
          name: per_page
          description: 'The number of records to return per page. Can range between 1 and 2000. (Default: 2000)'
          required: false
          in: query
          schema:
            type: integer
    post:
      summary: 'Create an invoice payment'
      operationId: createInvoicePayment
      description: 'Creates a new invoice payment object. Returns an invoice payment object and a 201 Created response code if the call succeeded.'
      externalDocs:
        description: 'Create an invoice payment'
        url: 'https://help.getharvest.com/api-v2/invoices-api/invoices/invoice-payments/#create-an-invoice-payment'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        201:
          description: 'Create an invoice payment'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InvoicePayment'
              example:
                id: 10336386
                amount: 1575.86
                paid_at: '2017-07-24T13:32:18Z'
                paid_date: '2017-07-24'
                recorded_by: 'Jane Bar'
                recorded_by_email: jane@example.com
                notes: 'Paid by phone'
                transaction_id: null
                created_at: '2017-07-28T14:42:44Z'
                updated_at: '2017-07-28T14:42:44Z'
                payment_gateway:
                  id: null
                  name: null
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: invoiceId
          required: true
          in: path
          schema:
            type: string
      requestBody:
        description: 'json payload'
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                amount:
                  type: number
                  description: 'The amount of the payment.'
                  nullable: true
                  format: float
                paid_at:
                  type: string
                  description: 'Date and time the payment was made. Pass either paid_at or paid_date, but not both.'
                  nullable: true
                  format: date-time
                paid_date:
                  type: string
                  description: 'Date the payment was made. Pass either paid_at or paid_date, but not both.'
                  nullable: true
                  format: date
                notes:
                  type: string
                  description: 'Any notes to be associated with the payment.'
                  nullable: true
                send_thank_you:
                  type: boolean
                  description: 'Whether or not to send a thank you email (if enabled for your account in Invoices > Configure > Messages). Only sends an email if the invoice will be fully paid after creating this payment. Defaults to true.'
                  nullable: true
              required:
                - amount
  '/invoices/{invoiceId}/payments/{paymentId}':
    delete:
      summary: 'Delete an invoice payment'
      operationId: deleteInvoicePayment
      description: 'Delete an invoice payment. Returns a 200 OK response code if the call succeeded.'
      externalDocs:
        description: 'Delete an invoice payment'
        url: 'https://help.getharvest.com/api-v2/invoices-api/invoices/invoice-payments/#delete-an-invoice-payment'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Delete an invoice payment'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: invoiceId
          required: true
          in: path
          schema:
            type: string
        -
          name: paymentId
          required: true
          in: path
          schema:
            type: string
  /projects:
    get:
      summary: 'List all projects'
      operationId: listProjects
      description: "Returns a list of your projects. The projects are returned sorted by creation date, with the most recently created projects appearing first.\n\nThe response contains an object with a projects property that contains an array of up to per_page projects. Each entry in the array is a separate project object. If no more projects are available, the resulting array will be empty. Several additional pagination properties are included in the response to simplify paginating your projects."
      externalDocs:
        description: 'List all projects'
        url: 'https://help.getharvest.com/api-v2/projects-api/projects/projects/#list-all-projects'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'List all projects'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Projects'
              example:
                projects:
                  -
                    id: 14308069
                    name: 'Online Store - Phase 1'
                    code: OS1
                    is_active: true
                    bill_by: Project
                    budget: 200.0
                    budget_by: project
                    budget_is_monthly: false
                    notify_when_over_budget: true
                    over_budget_notification_percentage: 80.0
                    over_budget_notification_date: null
                    show_budget_to_all: false
                    created_at: '2017-06-26T21:52:18Z'
                    updated_at: '2017-06-26T21:54:06Z'
                    starts_on: '2017-06-01'
                    ends_on: null
                    is_billable: true
                    is_fixed_fee: false
                    notes: ''
                    client:
                      id: 5735776
                      name: '123 Industries'
                      currency: EUR
                    cost_budget: null
                    cost_budget_include_expenses: false
                    hourly_rate: 100.0
                    fee: null
                  -
                    id: 14307913
                    name: 'Marketing Website'
                    code: MW
                    is_active: true
                    bill_by: Project
                    budget: 50.0
                    budget_by: project
                    budget_is_monthly: false
                    notify_when_over_budget: true
                    over_budget_notification_percentage: 80.0
                    over_budget_notification_date: null
                    show_budget_to_all: false
                    created_at: '2017-06-26T21:36:23Z'
                    updated_at: '2017-06-26T21:54:46Z'
                    starts_on: '2017-01-01'
                    ends_on: '2017-03-31'
                    is_billable: true
                    is_fixed_fee: false
                    notes: ''
                    client:
                      id: 5735774
                      name: 'ABC Corp'
                      currency: USD
                    cost_budget: null
                    cost_budget_include_expenses: false
                    hourly_rate: 100.0
                    fee: null
                per_page: 2000
                total_pages: 1
                total_entries: 2
                next_page: null
                previous_page: null
                page: 1
                links:
                  first: 'https://api.harvestapp.com/v2/projects?page=1&per_page=2000'
                  next: null
                  previous: null
                  last: 'https://api.harvestapp.com/v2/projects?page=1&per_page=2000'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: is_active
          description: 'Pass true to only return active projects and false to return inactive projects.'
          required: false
          in: query
          schema:
            type: boolean
        -
          name: client_id
          description: 'Only return projects belonging to the client with the given ID.'
          required: false
          in: query
          schema:
            type: integer
        -
          name: updated_since
          description: 'Only return projects that have been updated since the given date and time.'
          required: false
          in: query
          schema:
            type: string
        -
          name: page
          description: 'DEPRECATED The page number to use in pagination. For instance, if you make a list request and receive 2000 records, your subsequent call can include page=2 to retrieve the next page of the list. (Default: 1)'
          required: false
          in: query
          schema:
            type: integer
          deprecated: true
        -
          name: cursor
          description: 'Pagination cursor'
          required: false
          in: query
          schema:
            type: string
        -
          name: per_page
          description: 'The number of records to return per page. Can range between 1 and 2000. (Default: 2000)'
          required: false
          in: query
          schema:
            type: integer
    post:
      summary: 'Create a project'
      operationId: createProject
      description: 'Creates a new project object. Returns a project object and a 201 Created response code if the call succeeded.'
      externalDocs:
        description: 'Create a project'
        url: 'https://help.getharvest.com/api-v2/projects-api/projects/projects/#create-a-project'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        201:
          description: 'Create a project'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Project'
              example:
                id: 14308112
                name: 'Your New Project'
                code: null
                is_active: true
                bill_by: Project
                budget: 10000.0
                budget_by: project
                budget_is_monthly: false
                notify_when_over_budget: false
                over_budget_notification_percentage: 80.0
                over_budget_notification_date: null
                show_budget_to_all: false
                created_at: '2017-06-26T21:56:52Z'
                updated_at: '2017-06-26T21:56:52Z'
                starts_on: null
                ends_on: null
                is_billable: true
                is_fixed_fee: false
                notes: ''
                client:
                  id: 5735776
                  name: '123 Industries'
                  currency: EUR
                cost_budget: null
                cost_budget_include_expenses: false
                hourly_rate: 100.0
                fee: null
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      requestBody:
        description: 'json payload'
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                client_id:
                  type: integer
                  description: 'The ID of the client to associate this project with.'
                  nullable: true
                  format: int32
                name:
                  type: string
                  description: 'The name of the project.'
                  nullable: true
                code:
                  type: string
                  description: 'The code associated with the project.'
                  nullable: true
                is_active:
                  type: boolean
                  description: 'Whether the project is active or archived. Defaults to true.'
                  nullable: true
                is_billable:
                  type: boolean
                  description: 'Whether the project is billable or not.'
                  nullable: true
                is_fixed_fee:
                  type: boolean
                  description: 'Whether the project is a fixed-fee project or not.'
                  nullable: true
                bill_by:
                  type: string
                  description: 'The method by which the project is invoiced. Options: Project, Tasks, People, or none.'
                  nullable: true
                hourly_rate:
                  type: number
                  description: 'Rate for projects billed by Project Hourly Rate.'
                  nullable: true
                  format: float
                budget:
                  type: number
                  description: 'The budget in hours for the project when budgeting by time.'
                  nullable: true
                  format: float
                budget_by:
                  type: string
                  description: 'The method by which the project is budgeted. Options: project (Hours Per Project), project_cost (Total Project Fees), task (Hours Per Task), task_fees (Fees Per Task), person (Hours Per Person), none (No Budget).'
                  nullable: true
                budget_is_monthly:
                  type: boolean
                  description: 'Option to have the budget reset every month. Defaults to false.'
                  nullable: true
                notify_when_over_budget:
                  type: boolean
                  description: 'Whether Project Managers should be notified when the project goes over budget. Defaults to false.'
                  nullable: true
                over_budget_notification_percentage:
                  type: number
                  description: 'Percentage value used to trigger over budget email alerts. Example: use 10.0 for 10.0%.'
                  nullable: true
                  format: float
                show_budget_to_all:
                  type: boolean
                  description: 'Option to show project budget to all employees. Does not apply to Total Project Fee projects. Defaults to false.'
                  nullable: true
                cost_budget:
                  type: number
                  description: 'The monetary budget for the project when budgeting by money.'
                  nullable: true
                  format: float
                cost_budget_include_expenses:
                  type: boolean
                  description: 'Option for budget of Total Project Fees projects to include tracked expenses. Defaults to false.'
                  nullable: true
                fee:
                  type: number
                  description: 'The amount you plan to invoice for the project. Only used by fixed-fee projects.'
                  nullable: true
                  format: float
                notes:
                  type: string
                  description: 'Project notes.'
                  nullable: true
                starts_on:
                  type: string
                  description: 'Date the project was started.'
                  nullable: true
                  format: date
                ends_on:
                  type: string
                  description: 'Date the project will end.'
                  nullable: true
                  format: date
              required:
                - client_id
                - name
                - is_billable
                - bill_by
                - budget_by
  '/projects/{projectId}':
    delete:
      summary: 'Delete a project'
      operationId: deleteProject
      description: "Deletes a project and any time entries or expenses tracked to it.\nHowever, invoices associated with the project will not be deleted.\nIf you don’t want the project’s time entries and expenses to be deleted, you should archive the project instead."
      externalDocs:
        description: 'Delete a project'
        url: 'https://help.getharvest.com/api-v2/projects-api/projects/projects/#delete-a-project'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Delete a project'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: projectId
          required: true
          in: path
          schema:
            type: string
    get:
      summary: 'Retrieve a project'
      operationId: retrieveProject
      description: 'Retrieves the project with the given ID. Returns a project object and a 200 OK response code if a valid identifier was provided.'
      externalDocs:
        description: 'Retrieve a project'
        url: 'https://help.getharvest.com/api-v2/projects-api/projects/projects/#retrieve-a-project'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Retrieve a project'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Project'
              example:
                id: 14308069
                name: 'Online Store - Phase 1'
                code: OS1
                is_active: true
                bill_by: Project
                budget: 200.0
                budget_by: project
                budget_is_monthly: false
                notify_when_over_budget: true
                over_budget_notification_percentage: 80.0
                over_budget_notification_date: null
                show_budget_to_all: false
                created_at: '2017-06-26T21:52:18Z'
                updated_at: '2017-06-26T21:54:06Z'
                starts_on: '2017-06-01'
                ends_on: null
                is_billable: true
                is_fixed_fee: false
                notes: ''
                client:
                  id: 5735776
                  name: '123 Industries'
                  currency: EUR
                cost_budget: null
                cost_budget_include_expenses: false
                hourly_rate: 100.0
                fee: null
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: projectId
          required: true
          in: path
          schema:
            type: string
    patch:
      summary: 'Update a project'
      operationId: updateProject
      description: 'Updates the specific project by setting the values of the parameters passed. Any parameters not provided will be left unchanged. Returns a project object and a 200 OK response code if the call succeeded.'
      externalDocs:
        description: 'Update a project'
        url: 'https://help.getharvest.com/api-v2/projects-api/projects/projects/#update-a-project'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Update a project'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Project'
              example:
                id: 14308112
                name: 'New project name'
                code: null
                is_active: true
                bill_by: Project
                budget: 10000.0
                budget_by: project
                budget_is_monthly: false
                notify_when_over_budget: false
                over_budget_notification_percentage: 80.0
                over_budget_notification_date: null
                show_budget_to_all: false
                created_at: '2017-06-26T21:56:52Z'
                updated_at: '2017-06-26T21:57:20Z'
                starts_on: null
                ends_on: null
                is_billable: true
                is_fixed_fee: false
                notes: ''
                client:
                  id: 5735776
                  name: '123 Industries'
                  currency: EUR
                cost_budget: null
                cost_budget_include_expenses: false
                hourly_rate: 100.0
                fee: null
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: projectId
          required: true
          in: path
          schema:
            type: string
      requestBody:
        description: 'json payload'
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                client_id:
                  type: integer
                  description: 'The ID of the client to associate this project with.'
                  nullable: true
                  format: int32
                name:
                  type: string
                  description: 'The name of the project.'
                  nullable: true
                code:
                  type: string
                  description: 'The code associated with the project.'
                  nullable: true
                is_active:
                  type: boolean
                  description: 'Whether the project is active or archived. Defaults to true.'
                  nullable: true
                is_billable:
                  type: boolean
                  description: 'Whether the project is billable or not.'
                  nullable: true
                is_fixed_fee:
                  type: boolean
                  description: 'Whether the project is a fixed-fee project or not.'
                  nullable: true
                bill_by:
                  type: string
                  description: 'The method by which the project is invoiced. Options: Project, Tasks, People, or none.'
                  nullable: true
                hourly_rate:
                  type: number
                  description: 'Rate for projects billed by Project Hourly Rate.'
                  nullable: true
                  format: float
                budget:
                  type: number
                  description: 'The budget in hours for the project when budgeting by time.'
                  nullable: true
                  format: float
                budget_by:
                  type: string
                  description: 'The method by which the project is budgeted. Options: project (Hours Per Project), project_cost (Total Project Fees), task (Hours Per Task), task_fees (Fees Per Task), person (Hours Per Person), none (No Budget).'
                  nullable: true
                budget_is_monthly:
                  type: boolean
                  description: 'Option to have the budget reset every month. Defaults to false.'
                  nullable: true
                notify_when_over_budget:
                  type: boolean
                  description: 'Whether Project Managers should be notified when the project goes over budget. Defaults to false.'
                  nullable: true
                over_budget_notification_percentage:
                  type: number
                  description: 'Percentage value used to trigger over budget email alerts. Example: use 10.0 for 10.0%.'
                  nullable: true
                  format: float
                show_budget_to_all:
                  type: boolean
                  description: 'Option to show project budget to all employees. Does not apply to Total Project Fee projects. Defaults to false.'
                  nullable: true
                cost_budget:
                  type: number
                  description: 'The monetary budget for the project when budgeting by money.'
                  nullable: true
                  format: float
                cost_budget_include_expenses:
                  type: boolean
                  description: 'Option for budget of Total Project Fees projects to include tracked expenses. Defaults to false.'
                  nullable: true
                fee:
                  type: number
                  description: 'The amount you plan to invoice for the project. Only used by fixed-fee projects.'
                  nullable: true
                  format: float
                notes:
                  type: string
                  description: 'Project notes.'
                  nullable: true
                starts_on:
                  type: string
                  description: 'Date the project was started.'
                  nullable: true
                  format: date
                ends_on:
                  type: string
                  description: 'Date the project will end.'
                  nullable: true
                  format: date
  '/projects/{projectId}/task_assignments':
    get:
      summary: 'List all task assignments for a specific project'
      operationId: listTaskAssignmentsForSpecificProject
      description: "Returns a list of your task assignments for the project identified by PROJECT_ID. The task assignments are returned sorted by creation date, with the most recently created task assignments appearing first.\n\nThe response contains an object with a task_assignments property that contains an array of up to per_page task assignments. Each entry in the array is a separate task assignment object. If no more task assignments are available, the resulting array will be empty. Several additional pagination properties are included in the response to simplify paginating your task assignments."
      externalDocs:
        description: 'List all task assignments for a specific project'
        url: 'https://help.getharvest.com/api-v2/projects-api/projects/task-assignments/#list-all-task-assignments-for-a-specific-project'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'List all task assignments for a specific project'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TaskAssignments'
              example:
                task_assignments:
                  -
                    id: 155505016
                    billable: false
                    is_active: true
                    created_at: '2017-06-26T21:52:18Z'
                    updated_at: '2017-06-26T21:54:06Z'
                    hourly_rate: 100.0
                    budget: null
                    project:
                      id: 14308069
                      name: 'Online Store - Phase 1'
                      code: OS1
                    task:
                      id: 8083369
                      name: Research
                  -
                    id: 155505015
                    billable: true
                    is_active: true
                    created_at: '2017-06-26T21:52:18Z'
                    updated_at: '2017-06-26T21:52:18Z'
                    hourly_rate: 100.0
                    budget: null
                    project:
                      id: 14308069
                      name: 'Online Store - Phase 1'
                      code: OS1
                    task:
                      id: 8083368
                      name: 'Project Management'
                  -
                    id: 155505014
                    billable: true
                    is_active: true
                    created_at: '2017-06-26T21:52:18Z'
                    updated_at: '2017-06-26T21:52:18Z'
                    hourly_rate: 100.0
                    budget: null
                    project:
                      id: 14308069
                      name: 'Online Store - Phase 1'
                      code: OS1
                    task:
                      id: 8083366
                      name: Programming
                  -
                    id: 155505013
                    billable: true
                    is_active: true
                    created_at: '2017-06-26T21:52:18Z'
                    updated_at: '2017-06-26T21:52:18Z'
                    hourly_rate: 100.0
                    budget: null
                    project:
                      id: 14308069
                      name: 'Online Store - Phase 1'
                      code: OS1
                    task:
                      id: 8083365
                      name: 'Graphic Design'
                per_page: 2000
                total_pages: 1
                total_entries: 4
                next_page: null
                previous_page: null
                page: 1
                links:
                  first: 'https://api.harvestapp.com/v2/projects/14308069/task_assignments?page=1&per_page=2000'
                  next: null
                  previous: null
                  last: 'https://api.harvestapp.com/v2/projects/14308069/task_assignments?page=1&per_page=2000'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: projectId
          required: true
          in: path
          schema:
            type: string
        -
          name: is_active
          description: 'Pass true to only return active task assignments and false to return inactive task assignments.'
          required: false
          in: query
          schema:
            type: boolean
        -
          name: updated_since
          description: 'Only return task assignments that have been updated since the given date and time.'
          required: false
          in: query
          schema:
            type: string
        -
          name: page
          description: 'The page number to use in pagination. For instance, if you make a list request and receive 2000 records, your subsequent call can include page=2 to retrieve the next page of the list. (Default: 1)'
          required: false
          in: query
          schema:
            type: integer
        -
          name: per_page
          description: 'The number of records to return per page. Can range between 1 and 2000. (Default: 2000)'
          required: false
          in: query
          schema:
            type: integer
    post:
      summary: 'Create a task assignment'
      operationId: createTaskAssignment
      description: 'Creates a new task assignment object. Returns a task assignment object and a 201 Created response code if the call succeeded.'
      externalDocs:
        description: 'Create a task assignment'
        url: 'https://help.getharvest.com/api-v2/projects-api/projects/task-assignments/#create-a-task-assignment'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        201:
          description: 'Create a task assignment'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TaskAssignment'
              example:
                id: 155506339
                billable: true
                is_active: true
                created_at: '2017-06-26T22:10:43Z'
                updated_at: '2017-06-26T22:10:43Z'
                hourly_rate: 75.5
                budget: null
                project:
                  id: 14308069
                  name: 'Online Store - Phase 1'
                  code: OS1
                task:
                  id: 8083800
                  name: 'Business Development'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: projectId
          required: true
          in: path
          schema:
            type: string
      requestBody:
        description: 'json payload'
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                task_id:
                  type: integer
                  description: 'The ID of the task to associate with the project.'
                  nullable: true
                  format: int32
                is_active:
                  type: boolean
                  description: 'Whether the task assignment is active or archived. Defaults to true.'
                  nullable: true
                billable:
                  type: boolean
                  description: 'Whether the task assignment is billable or not. Defaults to false.'
                  nullable: true
                hourly_rate:
                  type: number
                  description: 'Rate used when the project’s bill_by is Tasks. Defaults to null when billing by task hourly rate, otherwise 0.'
                  nullable: true
                  format: float
                budget:
                  type: number
                  description: 'Budget used when the project’s budget_by is task or task_fees.'
                  nullable: true
                  format: float
              required:
                - task_id
  '/projects/{projectId}/task_assignments/{taskAssignmentId}':
    delete:
      summary: 'Delete a task assignment'
      operationId: deleteTaskAssignment
      description: 'Delete a task assignment. Deleting a task assignment is only possible if it has no time entries associated with it. Returns a 200 OK response code if the call succeeded.'
      externalDocs:
        description: 'Delete a task assignment'
        url: 'https://help.getharvest.com/api-v2/projects-api/projects/task-assignments/#delete-a-task-assignment'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Delete a task assignment'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: projectId
          required: true
          in: path
          schema:
            type: string
        -
          name: taskAssignmentId
          required: true
          in: path
          schema:
            type: string
    get:
      summary: 'Retrieve a task assignment'
      operationId: retrieveTaskAssignment
      description: 'Retrieves the task assignment with the given ID. Returns a task assignment object and a 200 OK response code if a valid identifier was provided.'
      externalDocs:
        description: 'Retrieve a task assignment'
        url: 'https://help.getharvest.com/api-v2/projects-api/projects/task-assignments/#retrieve-a-task-assignment'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Retrieve a task assignment'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TaskAssignment'
              example:
                id: 155505016
                billable: false
                is_active: true
                created_at: '2017-06-26T21:52:18Z'
                updated_at: '2017-06-26T21:54:06Z'
                hourly_rate: 100.0
                budget: null
                project:
                  id: 14308069
                  name: 'Online Store - Phase 1'
                  code: OS1
                task:
                  id: 8083369
                  name: Research
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: projectId
          required: true
          in: path
          schema:
            type: string
        -
          name: taskAssignmentId
          required: true
          in: path
          schema:
            type: string
    patch:
      summary: 'Update a task assignment'
      operationId: updateTaskAssignment
      description: 'Updates the specific task assignment by setting the values of the parameters passed. Any parameters not provided will be left unchanged. Returns a task assignment object and a 200 OK response code if the call succeeded.'
      externalDocs:
        description: 'Update a task assignment'
        url: 'https://help.getharvest.com/api-v2/projects-api/projects/task-assignments/#update-a-task-assignment'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Update a task assignment'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TaskAssignment'
              example:
                id: 155506339
                billable: true
                is_active: true
                created_at: '2017-06-26T22:10:43Z'
                updated_at: '2017-06-26T22:11:27Z'
                hourly_rate: 75.5
                budget: 120.0
                project:
                  id: 14308069
                  name: 'Online Store - Phase 1'
                  code: OS1
                task:
                  id: 8083800
                  name: 'Business Development'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: projectId
          required: true
          in: path
          schema:
            type: string
        -
          name: taskAssignmentId
          required: true
          in: path
          schema:
            type: string
      requestBody:
        description: 'json payload'
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                is_active:
                  type: boolean
                  description: 'Whether the task assignment is active or archived.'
                  nullable: true
                billable:
                  type: boolean
                  description: 'Whether the task assignment is billable or not.'
                  nullable: true
                hourly_rate:
                  type: number
                  description: 'Rate used when the project’s bill_by is Tasks.'
                  nullable: true
                  format: float
                budget:
                  type: number
                  description: 'Budget used when the project’s budget_by is task or task_fees.'
                  nullable: true
                  format: float
  '/projects/{projectId}/user_assignments':
    get:
      summary: 'List all user assignments for a specific project'
      operationId: listUserAssignmentsForSpecificProject
      description: "Returns a list of user assignments for the project identified by PROJECT_ID. The user assignments are returned sorted by creation date, with the most recently created user assignments appearing first.\n\nThe response contains an object with a user_assignments property that contains an array of up to per_page user assignments. Each entry in the array is a separate user assignment object. If no more user assignments are available, the resulting array will be empty. Several additional pagination properties are included in the response to simplify paginating your user assignments."
      externalDocs:
        description: 'List all user assignments for a specific project'
        url: 'https://help.getharvest.com/api-v2/projects-api/projects/user-assignments/#list-all-user-assignments-for-a-specific-project'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'List all user assignments for a specific project'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserAssignments'
              example:
                user_assignments:
                  -
                    id: 125068554
                    is_project_manager: true
                    is_active: true
                    use_default_rates: true
                    budget: null
                    created_at: '2017-06-26T22:32:52Z'
                    updated_at: '2017-06-26T22:32:52Z'
                    hourly_rate: 100.0
                    project:
                      id: 14308069
                      name: 'Online Store - Phase 1'
                      code: OS1
                    user:
                      id: 1782959
                      name: 'Kim Allen'
                  -
                    id: 125066109
                    is_project_manager: true
                    is_active: true
                    use_default_rates: false
                    budget: null
                    created_at: '2017-06-26T21:52:18Z'
                    updated_at: '2017-06-26T21:52:18Z'
                    hourly_rate: 100.0
                    project:
                      id: 14308069
                      name: 'Online Store - Phase 1'
                      code: OS1
                    user:
                      id: 1782884
                      name: 'Jeremy Israelsen'
                per_page: 2000
                total_pages: 1
                total_entries: 2
                next_page: null
                previous_page: null
                page: 1
                links:
                  first: 'https://api.harvestapp.com/v2/projects/14308069/user_assignments?page=1&per_page=2000'
                  next: null
                  previous: null
                  last: 'https://api.harvestapp.com/v2/projects/14308069/user_assignments?page=1&per_page=2000'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: projectId
          required: true
          in: path
          schema:
            type: string
        -
          name: user_id
          description: 'Only return user assignments belonging to the user with the given ID.'
          required: false
          in: query
          schema:
            type: integer
        -
          name: is_active
          description: 'Pass true to only return active user assignments and false to return inactive user assignments.'
          required: false
          in: query
          schema:
            type: boolean
        -
          name: updated_since
          description: 'Only return user assignments that have been updated since the given date and time.'
          required: false
          in: query
          schema:
            type: string
        -
          name: page
          description: 'The page number to use in pagination. For instance, if you make a list request and receive 2000 records, your subsequent call can include page=2 to retrieve the next page of the list. (Default: 1)'
          required: false
          in: query
          schema:
            type: integer
        -
          name: per_page
          description: 'The number of records to return per page. Can range between 1 and 2000. (Default: 2000)'
          required: false
          in: query
          schema:
            type: integer
    post:
      summary: 'Create a user assignment'
      operationId: createUserAssignment
      description: 'Creates a new user assignment object. Returns a user assignment object and a 201 Created response code if the call succeeded.'
      externalDocs:
        description: 'Create a user assignment'
        url: 'https://help.getharvest.com/api-v2/projects-api/projects/user-assignments/#create-a-user-assignment'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        201:
          description: 'Create a user assignment'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserAssignment'
              example:
                id: 125068758
                is_project_manager: false
                is_active: true
                use_default_rates: false
                budget: null
                created_at: '2017-06-26T22:36:01Z'
                updated_at: '2017-06-26T22:36:01Z'
                hourly_rate: 75.5
                project:
                  id: 14308069
                  name: 'Online Store - Phase 1'
                  code: OS1
                user:
                  id: 1782974
                  name: 'Jim Allen'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: projectId
          required: true
          in: path
          schema:
            type: string
      requestBody:
        description: 'json payload'
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                user_id:
                  type: integer
                  description: 'The ID of the user to associate with the project.'
                  nullable: true
                  format: int32
                is_active:
                  type: boolean
                  description: 'Whether the user assignment is active or archived. Defaults to true.'
                  nullable: true
                is_project_manager:
                  type: boolean
                  description: 'Determines if the user has Project Manager permissions for the project. Defaults to false for users with Regular User permissions and true for those with Project Managers or Administrator permissions.'
                  nullable: true
                use_default_rates:
                  type: boolean
                  description: 'Determines which billable rate(s) will be used on the project for this user when bill_by is People. When true, the project will use the user’s default billable rates. When false, the project will use the custom rate defined on this user assignment. Defaults to true.'
                  nullable: true
                hourly_rate:
                  type: number
                  description: 'Custom rate used when the project’s bill_by is People and use_default_rates is false. Defaults to 0.'
                  nullable: true
                  format: float
                budget:
                  type: number
                  description: 'Budget used when the project’s budget_by is person.'
                  nullable: true
                  format: float
              required:
                - user_id
  '/projects/{projectId}/user_assignments/{userAssignmentId}':
    delete:
      summary: 'Delete a user assignment'
      operationId: deleteUserAssignment
      description: 'Delete a user assignment. Deleting a user assignment is only possible if it has no time entries or expenses associated with it. Returns a 200 OK response code if the call succeeded.'
      externalDocs:
        description: 'Delete a user assignment'
        url: 'https://help.getharvest.com/api-v2/projects-api/projects/user-assignments/#delete-a-user-assignment'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Delete a user assignment'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: projectId
          required: true
          in: path
          schema:
            type: string
        -
          name: userAssignmentId
          required: true
          in: path
          schema:
            type: string
    get:
      summary: 'Retrieve a user assignment'
      operationId: retrieveUserAssignment
      description: 'Retrieves the user assignment with the given ID. Returns a user assignment object and a 200 OK response code if a valid identifier was provided.'
      externalDocs:
        description: 'Retrieve a user assignment'
        url: 'https://help.getharvest.com/api-v2/projects-api/projects/user-assignments/#retrieve-a-user-assignment'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Retrieve a user assignment'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserAssignment'
              example:
                id: 125068554
                is_project_manager: true
                is_active: true
                use_default_rates: true
                budget: null
                created_at: '2017-06-26T22:32:52Z'
                updated_at: '2017-06-26T22:32:52Z'
                hourly_rate: 100.0
                project:
                  id: 14308069
                  name: 'Online Store - Phase 1'
                  code: OS1
                user:
                  id: 1782959
                  name: 'Kim Allen'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: projectId
          required: true
          in: path
          schema:
            type: string
        -
          name: userAssignmentId
          required: true
          in: path
          schema:
            type: string
    patch:
      summary: 'Update a user assignment'
      operationId: updateUserAssignment
      description: 'Updates the specific user assignment by setting the values of the parameters passed. Any parameters not provided will be left unchanged. Returns a user assignment object and a 200 OK response code if the call succeeded.'
      externalDocs:
        description: 'Update a user assignment'
        url: 'https://help.getharvest.com/api-v2/projects-api/projects/user-assignments/#update-a-user-assignment'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Update a user assignment'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserAssignment'
              example:
                id: 125068758
                is_project_manager: false
                is_active: true
                use_default_rates: false
                budget: 120.0
                created_at: '2017-06-26T22:36:01Z'
                updated_at: '2017-06-26T22:36:35Z'
                hourly_rate: 75.5
                project:
                  id: 14308069
                  name: 'Online Store - Phase 1'
                  code: OS1
                user:
                  id: 1782974
                  name: 'Jim Allen'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: projectId
          required: true
          in: path
          schema:
            type: string
        -
          name: userAssignmentId
          required: true
          in: path
          schema:
            type: string
      requestBody:
        description: 'json payload'
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                is_active:
                  type: boolean
                  description: 'Whether the user assignment is active or archived.'
                  nullable: true
                is_project_manager:
                  type: boolean
                  description: 'Determines if the user has Project Manager permissions for the project.'
                  nullable: true
                use_default_rates:
                  type: boolean
                  description: 'Determines which billable rate(s) will be used on the project for this user when bill_by is People. When true, the project will use the user’s default billable rates. When false, the project will use the custom rate defined on this user assignment.'
                  nullable: true
                hourly_rate:
                  type: number
                  description: 'Custom rate used when the project’s bill_by is People and use_default_rates is false.'
                  nullable: true
                  format: float
                budget:
                  type: number
                  description: 'Budget used when the project’s budget_by is person.'
                  nullable: true
                  format: float
  /reports/expenses/categories:
    get:
      summary: 'Expense Categories Report'
      operationId: expenseCategoriesReport
      description: ''
      externalDocs:
        description: 'Expense Categories Report'
        url: 'https://help.getharvest.com/api-v2/reports-api/reports/expense-reports/#expense-categories-report'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Expense Categories Report'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ExpenseReportsResults'
              example:
                results:
                  -
                    expense_category_id: 4197501
                    expense_category_name: Lodging
                    total_amount: 100
                    billable_amount: 100
                    currency: EUR
                  -
                    expense_category_id: 4195926
                    expense_category_name: Meals
                    total_amount: 100
                    billable_amount: 100
                    currency: EUR
                  -
                    expense_category_id: 4195926
                    expense_category_name: Meals
                    total_amount: 33.35
                    billable_amount: 33.35
                    currency: USD
                per_page: 2000
                total_pages: 1
                total_entries: 3
                next_page: null
                previous_page: null
                page: 1
                links:
                  first: 'https://api.harvestapp.com/v2/reports/expenses/categories?from=20170101&page=1&per_page=2000&to=20171231'
                  next: null
                  previous: null
                  last: 'https://api.harvestapp.com/v2/reports/expenses/categories?from=20170101&page=1&per_page=2000&to=20171231'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: from
          description: 'Only report on expenses with a spent_date on or after the given date.'
          required: true
          in: query
          schema:
            type: string
        -
          name: to
          description: 'Only report on expenses with a spent_date on or before the given date.'
          required: true
          in: query
          schema:
            type: string
        -
          name: page
          description: 'The page number to use in pagination. For instance, if you make a list request and receive 2000 records, your subsequent call can include page=2 to retrieve the next page of the list. (Default: 1)'
          required: false
          in: query
          schema:
            type: integer
        -
          name: per_page
          description: 'The number of records to return per page. Can range between 1 and 2000. (Default: 2000)'
          required: false
          in: query
          schema:
            type: integer
  /reports/expenses/clients:
    get:
      summary: 'Clients Report'
      operationId: clientsExpensesReport
      description: ''
      externalDocs:
        description: 'Clients Report'
        url: 'https://help.getharvest.com/api-v2/reports-api/reports/expense-reports/#clients-report'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Clients Report'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ExpenseReportsResults'
              example:
                results:
                  -
                    client_id: 5735776
                    client_name: '123 Industries'
                    total_amount: 100
                    billable_amount: 100
                    currency: EUR
                  -
                    client_id: 5735774
                    client_name: 'ABC Corp'
                    total_amount: 133.35
                    billable_amount: 133.35
                    currency: USD
                per_page: 2000
                total_pages: 1
                total_entries: 2
                next_page: null
                previous_page: null
                page: 1
                links:
                  first: 'https://api.harvestapp.com/v2/reports/expenses/clients?from=20170101&page=1&per_page=2000&to=20171231'
                  next: null
                  previous: null
                  last: 'https://api.harvestapp.com/v2/reports/expenses/clients?from=20170101&page=1&per_page=2000&to=20171231'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: from
          description: 'Only report on expenses with a spent_date on or after the given date.'
          required: true
          in: query
          schema:
            type: string
        -
          name: to
          description: 'Only report on expenses with a spent_date on or before the given date.'
          required: true
          in: query
          schema:
            type: string
        -
          name: page
          description: 'The page number to use in pagination. For instance, if you make a list request and receive 2000 records, your subsequent call can include page=2 to retrieve the next page of the list. (Default: 1)'
          required: false
          in: query
          schema:
            type: integer
        -
          name: per_page
          description: 'The number of records to return per page. Can range between 1 and 2000. (Default: 2000)'
          required: false
          in: query
          schema:
            type: integer
  /reports/expenses/projects:
    get:
      summary: 'Projects Report'
      operationId: projectsExpensesReport
      description: ''
      externalDocs:
        description: 'Projects Report'
        url: 'https://help.getharvest.com/api-v2/reports-api/reports/expense-reports/#projects-report'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Projects Report'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ExpenseReportsResults'
              example:
                results:
                  -
                    client_id: 5735774
                    client_name: 'ABC Corp'
                    project_id: 14307913
                    project_name: '[MW] Marketing Website'
                    total_amount: 133.35
                    billable_amount: 133.35
                    currency: USD
                  -
                    client_id: 5735776
                    client_name: '123 Industries'
                    project_id: 14308069
                    project_name: '[OS1] Online Store - Phase 1'
                    total_amount: 100
                    billable_amount: 100
                    currency: EUR
                per_page: 2000
                total_pages: 1
                total_entries: 2
                next_page: null
                previous_page: null
                page: 1
                links:
                  first: 'https://api.harvestapp.com/v2/reports/expenses/projects?from=20170101&page=1&per_page=2000&to=20171231'
                  next: null
                  previous: null
                  last: 'https://api.harvestapp.com/v2/reports/expenses/projects?from=20170101&page=1&per_page=2000&to=20171231'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: from
          description: 'Only report on expenses with a spent_date on or after the given date.'
          required: true
          in: query
          schema:
            type: string
        -
          name: to
          description: 'Only report on expenses with a spent_date on or before the given date.'
          required: true
          in: query
          schema:
            type: string
        -
          name: page
          description: 'The page number to use in pagination. For instance, if you make a list request and receive 2000 records, your subsequent call can include page=2 to retrieve the next page of the list. (Default: 1)'
          required: false
          in: query
          schema:
            type: integer
        -
          name: per_page
          description: 'The number of records to return per page. Can range between 1 and 2000. (Default: 2000)'
          required: false
          in: query
          schema:
            type: integer
  /reports/expenses/team:
    get:
      summary: 'Team Report'
      operationId: teamExpensesReport
      description: ''
      externalDocs:
        description: 'Team Report'
        url: 'https://help.getharvest.com/api-v2/reports-api/reports/expense-reports/#team-report'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Team Report'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ExpenseReportsResults'
              example:
                results:
                  -
                    user_id: 1782884
                    user_name: 'Bob Powell'
                    is_contractor: false
                    total_amount: 100
                    billable_amount: 100
                    currency: USD
                  -
                    user_id: 1782959
                    user_name: 'Kim Allen'
                    is_contractor: false
                    total_amount: 100
                    billable_amount: 100
                    currency: EUR
                  -
                    user_id: 1782959
                    user_name: 'Kim Allen'
                    is_contractor: false
                    total_amount: 33.35
                    billable_amount: 33.35
                    currency: USD
                per_page: 2000
                total_pages: 1
                total_entries: 3
                next_page: null
                previous_page: null
                page: 1
                links:
                  first: 'https://api.harvestapp.com/v2/reports/expenses/team?from=20170101&page=1&per_page=2000&to=20171231'
                  next: null
                  previous: null
                  last: 'https://api.harvestapp.com/v2/reports/expenses/team?from=20170101&page=1&per_page=2000&to=20171231'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: from
          description: 'Only report on expenses with a spent_date on or after the given date.'
          required: true
          in: query
          schema:
            type: string
        -
          name: to
          description: 'Only report on expenses with a spent_date on or before the given date.'
          required: true
          in: query
          schema:
            type: string
        -
          name: page
          description: 'The page number to use in pagination. For instance, if you make a list request and receive 2000 records, your subsequent call can include page=2 to retrieve the next page of the list. (Default: 1)'
          required: false
          in: query
          schema:
            type: integer
        -
          name: per_page
          description: 'The number of records to return per page. Can range between 1 and 2000. (Default: 2000)'
          required: false
          in: query
          schema:
            type: integer
  /reports/project_budget:
    get:
      summary: 'Project Budget Report'
      operationId: projectBudgetReport
      description: 'The response contains an object with a results property that contains an array of up to per_page results. Each entry in the array is a separate result object. If no more results are available, the resulting array will be empty. Several additional pagination properties are included in the response to simplify paginating your results.'
      externalDocs:
        description: 'Project Budget Report'
        url: 'https://help.getharvest.com/api-v2/reports-api/reports/project-budget-report/#project-budget-report'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Project Budget Report'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProjectBudgetReportResults'
              example:
                results:
                  -
                    project_id: 14308069
                    project_name: 'Online Store - Phase 1'
                    client_id: 5735776
                    client_name: '123 Industries'
                    budget_is_monthly: false
                    budget_by: project
                    is_active: true
                    budget: 200
                    budget_spent: 4
                    budget_remaining: 196
                  -
                    project_id: 14307913
                    project_name: 'Marketing Website'
                    client_id: 5735774
                    client_name: 'ABC Corp'
                    budget_is_monthly: false
                    budget_by: project
                    is_active: true
                    budget: 50
                    budget_spent: 2
                    budget_remaining: 48
                per_page: 2000
                total_pages: 1
                total_entries: 2
                next_page: null
                previous_page: null
                page: 1
                links:
                  first: 'https://api.harvestapp.com/v2/reports/project_budget?page=1&per_page=2000'
                  next: null
                  previous: null
                  last: 'https://api.harvestapp.com/v2/reports/project_budget?page=1&per_page=2000'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: page
          description: 'The page number to use in pagination. For instance, if you make a list request and receive 2000 records, your subsequent call can include page=2 to retrieve the next page of the list. (Default: 1)'
          required: false
          in: query
          schema:
            type: integer
        -
          name: per_page
          description: 'The number of records to return per page. Can range between 1 and 2000. (Default: 2000)'
          required: false
          in: query
          schema:
            type: integer
        -
          name: is_active
          description: 'Pass true to only return active projects and false to return inactive projects.'
          required: false
          in: query
          schema:
            type: boolean
  /reports/time/clients:
    get:
      summary: 'Clients Report'
      operationId: clientsTimeReport
      description: ''
      externalDocs:
        description: 'Clients Report'
        url: 'https://help.getharvest.com/api-v2/reports-api/reports/time-reports/#clients-report'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Clients Report'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TimeReportsResults'
              example:
                results:
                  -
                    client_id: 5735776
                    client_name: '123 Industries'
                    total_hours: 4.5
                    billable_hours: 3.5
                    currency: EUR
                    billable_amount: 350
                  -
                    client_id: 5735774
                    client_name: 'ABC Corp'
                    total_hours: 2
                    billable_hours: 2
                    currency: USD
                    billable_amount: 200
                per_page: 2000
                total_pages: 1
                total_entries: 2
                next_page: null
                previous_page: null
                page: 1
                links:
                  first: 'https://api.harvestapp.com/v2/reports/time/clients?from=20170101&page=1&per_page=2000&to=20171231'
                  next: null
                  previous: null
                  last: 'https://api.harvestapp.com/v2/reports/time/clients?from=20170101&page=1&per_page=2000&to=20171231'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: from
          description: 'Only report on time entries with a spent_date on or after the given date.'
          required: true
          in: query
          schema:
            type: string
        -
          name: to
          description: 'Only report on time entries with a spent_date on or before the given date.'
          required: true
          in: query
          schema:
            type: string
        -
          name: include_fixed_fee
          description: 'When true, billable amounts will be calculated and included for fixed fee projects.'
          required: false
          in: query
          schema:
            type: string
        -
          name: page
          description: 'The page number to use in pagination. For instance, if you make a list request and receive 2000 records, your subsequent call can include page=2 to retrieve the next page of the list. (Default: 1)'
          required: false
          in: query
          schema:
            type: integer
        -
          name: per_page
          description: 'The number of records to return per page. Can range between 1 and 2000. (Default: 2000)'
          required: false
          in: query
          schema:
            type: integer
  /reports/time/projects:
    get:
      summary: 'Projects Report'
      operationId: projectsTimeReport
      description: ''
      externalDocs:
        description: 'Projects Report'
        url: 'https://help.getharvest.com/api-v2/reports-api/reports/time-reports/#projects-report'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Projects Report'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TimeReportsResults'
              example:
                results:
                  -
                    project_id: 14307913
                    project_name: '[MW] Marketing Website'
                    client_id: 5735774
                    client_name: 'ABC Corp'
                    total_hours: 2
                    billable_hours: 2
                    currency: USD
                    billable_amount: 200
                  -
                    project_id: 14308069
                    project_name: '[OS1] Online Store - Phase 1'
                    client_id: 5735776
                    client_name: '123 Industries'
                    total_hours: 4
                    billable_hours: 3
                    currency: EUR
                    billable_amount: 300
                  -
                    project_id: 14808188
                    project_name: '[TF] Task Force'
                    client_id: 5735776
                    client_name: '123 Industries'
                    total_hours: 0.5
                    billable_hours: 0.5
                    currency: EUR
                    billable_amount: 50
                per_page: 2000
                total_pages: 1
                total_entries: 3
                next_page: null
                previous_page: null
                page: 1
                links:
                  first: 'https://api.harvestapp.com/v2/reports/time/projects?from=20170101&page=1&per_page=2000&to=20171231'
                  next: null
                  previous: null
                  last: 'https://api.harvestapp.com/v2/reports/time/projects?from=20170101&page=1&per_page=2000&to=20171231'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: from
          description: 'Only report on time entries with a spent_date on or after the given date.'
          required: true
          in: query
          schema:
            type: string
        -
          name: to
          description: 'Only report on time entries with a spent_date on or before the given date.'
          required: true
          in: query
          schema:
            type: string
        -
          name: include_fixed_fee
          description: 'When true, billable amounts will be calculated and included for fixed fee projects.'
          required: false
          in: query
          schema:
            type: string
        -
          name: page
          description: 'The page number to use in pagination. For instance, if you make a list request and receive 2000 records, your subsequent call can include page=2 to retrieve the next page of the list. (Default: 1)'
          required: false
          in: query
          schema:
            type: integer
        -
          name: per_page
          description: 'The number of records to return per page. Can range between 1 and 2000. (Default: 2000)'
          required: false
          in: query
          schema:
            type: integer
  /reports/time/tasks:
    get:
      summary: 'Tasks Report'
      operationId: tasksReport
      description: ''
      externalDocs:
        description: 'Tasks Report'
        url: 'https://help.getharvest.com/api-v2/reports-api/reports/time-reports/#tasks-report'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Tasks Report'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TimeReportsResults'
              example:
                results:
                  -
                    task_id: 8083365
                    task_name: 'Graphic Design'
                    total_hours: 2
                    billable_hours: 2
                    currency: USD
                    billable_amount: 200
                  -
                    task_id: 8083366
                    task_name: Programming
                    total_hours: 1.5
                    billable_hours: 1.5
                    currency: EUR
                    billable_amount: 150
                  -
                    task_id: 8083368
                    task_name: 'Project Management'
                    total_hours: 1.5
                    billable_hours: 1.5
                    currency: EUR
                    billable_amount: 150
                  -
                    task_id: 8083368
                    task_name: 'Project Management'
                    total_hours: 0.5
                    billable_hours: 0.5
                    currency: USD
                    billable_amount: 50
                  -
                    task_id: 8083369
                    task_name: Research
                    total_hours: 1
                    billable_hours: 0
                    currency: EUR
                    billable_amount: 0
                per_page: 2000
                total_pages: 1
                total_entries: 5
                next_page: null
                previous_page: null
                page: 1
                links:
                  first: 'https://api.harvestapp.com/v2/reports/time/tasks?from=20170101&page=1&per_page=2000&to=20171231'
                  next: null
                  previous: null
                  last: 'https://api.harvestapp.com/v2/reports/time/tasks?from=20170101&page=1&per_page=2000&to=20171231'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: from
          description: 'Only report on time entries with a spent_date on or after the given date.'
          required: true
          in: query
          schema:
            type: string
        -
          name: to
          description: 'Only report on time entries with a spent_date on or before the given date.'
          required: true
          in: query
          schema:
            type: string
        -
          name: include_fixed_fee
          description: 'When true, billable amounts will be calculated and included for fixed fee projects.'
          required: false
          in: query
          schema:
            type: string
        -
          name: page
          description: 'The page number to use in pagination. For instance, if you make a list request and receive 2000 records, your subsequent call can include page=2 to retrieve the next page of the list. (Default: 1)'
          required: false
          in: query
          schema:
            type: integer
        -
          name: per_page
          description: 'The number of records to return per page. Can range between 1 and 2000. (Default: 2000)'
          required: false
          in: query
          schema:
            type: integer
  /reports/time/team:
    get:
      summary: 'Team Report'
      operationId: teamTimeReport
      description: ''
      externalDocs:
        description: 'Team Report'
        url: 'https://help.getharvest.com/api-v2/reports-api/reports/time-reports/#team-report'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Team Report'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TimeReportsResults'
              example:
                results:
                  -
                    user_id: 1795925
                    user_name: 'Jane Smith'
                    is_contractor: false
                    total_hours: 0.5
                    billable_hours: 0.5
                    currency: EUR
                    billable_amount: 50
                    weekly_capacity: 126000
                    avatar_url: 'https://cache.harvestapp.com/assets/profile_images/abraj_albait_towers.png?1498516481'
                  -
                    user_id: 1782959
                    user_name: 'Kim Allen'
                    is_contractor: false
                    total_hours: 4
                    billable_hours: 3
                    currency: EUR
                    billable_amount: 300
                    weekly_capacity: 126000
                    avatar_url: 'https://cache.harvestapp.com/assets/profile_images/cornell_clock_tower.png?1498515345'
                  -
                    user_id: 1782959
                    user_name: 'Kim Allen'
                    is_contractor: false
                    total_hours: 2
                    billable_hours: 2
                    currency: USD
                    billable_amount: 200
                    weekly_capacity: 126000
                    avatar_url: 'https://cache.harvestapp.com/assets/profile_images/allen_bradley_clock_tower.png?1498509661'
                per_page: 2000
                total_pages: 1
                total_entries: 3
                next_page: null
                previous_page: null
                page: 1
                links:
                  first: 'https://api.harvestapp.com/v2/reports/time/team?from=20170101&page=1&per_page=2000&to=20171231'
                  next: null
                  previous: null
                  last: 'https://api.harvestapp.com/v2/reports/time/team?from=20170101&page=1&per_page=2000&to=20171231'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: from
          description: 'Only report on time entries with a spent_date on or after the given date.'
          required: true
          in: query
          schema:
            type: string
        -
          name: to
          description: 'Only report on time entries with a spent_date on or before the given date.'
          required: true
          in: query
          schema:
            type: string
        -
          name: include_fixed_fee
          description: 'When true, billable amounts will be calculated and included for fixed fee projects.'
          required: false
          in: query
          schema:
            type: string
        -
          name: page
          description: 'The page number to use in pagination. For instance, if you make a list request and receive 2000 records, your subsequent call can include page=2 to retrieve the next page of the list. (Default: 1)'
          required: false
          in: query
          schema:
            type: integer
        -
          name: per_page
          description: 'The number of records to return per page. Can range between 1 and 2000. (Default: 2000)'
          required: false
          in: query
          schema:
            type: integer
  /reports/uninvoiced:
    get:
      summary: 'Uninvoiced Report'
      operationId: uninvoicedReport
      description: "The response contains an object with a results property that contains an array of up to per_page results. Each entry in the array is a separate result object. If no more results are available, the resulting array will be empty. Several additional pagination properties are included in the response to simplify paginating your results.\n\nNote: Each request requires both the from and to parameters to be supplied in the URL’s query string. The timeframe supplied cannot exceed 1 year (365 days)."
      externalDocs:
        description: 'Uninvoiced Report'
        url: 'https://help.getharvest.com/api-v2/reports-api/reports/uninvoiced-report/#uninvoiced-report'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Uninvoiced Report'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UninvoicedReportResults'
              example:
                results:
                  -
                    client_id: 5735776
                    client_name: '123 Industries'
                    project_id: 14308069
                    project_name: 'Online Store - Phase 1'
                    currency: EUR
                    total_hours: 4
                    uninvoiced_hours: 0
                    uninvoiced_expenses: 100
                    uninvoiced_amount: 100
                  -
                    client_id: 5735776
                    client_name: '123 Industries'
                    project_id: 14808188
                    project_name: 'Task Force'
                    currency: EUR
                    total_hours: 0.5
                    uninvoiced_hours: 0.5
                    uninvoiced_expenses: 0
                    uninvoiced_amount: 50
                  -
                    client_id: 5735774
                    client_name: 'ABC Corp'
                    project_id: 14307913
                    project_name: 'Marketing Website'
                    currency: USD
                    total_hours: 2
                    uninvoiced_hours: 0
                    uninvoiced_expenses: 0
                    uninvoiced_amount: 0
                per_page: 2000
                total_pages: 1
                total_entries: 3
                next_page: null
                previous_page: null
                page: 1
                links:
                  first: 'https://api.harvestapp.com/v2/reports/uninvoiced?from=20170101&page=1&per_page=2000&to=20171231'
                  next: null
                  previous: null
                  last: 'https://api.harvestapp.com/v2/reports/uninvoiced?from=20170101&page=1&per_page=2000&to=20171231'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: from
          description: 'Only report on time entries and expenses with a spent_date on or after the given date.'
          required: true
          in: query
          schema:
            type: string
        -
          name: to
          description: 'Only report on time entries and expenses with a spent_date on or before the given date.'
          required: true
          in: query
          schema:
            type: string
        -
          name: include_fixed_fee
          description: 'Whether or not to include fixed-fee projects in the response. Fixed-fee uninvoiced fee amount will show as long as the selected date range is on or after the project start date (If project start date is not specified, it is project creation date). Otherwise, it will be 0. (Default: true)'
          required: false
          in: query
          schema:
            type: boolean
        -
          name: page
          description: 'The page number to use in pagination. For instance, if you make a list request and receive 2000 records, your subsequent call can include page=2 to retrieve the next page of the list. (Default: 1)'
          required: false
          in: query
          schema:
            type: integer
        -
          name: per_page
          description: 'The number of records to return per page. Can range between 1 and 2000. (Default: 2000)'
          required: false
          in: query
          schema:
            type: integer
  /roles:
    get:
      summary: 'List all roles'
      operationId: listRoles
      description: "Returns a list of roles in the account. The roles are returned sorted by creation date, with the most recently created roles appearing first.\n\nThe response contains an object with a roles property that contains an array of up to per_page roles. Each entry in the array is a separate role object. If no more roles are available, the resulting array will be empty. Several additional pagination properties are included in the response to simplify paginating your roles."
      externalDocs:
        description: 'List all roles'
        url: 'https://help.getharvest.com/api-v2/roles-api/roles/roles/#list-all-roles'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'List all roles'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Roles'
              example:
                roles:
                  -
                    id: 618100
                    name: Designer
                    created_at: '2020-04-17T10:09:41Z'
                    updated_at: '2020-04-17T10:09:41Z'
                    user_ids: []
                  -
                    id: 618099
                    name: Developer
                    created_at: '2020-04-17T10:08:43Z'
                    updated_at: '2020-04-17T10:08:43Z'
                    user_ids: []
                  -
                    id: 617630
                    name: Sales
                    created_at: '2020-04-16T16:59:59Z'
                    updated_at: '2020-04-16T16:59:59Z'
                    user_ids:
                      - 2084359
                      - 3122373
                      - 3122374
                per_page: 2000
                total_pages: 1
                total_entries: 2
                next_page: null
                previous_page: null
                page: 1
                links:
                  first: 'https://api.harvestapp.com/v2/roles?page=1&per_page=2000'
                  next: null
                  previous: null
                  last: 'https://api.harvestapp.com/v2/roles?page=1&per_page=2000'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: page
          description: 'DEPRECATED The page number to use in pagination. For instance, if you make a list request and receive 2000 records, your subsequent call can include page=2 to retrieve the next page of the list. (Default: 1)'
          required: false
          in: query
          schema:
            type: integer
          deprecated: true
        -
          name: cursor
          description: 'Pagination cursor'
          required: false
          in: query
          schema:
            type: string
        -
          name: per_page
          description: 'The number of records to return per page. Can range between 1 and 2000. (Default: 2000)'
          required: false
          in: query
          schema:
            type: integer
    post:
      summary: 'Create a role'
      operationId: createRole
      description: 'Creates a new role object. Returns a role object and a 201 Created response code if the call succeeded.'
      externalDocs:
        description: 'Create a role'
        url: 'https://help.getharvest.com/api-v2/roles-api/roles/roles/#create-a-role'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        201:
          description: 'Create a role'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Role'
              example:
                id: 617670
                name: Marketing
                created_at: '2020-04-16T18:18:30Z'
                updated_at: '2020-04-16T18:18:30Z'
                user_ids:
                  - 3122374
                  - 3122373
                  - 2084359
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      requestBody:
        description: 'json payload'
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'The name of the role.'
                  nullable: true
                user_ids:
                  type: array
                  description: 'The IDs of the users assigned to this role.'
                  nullable: true
                  items:
                    type: integer
              required:
                - name
  '/roles/{roleId}':
    delete:
      summary: 'Delete a role'
      operationId: deleteRole
      description: 'Delete a role. Deleting a role will unlink it from any users it was assigned to. Returns a 200 OK response code if the call succeeded.'
      externalDocs:
        description: 'Delete a role'
        url: 'https://help.getharvest.com/api-v2/roles-api/roles/roles/#delete-a-role'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Delete a role'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: roleId
          required: true
          in: path
          schema:
            type: string
    get:
      summary: 'Retrieve a role'
      operationId: retrieveRole
      description: 'Retrieves the role with the given ID. Returns a role object and a 200 OK response code if a valid identifier was provided.'
      externalDocs:
        description: 'Retrieve a role'
        url: 'https://help.getharvest.com/api-v2/roles-api/roles/roles/#retrieve-a-role'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Retrieve a role'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Role'
              example:
                id: 617630
                name: Sales
                created_at: '2020-04-16T16:59:59Z'
                updated_at: '2020-04-16T16:59:59Z'
                user_ids:
                  - 2084359
                  - 3122373
                  - 3122374
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: roleId
          required: true
          in: path
          schema:
            type: string
    patch:
      summary: 'Update a role'
      operationId: updateRole
      description: 'Updates the specific role by setting the values of the parameters passed. Any parameters not provided will be left unchanged. Returns a role object and a 200 OK response code if the call succeeded.'
      externalDocs:
        description: 'Update a role'
        url: 'https://help.getharvest.com/api-v2/roles-api/roles/roles/#update-a-role'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Update a role'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Role'
              example:
                id: 618099
                name: HR
                created_at: '2020-04-16T17:00:38Z'
                updated_at: '2020-04-16T17:00:57Z'
                user_ids:
                  - 2084359
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: roleId
          required: true
          in: path
          schema:
            type: string
      requestBody:
        description: 'json payload'
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'The name of the role.'
                  nullable: true
                user_ids:
                  type: array
                  description: 'The IDs of the users assigned to this role.'
                  nullable: true
                  items:
                    type: integer
  /task_assignments:
    get:
      summary: 'List all task assignments'
      operationId: listTaskAssignments
      description: "Returns a list of your task assignments. The task assignments are returned sorted by creation date, with the most recently created task assignments appearing first.\n\nThe response contains an object with a task_assignments property that contains an array of up to per_page task assignments. Each entry in the array is a separate task assignment object. If no more task assignments are available, the resulting array will be empty. Several additional pagination properties are included in the response to simplify paginating your task assignments."
      externalDocs:
        description: 'List all task assignments'
        url: 'https://help.getharvest.com/api-v2/projects-api/projects/task-assignments/#list-all-task-assignments'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'List all task assignments'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TaskAssignments'
              example:
                task_assignments:
                  -
                    id: 160726647
                    billable: false
                    is_active: true
                    created_at: '2017-08-22T17:36:54Z'
                    updated_at: '2017-08-22T17:36:54Z'
                    hourly_rate: 100.0
                    budget: null
                    project:
                      id: 14808188
                      name: 'Task Force'
                      code: TF
                    task:
                      id: 8083369
                      name: Research
                  -
                    id: 160726646
                    billable: true
                    is_active: true
                    created_at: '2017-08-22T17:36:54Z'
                    updated_at: '2017-08-22T17:36:54Z'
                    hourly_rate: 100.0
                    budget: null
                    project:
                      id: 14808188
                      name: 'Task Force'
                      code: TF
                    task:
                      id: 8083368
                      name: 'Project Management'
                  -
                    id: 160726645
                    billable: true
                    is_active: true
                    created_at: '2017-08-22T17:36:54Z'
                    updated_at: '2017-08-22T17:36:54Z'
                    hourly_rate: 100.0
                    budget: null
                    project:
                      id: 14808188
                      name: 'Task Force'
                      code: TF
                    task:
                      id: 8083366
                      name: Programming
                  -
                    id: 160726644
                    billable: true
                    is_active: true
                    created_at: '2017-08-22T17:36:54Z'
                    updated_at: '2017-08-22T17:36:54Z'
                    hourly_rate: 100.0
                    budget: null
                    project:
                      id: 14808188
                      name: 'Task Force'
                      code: TF
                    task:
                      id: 8083365
                      name: 'Graphic Design'
                  -
                    id: 155505153
                    billable: false
                    is_active: true
                    created_at: '2017-06-26T21:53:20Z'
                    updated_at: '2017-06-26T21:54:31Z'
                    hourly_rate: 100.0
                    budget: null
                    project:
                      id: 14307913
                      name: 'Marketing Website'
                      code: MW
                    task:
                      id: 8083369
                      name: Research
                  -
                    id: 155505016
                    billable: false
                    is_active: true
                    created_at: '2017-06-26T21:52:18Z'
                    updated_at: '2017-06-26T21:54:06Z'
                    hourly_rate: 100.0
                    budget: null
                    project:
                      id: 14308069
                      name: 'Online Store - Phase 1'
                      code: OS1
                    task:
                      id: 8083369
                      name: Research
                  -
                    id: 155505015
                    billable: true
                    is_active: true
                    created_at: '2017-06-26T21:52:18Z'
                    updated_at: '2017-06-26T21:52:18Z'
                    hourly_rate: 100.0
                    budget: null
                    project:
                      id: 14308069
                      name: 'Online Store - Phase 1'
                      code: OS1
                    task:
                      id: 8083368
                      name: 'Project Management'
                  -
                    id: 155505014
                    billable: true
                    is_active: true
                    created_at: '2017-06-26T21:52:18Z'
                    updated_at: '2017-06-26T21:52:18Z'
                    hourly_rate: 100.0
                    budget: null
                    project:
                      id: 14308069
                      name: 'Online Store - Phase 1'
                      code: OS1
                    task:
                      id: 8083366
                      name: Programming
                  -
                    id: 155505013
                    billable: true
                    is_active: true
                    created_at: '2017-06-26T21:52:18Z'
                    updated_at: '2017-06-26T21:52:18Z'
                    hourly_rate: 100.0
                    budget: null
                    project:
                      id: 14308069
                      name: 'Online Store - Phase 1'
                      code: OS1
                    task:
                      id: 8083365
                      name: 'Graphic Design'
                  -
                    id: 155502711
                    billable: true
                    is_active: true
                    created_at: '2017-06-26T21:36:23Z'
                    updated_at: '2017-06-26T21:36:23Z'
                    hourly_rate: 100.0
                    budget: null
                    project:
                      id: 14307913
                      name: 'Marketing Website'
                      code: MW
                    task:
                      id: 8083368
                      name: 'Project Management'
                  -
                    id: 155502710
                    billable: true
                    is_active: true
                    created_at: '2017-06-26T21:36:23Z'
                    updated_at: '2017-06-26T21:36:23Z'
                    hourly_rate: 100.0
                    budget: null
                    project:
                      id: 14307913
                      name: 'Marketing Website'
                      code: MW
                    task:
                      id: 8083366
                      name: Programming
                  -
                    id: 155502709
                    billable: true
                    is_active: true
                    created_at: '2017-06-26T21:36:23Z'
                    updated_at: '2017-06-26T21:36:23Z'
                    hourly_rate: 100.0
                    budget: null
                    project:
                      id: 14307913
                      name: 'Marketing Website'
                      code: MW
                    task:
                      id: 8083365
                      name: 'Graphic Design'
                per_page: 2000
                total_pages: 1
                total_entries: 12
                next_page: null
                previous_page: null
                page: 1
                links:
                  first: 'https://api.harvestapp.com/v2/task_assignments?page=1&per_page=2000'
                  next: null
                  previous: null
                  last: 'https://api.harvestapp.com/v2/task_assignments?page=1&per_page=2000'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: is_active
          description: 'Pass true to only return active task assignments and false to return inactive task assignments.'
          required: false
          in: query
          schema:
            type: boolean
        -
          name: updated_since
          description: 'Only return task assignments that have been updated since the given date and time.'
          required: false
          in: query
          schema:
            type: string
        -
          name: page
          description: 'DEPRECATED The page number to use in pagination. For instance, if you make a list request and receive 2000 records, your subsequent call can include page=2 to retrieve the next page of the list. (Default: 1)'
          required: false
          in: query
          schema:
            type: integer
          deprecated: true
        -
          name: cursor
          description: 'Pagination cursor'
          required: false
          in: query
          schema:
            type: string
        -
          name: per_page
          description: 'The number of records to return per page. Can range between 1 and 2000. (Default: 2000)'
          required: false
          in: query
          schema:
            type: integer
  /tasks:
    get:
      summary: 'List all tasks'
      operationId: listTasks
      description: "Returns a list of your tasks. The tasks are returned sorted by creation date, with the most recently created tasks appearing first.\n\nThe response contains an object with a tasks property that contains an array of up to per_page tasks. Each entry in the array is a separate task object. If no more tasks are available, the resulting array will be empty. Several additional pagination properties are included in the response to simplify paginating your tasks."
      externalDocs:
        description: 'List all tasks'
        url: 'https://help.getharvest.com/api-v2/tasks-api/tasks/tasks/#list-all-tasks'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'List all tasks'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Tasks'
              example:
                tasks:
                  -
                    id: 8083800
                    name: 'Business Development'
                    billable_by_default: false
                    default_hourly_rate: 0.0
                    is_default: false
                    is_active: true
                    created_at: '2017-06-26T22:08:25Z'
                    updated_at: '2017-06-26T22:08:25Z'
                  -
                    id: 8083369
                    name: Research
                    billable_by_default: false
                    default_hourly_rate: 0.0
                    is_default: true
                    is_active: true
                    created_at: '2017-06-26T20:41:00Z'
                    updated_at: '2017-06-26T21:53:34Z'
                  -
                    id: 8083368
                    name: 'Project Management'
                    billable_by_default: true
                    default_hourly_rate: 100.0
                    is_default: true
                    is_active: true
                    created_at: '2017-06-26T20:41:00Z'
                    updated_at: '2017-06-26T21:14:10Z'
                  -
                    id: 8083366
                    name: Programming
                    billable_by_default: true
                    default_hourly_rate: 100.0
                    is_default: true
                    is_active: true
                    created_at: '2017-06-26T20:41:00Z'
                    updated_at: '2017-06-26T21:14:07Z'
                  -
                    id: 8083365
                    name: 'Graphic Design'
                    billable_by_default: true
                    default_hourly_rate: 100.0
                    is_default: true
                    is_active: true
                    created_at: '2017-06-26T20:41:00Z'
                    updated_at: '2017-06-26T21:14:02Z'
                per_page: 2000
                total_pages: 1
                total_entries: 5
                next_page: null
                previous_page: null
                page: 1
                links:
                  first: 'https://api.harvestapp.com/v2/tasks?page=1&per_page=2000'
                  next: null
                  previous: null
                  last: 'https://api.harvestapp.com/v2/tasks?page=1&per_page=2000'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: is_active
          description: 'Pass true to only return active tasks and false to return inactive tasks.'
          required: false
          in: query
          schema:
            type: boolean
        -
          name: updated_since
          description: 'Only return tasks that have been updated since the given date and time.'
          required: false
          in: query
          schema:
            type: string
        -
          name: page
          description: 'DEPRECATED The page number to use in pagination. For instance, if you make a list request and receive 2000 records, your subsequent call can include page=2 to retrieve the next page of the list. (Default: 1)'
          required: false
          in: query
          schema:
            type: integer
          deprecated: true
        -
          name: cursor
          description: 'Pagination cursor'
          required: false
          in: query
          schema:
            type: string
        -
          name: per_page
          description: 'The number of records to return per page. Can range between 1 and 2000. (Default: 2000)'
          required: false
          in: query
          schema:
            type: integer
    post:
      summary: 'Create a task'
      operationId: createTask
      description: 'Creates a new task object. Returns a task object and a 201 Created response code if the call succeeded.'
      externalDocs:
        description: 'Create a task'
        url: 'https://help.getharvest.com/api-v2/tasks-api/tasks/tasks/#create-a-task'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        201:
          description: 'Create a task'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Task'
              example:
                id: 8083782
                name: 'New Task Name'
                billable_by_default: true
                default_hourly_rate: 0
                is_default: false
                is_active: true
                created_at: '2017-06-26T22:04:31Z'
                updated_at: '2017-06-26T22:04:31Z'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      requestBody:
        description: 'json payload'
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'The name of the task.'
                  nullable: true
                billable_by_default:
                  type: boolean
                  description: 'Used in determining whether default tasks should be marked billable when creating a new project. Defaults to true.'
                  nullable: true
                default_hourly_rate:
                  type: number
                  description: 'The default hourly rate to use for this task when it is added to a project. Defaults to 0.'
                  nullable: true
                  format: float
                is_default:
                  type: boolean
                  description: 'Whether this task should be automatically added to future projects. Defaults to false.'
                  nullable: true
                is_active:
                  type: boolean
                  description: 'Whether this task is active or archived. Defaults to true.'
                  nullable: true
              required:
                - name
  '/tasks/{taskId}':
    delete:
      summary: 'Delete a task'
      operationId: deleteTask
      description: 'Delete a task. Deleting a task is only possible if it has no time entries associated with it. Returns a 200 OK response code if the call succeeded.'
      externalDocs:
        description: 'Delete a task'
        url: 'https://help.getharvest.com/api-v2/tasks-api/tasks/tasks/#delete-a-task'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Delete a task'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: taskId
          required: true
          in: path
          schema:
            type: string
    get:
      summary: 'Retrieve a task'
      operationId: retrieveTask
      description: 'Retrieves the task with the given ID. Returns a task object and a 200 OK response code if a valid identifier was provided.'
      externalDocs:
        description: 'Retrieve a task'
        url: 'https://help.getharvest.com/api-v2/tasks-api/tasks/tasks/#retrieve-a-task'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Retrieve a task'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Task'
              example:
                id: 8083800
                name: 'Business Development'
                billable_by_default: false
                default_hourly_rate: 0.0
                is_default: false
                is_active: true
                created_at: '2017-06-26T22:08:25Z'
                updated_at: '2017-06-26T22:08:25Z'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: taskId
          required: true
          in: path
          schema:
            type: string
    patch:
      summary: 'Update a task'
      operationId: updateTask
      description: 'Updates the specific task by setting the values of the parameters passed. Any parameters not provided will be left unchanged. Returns a task object and a 200 OK response code if the call succeeded.'
      externalDocs:
        description: 'Update a task'
        url: 'https://help.getharvest.com/api-v2/tasks-api/tasks/tasks/#update-a-task'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Update a task'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Task'
              example:
                id: 8083782
                name: 'New Task Name'
                billable_by_default: true
                default_hourly_rate: 0
                is_default: true
                is_active: true
                created_at: '2017-06-26T22:04:31Z'
                updated_at: '2017-06-26T22:04:54Z'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: taskId
          required: true
          in: path
          schema:
            type: string
      requestBody:
        description: 'json payload'
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'The name of the task.'
                  nullable: true
                billable_by_default:
                  type: boolean
                  description: 'Used in determining whether default tasks should be marked billable when creating a new project.'
                  nullable: true
                default_hourly_rate:
                  type: number
                  description: 'The default hourly rate to use for this task when it is added to a project.'
                  nullable: true
                  format: float
                is_default:
                  type: boolean
                  description: 'Whether this task should be automatically added to future projects.'
                  nullable: true
                is_active:
                  type: boolean
                  description: 'Whether this task is active or archived.'
                  nullable: true
  /time_entries:
    get:
      summary: 'List all time entries'
      operationId: listTimeEntries
      description: "Returns a list of time entries. The time entries are returned sorted by spent_date date. At this time, the sort option can’t be customized.\n\nThe response contains an object with a time_entries property that contains an array of up to per_page time entries. Each entry in the array is a separate time entry object. If no more time entries are available, the resulting array will be empty. Several additional pagination properties are included in the response to simplify paginating your time entries."
      externalDocs:
        description: 'List all time entries'
        url: 'https://help.getharvest.com/api-v2/timesheets-api/timesheets/time-entries/#list-all-time-entries'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'List all time entries'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TimeEntries'
              example:
                time_entries:
                  -
                    id: 636709355
                    spent_date: '2017-03-02'
                    user:
                      id: 1782959
                      name: 'Kim Allen'
                    client:
                      id: 5735774
                      name: 'ABC Corp'
                    project:
                      id: 14307913
                      name: 'Marketing Website'
                    task:
                      id: 8083365
                      name: 'Graphic Design'
                    user_assignment:
                      id: 125068553
                      is_project_manager: true
                      is_active: true
                      budget: null
                      created_at: '2017-06-26T22:32:52Z'
                      updated_at: '2017-06-26T22:32:52Z'
                      hourly_rate: 100.0
                    task_assignment:
                      id: 155502709
                      billable: true
                      is_active: true
                      created_at: '2017-06-26T21:36:23Z'
                      updated_at: '2017-06-26T21:36:23Z'
                      hourly_rate: 100.0
                      budget: null
                    hours: 2.11
                    hours_without_timer: 2.11
                    rounded_hours: 2.25
                    notes: 'Adding CSS styling'
                    created_at: '2017-06-27T15:50:15Z'
                    updated_at: '2017-06-27T16:47:14Z'
                    is_locked: true
                    locked_reason: 'Item Approved and Locked for this Time Period'
                    is_closed: true
                    is_billed: false
                    timer_started_at: null
                    started_time: '3:00pm'
                    ended_time: '5:00pm'
                    is_running: false
                    invoice: null
                    external_reference: null
                    billable: true
                    budgeted: true
                    billable_rate: 100.0
                    cost_rate: 50.0
                  -
                    id: 636708723
                    spent_date: '2017-03-01'
                    user:
                      id: 1782959
                      name: 'Kim Allen'
                    client:
                      id: 5735776
                      name: '123 Industries'
                    project:
                      id: 14308069
                      name: 'Online Store - Phase 1'
                    task:
                      id: 8083366
                      name: Programming
                    user_assignment:
                      id: 125068554
                      is_project_manager: true
                      is_active: true
                      budget: null
                      created_at: '2017-06-26T22:32:52Z'
                      updated_at: '2017-06-26T22:32:52Z'
                      hourly_rate: 100.0
                    task_assignment:
                      id: 155505014
                      billable: true
                      is_active: true
                      created_at: '2017-06-26T21:52:18Z'
                      updated_at: '2017-06-26T21:52:18Z'
                      hourly_rate: 100.0
                      budget: null
                    hours: 1.35
                    hours_without_timer: 1.35
                    rounded_hours: 1.5
                    notes: 'Importing products'
                    created_at: '2017-06-27T15:49:28Z'
                    updated_at: '2017-06-27T16:47:14Z'
                    is_locked: true
                    locked_reason: 'Item Invoiced and Approved and Locked for this Time Period'
                    is_closed: true
                    is_billed: true
                    timer_started_at: null
                    started_time: '1:00pm'
                    ended_time: '2:00pm'
                    is_running: false
                    invoice:
                      id: 13150403
                      number: '1001'
                    external_reference: null
                    billable: true
                    budgeted: true
                    billable_rate: 100.0
                    cost_rate: 50.0
                  -
                    id: 636708574
                    spent_date: '2017-03-01'
                    user:
                      id: 1782959
                      name: 'Kim Allen'
                    client:
                      id: 5735776
                      name: '123 Industries'
                    project:
                      id: 14308069
                      name: 'Online Store - Phase 1'
                    task:
                      id: 8083369
                      name: Research
                    user_assignment:
                      id: 125068554
                      is_project_manager: true
                      is_active: true
                      budget: null
                      created_at: '2017-06-26T22:32:52Z'
                      updated_at: '2017-06-26T22:32:52Z'
                      hourly_rate: 100.0
                    task_assignment:
                      id: 155505016
                      billable: false
                      is_active: true
                      created_at: '2017-06-26T21:52:18Z'
                      updated_at: '2017-06-26T21:54:06Z'
                      hourly_rate: 100.0
                      budget: null
                    hours: 1.0
                    hours_without_timer: 1.0
                    rounded_hours: 1.0
                    notes: 'Evaluating 3rd party libraries'
                    created_at: '2017-06-27T15:49:17Z'
                    updated_at: '2017-06-27T16:47:14Z'
                    is_locked: true
                    locked_reason: 'Item Approved and Locked for this Time Period'
                    is_closed: true
                    is_billed: false
                    timer_started_at: null
                    started_time: '11:00am'
                    ended_time: '12:00pm'
                    is_running: false
                    invoice: null
                    external_reference: null
                    billable: false
                    budgeted: true
                    billable_rate: null
                    cost_rate: 50.0
                  -
                    id: 636707831
                    spent_date: '2017-03-01'
                    user:
                      id: 1782959
                      name: 'Kim Allen'
                    client:
                      id: 5735776
                      name: '123 Industries'
                    project:
                      id: 14308069
                      name: 'Online Store - Phase 1'
                    task:
                      id: 8083368
                      name: 'Project Management'
                    user_assignment:
                      id: 125068554
                      is_project_manager: true
                      is_active: true
                      budget: null
                      created_at: '2017-06-26T22:32:52Z'
                      updated_at: '2017-06-26T22:32:52Z'
                      hourly_rate: 100.0
                    task_assignment:
                      id: 155505015
                      billable: true
                      is_active: true
                      created_at: '2017-06-26T21:52:18Z'
                      updated_at: '2017-06-26T21:52:18Z'
                      hourly_rate: 100.0
                      budget: null
                    hours: 2.0
                    hours_without_timer: 2.0
                    rounded_hours: 2.0
                    notes: 'Planning meetings'
                    created_at: '2017-06-27T15:48:24Z'
                    updated_at: '2017-06-27T16:47:14Z'
                    is_locked: true
                    locked_reason: 'Item Invoiced and Approved and Locked for this Time Period'
                    is_closed: true
                    is_billed: true
                    timer_started_at: null
                    started_time: '9:00am'
                    ended_time: '11:00am'
                    is_running: false
                    invoice:
                      id: 13150403
                      number: '1001'
                    external_reference: null
                    billable: true
                    budgeted: true
                    billable_rate: 100.0
                    cost_rate: 50.0
                per_page: 2000
                total_pages: 1
                total_entries: 4
                next_page: null
                previous_page: null
                page: 1
                links:
                  first: 'https://api.harvestapp.com/v2/time_entries?page=1&per_page=2000'
                  next: null
                  previous: null
                  last: 'https://api.harvestapp.com/v2/time_entries?page=1&per_page=2000'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: user_id
          description: 'Only return time entries belonging to the user with the given ID.'
          required: false
          in: query
          schema:
            type: integer
        -
          name: client_id
          description: 'Only return time entries belonging to the client with the given ID.'
          required: false
          in: query
          schema:
            type: integer
        -
          name: project_id
          description: 'Only return time entries belonging to the project with the given ID.'
          required: false
          in: query
          schema:
            type: integer
        -
          name: task_id
          description: 'Only return time entries belonging to the task with the given ID.'
          required: false
          in: query
          schema:
            type: integer
        -
          name: external_reference_id
          description: 'Only return time entries with the given external_reference ID.'
          required: false
          in: query
          schema:
            type: string
        -
          name: is_billed
          description: 'Pass true to only return time entries that have been invoiced and false to return time entries that have not been invoiced.'
          required: false
          in: query
          schema:
            type: boolean
        -
          name: is_running
          description: 'Pass true to only return running time entries and false to return non-running time entries.'
          required: false
          in: query
          schema:
            type: boolean
        -
          name: updated_since
          description: 'Only return time entries that have been updated since the given date and time. Use the ISO 8601 Format.'
          required: false
          in: query
          schema:
            type: string
        -
          name: from
          description: 'Only return time entries with a spent_date on or after the given date.'
          required: false
          in: query
          schema:
            type: string
        -
          name: to
          description: 'Only return time entries with a spent_date on or before the given date.'
          required: false
          in: query
          schema:
            type: string
        -
          name: page
          description: 'The page number to use in pagination. For instance, if you make a list request and receive 2000 records, your subsequent call can include page=2 to retrieve the next page of the list. (Default: 1)'
          required: false
          in: query
          schema:
            type: integer
        -
          name: per_page
          description: 'The number of records to return per page. Can range between 1 and 2000. (Default: 2000)'
          required: false
          in: query
          schema:
            type: integer
    post:
      summary: 'Create a time entry'
      operationId: createTimeEntry
      description: "Creates a new time entry object. Returns a time entry object and a 201 Created response code if the call succeeded.\n\nYou should only use this method to create time entries when your account is configured to track time via duration. You can verify this by visiting the Settings page in your Harvest account or by checking if wants_timestamp_timers is false in the Company API."
      externalDocs:
        description: 'Create a time entry via duration'
        url: 'https://help.getharvest.com/api-v2/timesheets-api/timesheets/time-entries/#create-a-time-entry-via-duration'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        201:
          description: 'Create a time entry'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TimeEntry'
              example:
                id: 636718192
                spent_date: '2017-03-21'
                user:
                  id: 1782959
                  name: 'Kim Allen'
                client:
                  id: 5735774
                  name: 'ABC Corp'
                project:
                  id: 14307913
                  name: 'Marketing Website'
                task:
                  id: 8083365
                  name: 'Graphic Design'
                user_assignment:
                  id: 125068553
                  is_project_manager: true
                  is_active: true
                  budget: null
                  created_at: '2017-06-26T22:32:52Z'
                  updated_at: '2017-06-26T22:32:52Z'
                  hourly_rate: 100.0
                task_assignment:
                  id: 155502709
                  billable: true
                  is_active: true
                  created_at: '2017-06-26T21:36:23Z'
                  updated_at: '2017-06-26T21:36:23Z'
                  hourly_rate: 100.0
                  budget: null
                hours: 1.0
                rounded_hours: 1.0
                notes: null
                created_at: '2017-06-27T16:01:23Z'
                updated_at: '2017-06-27T16:01:23Z'
                is_locked: false
                locked_reason: null
                is_closed: false
                is_billed: false
                timer_started_at: null
                started_time: null
                ended_time: null
                is_running: false
                invoice: null
                external_reference: null
                billable: true
                budgeted: true
                billable_rate: 100.0
                cost_rate: 50.0
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      requestBody:
        description: 'json payload'
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                user_id:
                  type: integer
                  description: 'The ID of the user to associate with the time entry. Defaults to the currently authenticated user’s ID.'
                  nullable: true
                  format: int32
                project_id:
                  type: integer
                  description: 'The ID of the project to associate with the time entry.'
                  nullable: true
                  format: int32
                task_id:
                  type: integer
                  description: 'The ID of the task to associate with the time entry.'
                  nullable: true
                  format: int32
                spent_date:
                  type: string
                  description: 'The ISO 8601 formatted date the time entry was spent.'
                  nullable: true
                  format: date
                started_time:
                  type: string
                  description: 'The time the entry started. Defaults to the current time. Example: “8:00am”.'
                  nullable: true
                ended_time:
                  type: string
                  description: 'The time the entry ended. If provided, is_running will be set to false. If not provided, is_running will be set to true.'
                  nullable: true
                notes:
                  type: string
                  description: 'Any notes to be associated with the time entry.'
                  nullable: true
                external_reference:
                  type: object
                  description: 'An object containing the id, group_id, account_id, and permalink of the external reference.'
                  nullable: true
                  properties:
                    id:
                      type: string
                      nullable: true
                    group_id:
                      type: string
                      nullable: true
                    account_id:
                      type: string
                      nullable: true
                    permalink:
                      type: string
                      nullable: true
                hours:
                  type: number
                  description: 'The current amount of time tracked. If provided, the time entry will be created with the specified hours and is_running will be set to false. If not provided, hours will be set to 0.0 and is_running will be set to true.'
                  nullable: true
                  format: float
              required:
                - project_id
                - task_id
                - spent_date
  '/time_entries/{timeEntryId}':
    delete:
      summary: 'Delete a time entry'
      operationId: deleteTimeEntry
      description: 'Delete a time entry. Deleting a time entry is only possible if it’s not closed and the associated project and task haven’t been archived.  However, Admins can delete closed entries. Returns a 200 OK response code if the call succeeded.'
      externalDocs:
        description: 'Delete a time entry'
        url: 'https://help.getharvest.com/api-v2/timesheets-api/timesheets/time-entries/#delete-a-time-entry'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Delete a time entry'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: timeEntryId
          required: true
          in: path
          schema:
            type: string
    get:
      summary: 'Retrieve a time entry'
      operationId: retrieveTimeEntry
      description: 'Retrieves the time entry with the given ID. Returns a time entry object and a 200 OK response code if a valid identifier was provided.'
      externalDocs:
        description: 'Retrieve a time entry'
        url: 'https://help.getharvest.com/api-v2/timesheets-api/timesheets/time-entries/#retrieve-a-time-entry'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Retrieve a time entry'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TimeEntry'
              example:
                id: 636708723
                spent_date: '2017-03-01'
                user:
                  id: 1782959
                  name: 'Kim Allen'
                client:
                  id: 5735776
                  name: '123 Industries'
                project:
                  id: 14308069
                  name: 'Online Store - Phase 1'
                task:
                  id: 8083366
                  name: Programming
                user_assignment:
                  id: 125068554
                  is_project_manager: true
                  is_active: true
                  budget: null
                  created_at: '2017-06-26T22:32:52Z'
                  updated_at: '2017-06-26T22:32:52Z'
                  hourly_rate: 100.0
                task_assignment:
                  id: 155505014
                  billable: true
                  is_active: true
                  created_at: '2017-06-26T21:52:18Z'
                  updated_at: '2017-06-26T21:52:18Z'
                  hourly_rate: 100.0
                  budget: null
                hours: 1.0
                hours_without_timer: 1.0
                rounded_hours: 1.0
                notes: 'Importing products'
                created_at: '2017-06-27T15:49:28Z'
                updated_at: '2017-06-27T16:47:14Z'
                is_locked: true
                locked_reason: 'Item Invoiced and Approved and Locked for this Time Period'
                is_closed: true
                is_billed: true
                timer_started_at: null
                started_time: '1:00pm'
                ended_time: '2:00pm'
                is_running: false
                invoice:
                  id: 13150403
                  number: '1001'
                external_reference: null
                billable: true
                budgeted: true
                billable_rate: 100.0
                cost_rate: 50.0
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: timeEntryId
          required: true
          in: path
          schema:
            type: string
    patch:
      summary: 'Update a time entry'
      operationId: updateTimeEntry
      description: 'Updates the specific time entry by setting the values of the parameters passed. Any parameters not provided will be left unchanged. Returns a time entry object and a 200 OK response code if the call succeeded.'
      externalDocs:
        description: 'Update a time entry'
        url: 'https://help.getharvest.com/api-v2/timesheets-api/timesheets/time-entries/#update-a-time-entry'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Update a time entry'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TimeEntry'
              example:
                id: 636718192
                spent_date: '2017-03-21'
                user:
                  id: 1782959
                  name: 'Kim Allen'
                client:
                  id: 5735774
                  name: 'ABC Corp'
                project:
                  id: 14307913
                  name: 'Marketing Website'
                task:
                  id: 8083365
                  name: 'Graphic Design'
                user_assignment:
                  id: 125068553
                  is_project_manager: true
                  is_active: true
                  budget: null
                  created_at: '2017-06-26T22:32:52Z'
                  updated_at: '2017-06-26T22:32:52Z'
                  hourly_rate: 100.0
                task_assignment:
                  id: 155502709
                  billable: true
                  is_active: true
                  created_at: '2017-06-26T21:36:23Z'
                  updated_at: '2017-06-26T21:36:23Z'
                  hourly_rate: 100.0
                  budget: null
                hours: 1.0
                hours_without_timer: 1.0
                rounded_hours: 1.0
                notes: 'Updated notes'
                created_at: '2017-06-27T16:01:23Z'
                updated_at: '2017-06-27T16:02:40Z'
                is_locked: false
                locked_reason: null
                is_closed: false
                is_billed: false
                timer_started_at: null
                started_time: null
                ended_time: null
                is_running: false
                invoice: null
                external_reference: null
                billable: true
                budgeted: true
                billable_rate: 100.0
                cost_rate: 50.0
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: timeEntryId
          required: true
          in: path
          schema:
            type: string
      requestBody:
        description: 'json payload'
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                project_id:
                  type: integer
                  description: 'The ID of the project to associate with the time entry.'
                  nullable: true
                  format: int32
                task_id:
                  type: integer
                  description: 'The ID of the task to associate with the time entry.'
                  nullable: true
                  format: int32
                spent_date:
                  type: string
                  description: 'The ISO 8601 formatted date the time entry was spent.'
                  nullable: true
                  format: date
                started_time:
                  type: string
                  description: 'The time the entry started. Defaults to the current time. Example: “8:00am”.'
                  nullable: true
                ended_time:
                  type: string
                  description: 'The time the entry ended.'
                  nullable: true
                hours:
                  type: number
                  description: 'The current amount of time tracked.'
                  nullable: true
                  format: float
                notes:
                  type: string
                  description: 'Any notes to be associated with the time entry.'
                  nullable: true
                external_reference:
                  type: object
                  description: 'An object containing the id, group_id, account_id, and permalink of the external reference.'
                  nullable: true
                  properties:
                    id:
                      type: string
                      nullable: true
                    group_id:
                      type: string
                      nullable: true
                    account_id:
                      type: string
                      nullable: true
                    permalink:
                      type: string
                      nullable: true
  '/time_entries/{timeEntryId}/external_reference':
    delete:
      summary: 'Delete a time entry’s external reference'
      operationId: deleteTimeEntryExternalReference
      description: 'Delete a time entry’s external reference. Returns a 200 OK response code if the call succeeded.'
      externalDocs:
        description: 'Delete a time entry’s external reference'
        url: 'https://help.getharvest.com/api-v2/timesheets-api/timesheets/time-entries/#delete-a-time-entrys-external-reference'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Delete a time entry’s external reference'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: timeEntryId
          required: true
          in: path
          schema:
            type: string
  '/time_entries/{timeEntryId}/restart':
    patch:
      summary: 'Restart a stopped time entry'
      operationId: restartStoppedTimeEntry
      description: 'Restarting a time entry is only possible if it isn’t currently running. Returns a 200 OK response code if the call succeeded.'
      externalDocs:
        description: 'Restart a stopped time entry'
        url: 'https://help.getharvest.com/api-v2/timesheets-api/timesheets/time-entries/#restart-a-stopped-time-entry'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Restart a stopped time entry'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TimeEntry'
              example:
                id: 662204379
                spent_date: '2017-03-21'
                user:
                  id: 1795925
                  name: 'Jane Smith'
                client:
                  id: 5735776
                  name: '123 Industries'
                project:
                  id: 14808188
                  name: 'Task Force'
                task:
                  id: 8083366
                  name: Programming
                user_assignment:
                  id: 130403296
                  is_project_manager: true
                  is_active: true
                  budget: null
                  created_at: '2017-08-22T17:36:54Z'
                  updated_at: '2017-08-22T17:36:54Z'
                  hourly_rate: 100
                task_assignment:
                  id: 160726645
                  billable: true
                  is_active: true
                  created_at: '2017-08-22T17:36:54Z'
                  updated_at: '2017-08-22T17:36:54Z'
                  hourly_rate: 100
                  budget: null
                hours: 0
                hours_without_timer: 0
                rounded_hours: 0
                notes: null
                created_at: '2017-08-22T17:40:24Z'
                updated_at: '2017-08-22T17:40:24Z'
                is_locked: false
                locked_reason: null
                is_closed: false
                is_billed: false
                timer_started_at: '2017-08-22T17:40:24Z'
                started_time: '11:40am'
                ended_time: null
                is_running: true
                invoice: null
                external_reference: null
                billable: true
                budgeted: false
                billable_rate: 100
                cost_rate: 75
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: timeEntryId
          required: true
          in: path
          schema:
            type: string
  '/time_entries/{timeEntryId}/stop':
    patch:
      summary: 'Stop a running time entry'
      operationId: stopRunningTimeEntry
      description: 'Stopping a time entry is only possible if it’s currently running. Returns a 200 OK response code if the call succeeded.'
      externalDocs:
        description: 'Stop a running time entry'
        url: 'https://help.getharvest.com/api-v2/timesheets-api/timesheets/time-entries/#stop-a-running-time-entry'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Stop a running time entry'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TimeEntry'
              example:
                id: 662202797
                spent_date: '2017-03-21'
                user:
                  id: 1795925
                  name: 'Jane Smith'
                client:
                  id: 5735776
                  name: '123 Industries'
                project:
                  id: 14808188
                  name: 'Task Force'
                task:
                  id: 8083366
                  name: Programming
                user_assignment:
                  id: 130403296
                  is_project_manager: true
                  is_active: true
                  budget: null
                  created_at: '2017-08-22T17:36:54Z'
                  updated_at: '2017-08-22T17:36:54Z'
                  hourly_rate: 100
                task_assignment:
                  id: 160726645
                  billable: true
                  is_active: true
                  created_at: '2017-08-22T17:36:54Z'
                  updated_at: '2017-08-22T17:36:54Z'
                  hourly_rate: 100
                  budget: null
                hours: 0.02
                hours_without_timer: 0.02
                rounded_hours: 0.25
                notes: null
                created_at: '2017-08-22T17:37:13Z'
                updated_at: '2017-08-22T17:38:31Z'
                is_locked: false
                locked_reason: null
                is_closed: false
                is_billed: false
                timer_started_at: null
                started_time: '11:37am'
                ended_time: '11:38am'
                is_running: false
                invoice: null
                external_reference: null
                billable: true
                budgeted: false
                billable_rate: 100
                cost_rate: 75
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: timeEntryId
          required: true
          in: path
          schema:
            type: string
  /user_assignments:
    get:
      summary: 'List all user assignments'
      operationId: listUserAssignments
      description: "Returns a list of your projects user assignments, active and archived. The user assignments are returned sorted by creation date, with the most recently created user assignments appearing first.\n\nThe response contains an object with a user_assignments property that contains an array of up to per_page user assignments. Each entry in the array is a separate user assignment object. If no more user assignments are available, the resulting array will be empty. Several additional pagination properties are included in the response to simplify paginating your user assignments."
      externalDocs:
        description: 'List all user assignments'
        url: 'https://help.getharvest.com/api-v2/projects-api/projects/user-assignments/#list-all-user-assignments'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'List all user assignments'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserAssignments'
              example:
                user_assignments:
                  -
                    id: 130403297
                    is_project_manager: true
                    is_active: true
                    use_default_rates: false
                    budget: null
                    created_at: '2017-08-22T17:36:54Z'
                    updated_at: '2017-08-22T17:36:54Z'
                    hourly_rate: 100.0
                    project:
                      id: 14808188
                      name: 'Task Force'
                      code: TF
                    user:
                      id: 1782959
                      name: 'Kim Allen'
                  -
                    id: 130403296
                    is_project_manager: true
                    is_active: true
                    use_default_rates: true
                    budget: null
                    created_at: '2017-08-22T17:36:54Z'
                    updated_at: '2017-08-22T17:36:54Z'
                    hourly_rate: 100.0
                    project:
                      id: 14808188
                      name: 'Task Force'
                      code: TF
                    user:
                      id: 1795925
                      name: 'Jason Dew'
                  -
                    id: 125068554
                    is_project_manager: true
                    is_active: true
                    use_default_rates: true
                    budget: null
                    created_at: '2017-06-26T22:32:52Z'
                    updated_at: '2017-06-26T22:32:52Z'
                    hourly_rate: 100.0
                    project:
                      id: 14308069
                      name: 'Online Store - Phase 1'
                      code: OS1
                    user:
                      id: 1782959
                      name: 'Kim Allen'
                  -
                    id: 125068553
                    is_project_manager: true
                    is_active: true
                    use_default_rates: true
                    budget: null
                    created_at: '2017-06-26T22:32:52Z'
                    updated_at: '2017-06-26T22:32:52Z'
                    hourly_rate: 100.0
                    project:
                      id: 14307913
                      name: 'Marketing Website'
                      code: MW
                    user:
                      id: 1782959
                      name: 'Kim Allen'
                  -
                    id: 125066109
                    is_project_manager: true
                    is_active: true
                    use_default_rates: false
                    budget: null
                    created_at: '2017-06-26T21:52:18Z'
                    updated_at: '2017-06-26T21:52:18Z'
                    hourly_rate: 100.0
                    project:
                      id: 14308069
                      name: 'Online Store - Phase 1'
                      code: OS1
                    user:
                      id: 1782884
                      name: 'Jeremy Israelsen'
                  -
                    id: 125063975
                    is_project_manager: true
                    is_active: true
                    use_default_rates: true
                    budget: null
                    created_at: '2017-06-26T21:36:23Z'
                    updated_at: '2017-06-26T21:36:23Z'
                    hourly_rate: 100.0
                    project:
                      id: 14307913
                      name: 'Marketing Website'
                      code: MW
                    user:
                      id: 1782884
                      name: 'Jeremy Israelsen'
                per_page: 2000
                total_pages: 1
                total_entries: 6
                next_page: null
                previous_page: null
                page: 1
                links:
                  first: 'https://api.harvestapp.com/v2/user_assignments?page=1&per_page=2000'
                  next: null
                  previous: null
                  last: 'https://api.harvestapp.com/v2/user_assignments?page=1&per_page=2000'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: user_id
          description: 'Only return user assignments belonging to the user with the given ID.'
          required: false
          in: query
          schema:
            type: integer
        -
          name: is_active
          description: 'Pass true to only return active user assignments and false to return inactive user assignments.'
          required: false
          in: query
          schema:
            type: boolean
        -
          name: updated_since
          description: 'Only return user assignments that have been updated since the given date and time.'
          required: false
          in: query
          schema:
            type: string
        -
          name: page
          description: 'DEPRECATED The page number to use in pagination. For instance, if you make a list request and receive 2000 records, your subsequent call can include page=2 to retrieve the next page of the list. (Default: 1)'
          required: false
          in: query
          schema:
            type: integer
          deprecated: true
        -
          name: cursor
          description: 'Pagination cursor'
          required: false
          in: query
          schema:
            type: string
        -
          name: per_page
          description: 'The number of records to return per page. Can range between 1 and 2000. (Default: 2000)'
          required: false
          in: query
          schema:
            type: integer
  /users:
    get:
      summary: 'List all users'
      operationId: listUsers
      description: "Returns a list of your users. The users are returned sorted by creation date, with the most recently created users appearing first.\n\nThe response contains an object with a users property that contains an array of up to per_page users. Each entry in the array is a separate user object. If no more users are available, the resulting array will be empty. Several additional pagination properties are included in the response to simplify paginating your users."
      externalDocs:
        description: 'List all users'
        url: 'https://help.getharvest.com/api-v2/users-api/users/users/#list-all-users'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'List all users'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Users'
              example:
                users:
                  -
                    id: 3230547
                    first_name: Jim
                    last_name: Allen
                    email: jimallen@example.com
                    telephone: ''
                    timezone: 'Mountain Time (US & Canada)'
                    has_access_to_all_future_projects: false
                    is_contractor: false
                    is_active: true
                    created_at: '2020-05-01T22:34:41Z'
                    updated_at: '2020-05-01T22:34:52Z'
                    weekly_capacity: 126000
                    default_hourly_rate: 100.0
                    cost_rate: 50.0
                    roles:
                      - Developer
                    access_roles:
                      - member
                    avatar_url: 'https://cache.harvestapp.com/assets/profile_images/abraj_albait_towers.png?1498516481'
                  -
                    id: 1782959
                    first_name: Kim
                    last_name: Allen
                    email: kimallen@example.com
                    telephone: ''
                    timezone: 'Eastern Time (US & Canada)'
                    has_access_to_all_future_projects: true
                    is_contractor: false
                    is_active: true
                    created_at: '2020-05-01T22:15:45Z'
                    updated_at: '2020-05-01T22:32:52Z'
                    weekly_capacity: 126000
                    default_hourly_rate: 100.0
                    cost_rate: 50.0
                    roles:
                      - Designer
                    access_roles:
                      - member
                    avatar_url: 'https://cache.harvestapp.com/assets/profile_images/cornell_clock_tower.png?1498515345'
                  -
                    id: 1782884
                    first_name: Bob
                    last_name: Powell
                    email: bobpowell@example.com
                    telephone: ''
                    timezone: 'Mountain Time (US & Canada)'
                    has_access_to_all_future_projects: false
                    is_contractor: false
                    is_active: true
                    created_at: '2020-05-01T20:41:00Z'
                    updated_at: '2020-05-01T20:42:25Z'
                    weekly_capacity: 126000
                    default_hourly_rate: 100.0
                    cost_rate: 75.0
                    roles:
                      - Founder
                      - CEO
                    access_roles:
                      - administrator
                    avatar_url: 'https://cache.harvestapp.com/assets/profile_images/allen_bradley_clock_tower.png?1498509661'
                per_page: 2000
                total_pages: 1
                total_entries: 3
                next_page: null
                previous_page: null
                page: 1
                links:
                  first: 'https://api.harvestapp.com/v2/users?page=1&per_page=2000'
                  next: null
                  previous: null
                  last: 'https://api.harvestapp.com/v2/users?page=1&per_page=2000'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: is_active
          description: 'Pass true to only return active users and false to return inactive users.'
          required: false
          in: query
          schema:
            type: boolean
        -
          name: updated_since
          description: 'Only return users that have been updated since the given date and time.'
          required: false
          in: query
          schema:
            type: string
        -
          name: page
          description: 'DEPRECATED The page number to use in pagination. For instance, if you make a list request and receive 2000 records, your subsequent call can include page=2 to retrieve the next page of the list. (Default: 1)'
          required: false
          in: query
          schema:
            type: integer
          deprecated: true
        -
          name: cursor
          description: 'Pagination cursor'
          required: false
          in: query
          schema:
            type: string
        -
          name: per_page
          description: 'The number of records to return per page. Can range between 1 and 2000. (Default: 2000)'
          required: false
          in: query
          schema:
            type: integer
    post:
      summary: 'Create a user'
      operationId: createUser
      description: 'Creates a new user object and sends an invitation email to the address specified in the email parameter. Returns a user object and a 201 Created response code if the call succeeded.'
      externalDocs:
        description: 'Create a user'
        url: 'https://help.getharvest.com/api-v2/users-api/users/users/#create-a-user'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        201:
          description: 'Create a user'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/User'
              example:
                id: 3
                first_name: George
                last_name: Frank
                email: george@example.com
                telephone: ''
                timezone: 'Eastern Time (US & Canada)'
                has_access_to_all_future_projects: false
                is_contractor: false
                is_active: true
                weekly_capacity: 126000
                default_hourly_rate: 0
                cost_rate: 0
                roles: []
                access_roles:
                  - manager
                  - project_creator
                  - time_and_expenses_manager
                avatar_url: 'https://{ACCOUNT_SUBDOMAIN}.harvestapp.com/assets/profile_images/big_ben.png?1485372046'
                created_at: '2020-01-25T19:20:46Z'
                updated_at: '2020-01-25T19:20:57Z'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      requestBody:
        description: 'json payload'
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                first_name:
                  type: string
                  description: 'The first name of the user.'
                  nullable: true
                last_name:
                  type: string
                  description: 'The last name of the user.'
                  nullable: true
                email:
                  type: string
                  description: 'The email address of the user.'
                  nullable: true
                  format: email
                timezone:
                  type: string
                  description: 'The user’s timezone. Defaults to the company’s timezone. See a list of supported time zones.'
                  nullable: true
                has_access_to_all_future_projects:
                  type: boolean
                  description: 'Whether the user should be automatically added to future projects. Defaults to false.'
                  nullable: true
                is_contractor:
                  type: boolean
                  description: 'Whether the user is a contractor or an employee. Defaults to false.'
                  nullable: true
                is_active:
                  type: boolean
                  description: 'Whether the user is active or archived. Defaults to true.'
                  nullable: true
                weekly_capacity:
                  type: integer
                  description: 'The number of hours per week this person is available to work in seconds. Defaults to 126000 seconds (35 hours).'
                  nullable: true
                  format: int32
                default_hourly_rate:
                  type: number
                  description: 'The billable rate to use for this user when they are added to a project. Defaults to 0.'
                  nullable: true
                  format: float
                cost_rate:
                  type: number
                  description: 'The cost rate to use for this user when calculating a project’s costs vs billable amount. Defaults to 0.'
                  nullable: true
                  format: float
                roles:
                  type: array
                  description: 'Descriptive names of the business roles assigned to this person. They can be used for filtering reports, and have no effect in their permissions in Harvest.'
                  nullable: true
                  items:
                    type: string
                access_roles:
                  type: array
                  description: 'Access role(s) that determine the user’s permissions in Harvest. Possible values: administrator, manager or member. Users with the manager role can additionally be granted one or more of these roles: project_creator, billable_rates_manager, managed_projects_invoice_drafter, managed_projects_invoice_manager, client_and_task_manager, time_and_expenses_manager, estimates_manager.'
                  nullable: true
                  items:
                    type: string
              required:
                - first_name
                - last_name
                - email
  /users/me:
    get:
      summary: 'Retrieve the currently authenticated user'
      operationId: retrieveTheCurrentlyAuthenticatedUser
      description: 'Retrieves the currently authenticated user. Returns a user object and a 200 OK response code.'
      externalDocs:
        description: 'Retrieve the currently authenticated user'
        url: 'https://help.getharvest.com/api-v2/users-api/users/users/#retrieve-the-currently-authenticated-user'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Retrieve the currently authenticated user'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/User'
              example:
                id: 1782884
                first_name: Bob
                last_name: Powell
                email: bobpowell@example.com
                telephone: ''
                timezone: 'Mountain Time (US & Canada)'
                has_access_to_all_future_projects: false
                is_contractor: false
                is_active: true
                created_at: '2020-05-01T20:41:00Z'
                updated_at: '2020-05-01T20:42:25Z'
                weekly_capacity: 126000
                default_hourly_rate: 100.0
                cost_rate: 75.0
                roles:
                  - Founder
                  - CEO
                access_roles:
                  - administrator
                avatar_url: 'https://cache.harvestapp.com/assets/profile_images/allen_bradley_clock_tower.png?1498509661'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /users/me/project_assignments:
    get:
      summary: 'List active project assignments for the currently authenticated user'
      operationId: listActiveProjectAssignmentsForTheCurrentlyAuthenticatedUser
      description: "Returns a list of your active project assignments for the currently authenticated user. The project assignments are returned sorted by creation date, with the most recently created project assignments appearing first.\n\nThe response contains an object with a project_assignments property that contains an array of up to per_page project assignments. Each entry in the array is a separate project assignment object. If no more project assignments are available, the resulting array will be empty. Several additional pagination properties are included in the response to simplify paginating your project assignments."
      externalDocs:
        description: 'List active project assignments for the currently authenticated user'
        url: 'https://help.getharvest.com/api-v2/users-api/users/project-assignments/#list-active-project-assignments-for-the-currently-authenticated-user'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'List active project assignments for the currently authenticated user'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProjectAssignments'
              example:
                project_assignments:
                  -
                    id: 125066109
                    is_project_manager: true
                    is_active: true
                    use_default_rates: true
                    budget: null
                    created_at: '2017-06-26T21:52:18Z'
                    updated_at: '2017-06-26T21:52:18Z'
                    hourly_rate: 100.0
                    project:
                      id: 14308069
                      name: 'Online Store - Phase 1'
                      code: OS1
                    client:
                      id: 5735776
                      name: '123 Industries'
                    task_assignments:
                      -
                        id: 155505013
                        billable: true
                        is_active: true
                        created_at: '2017-06-26T21:52:18Z'
                        updated_at: '2017-06-26T21:52:18Z'
                        hourly_rate: 100.0
                        budget: null
                        task:
                          id: 8083365
                          name: 'Graphic Design'
                      -
                        id: 155505014
                        billable: true
                        is_active: true
                        created_at: '2017-06-26T21:52:18Z'
                        updated_at: '2017-06-26T21:52:18Z'
                        hourly_rate: 100.0
                        budget: null
                        task:
                          id: 8083366
                          name: Programming
                      -
                        id: 155505015
                        billable: true
                        is_active: true
                        created_at: '2017-06-26T21:52:18Z'
                        updated_at: '2017-06-26T21:52:18Z'
                        hourly_rate: 100.0
                        budget: null
                        task:
                          id: 8083368
                          name: 'Project Management'
                      -
                        id: 155505016
                        billable: false
                        is_active: true
                        created_at: '2017-06-26T21:52:18Z'
                        updated_at: '2017-06-26T21:54:06Z'
                        hourly_rate: 100.0
                        budget: null
                        task:
                          id: 8083369
                          name: Research
                  -
                    id: 125063975
                    is_project_manager: true
                    is_active: true
                    use_default_rates: false
                    budget: null
                    created_at: '2017-06-26T21:36:23Z'
                    updated_at: '2017-06-26T21:36:23Z'
                    hourly_rate: 100.0
                    project:
                      id: 14307913
                      name: 'Marketing Website'
                      code: MW
                    client:
                      id: 5735774
                      name: 'ABC Corp'
                    task_assignments:
                      -
                        id: 155502709
                        billable: true
                        is_active: true
                        created_at: '2017-06-26T21:36:23Z'
                        updated_at: '2017-06-26T21:36:23Z'
                        hourly_rate: 100.0
                        budget: null
                        task:
                          id: 8083365
                          name: 'Graphic Design'
                      -
                        id: 155502710
                        billable: true
                        is_active: true
                        created_at: '2017-06-26T21:36:23Z'
                        updated_at: '2017-06-26T21:36:23Z'
                        hourly_rate: 100.0
                        budget: null
                        task:
                          id: 8083366
                          name: Programming
                      -
                        id: 155502711
                        billable: true
                        is_active: true
                        created_at: '2017-06-26T21:36:23Z'
                        updated_at: '2017-06-26T21:36:23Z'
                        hourly_rate: 100.0
                        budget: null
                        task:
                          id: 8083368
                          name: 'Project Management'
                      -
                        id: 155505153
                        billable: false
                        is_active: true
                        created_at: '2017-06-26T21:53:20Z'
                        updated_at: '2017-06-26T21:54:31Z'
                        hourly_rate: 100.0
                        budget: null
                        task:
                          id: 8083369
                          name: Research
                per_page: 2000
                total_pages: 1
                total_entries: 2
                next_page: null
                previous_page: null
                page: 1
                links:
                  first: 'https://api.harvestapp.com/v2/users/1782884/project_assignments?page=1&per_page=2000'
                  next: null
                  previous: null
                  last: 'https://api.harvestapp.com/v2/users/1782884/project_assignments?page=1&per_page=2000'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: page
          description: 'The page number to use in pagination. For instance, if you make a list request and receive 2000 records, your subsequent call can include page=2 to retrieve the next page of the list. (Default: 1)'
          required: false
          in: query
          schema:
            type: integer
        -
          name: per_page
          description: 'The number of records to return per page. Can range between 1 and 2000. (Default: 2000)'
          required: false
          in: query
          schema:
            type: integer
  '/users/{userId}':
    delete:
      summary: 'Delete a user'
      operationId: deleteUser
      description: 'Delete a user. Deleting a user is only possible if they have no time entries or expenses associated with them. Returns a 200 OK response code if the call succeeded.'
      externalDocs:
        description: 'Delete a user'
        url: 'https://help.getharvest.com/api-v2/users-api/users/users/#delete-a-user'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Delete a user'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: userId
          required: true
          in: path
          schema:
            type: string
    get:
      summary: 'Retrieve a user'
      operationId: retrieveUser
      description: 'Retrieves the user with the given ID. Returns a user object and a 200 OK response code if a valid identifier was provided.'
      externalDocs:
        description: 'Retrieve a user'
        url: 'https://help.getharvest.com/api-v2/users-api/users/users/#retrieve-a-user'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Retrieve a user'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/User'
              example:
                id: 3230547
                first_name: Jim
                last_name: Allen
                email: jimallen@example.com
                telephone: ''
                timezone: 'Mountain Time (US & Canada)'
                has_access_to_all_future_projects: false
                is_contractor: false
                is_active: true
                created_at: '2020-05-01T22:34:41Z'
                updated_at: '2020-05-01T22:34:52Z'
                weekly_capacity: 126000
                default_hourly_rate: 100.0
                cost_rate: 50.0
                roles:
                  - Developer
                access_roles:
                  - member
                avatar_url: 'https://cache.harvestapp.com/assets/profile_images/abraj_albait_towers.png?1498516481'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: userId
          required: true
          in: path
          schema:
            type: string
    patch:
      summary: 'Update a user'
      operationId: updateUser
      description: 'Updates the specific user by setting the values of the parameters passed. Any parameters not provided will be left unchanged. Returns a user object and a 200 OK response code if the call succeeded.'
      externalDocs:
        description: 'Update a user'
        url: 'https://help.getharvest.com/api-v2/users-api/users/users/#update-a-user'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Update a user'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/User'
              example:
                id: 3237198
                first_name: Gary
                last_name: Brookes
                email: gary@example.com
                telephone: ''
                timezone: 'Eastern Time (US & Canada)'
                has_access_to_all_future_projects: true
                is_contractor: false
                is_active: true
                weekly_capacity: 126000
                default_hourly_rate: 120
                cost_rate: 50
                roles:
                  - 'Product Team'
                access_roles:
                  - manager
                  - time_and_expenses_manager
                  - billable_rates_manager
                avatar_url: 'https://{ACCOUNT_SUBDOMAIN}.harvestapp.com/assets/profile_images/big_ben.png?1485372046'
                created_at: '2018-01-01T19:20:46Z'
                updated_at: '2019-01-25T19:20:57Z'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: userId
          required: true
          in: path
          schema:
            type: string
      requestBody:
        description: 'json payload'
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                first_name:
                  type: string
                  description: 'The first name of the user. Can’t be updated if the user is inactive.'
                  nullable: true
                last_name:
                  type: string
                  description: 'The last name of the user. Can’t be updated if the user is inactive.'
                  nullable: true
                email:
                  type: string
                  description: 'The email address of the user. Can’t be updated if the user is inactive.'
                  nullable: true
                  format: email
                timezone:
                  type: string
                  description: 'The user’s timezone. Defaults to the company’s timezone. See a list of supported time zones.'
                  nullable: true
                has_access_to_all_future_projects:
                  type: boolean
                  description: 'Whether the user should be automatically added to future projects.'
                  nullable: true
                is_contractor:
                  type: boolean
                  description: 'Whether the user is a contractor or an employee.'
                  nullable: true
                is_active:
                  type: boolean
                  description: 'Whether the user is active or archived.'
                  nullable: true
                weekly_capacity:
                  type: integer
                  description: 'The number of hours per week this person is available to work in seconds.'
                  nullable: true
                  format: int32
                roles:
                  type: array
                  description: 'Descriptive names of the business roles assigned to this person. They can be used for filtering reports, and have no effect in their permissions in Harvest.'
                  nullable: true
                  items:
                    type: string
                access_roles:
                  type: array
                  description: 'Access role(s) that determine the user’s permissions in Harvest. Possible values: administrator, manager or member. Users with the manager role can additionally be granted one or more of these roles: project_creator, billable_rates_manager, managed_projects_invoice_drafter, managed_projects_invoice_manager, client_and_task_manager, time_and_expenses_manager, estimates_manager.'
                  nullable: true
                  items:
                    type: string
  '/users/{userId}/billable_rates':
    get:
      summary: 'List all billable rates for a specific user'
      operationId: listBillableRatesForSpecificUser
      description: "Returns a list of billable rates for the user identified by USER_ID. The billable rates are returned sorted by start_date, with the oldest starting billable rates appearing first.\n\nThe response contains an object with a billable_rates property that contains an array of up to per_page billable rates. Each entry in the array is a separate billable rate object. If no more billable rates are available, the resulting array will be empty. Several additional pagination properties are included in the response to simplify paginating your billable rates."
      externalDocs:
        description: 'List all billable rates for a specific user'
        url: 'https://help.getharvest.com/api-v2/users-api/users/billable-rates/#list-all-billable-rates-for-a-specific-user'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'List all billable rates for a specific user'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BillableRates'
              example:
                billable_rates:
                  -
                    id: 1836493
                    amount: 8.25
                    start_date: '2019-01-01'
                    end_date: '2019-05-31'
                    created_at: '2020-05-01T13:17:42Z'
                    updated_at: '2020-05-01T13:17:50Z'
                  -
                    id: 1836494
                    amount: 9.5
                    start_date: '2019-06-01'
                    end_date: '2019-12-31'
                    created_at: '2020-05-01T13:17:50Z'
                    updated_at: '2020-05-01T13:18:02Z'
                  -
                    id: 1836495
                    amount: 9.5
                    start_date: '2020-01-01'
                    end_date: '2020-04-30'
                    created_at: '2020-05-01T13:18:02Z'
                    updated_at: '2020-05-01T13:18:10Z'
                  -
                    id: 1836496
                    amount: 15.0
                    start_date: '2020-05-01'
                    end_date: null
                    created_at: '2020-05-01T13:18:10Z'
                    updated_at: '2020-05-01T13:18:10Z'
                per_page: 2000
                total_pages: 1
                total_entries: 4
                next_page: null
                previous_page: null
                page: 1
                links:
                  first: 'https://api.harvestapp.com/v2/users/3226125/billable_rates?page=1&per_page=2000'
                  next: null
                  previous: null
                  last: 'https://api.harvestapp.com/v2/users/3226125/billable_rates?page=1&per_page=2000'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: userId
          required: true
          in: path
          schema:
            type: string
        -
          name: page
          description: 'DEPRECATED The page number to use in pagination. For instance, if you make a list request and receive 2000 records, your subsequent call can include page=2 to retrieve the next page of the list. (Default: 1)'
          required: false
          in: query
          schema:
            type: integer
          deprecated: true
        -
          name: cursor
          description: 'Pagination cursor'
          required: false
          in: query
          schema:
            type: string
        -
          name: per_page
          description: 'The number of records to return per page. Can range between 1 and 2000. (Default: 2000)'
          required: false
          in: query
          schema:
            type: integer
    post:
      summary: 'Create a billable rate'
      operationId: createBillableRate
      description: "Creates a new billable rate object. Returns a billable rate object and a 201 Created response code if the call succeeded.\n\n\n  Creating a billable rate with no start_date will replace a user’s existing rate(s).\n  Creating a billable rate with a start_date that is before a user’s existing rate(s) will replace those billable rates with the new one.\n"
      externalDocs:
        description: 'Create a billable rate'
        url: 'https://help.getharvest.com/api-v2/users-api/users/billable-rates/#create-a-billable-rate'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        201:
          description: 'Create a billable rate'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BillableRate'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: userId
          required: true
          in: path
          schema:
            type: string
      requestBody:
        description: 'json payload'
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                amount:
                  type: number
                  description: 'The amount of the billable rate.'
                  nullable: true
                  format: float
                start_date:
                  type: string
                  description: 'The date the billable rate is effective. Cannot be a date in the future.'
                  nullable: true
                  format: date
              required:
                - amount
  '/users/{userId}/billable_rates/{billableRateId}':
    get:
      summary: 'Retrieve a billable rate'
      operationId: retrieveBillableRate
      description: 'Retrieves the billable rate with the given ID. Returns a billable rate object and a 200 OK response code if a valid identifier was provided.'
      externalDocs:
        description: 'Retrieve a billable rate'
        url: 'https://help.getharvest.com/api-v2/users-api/users/billable-rates/#retrieve-a-billable-rate'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Retrieve a billable rate'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BillableRate'
              example:
                id: 1836493
                amount: 8.25
                start_date: '2019-01-01'
                end_date: '2019-05-31'
                created_at: '2020-05-01T13:17:42Z'
                updated_at: '2020-05-01T13:17:50Z'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: userId
          required: true
          in: path
          schema:
            type: string
        -
          name: billableRateId
          required: true
          in: path
          schema:
            type: string
  '/users/{userId}/cost_rates':
    get:
      summary: 'List all cost rates for a specific user'
      operationId: listCostRatesForSpecificUser
      description: "Returns a list of cost rates for the user identified by USER_ID. The cost rates are returned sorted by start_date, with the oldest starting cost rates appearing first.\n\nThe response contains an object with a cost_rates property that contains an array of up to per_page cost rates. Each entry in the array is a separate cost rate object. If no more cost rates are available, the resulting array will be empty. Several additional pagination properties are included in the response to simplify paginating your cost rates."
      externalDocs:
        description: 'List all cost rates for a specific user'
        url: 'https://help.getharvest.com/api-v2/users-api/users/cost-rates/#list-all-cost-rates-for-a-specific-user'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'List all cost rates for a specific user'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CostRates'
              example:
                cost_rates:
                  -
                    id: 825301
                    amount: 9.25
                    start_date: '2019-01-01'
                    end_date: '2019-05-31'
                    created_at: '2020-05-01T13:19:09Z'
                    updated_at: '2020-05-01T13:19:17Z'
                  -
                    id: 825302
                    amount: 11.0
                    start_date: '2019-06-01'
                    end_date: '2019-12-31'
                    created_at: '2020-05-01T13:19:17Z'
                    updated_at: '2020-05-01T13:19:24Z'
                  -
                    id: 825303
                    amount: 12.5
                    start_date: '2020-01-01'
                    end_date: '2020-04-30'
                    created_at: '2020-05-01T13:19:24Z'
                    updated_at: '2020-05-01T13:19:31Z'
                  -
                    id: 825304
                    amount: 15.25
                    start_date: '2020-05-01'
                    end_date: null
                    created_at: '2020-05-01T13:19:31Z'
                    updated_at: '2020-05-01T13:19:31Z'
                per_page: 2000
                total_pages: 1
                total_entries: 4
                next_page: null
                previous_page: null
                page: 1
                links:
                  first: 'https://api.harvestapp.com/v2/users/3226125/cost_rates?page=1&per_page=2000'
                  next: null
                  previous: null
                  last: 'https://api.harvestapp.com/v2/users/3226125/cost_rates?page=1&per_page=2000'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: userId
          required: true
          in: path
          schema:
            type: string
        -
          name: page
          description: 'DEPRECATED The page number to use in pagination. For instance, if you make a list request and receive 2000 records, your subsequent call can include page=2 to retrieve the next page of the list. (Default: 1)'
          required: false
          in: query
          schema:
            type: integer
          deprecated: true
        -
          name: cursor
          description: 'Pagination cursor'
          required: false
          in: query
          schema:
            type: string
        -
          name: per_page
          description: 'The number of records to return per page. Can range between 1 and 2000. (Default: 2000)'
          required: false
          in: query
          schema:
            type: integer
    post:
      summary: 'Create a cost rate'
      operationId: createCostRate
      description: "Creates a new cost rate object. Returns a cost rate object and a 201 Created response code if the call succeeded.\n\n\n  Creating a cost rate with no start_date will replace a user’s existing rate(s).\n  Creating a cost rate with a start_date that is before a user’s existing rate(s) will replace those cost rates with the new one.\n"
      externalDocs:
        description: 'Create a cost rate'
        url: 'https://help.getharvest.com/api-v2/users-api/users/cost-rates/#create-a-cost-rate'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        201:
          description: 'Create a cost rate'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CostRate'
              example:
                id: 825305
                amount: 13.0
                start_date: '2020-04-05'
                end_date: null
                created_at: '2020-05-01T13:23:27Z'
                updated_at: '2020-05-01T13:23:27Z'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: userId
          required: true
          in: path
          schema:
            type: string
      requestBody:
        description: 'json payload'
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                amount:
                  type: number
                  description: 'The amount of the cost rate.'
                  nullable: true
                  format: float
                start_date:
                  type: string
                  description: 'The date the cost rate is effective. Cannot be a date in the future.'
                  nullable: true
                  format: date
              required:
                - amount
  '/users/{userId}/cost_rates/{costRateId}':
    get:
      summary: 'Retrieve a cost rate'
      operationId: retrieveCostRate
      description: 'Retrieves the cost rate with the given ID. Returns a cost rate object and a 200 OK response code if a valid identifier was provided.'
      externalDocs:
        description: 'Retrieve a cost rate'
        url: 'https://help.getharvest.com/api-v2/users-api/users/cost-rates/#retrieve-a-cost-rate'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Retrieve a cost rate'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CostRate'
              example:
                id: 825301
                amount: 9.25
                start_date: '2019-01-01'
                end_date: '2019-05-31'
                created_at: '2020-05-01T13:19:09Z'
                updated_at: '2020-05-01T13:19:17Z'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: userId
          required: true
          in: path
          schema:
            type: string
        -
          name: costRateId
          required: true
          in: path
          schema:
            type: string
  '/users/{userId}/project_assignments':
    get:
      summary: 'List active project assignments'
      operationId: listActiveProjectAssignments
      description: "Returns a list of active project assignments for the user identified by USER_ID. The project assignments are returned sorted by creation date, with the most recently created project assignments appearing first.\n\nThe response contains an object with a project_assignments property that contains an array of up to per_page project assignments. Each entry in the array is a separate project assignment object. If no more project assignments are available, the resulting array will be empty. Several additional pagination properties are included in the response to simplify paginating your project assignments."
      externalDocs:
        description: 'List active project assignments'
        url: 'https://help.getharvest.com/api-v2/users-api/users/project-assignments/#list-active-project-assignments'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'List active project assignments'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProjectAssignments'
              example:
                project_assignments:
                  -
                    id: 125068554
                    is_project_manager: true
                    is_active: true
                    use_default_rates: true
                    budget: null
                    created_at: '2017-06-26T22:32:52Z'
                    updated_at: '2017-06-26T22:32:52Z'
                    hourly_rate: 100.0
                    project:
                      id: 14308069
                      name: 'Online Store - Phase 1'
                      code: OS1
                    client:
                      id: 5735776
                      name: '123 Industries'
                    task_assignments:
                      -
                        id: 155505013
                        billable: true
                        is_active: true
                        created_at: '2017-06-26T21:52:18Z'
                        updated_at: '2017-06-26T21:52:18Z'
                        hourly_rate: 100.0
                        budget: null
                        task:
                          id: 8083365
                          name: 'Graphic Design'
                      -
                        id: 155505014
                        billable: true
                        is_active: true
                        created_at: '2017-06-26T21:52:18Z'
                        updated_at: '2017-06-26T21:52:18Z'
                        hourly_rate: 100.0
                        budget: null
                        task:
                          id: 8083366
                          name: Programming
                      -
                        id: 155505015
                        billable: true
                        is_active: true
                        created_at: '2017-06-26T21:52:18Z'
                        updated_at: '2017-06-26T21:52:18Z'
                        hourly_rate: 100.0
                        budget: null
                        task:
                          id: 8083368
                          name: 'Project Management'
                      -
                        id: 155505016
                        billable: false
                        is_active: true
                        created_at: '2017-06-26T21:52:18Z'
                        updated_at: '2017-06-26T21:54:06Z'
                        hourly_rate: 100.0
                        budget: null
                        task:
                          id: 8083369
                          name: Research
                  -
                    id: 125068553
                    is_project_manager: true
                    is_active: true
                    use_default_rates: false
                    budget: null
                    created_at: '2017-06-26T22:32:52Z'
                    updated_at: '2017-06-26T22:32:52Z'
                    hourly_rate: 100.0
                    project:
                      id: 14307913
                      name: 'Marketing Website'
                      code: MW
                    client:
                      id: 5735774
                      name: 'ABC Corp'
                    task_assignments:
                      -
                        id: 155502709
                        billable: true
                        is_active: true
                        created_at: '2017-06-26T21:36:23Z'
                        updated_at: '2017-06-26T21:36:23Z'
                        hourly_rate: 100.0
                        budget: null
                        task:
                          id: 8083365
                          name: 'Graphic Design'
                      -
                        id: 155502710
                        billable: true
                        is_active: true
                        created_at: '2017-06-26T21:36:23Z'
                        updated_at: '2017-06-26T21:36:23Z'
                        hourly_rate: 100.0
                        budget: null
                        task:
                          id: 8083366
                          name: Programming
                      -
                        id: 155502711
                        billable: true
                        is_active: true
                        created_at: '2017-06-26T21:36:23Z'
                        updated_at: '2017-06-26T21:36:23Z'
                        hourly_rate: 100.0
                        budget: null
                        task:
                          id: 8083368
                          name: 'Project Management'
                      -
                        id: 155505153
                        billable: false
                        is_active: true
                        created_at: '2017-06-26T21:53:20Z'
                        updated_at: '2017-06-26T21:54:31Z'
                        hourly_rate: 100.0
                        budget: null
                        task:
                          id: 8083369
                          name: Research
                per_page: 2000
                total_pages: 1
                total_entries: 2
                next_page: null
                previous_page: null
                page: 1
                links:
                  first: 'https://api.harvestapp.com/v2/users/1782959/project_assignments?page=1&per_page=2000'
                  next: null
                  previous: null
                  last: 'https://api.harvestapp.com/v2/users/1782959/project_assignments?page=1&per_page=2000'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: userId
          required: true
          in: path
          schema:
            type: string
        -
          name: updated_since
          description: 'Only return project assignments that have been updated since the given date and time.'
          required: false
          in: query
          schema:
            type: string
        -
          name: page
          description: 'DEPRECATED The page number to use in pagination. For instance, if you make a list request and receive 2000 records, your subsequent call can include page=2 to retrieve the next page of the list. (Default: 1)'
          required: false
          in: query
          schema:
            type: integer
          deprecated: true
        -
          name: cursor
          description: 'Pagination cursor'
          required: false
          in: query
          schema:
            type: string
        -
          name: per_page
          description: 'The number of records to return per page. Can range between 1 and 2000. (Default: 2000)'
          required: false
          in: query
          schema:
            type: integer
  '/users/{userId}/teammates':
    get:
      summary: 'List all assigned teammates for a specific user'
      operationId: listAssignedTeammatesForSpecificUser
      description: "Returns a list of assigned teammates for the user identified by USER_ID. The USER_ID must belong to a user that is a Manager, if not, a 422 Unprocessable Entity status code will be returned.\n\nThe response contains an object with a teammates property that contains an array of up to per_page teammates. Each entry in the array is a separate teammate object. If no more teammates are available, the resulting array will be empty. Several additional pagination properties are included in the response to simplify paginating your teammates."
      externalDocs:
        description: 'List all assigned teammates for a specific user'
        url: 'https://help.getharvest.com/api-v2/users-api/users/teammates/#list-all-assigned-teammates-for-a-specific-user'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'List all assigned teammates for a specific user'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Teammates'
              example:
                teammates:
                  -
                    id: 3230547
                    first_name: Jim
                    last_name: Allen
                    email: jimallen@example.com
                  -
                    id: 1782884
                    first_name: Bob
                    last_name: Powell
                    email: bobpowell@example.com
                per_page: 100
                total_pages: 1
                total_entries: 2
                next_page: null
                previous_page: null
                page: 1
                links:
                  first: 'https://api.harvestapp.com/v2/users/1782959/teammates?page=1&per_page=100'
                  next: null
                  previous: null
                  last: 'https://api.harvestapp.com/v2/users/1782959/teammates?page=1&per_page=100'
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: userId
          required: true
          in: path
          schema:
            type: string
        -
          name: page
          description: 'DEPRECATED The page number to use in pagination. For instance, if you make a list request and receive 100 records, your subsequent call can include page=2 to retrieve the next page of the list. (Default: 1)'
          required: false
          in: query
          schema:
            type: integer
          deprecated: true
        -
          name: cursor
          description: 'Pagination cursor'
          required: false
          in: query
          schema:
            type: string
        -
          name: per_page
          description: 'The number of records to return per page. Can range between 1 and 2000. (Default: 2000)'
          required: false
          in: query
          schema:
            type: integer
    patch:
      summary: 'Update a user’s assigned teammates'
      operationId: updateUserAssignedTeammates
      description: "Updates the the assigned teammates for a specific user. Returns list of assigned teammates and a 200 OK response code if the call succeeded. The USER_ID must belong to a user that is a Manager, if not, a 422 Unprocessable Entity status code will be returned.\n\nAdding teammates for the first time will add the people_manager access role to the Manager. Any IDs not included in the teammate_ids that are currently assigned will be unassigned from the Manager. Use an empty array to unassign all users. This will also remove the people_manager access role from the Manager."
      externalDocs:
        description: 'Update a user’s assigned teammates'
        url: 'https://help.getharvest.com/api-v2/users-api/users/teammates/#update-a-users-assigned-teammates'
      security:
        -
          BearerAuth: []
          AccountAuth: []
      responses:
        200:
          description: 'Update a user’s assigned teammates'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TeammatesPatchResponse'
              example:
                teammates:
                  -
                    id: 3230547
                    first_name: Jim
                    last_name: Allen
                    email: jimallen@example.com
                  -
                    id: 3230575
                    first_name: Gary
                    last_name: Brookes
                    email: gary@example.com
        default:
          description: 'error payload'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      parameters:
        -
          name: userId
          required: true
          in: path
          schema:
            type: string
      requestBody:
        description: 'json payload'
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                teammate_ids:
                  type: array
                  description: 'Full list of user IDs to be assigned to the Manager.'
                  nullable: true
                  items:
                    type: string
              required:
                - teammate_ids