Ruby client for the QuickBooks Online API version 3.

  • Built on top of the excellent Faraday gem.
  • JSON only support.
    • Please don't ask about XML support. Intuit has stated that JSON is the primary data format for the QuickBooks API (v3 and beyond). This gem will specialize in JSON only. The quickbooks-ruby gem has fantastic support for those who favor XML.
  • Features specs built directly against a QuickBooks Online Sandbox via the VCR gem.
  • Robust error handling.

Tutorials and Screencasts

Ruby >= 2.2.2 required


Add this line to your application's Gemfile:

gem 'qbo_api'

And then execute:

$ bundle

Or install it yourself as:

$ gem install qbo_api



  q = . # or wherever you are storing the OAuth creds
  qbo_api = QboApi.new(token: q.token, token_secret: q.secret, realm_id: q.companyid)

Configuration options

  • By default this client runs against a QBO sandbox. To run against the production QBO API URL do: ruby QboApi.production = true
  • Logging: ruby QboApi.log = true
  • To change logging target from $stdout e.g. ruby QboApi.logger = Rails.logger


  invoice = {
    "Line": [
        "Amount": 100.00,
        "DetailType": "SalesItemLineDetail",
        "SalesItemLineDetail": {
          "ItemRef": {
            "value": "1",
            "name": "Services"
    "CustomerRef": {
      "value": "1"
  response = qbo_api.create(:invoice, payload: invoice)
  p response['Id'] # => 65


  customer = { 
    DisplayName: 'Jack Doe',
    PrimaryPhone: {
      FreeFormNumber: "(415) 444-1234"
  response = qbo_api.update(:customer, id: 60, payload: customer)
  p response.fetch('PrimaryPhone').fetch('FreeFormNumber') # => "(415) 444-1234"

Delete (only works for transaction entities)

  response = qbo_api.delete(:invoice, id: 145)
  p response['status'] # => "Deleted"

Search with irregular characters

  name = qbo_api.esc "Amy's Bird Sanctuary"
  response = qbo_api.query(%{SELECT * FROM Customer WHERE DisplayName = '#{name}'})

Get an entity by its id

  response = qbo_api.get(:customer, 5)
  p response['DisplayName'] # => "Dukes Basketball Camp"

Change data capture (CDC) query

  response = api.cdc(entities: 'estimate', changed_since: '2011-10-10T09:00:00-07:00')
  # You can also send in a Time object e.g. changed_since: Time.now 
  expect(response['CDCResponse'].size).to eq 1
  ids = response['CDCResponse'][0]['QueryResponse'][0]['Estimate'].collect{ |e| e['Id'] }
  p ids

Respond to an error

  customer = { DisplayName: 'Weiskopf Consulting' } 
    response = qbo_api.create(:customer, payload: customer)
  rescue QboApi::BadRequest => e
    if e.message =~ /Another customer already exists with this name/
      # Query for Id using DisplayName
      # Do an qbo_api.update instead

Import/retrieve all

  # retrieves all customers
  qbo_api.all(:customers) do |c|
    p "#{c['Id']} #{c['DisplayName']}"

  # retrieves all vendors by groups of 5
  qbo_api.all(:vendor, max: 5) do |v|
    p v['DisplayName']

  # retrieves all customers by groups of 2 using a custom select query
  where = "WHERE Id IN ('5', '6', '7', '8', '9', '10')"
  qbo_api.all(:customer, max: 2, select: "SELECT * FROM Customer #{where}") do |c|
    p c['DisplayName']

What kind of QuickBooks entity?

  p qbo_api.is_transaction_entity?(:invoice) # => true
  # Plural is supported as well
  p qbo_api.is_transaction_entity?(:invoices) # => true
  p qbo_api.is_transaction_entity?(:customer) # => false
  p qbo_api.is_name_list_entity?(:vendors) # => true

Spin up an example

  • Check out this tutorial and screencast on spinning up an example.
  • git clone git://github.com/minimul/qbo_api && cd qbo_api
  • bundle
  • Create a .env file
    • If needed create an account at https://developer.intuit.com
    • Click Get started coding
    • Create an app with both the Accounting & Payments selected.
    • Go to the Development tab and copy and paste the consumer key and secret into the .env file. ruby export QBO_API_CONSUMER_KEY=<Your QuickBooks apps consumer key> export QBO_API_CONSUMER_SECRET=<Your QuickBooks apps consumer secret>
  • Note: the .env file will be automatically loaded after you run the next step.
  • Start up the example app
    • ruby example/app.rb
  • Goto http://localhost:9393
  • Use the Connect to QuickBooks button to connect to your QuickBooks sandbox, which you receive when signing up at https://developer.intuit.com.
  • After successfully connecting to your sandbox run:
    • http://localhost:9393/customer/5
    • You should see "Dukes Basketball Camp" displayed
  • Checkout example/app.rb to see what is going on under the hood.


Bug reports and pull requests are welcome on GitHub at https://github.com/minimul/qbo_api.

Running the specs

  • Check out this tutorial and screencast on running the specs
  • git clone git://github.com/minimul/qbo_api && cd qbo_api
  • bundle
  • Create a .env file
    • If you are just running the specs then at minimum your .env needs to look like the following: ruby export QBO_API_CONSUMER_KEY= export QBO_API_CONSUMER_SECRET= export QBO_API_ACCESS_TOKEN= export QBO_API_ACCESS_TOKEN_SECRET= export QBO_API_COMPANY_ID=12345
  • bundle exec rspec spec/

Creating new specs or modifying existing spec that have been recorded using the VCR gem.


The gem is available as open source under the terms of the MIT License.