NAV

Public API Bitwage Payroll

The Production API Entry Point: https://api.bitwage.com/v1
The Production Websites: Team Wages: https://team.bitwage.com, Invoicing: https://worker.bitwage.com

The Sandbox API Entry Point: https://api.bitwage.biz/v1
The Sandbox Websites: Team Wages: https://team.bitwage.biz, Invoicing: https://worker.bitwage.biz

All requests must include an application/json Content-Type Header
All production requests must go over SSL.

Welcome to the Bitwage Payroll Public API v1.0 Documentation. Last Modified March 8, 2016.

Bitwage offers programmatic Access to its wage payment resources including Tickers, User, Worker, and Employer.

Applications using Bitwage Payroll Public API v1 include:

  1. Hubstaff: Time tracking software with screenshots, activity levels, and in-depth reports.
  2. Bitwage Android App: Access to Worker and Employer Resources from Android Device
  3. Bitwage IOS App: Access to Worker and Employer Resources from IOS Device

Authentication information visible on Bitwage Apps Page. For inquiries, submit a message using the contact form at www.bitwage.com.

Authentication

Storing Credentials Securely

You should take great care to ensure your credentials are stored securely. 
If someone obtains your API Secret or OAUTH2 Access Token, they will be able to use Bitwage as if they were you. 
In particular, you should avoid storing these credentials in your code base (which gets added to version control) or in your database unless you have encrypted them securely. 
Separating credentials from your code base and database is a good practice. 
You can always regenerate your API key if you feel it has been compromised. 
Currently API key access is available only to Employer accounts and user must opt-in by generating an API Key and Secret.

Validating SSL Certificates

It is also very important that your application validates our SSL certificate when it connects over https. 
This helps prevent a man in the middle attack. 
If you are using a client library, this may be turned on by default, but you should confirm this. 
If you see a setting to ‘verify SSL’ you should always ensure it is set to true.

Access resources using:

API Key + Secret

Bitwage offers API Key + Secret Authentication to access your own Bitwage Worker and Employer Resources via the API.

  • Create a new API Key and Secret on the Bitwage Apps Page.
    • Enhanced Security Controls: can verify the actions and account information you wish to be accessible via the API and specify whether only certain IP Addresses have access. Coming Soon
    • Note: Users should never share API key + secret with anyone else.

Headers

>>> import time, hmac, hashlib
>>> ACCESS_NONCE = int(time.time() * 1e6)
>>> body = ''
>>> url = 'https://api.bitwage.com/v1/company/companies'
>>> message = str(ACCESS_NONCE) + url + ('' if not body else body)
>>> ACCESS_SIGNATURE=hmac.new(API_SECRET, message, hashlib.sha256).hexdigest()
>>> require 'openssl'
>>> ACCESS_NONCE = (Time.now.to_f * 1e6).to_i
>>> url = 'https://api.bitwage.com/v1/company/companies'
>>> message = ACCESS_NONCE.to_s + url + body.to_s
>>> ACCESS_SIGNATURE = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), API_SECRET, message)
>>> import javax.crypto.Mac;
>>> import javax.crypto.spec.SecretKeySpec;
>>> String ACCESS_NONCE = String.valueOf(System.currentTimeMillis());
>>> String url = "https://api.bitwage.com/v1/company/companies"
>>> String message = ACCESS_NONCE + url + (body != null ? body : "");
>>> Mac mac = Mac.getInstance("HmacSHA256");
>>> mac.init(new SecretKeySpec(API_SECRET.getBytes(), "HmacSHA256"));
>>> String ACCESS_SIGNATURE = new String(Hex.encodeHex(mac.doFinal(message.getBytes())));

Use the API Key and Secret to add three headers ACCESS_KEY, ACCESS_SIGNATURE, and ACCESS_NONCE to every API call that requires authentication. This scheme can be called “HMAC authentication.”

  1. The ACCESS_KEY header is your API Key.
  2. The ACCESS_NONCE header is a positive integer number that must increase with every request you make. Currently it must be submitted as a header. Coming Soon you can also submit it as a root-level parameter in a JSON POST request and as a GET parameter in the URL.
  3. The ACCESS_SIGNATURE header is a HMAC-SHA256 hash of the nonce concatentated with the full URL and body of the HTTP request, encoded using your API Secret.

Out-of-order Processing

Sometimes network traffic can cause near-simultaneous API calls to arrive out of order. Since the nonce must always be increasing, an API call with a higher nonce may arrive earlier than a separate call with a lower nonce if they are initiated very quickly together. When this happens, the second call will be dropped as invalid. To fix this, a separate expire parameter can be included, specifying a unix timestamp after which the call will not process. When the expire parameter is included, the nonce is ignored. We recommend setting the expire parameter to no greater than 15 minutes in the future to prevent replay attempts.

Web Application Flow

Bitwage is an OAuth 2.0 compliant service. Create your app on the Bitwage Apps Page.

Step 1 - Authorization

To prevent fraudulent transactions during the authentication process, we will only communicate with URLs that you have identified as trusted endpoints. Ensure the “OAuth 2.0 Redirect URLs” field for your application contains a valid callback URL to your server that is listening to complete your portion of the authentication workflow.

Once you save your configuration, your application will be assigned a unique “Client ID” and “Client Secret” value. Make note of these values — you will need to integrate them into the configuration files or the actual code of your application.

Step 2 - Requesting an Authorization Code

  #APP REQUESTS FROM USER A SUBSET OF THE FOLLOWING SCOPES 
  #Specify Your App's Scopes on Bitwage Apps Page (https://team.bitwage.com/profile/apps)

scope | meaning
--------- | -------
r_user_id | View User Profile
r_companies | View Companies
r_company_profile | View Company Profile
r_workers | View All Workers
r_company_payroll | View Specific Company Payrolls
r_worker_payrolls | View Worker Payrolls
r_worker | View Worker Information
r_company_payrolls | View All Company Payrolls
r_company_linkedaccounts | View Company Linked Accounts
r_company_invoice_approve | Approve Company Invoice
r_company_invoice | View Company Specific Invoice
r_company_invoices | View Company Invoices
w_company_invite | Send Invite to Worker
w_email_id | Get ID from Email
w_company_pay | Create Payroll Order
w_company_payroll_method | Select Payroll Order Method
w_payroll_delete | Delete Payroll Order

Once your application is properly configured, it’s time to request an authorization code. The authorization code is not the final token that you use to make calls to Bitwage with. It is used in the next step of the OAuth 2.0 flow to exchange for an actual access token. This is an important step because it provides assurance directly from Bitwage to the user that permission is being granted to the correct application, with the agreed-upon access to the member’s Bitwage profile.

HTTP Request

GET https://team.bitwage.com/authorize?client_id=client_id&state=state

Query Parameters

Parameter Type req? Description
client_id string yes Unique client ID assigned during step 1.
state string yes A cryptographically secure random string used to protect against cross-site request forgery attacks.

Once redirected, the user will be presented with Bitwage’s authentication dialog box. This identifies your application as well as outlines the particular member permissions that your application has requested. If desired, the logo and application name can be changed in your application configuration.

After the application is approved, the user will be redirected to the redirect_uri, which will have two important URL arguments that you will need to read from this request:

  • code: The OAuth 2.0 authorization code.
  • state: Value used to test against CSRF attacks.

Step 3 - Exchange Authorization Code for Request Token

>>> import time, requests, json
>>> expiration = int(time.time()+300)
>>> body1={'code':'253508d4d37d40f9ba5d92a37ed8b46c', 'client_id': 'asdf123123iew', 'client_secret': 'asdf123043s', 'grant_type': 'authorization_code'}
>>> url = "https://api.bitwage.com/oauth2/token"
>>> headers = {}
>>> headers['Content-Type'] = 'application/json'
>>> r = requests.get(url, headers = headers)
>>> print r

Request Body JSON structured like this:

{
    "code": "253508d4d37d40f9ba5d92a37ed8b46c",
    "client_id": "asdf123123iew",
    "client_secret": "asdf123043s",
    "grant_type": "authorization_code"
}

Response JSON structured like this:

{
    "access_token": "de5d700499604da8b54e26b27bde9826"
}

Here, you can obtain a request token with the authorization code.

HTTP Request

POST https://api.bitwage.com/v1/oauth2/token

Request Body Parameters

Parameter Type req? Description
code string yes half-token from STEP 2
client_id string yes ID of used application
client_secret string yes secret of used application
grant_type string yes always ‘authorization_code’

Username and Password

Username and Password Authentication is designed for Third Party Apps (Mobile Applications) to act on behalf of individual users for their Worker and/or Employer resources.

  1. Get a Bitwage APP API Key and Secret from a Bitwage admin. (See Bitwage Apps Page)
  2. Create a new User API Key and Secret through the Login and TwoFA endpoints.
  3. Use this User API Key and Secret to authenticate to any API (Worker or Employer Resource)

Extra Headers for Username and Password Authentication

User-Agent

>>> useragent = 'testheader1'
>>> headers = {}
>>> headers['User-Agent'] = useragent

You must include a User-Agent Header when:

  1. Getting a User API Key and Secret (User: Login, Two Factor Authentication)
  2. You are using a User API Key and Secret to authenticate to any API.

Set to device’s user-agent or during testing set to arbitrary string.

USER_APP

>>> headers = {}
>>> headers['USER_APP'] = True

You must include a USER_APP Header when:

  1. Accessing an Employer API Resource (/v1/company).

Set to True (boolean)

User: Login

>>> import time, requests, json
>>> expiration = int(time.time()+300)
>>> url = "https://api.bitwage.com/v1/user/login?expire=" + str(expiration)
>>> headers = {}

# Authentication Headers:
>>> headers['ACCESS_KEY'] = APP_API_KEY
>>> headers['ACCESS_SIGNATURE'] = ACCESS_SIGNATURE
>>> headers['ACCESS_NONCE'] = ACCESS_NONCE
>>> headers['User-Agent'] = USER_AGENT

>>> headers['Content-Type'] = 'application/json'
>>> r = requests.get(url, headers = headers)
>>> print r

Request Body JSON structured like this:

{
  "username": "joeshoe@gmail.com",
  "password": "asjdfioas"
}

Response JSON structured like this:

{ 
    "username": "joeshoe@gmail.com,
    "uuid": "d72f22b5-cb00-4168-8f82-50ca35956f3d"
}

For Authentication Headers follow API Key & Secret flow above, but use Bitwage APP Key and Secret given by Bitwage Support instead of the Key and Secret found in your Profile & Security page.
Login using username and password. Returns username and uuid. Use these with the access code to get the User Api Key and Secret

HTTP Request

POST https://api.bitwage.com/v1/user/login?expire=expiration

Query Parameters

Parameter Type Description
expiration Unix Timestamp Specifies the time after which the call will not process. When included, the nonce is ignored.

Request Body Parameters

Parameter Type Description
username string bitwage username of the user
password string bitwage password of the user

User: Two Factor Authentication

>>> import time, requests, json
>>> expiration = int(time.time()+300)
>>> url = "https://api.bitwage.com/v1/user/twofa?expire=" + str(expiration)
>>> headers = {}

# Authentication Headers:
>>> headers['ACCESS_KEY'] = APP_API_KEY
>>> headers['ACCESS_SIGNATURE'] = ACCESS_SIGNATURE
>>> headers['ACCESS_NONCE'] = ACCESS_NONCE
>>> headers['User-Agent'] = USER_AGENT

>>> headers['Content-Type'] = 'application/json'
>>> r = requests.get(url, headers = headers)
>>> print r

Request Body JSON structured like this:

{
  "username": "joeshoe@gmail.com",
  "uuid": "d72f22b5-cb00-4168-8f82-50ca35956f3d",
  "access_token": 939393,
  "gcm_address": "asajdkf839829823f9dsa92399929292"
}

Response JSON structured like this:

{ 
    "username": "joeshoe@gmail.com,
    "apikey": "b47a747c2c654adba50f41acd2939511",
    "apisecret": "80fe301033df46efb36355247044bbcb"
}

Use Bitwage APP API Key and APP API Secret for Authentication Headers. Submit the two factor authentication access token for a user along with the username, uuid from login call, and optional gcm_address, which is the ios or android push notification id. Returns username and user’s api key and secret. This User API Key and Secret works with User API. It doesn’t expire but can be revoked from Bitwage Portal under Profile & Security.

HTTP Request

POST https://api.bitwage.com/v1/user/twofa?expire=expiration

Query Parameters

Parameter Type Description
expiration Unix Timestamp Specifies the time after which the call will not process. When included, the nonce is ignored.

Request Body Parameters

Parameter Type Description required?
username string bitwage username of the user yes
uuid string bitwage username of the user yes
access_token string bitwage username of the user yes
gcm_address string bitwage username of the user no

Tickers

Tickers

>>> url = "https://api.bitwage.com/v1/tickers"
>>> r = requests.get(url)
>>> print r

Response JSON structured like this:

{
    "XBTUSD": "687.45",
    "XBTEUR": "616.13",
    "USDEUR": "0.88",
    "EURPHP": "51.08",
    "EURINR": "74.84",
    "EURVND": "24841.15",
    "USDVND": "22300.00",
    "USDINR": "67.18",
    "EURMXN": "20.44",
    "EURUSD": "1.10",
    "datetimeUTC": "2016-07-02 08:40:59",
    "USDMXN": "18.35",
    "USDBRL": "3.24",
    "EURBRL": "3.60",
    "USDPHP": "45.78"
}

View all Bitwage tickers. No Authentication Required.

The format for quoting currency pairs is AAABBB, where AAA is the base currency and BBB is the quote currency. i.e. a currency pair shows how much of the quote currency is needed to purchase one unit of the base currency.

HTTP Request

GET https://api.bitwage.com/v1/tickers

Ticker

>>> url = "https://api.bitwage.com/v1/ticker/XBTUSD"
>>> r = requests.get(url)
>>> print r

Response JSON structured like this:

{
    "XBTUSD": "268.66",
    "datetimeUTC": "2015-07-08 01:20:05"
}

View specific Bitwage Currency Pair ticker.

Valid pairs shown in Tickers API.

HTTP Request

GET https://api.bitwage.com/v1/ticker/{currencypair}

User: Profile

Profile

>>> import time, requests, json
>>> expiration = int(time.time()+300)
>>> url = "https://api.bitwage.com/v1/company/userid?expire=" + str(expiration)
>>> headers = {}

# Authentication Headers for Key/Secret:
>>> headers['ACCESS_KEY'] = API_KEY
>>> headers['ACCESS_SIGNATURE'] = ACCESS_SIGNATURE
>>> headers['ACCESS_NONCE'] = ACCESS_NONCE
# if using User API Key/Secret
>>> headers['User-Agent'] = USER_AGENT
>>> headers['USER_APP'] = True

# Authentication Headers for Open Authentication
>>> headers['Authorization'] = 'Bearer ' + ACCESS_TOKEN

>>> headers['Content-Type'] = 'application/json'
>>> r = requests.get(url, headers = headers)
>>> print r

Response JSON structured like this:

{
  "user_id": "139343039393",
  "first_name": "George",
  "last_name": "Foogleshmidt",
  "date_of_birth": "02-13-2010",
  "phone_number": "19123457686",
  "street_address": "123 First Street",
  "city": "San Francisco",
  "state": "CA",
  "zip": "94120"
}

View Profile Information of the user. User is defined as: owner of the API Key/Secret, user who created a User API Key/Secret via Username and Password authentication, or the Company Admin who created an Access Token by linking their Bitwage Company via Oauth2.

HTTP Request

GET https://api.bitwage.com/v1/company/userid?expire=expiration

Query Parameters

Parameter Type Description
expiration Unix Timestamp Specifies the time after which the call will not process. When included, the nonce is ignored.

Companies

>>> import time, requests, json
>>> expiration = int(time.time()+300)
>>> url = "https://api.bitwage.com/v1/company/companies?expire=" + str(expiration)
>>> headers = {}

# Authentication Headers for Key/Secret:
>>> headers['ACCESS_KEY'] = API_KEY
>>> headers['ACCESS_SIGNATURE'] = ACCESS_SIGNATURE
>>> headers['ACCESS_NONCE'] = ACCESS_NONCE
# if using User API Key/Secret
>>> headers['User-Agent'] = USER_AGENT
>>> headers['USER_APP'] = True

# Authentication Headers for Open Authentication
>>> headers['Authorization'] = 'Bearer ' + ACCESS_TOKEN

>>> headers['Content-Type'] = 'application/json'
>>> r = requests.get(url, headers = headers)
>>> print r

Response JSON structured like this:

{
  "companies": [
    {
      "company_id": 12357567567,
      "company_name": "Najin"
    },
    {
      "company_id": 54358605335,
      "company_name": "Bape"
    }
  ],
  "default_company": 12357567567
}

View companies user is an admin of. Default Company is either 0 or the company_id of the desired company to be shown in Employer sidebar. User is defined as: owner of the API Key/Secret, user who created a User API Key/Secret via Username and Password authentication, or the Company Admin who created an Access Token by linking their Bitwage Company via Oauth2.

HTTP Request

GET https://api.bitwage.com/v1/company/companies?expire=expiration

Query Parameters

Parameter Type Description
expiration Unix Timestamp Specifies the time after which the call will not process. When included, the nonce is ignored.

BPI Company View

>>> import time, requests, json
>>> expiration = int(time.time()+300)
>>> url = "https://api.bitwage.com/v1/user/bpi_company/view?expire=" + str(expiration)
>>> headers = {}

# Authentication Headers for Key/Secret:
>>> headers['ACCESS_KEY'] = API_KEY
>>> headers['ACCESS_SIGNATURE'] = ACCESS_SIGNATURE
>>> headers['ACCESS_NONCE'] = ACCESS_NONCE
# if using User API Key/Secret
>>> headers['User-Agent'] = USER_AGENT
>>> headers['USER_APP'] = True

# Authentication Headers for Open Authentication
>>> headers['Authorization'] = 'Bearer ' + ACCESS_TOKEN

>>> headers['Content-Type'] = 'application/json'
>>> r = requests.get(url, headers = headers)
>>> print r

Response JSON structured like this:

{
  "bpiemplist": [
    {
      "ppname": "payroll provider name",
      "created": "2016-09-09 05:33:08.238780",
      "ppwebsite": "https://team.bitwage.com/",
      "employer": "test employer",
      "employerwebsite": "https://team.bitwage.com/",
      "employercurrency": "USD",
      "jobrole": "Employee",
      "bpionboardid": 6253195365934046,
      "order": 1
    }
  ]
}

View list of BPI companies for authenticated user.

HTTP Request

GET https://api.bitwage.com/v1/user/bpi_company/view?expire=expiration

Query Parameters

Parameter Type Description
expiration Unix Timestamp Specifies the time after which the call will not process. When included, the nonce is ignored.

BPI Company Edit

>>> import time, requests, json
>>> company_id = <insert company ID here as int>
>>> expiration = int(time.time()+300)
>>> body1={"jobrole":"Employee", "bpionboardid":"6253193365974016", "employer":"test employer11", "employerwebsite": "https://team.bitwage.com/", "employercurrency": "USD","ppname":"payroll provider","ppwebsite":"https://team.bitwage.com/"}
>>> body = json.dumps(body1)
>>> url = "https://api.bitwage.com/v1/user/bpi_company/edit?expire=" + str(expiration)
>>> headers = {}

# Authentication Headers for Key/Secret:
>>> headers['ACCESS_KEY'] = API_KEY
>>> headers['ACCESS_SIGNATURE'] = ACCESS_SIGNATURE
>>> headers['ACCESS_NONCE'] = ACCESS_NONCE
# if using User API Key/Secret
>>> headers['User-Agent'] = USER_AGENT
>>> headers['USER_APP'] = True

# Authentication Headers for Open Authentication
>>> headers['Authorization'] = 'Bearer ' + ACCESS_TOKEN

>>> headers['Content-Type'] = 'application/json'
>>> r = requests.post(url,json=body1,headers=headers)
>>> print r

Response JSON structured like this:

{
  "bpiemplist": [
    {
      "ppname": "payroll provider name",
      "created": "2016-09-09 05:33:08.238780",
      "ppwebsite": "https://team.bitwage.com/",
      "employer": "test employer",
      "employerwebsite": "https://team.bitwage.com/",
      "employercurrency": "USD",
      "jobrole": "Employee",
      "bpionboardid": 6253195365934046,
      "order": 1
    }
  ]
}

Edit BPI company for authenticated user as specified by param bpionboardid.

HTTP Request

POST https://api.bitwage.com/v1/user/bpi_company/edit?expire=expiration

Query Parameters

Parameter Type Description
expiration Unix Timestamp Specifies the time after which the call will not process. When included, the nonce is ignored.

Request Body Parameters

Parameter Type Description
employer string employer name to set
ppname string payroll provider name to set
employerwebsite string employer website to set
ppwebsite string payroll provider website to set
employercurrency string employer currency to set
jobrole string job role to set
bpionboardid string if of bpionboard object

BPI Company Add

>>> import time, requests, json
>>> company_id = <insert company ID here as int>
>>> expiration = int(time.time()+300)
>>> body1={"jobrole":"Employee", "employer":"test employer11", "employerwebsite": "https://team.bitwage.com/", "employercurrency": "USD","ppname":"payroll provider","ppwebsite":"https://team.bitwage.com/"}
>>> body = json.dumps(body1)
>>> url = "https://api.bitwage.com/v1/user/bpi_company/add?expire=" + str(expiration)
>>> headers = {}

# Authentication Headers for Key/Secret:
>>> headers['ACCESS_KEY'] = API_KEY
>>> headers['ACCESS_SIGNATURE'] = ACCESS_SIGNATURE
>>> headers['ACCESS_NONCE'] = ACCESS_NONCE
# if using User API Key/Secret
>>> headers['User-Agent'] = USER_AGENT
>>> headers['USER_APP'] = True

# Authentication Headers for Open Authentication
>>> headers['Authorization'] = 'Bearer ' + ACCESS_TOKEN

>>> headers['Content-Type'] = 'application/json'
>>> r = requests.post(url,json=body1,headers=headers)
>>> print r

Response JSON structured like this:

{
  "bpiemplist": [
    {
      "ppname": "payroll provider name",
      "created": "2016-09-09 05:33:08.238780",
      "ppwebsite": "https://team.bitwage.com/",
      "employer": "test employer",
      "employerwebsite": "https://team.bitwage.com/",
      "employercurrency": "USD",
      "jobrole": "Employee",
      "bpionboardid": 6253195365934046,
      "order": 1
    }
  ]
}

Add BPI company for authenticated user.

HTTP Request

POST https://api.bitwage.com/v1/user/bpi_company/add?expire=expiration

Query Parameters

Parameter Type Description
expiration Unix Timestamp Specifies the time after which the call will not process. When included, the nonce is ignored.

Request Body Parameters

Parameter Type Description
employer string employer name to set
ppname string payroll provider name to set
employerwebsite string employer website to set
ppwebsite string payroll provider website to set
employercurrency string employer currency to set
jobrole string job role to set

BPI Company Delete

>>> import time, requests, json
>>> company_id = <insert company ID here as int>
>>> expiration = int(time.time()+300)
>>> body1={"bpionboardid":"6253193365974016"}
>>> body = json.dumps(body1)
>>> url = "https://api.bitwage.com/v1/user/bpi_company/delete?expire=" + str(expiration)
>>> headers = {}

# Authentication Headers for Key/Secret:
>>> headers['ACCESS_KEY'] = API_KEY
>>> headers['ACCESS_SIGNATURE'] = ACCESS_SIGNATURE
>>> headers['ACCESS_NONCE'] = ACCESS_NONCE
# if using User API Key/Secret
>>> headers['User-Agent'] = USER_AGENT
>>> headers['USER_APP'] = True

# Authentication Headers for Open Authentication
>>> headers['Authorization'] = 'Bearer ' + ACCESS_TOKEN

>>> headers['Content-Type'] = 'application/json'
>>> r = requests.post(url,json=body1,headers=headers)
>>> print r

Response JSON structured like this:

{
    "status": "success"
}

Delete BPI company for authenticated user.

HTTP Request

POST https://api.bitwage.com/v1/user/bpi_company/delete?expire=expiration

Query Parameters

Parameter Type Description
expiration Unix Timestamp Specifies the time after which the call will not process. When included, the nonce is ignored.

Request Body Parameters

Parameter Type Description
bpionboardid string id of bpionboard object to delete

Add Card

>>> import time, requests, json
>>> stripeToken = <insert stripeToken here>
>>> expiration = int(time.time()+300)
>>> body1={"stripeToken":"6253193365974016"}
>>> body = json.dumps(body1)
>>> url = "https://api.bitwage.com/v1/user/link/creditcard?expire=" + str(expiration)
>>> headers = {}

# Authentication Headers for Key/Secret:
>>> headers['ACCESS_KEY'] = API_KEY
>>> headers['ACCESS_SIGNATURE'] = ACCESS_SIGNATURE
>>> headers['ACCESS_NONCE'] = ACCESS_NONCE
# if using User API Key/Secret
>>> headers['User-Agent'] = USER_AGENT
>>> headers['USER_APP'] = True

# Authentication Headers for Open Authentication
>>> headers['Authorization'] = 'Bearer ' + ACCESS_TOKEN

>>> headers['Content-Type'] = 'application/json'
>>> r = requests.post(url,json=body1,headers=headers)
>>> print r

Response JSON structured like this:

{
    'userlinkcreditcardsuccess': True
}

Add card for authenticated user.

HTTP Request

POST https://api.bitwage.com/v1/user/link/creditcard?expire=expiration

Query Parameters

Parameter Type Description
expiration Unix Timestamp Specifies the time after which the call will not process. When included, the nonce is ignored.

Request Body Parameters

Parameter Type Description
stripeToken string stripeToken of card to add

View Card

>>> import time, requests, json
>>> expiration = int(time.time()+300)
>>> url = "https://api.bitwage.com/v1/user/viewlinkedcard?expire=" + str(expiration)
>>> headers = {}

# Authentication Headers for Key/Secret:
>>> headers['ACCESS_KEY'] = API_KEY
>>> headers['ACCESS_SIGNATURE'] = ACCESS_SIGNATURE
>>> headers['ACCESS_NONCE'] = ACCESS_NONCE
# if using User API Key/Secret
>>> headers['User-Agent'] = USER_AGENT
>>> headers['USER_APP'] = True

# Authentication Headers for Open Authentication
>>> headers['Authorization'] = 'Bearer ' + ACCESS_TOKEN

>>> headers['Content-Type'] = 'application/json'
>>> r = requests.get(url,headers=headers)
>>> print r

View card for authenticated user.

HTTP Request

GET https://api.bitwage.com/v1/user/viewlinkedcard?expire=expiration

Query Parameters

Parameter Type Description
expiration Unix Timestamp Specifies the time after which the call will not process. When included, the nonce is ignored.

Delete Card

>>> import time, requests, json
>>> expiration = int(time.time()+300)
>>> linkedcard_id = <insert Linked Card Id here>
>>> expiration = int(time.time()+300)
>>> url = "https://api.bitwage.com/v1/user/deletelinkedcard?expire=" + str(expiration) + "&linkedcard_id=" + str(linkedcard_id)
>>> headers = {}

# Authentication Headers for Key/Secret:
>>> headers['ACCESS_KEY'] = API_KEY
>>> headers['ACCESS_SIGNATURE'] = ACCESS_SIGNATURE
>>> headers['ACCESS_NONCE'] = ACCESS_NONCE
# if using User API Key/Secret
>>> headers['User-Agent'] = USER_AGENT
>>> headers['USER_APP'] = True

# Authentication Headers for Open Authentication
>>> headers['Authorization'] = 'Bearer ' + ACCESS_TOKEN

>>> headers['Content-Type'] = 'application/json'
>>> r = requests.post(url,headers=headers)
>>> print r

Delete card for authenticated user.

HTTP Request

GET https://api.bitwage.com/v1/user/deletelinkedcard?expire=expiration

Query Parameters

Parameter Type Description
expiration Unix Timestamp Specifies the time after which the call will not process. When included, the nonce is ignored.

View Subscriptions

>>> import time, requests
>>> expiration = int(time.time()+300)
>>> url = "https://api.bitwage.com/v1/user/view_subscription?expire=" + str(expiration)
>>> headers = {}

# Authentication Headers for Key/Secret:
>>> headers['ACCESS_KEY'] = API_KEY
>>> headers['ACCESS_SIGNATURE'] = ACCESS_SIGNATURE
>>> headers['ACCESS_NONCE'] = ACCESS_NONCE
# if using User API Key/Secret
>>> headers['User-Agent'] = USER_AGENT
>>> headers['USER_APP'] = True

# Authentication Headers for Open Authentication
>>> headers['Authorization'] = 'Bearer ' + ACCESS_TOKEN

>>> headers['Content-Type'] = 'application/json'
>>> r = requests.post(url,headers=headers)
>>> print r

View current subscriptions for authenticated user.

HTTP Request

POST https://api.bitwage.com/v1/user/view_subscriptions?expire=expiration

Query Parameters

Parameter Type Description
expiration Unix Timestamp Specifies the time after which the call will not process. When included, the nonce is ignored.

Cancel Subscription

>>> import time, requests
>>> expiration = int(time.time()+300)
>>> url = "https://api.bitwage.com/v1/user/cancel_subscription?expire=" + str(expiration)
>>> headers = {}

# Authentication Headers for Key/Secret:
>>> headers['ACCESS_KEY'] = API_KEY
>>> headers['ACCESS_SIGNATURE'] = ACCESS_SIGNATURE
>>> headers['ACCESS_NONCE'] = ACCESS_NONCE
# if using User API Key/Secret
>>> headers['User-Agent'] = USER_AGENT
>>> headers['USER_APP'] = True

# Authentication Headers for Open Authentication
>>> headers['Authorization'] = 'Bearer ' + ACCESS_TOKEN

>>> headers['Content-Type'] = 'application/json'
>>> r = requests.post(url,headers=headers)
>>> print r

Response JSON structured like this:

{
  "result": "success"
}

Cancel active subscription for authenticated user.

HTTP Request

POST https://api.bitwage.com/v1/user/cancel_subscription?expire=expiration

Query Parameters

Parameter Type Description
expiration Unix Timestamp Specifies the time after which the call will not process. When included, the nonce is ignored.

Create Subscription

>>> import time, requests
>>> expiration = int(time.time()+300)
>>> url = "https://api.bitwage.com/v1/user/create_subscription?expire=" + str(expiration)
>>> headers = {}

# Authentication Headers for Key/Secret:
>>> headers['ACCESS_KEY'] = API_KEY
>>> headers['ACCESS_SIGNATURE'] = ACCESS_SIGNATURE
>>> headers['ACCESS_NONCE'] = ACCESS_NONCE
# if using User API Key/Secret
>>> headers['User-Agent'] = USER_AGENT
>>> headers['USER_APP'] = True

# Authentication Headers for Open Authentication
>>> headers['Authorization'] = 'Bearer ' + ACCESS_TOKEN

>>> headers['Content-Type'] = 'application/json'
>>> r = requests.post(url,headers=headers)
>>> print r

Response JSON structured like this:

{
  "success": "subscribed"
}

Create subscription for authenticated user.

HTTP Request

POST https://api.bitwage.com/v1/user/create_subscription?expire=expiration

Query Parameters

Parameter Type Description
expiration Unix Timestamp Specifies the time after which the call will not process. When included, the nonce is ignored.

Worker: History

Payrolls

>>> import time, requests, json
>>> expiration = int(time.time()+300)
>>> url = "https://api.bitwage.com/v1/user/payrolls?expire=" + str(expiration)
>>> headers = {}

# Authentication Headers for Key/Secret:
>>> headers['ACCESS_KEY'] = API_KEY
>>> headers['ACCESS_SIGNATURE'] = ACCESS_SIGNATURE
>>> headers['ACCESS_NONCE'] = ACCESS_NONCE
>>> headers['User-Agent'] = USER_AGENT

>>> headers['Content-Type'] = 'application/json'
>>> r = requests.get(url, headers = headers)
>>> print r

Response JSON structured like this:

{
    "payroll_fulfilled": 5,
    "payroll_not_fulfilled": 14,
    "total_fulfilled": 15.02,
    "total_not_fulfilled": 560.77,
    "total_by_currency": {
        "fulfilled":{
            "USD": 15.02,
            "EUR":0.0
        },
        "not_fulfilled":{
            "USD":560.77,
            "EUR":0.0
        }
    },
    "bpicompanyname": "Payroll Individual",
    "bpicompanyid": 6471725441089536,
    "userpayrolls": [
        {
            "id": 5603420492791808,
            "payroll_id": 5040470539370496,
            "company_id": 6471725441089536,
            "company_name": u'ΠατρονομοςBPI',
            "payment_type": "ach",
            "created": "2015-06-04T20:29:59.220184",
            "received": true,
            "datereceived": "2015-06-04T20:29:59.315871",
            "approved": true,
            "dateapproved": "2015-06-04T20:30:15.730674",
            "broadcasted": true,
            "fulfilled": true,
            "datefulfilled": "2015-06-04T20:31:59.220184",
            "currency":"USD",
            "amount_usd": 0.02,
            "amount_btc": 0.02253044,
            "transaction_id": "e0cff7a55521f7f4b44334d74cd234dda88f596a2a2559820addb8399560fcdb",
            "distobj_list": [
                {
                    "percentage":100,
                    "usercompany_wallet": "1CK6k5wmEqYjEbNrY25EdwNFahfdHm7p52",
                    "payment_outlet": "",
                    "paymentoutlet_orderid": "",
                    "distributionobjects": True,
                    "userpayrolldistributionobjects": True,
                    "amount_usd": 0.02,
                    "amount_btc": 0.02253044,
                    "country": "Bitcoin",
                    "currency": "BTC"
                }
            ]
        }
    ]
}

For this endpoint: use User’s API Key and Secret obtained from TwoFA. View Payrolls User has received through Bitwage. amount_usd is currency-agnostic amount not just USD.

HTTP Request

GET https://api.bitwage.com/v1/user/payrolls?expire=expiration

Query Parameters

Parameter Type Description
expiration Unix Timestamp Specifies the time after which the call will not process. When included, the nonce is ignored.

Employer: Profile

Profile

>>> import time, requests, json
>>> company_id = <insert company ID here as int>
>>> expiration = int(time.time()+300)
>>> url = "https://api.bitwage.com/v1/company?expire=" + str(expiration) + "&company_id=" + str(company_id)
>>> headers = {}

# Authentication Headers for Key/Secret:
>>> headers['ACCESS_KEY'] = API_KEY
>>> headers['ACCESS_SIGNATURE'] = ACCESS_SIGNATURE
>>> headers['ACCESS_NONCE'] = ACCESS_NONCE
# if using User API Key/Secret
>>> headers['User-Agent'] = USER_AGENT
>>> headers['USER_APP'] = True

# Authentication Headers for Open Authentication
>>> headers['Authorization'] = 'Bearer ' + ACCESS_TOKEN

>>> headers['Content-Type'] = 'application/json'
>>> r = requests.get(url, headers = headers)
>>> print r

Response JSON structured like this:

{
  "company_name": "Example Company",
  "company_id": "6403555720167424",
  "street_address": "123 Main St.",
  "country": "US",
  "city": "Sunnyvale",
  "state": "CA",
  "zip": "12345",
  "website_url": "http://www.example.com",
  "email": "example@example.com",
  "phone": "+1 (123) 456-7891",
  "ein": "123151244",
  "default_payment_method": "ach_credit"
}

View profile information of specified company. Default Payment Method options are: “ach_credit”, “ach_debit”, “wire”, “bitcoin”, “credit_card”

HTTP Request

GET https://api.bitwage.com/v1/company?expire=expiration&company_id=company_id

Query Parameters

Parameter Type Description
expiration Unix Timestamp Specifies the time after which the call will not process. When included, the nonce is ignored.
company_id Number The company’s ID in the Bitwage database.

Linked Accounts

>>> import time, requests, json
>>> expiration = int(time.time()+300)
>>> url = "https://api.bitwage.com/v1/company/linkedaccounts?expire=" + str(expiration) + "&company_id=COMPANYID"
>>> headers = {}

# Authentication Headers for Key/Secret:
>>> headers['ACCESS_KEY'] = API_KEY
>>> headers['ACCESS_SIGNATURE'] = ACCESS_SIGNATURE
>>> headers['ACCESS_NONCE'] = ACCESS_NONCE
# if using User API Key/Secret
>>> headers['User-Agent'] = USER_AGENT
>>> headers['USER_APP'] = True

# Authentication Headers for Open Authentication
>>> headers['Authorization'] = 'Bearer ' + ACCESS_TOKEN

>>> headers['Content-Type'] = 'application/json'
>>> r = requests.get(url, headers = headers)
>>> print r

Response JSON structured like this:

{
    'linkedaccounts': [{
      'type': 'credit_card',
      'brand': 'Visa',
      'last4': 1234,
      'id': 12345678
    }]
}

View accounts that the Employer has linked.

HTTP Request

GET https://api.bitwage.com/v1/company/linkedaccounts?expire=expiration&company_id=COMPANYID

Query Parameters

Parameter Type Description
expiration Unix Timestamp Specifies the time after which the call will not process. When included, the nonce is ignored.
company_id Number The company’s ID in the Bitwage database.

Employer: Workers

Workers

>>> import time, requests, json
>>> company_id = <insert company ID here as int>
>>> expiration = int(time.time()+300)
>>> url = "https://api.bitwage.com/v1/company/workers?expire=" + str(expiration) + "&company_id=" + str(company_id)
>>> headers = {}

# Authentication Headers for Key/Secret:
>>> headers['ACCESS_KEY'] = API_KEY
>>> headers['ACCESS_SIGNATURE'] = ACCESS_SIGNATURE
>>> headers['ACCESS_NONCE'] = ACCESS_NONCE
# if using User API Key/Secret
>>> headers['User-Agent'] = USER_AGENT
>>> headers['USER_APP'] = True

# Authentication Headers for Open Authentication
>>> headers['Authorization'] = 'Bearer ' + ACCESS_TOKEN

>>> headers['Content-Type'] = 'application/json'
>>> r = requests.get(url, headers = headers)
>>> print r

Response JSON structured like this:

{
  "workers": [
    {
      "email": "buspos@giants.com",
      "user_id": 2885074604081128,
      "role": "admin"
    },
    {
      "email": "madbum@giants.com",
      "user_id": 1230984041000002,
      "role": "admin"
    }
  ],
  "meta": {
    "curr_page":1,
    "next_page":"",
    "total_pages":1
  }
}

View all workers of specified Employer.

HTTP Request

GET https://api.bitwage.com/v1/company/workers?expire=expiration&company_id=company_id&page=3

Query Parameters

Parameter Type Description
expiration Unix Timestamp Specifies the time after which the call will not process. When included, the nonce is ignored.
company_id Number The company’s ID in the Bitwage database.
page Number The page of results to return (ie. pagination parameter).

Worker

>>> import time, requests, json
>>> company_id = <insert company ID here as int>
>>> expiration = int(time.time()+300)
>>> user_id = <insert user_id as int>
>>> url = "https://api.bitwage.com/v1/company/worker?expire=" + str(expiration) + "&company_id=" + str(company_id) + "&user_id=" + str(user_id)
>>> headers = {}

# Authentication Headers for Key/Secret:
>>> headers['ACCESS_KEY'] = API_KEY
>>> headers['ACCESS_SIGNATURE'] = ACCESS_SIGNATURE
>>> headers['ACCESS_NONCE'] = ACCESS_NONCE
# if using User API Key/Secret
>>> headers['User-Agent'] = USER_AGENT
>>> headers['USER_APP'] = True

# Authentication Headers for Open Authentication
>>> headers['Authorization'] = 'Bearer ' + ACCESS_TOKEN

>>> headers['Content-Type'] = 'application/json'
>>> r = requests.get(url, headers = headers)
>>> print r

Response JSON structured like this:

{
  "first_name": "John",
  "last_name": "Smith",
  "email": "example@example.com",
  "dob": "2000-01-31",
  "phone_number": "+1 (123) 345-9539",
  "street_address": "123 Main St",
  "role": "admin",
  "worker_id": "5629499534213120",
  "total_not_fulfilled": 1000.0,
  "total_fulfilled": 0.0,
  "total_by_currency": {
    "fulfilled": {
        "USD":0.0,
        "EUR":0.0
    },
    "not_fulfilled": {
        "USD":1000.0,
        "EUR":0.0
    }
  },
  "receive_method_entered": false
}

View information of specified worker.

HTTP Request

GET https://api.bitwage.com/v1/company/worker?expire=expiration&company_id=company_id&user_id=user_id

Query Parameters

Parameter Type Description
expiration Unix Timestamp Specifies the time after which the call will not process. When included, the nonce is ignored.
company_id Number The company’s ID in the Bitwage database.
user_id Number The worker’s ID in the Bitwage database.

Invite Worker

>>> import time, requests, json
>>> company_id = <insert company ID here as int>
>>> expiration = int(time.time()+300)
>>> body1={'to_invite':[{'email': 'example@example.com','role': 'admin'}]}
>>>body = json.dumps(body1)
>>> url = "https://api.bitwage.com/v1/company/workers/invite?expire=" + str(expiration) + "&company_id=" + str(company_id)
>>> headers = {}

# Authentication Headers for Key/Secret:
>>> headers['ACCESS_KEY'] = API_KEY
>>> headers['ACCESS_SIGNATURE'] = ACCESS_SIGNATURE
>>> headers['ACCESS_NONCE'] = ACCESS_NONCE
# if using User API Key/Secret
>>> headers['User-Agent'] = USER_AGENT
>>> headers['USER_APP'] = True

# Authentication Headers for Open Authentication
>>> headers['Authorization'] = 'Bearer ' + ACCESS_TOKEN

>>> headers['Content-Type'] = 'application/json'
>>> r = requests.post(url,json=body1,headers=headers)
>>> print r

Request Body JSON structured like this:

{
    "to_invite": [
        {
            "email": "example@example.com",
            "role": "admin"
        }
    ]
}

Response JSON structured like this:

{
  "invite_log": [
    {
      "email": "example@example.com",
      "status": "sent"
    }
  ]
}

Invite workers to your Employer profile on Bitwage.

HTTP Request

POST https://api.bitwage.com/v1/company/workers/invite?expire=expiration&company_id=company_id

Query Parameters

Parameter Type Description
expiration Unix Timestamp Specifies the time after which the call will not process. When included, the nonce is ignored.
company_id Number The company’s ID in the Bitwage database.

Request Body Parameters

Parameter Type Description
email string email of user to invite
role string role of user to invite (contractor, admin, or employee)

Email to ID

>>> import time, requests, json
>>> company_id = <insert company ID here as int>
>>> expiration = int(time.time()+300)
>>> body1={"emails": ["example1@example1.com", "example2@example2.com"]}
>>>body = json.dumps(body1)
>>> url = "https://api.bitwage.com/v1/company/workers/emailtoid?expire=" + str(expiration) + "&company_id=" + str(company_id)
>>> headers = {}

# Authentication Headers for Key/Secret:
>>> headers['ACCESS_KEY'] = API_KEY
>>> headers['ACCESS_SIGNATURE'] = ACCESS_SIGNATURE
>>> headers['ACCESS_NONCE'] = ACCESS_NONCE
# if using User API Key/Secret
>>> headers['User-Agent'] = USER_AGENT
>>> headers['USER_APP'] = True

# Authentication Headers for Open Authentication
>>> headers['Authorization'] = 'Bearer ' + ACCESS_TOKEN

>>> headers['Content-Type'] = 'application/json'
>>> r = requests.post(url,json=body1,headers=headers)
>>> print r

Request Body JSON structured like this:

{
    "emails": [
        "example1@example1.com"
    ]
}

Response JSON structured like this:

{
  "success": [
    {
      "email": "success@success.com",
      "user_id": 6685030696878080
    }
  ],
  "failure": [
    {
      "email": "failure@failure.com",
      "error": "Worker does not exist."
    }
  ]
}

HTTP Request

POST https://api.bitwage.com/v1/company/workers/emailtoid?expire=expiration&company_id=company_id

Query Parameters

Parameter Type Description
expiration Unix Timestamp Specifies the time after which the call will not process. When included, the nonce is ignored.
company_id Number The company’s ID in the Bitwage database.

Request Body Parameters

Parameter Type Description
email string email of user that you want ID from.

Employer: Payrolls

Payrolls

>>> import time, requests, json
>>> company_id = <insert company ID here as int>
>>> expiration = int(time.time()+300)
>>> url = "https://api.bitwage.com/v1/company/payrolls?expire=" + str(expiration) + "&company_id=" + str(company_id)
>>> headers = {}

# Authentication Headers for Key/Secret:
>>> headers['ACCESS_KEY'] = API_KEY
>>> headers['ACCESS_SIGNATURE'] = ACCESS_SIGNATURE
>>> headers['ACCESS_NONCE'] = ACCESS_NONCE
# if using User API Key/Secret
>>> headers['User-Agent'] = USER_AGENT
>>> headers['USER_APP'] = True

# Authentication Headers for Open Authentication
>>> headers['Authorization'] = 'Bearer ' + ACCESS_TOKEN

>>> headers['Content-Type'] = 'application/json'
>>> r = requests.get(url, headers = headers)
>>> print r

Response JSON structured like this:

{
  "company_id": "6403555720167424",
  "company_name": "Example Company",
  "payroll_not_fulfilled": 0,
  "payroll_fulfilled": 33,
  "total_fulfilled": 0.0,
  "total_not_fulfilled": 1000.03,
  "total_by_currency": {
    "fulfilled": {
        "USD":0.0,
        "EUR":0.0
    },
    "not_fulfilled": {
        "USD":1000.03,
        "EUR":0.0
    }
  },
  "payrolls": [
    {
      "amount": 0.03,
      "currency": "USD",
      "id": 4838400918028288,
      "time_created": "2015-07-16T02:07:31.937968",
      "userpayrolls": [
           {
               "user_email": "test@example.com", 
               "user_id": 5677071464398848, 
               "userpayroll_id": 6523493654986752
           }
       ]
    },
    {
      "amount": 1.00,
      "currency": "USD",
      "id": 4234242238028288,
      "time_created": "2015-07-16T02:08:36.923968",
      "userpayrolls": [
           {
               "user_email": "test2@example.com", 
               "user_id": 5677071364398848, 
               "userpayroll_id": 6523423654986752
           }
       ]
    }
  ],
  "meta":{
    "curr_page":1,
    "next_page":"",
    "total_pages":1
  }
}

View all payrolls for specified Employer.

HTTP Request

GET https://api.bitwage.com/v1/company/payrolls?expire=expiration&company_id=company_id

Query Parameters

Parameter Type Description
expiration Unix Timestamp Specifies the time after which the call will not process. When included, the nonce is ignored.
company_id Number The company’s ID in the Bitwage database.

Payroll

>>> import time, requests, json
>>> company_id = <insert company ID here as int>
>>> payroll_id = <insert payroll ID here as int>
>>> expiration = int(time.time()+300)
>>> url = "https://api.bitwage.com/v1/company/payroll?expire=" + str(expiration) + "&company_id=" + str(company_id) + "&payroll_id=" + str(payroll_id)
>>> headers = {}

# Authentication Headers for Key/Secret:
>>> headers['ACCESS_KEY'] = API_KEY
>>> headers['ACCESS_SIGNATURE'] = ACCESS_SIGNATURE
>>> headers['ACCESS_NONCE'] = ACCESS_NONCE
# if using User API Key/Secret
>>> headers['User-Agent'] = USER_AGENT
>>> headers['USER_APP'] = True

# Authentication Headers for Open Authentication
>>> headers['Authorization'] = 'Bearer ' + ACCESS_TOKEN

>>> headers['Content-Type'] = 'application/json'
>>> r = requests.get(url, headers = headers)
>>> print r

Response JSON structured like this:

{
  "time_created": "2015-06-30T00:48:01.265676",
  "date_received": "2015-06-20",
  "date_processed": "2015-06-21",
  "date_fulfilled": "2015-06-22",
  "total_amount": 1.03,
  "currency": "USD",
  "userpayrolls": [
    {
      "amount": 0.03,
      "currency": "USD",
      "user_id": 4838400918028288,
      "email": "test@example.com"
    },
    {
      "amount": 1.00,
      "currency": "USD",
      "user_id": 4234242238028288,
      "email": "test2@example.com"
    }
  ],
  "payment_type": "ach",
  "payment_details": {
    "printOnCheck": "Individual",
    "address": "123 Main St.",
    "checkNum": "3333333333",
    "city": "Los Angeles",
    "memo": "A+",
    "phone": "+1 (123) 633-0123",
    "bankAccNum": "XXXXXX2222",
    "bankRoute": "1111111111",
    "state": "CA",
    "email": "example@example.com",
    "first_name": "John",
    "last_name": "Smith",
    "zipcode": "95070"
  },
  "meta": {
    "curr_page":1,
    "next_page":"",
    "total_pages":1
  }
}

View information about a specified payroll.

HTTP Request

GET https://api.bitwage.com/v1/company/payroll?expire=expiration&company_id=company_id&payroll_id=payroll_id

Query Parameters

Parameter Type Description
expiration Unix Timestamp Specifies the time after which the call will not process. When included, the nonce is ignored.
company_id Number The company’s ID in the Bitwage database.
payroll_id Number The payroll’s ID in the Bitwage database.

Worker Payrolls

>>> import time, requests, json
>>> company_id = <insert company ID here as int>
>>> expiration = int(time.time()+300)
>>> user_id = <insert user ID here as int>
>>> url = "https://api.bitwage.com/v1/company/worker/payrolls?expire=" + str(expiration) + "&company_id=" + str(company_id) + "&user_id=" + str(user_id)
>>> headers = {}

# Authentication Headers for Key/Secret:
>>> headers['ACCESS_KEY'] = API_KEY
>>> headers['ACCESS_SIGNATURE'] = ACCESS_SIGNATURE
>>> headers['ACCESS_NONCE'] = ACCESS_NONCE
# if using User API Key/Secret
>>> headers['User-Agent'] = USER_AGENT
>>> headers['USER_APP'] = True

# Authentication Headers for Open Authentication
>>> headers['Authorization'] = 'Bearer ' + ACCESS_TOKEN

>>> headers['Content-Type'] = 'application/json'
>>> r = requests.get(url, headers = headers)
>>> print r

Response JSON structured like this:

{
  "company_id": "6403555720167424",
  "company_name": "Example Company",
  "payroll_not_fulfilled": 33,
  "payroll_fulfilled": 0,
  "total_fulfilled": 0.0,
  "total_not_fulfilled": 10000.06,
  "total_by_currency": {
    "fulfilled": {
        "USD":0.0,
        "EUR":0.0
    },
    "not_fulfilled": {
        "USD":10000.06,
        "EUR":0.0
    }
  },
  "payrolls": [
    {
      "amount": 0.03,
      "currency": "USD",
      "id": 4838400918028288,
      "time_created": "2015-07-16T02:07:31.937968",
      "userpayrolls": [
           {
               "user_email": "test3@example.com", 
               "user_id": 5677071364398842, 
               "userpayroll_id": 6523423654986751
           }
       ]
    },
    {
      "amount": 1.00,
      "currency": "USD",
      "id": 4234242238028288,
      "time_created": "2015-07-16T02:08:36.923968",
      "userpayrolls": [
           {
               "user_email": "test3@example.com", 
               "user_id": 5677071364398842, 
               "userpayroll_id": 6523423654986753
           }
       ]
    }
  ],
  "meta": {
    "curr_page":1,
    "next_page":"",
    "total_pages":1
  }
}

View all payrolls where the specified worker is a recipient.

HTTP Request

GET https://api.bitwage.com/v1/company/worker/payrolls?expire=expiration&company_id=company_id&user_id=user_id

Query Parameters

Parameter Type Description
expiration Unix Timestamp Specifies the time after which the call will not process. When included, the nonce is ignored.
company_id Number The company’s ID in the Bitwage database.
user_id Number The worker’s ID in the Bitwage database.

Create Payroll

>>> import time, requests, json
>>> company_id = <insert company ID here as int>
>>> paywithid = <insert paywithid here as true or false>
>>> deleteifnotmethod = <insert deleteifnotmethod here as true or false>
>>> expiration = int(time.time()+300)
>>> body1={'to_pay':[{'email': 'example@example.com','amount_usd': '10.0'}]} #email or user_id depending on value of paywithid. amount_usd as string
>>>body = json.dumps(body1)
>>> url = "https://api.bitwage.com/v1/company/workers/pay?expire=" + str(expiration) + "&company_id=" + str(company_id) + "&paywithid=" + str(paywithid) + "&deleteifnotmethod=" + str(deleteifnotmethod)
>>> headers = {}

# Authentication Headers for Key/Secret:
>>> headers['ACCESS_KEY'] = API_KEY
>>> headers['ACCESS_SIGNATURE'] = ACCESS_SIGNATURE
>>> headers['ACCESS_NONCE'] = ACCESS_NONCE
# if using User API Key/Secret
>>> headers['User-Agent'] = USER_AGENT
>>> headers['USER_APP'] = True

# Authentication Headers for Open Authentication
>>> headers['Authorization'] = 'Bearer ' + ACCESS_TOKEN

>>> headers['Content-Type'] = 'application/json'
>>> r = requests.post(url,json=body1,headers=headers)
>>> print r

Request Body JSON structured like this:

{
    "to_pay": [
        {
            "email": "example@example.com",
            "amount_usd": "10.0"
        }
    ]
}

Response JSON structured like this:

{
  "payroll_id": 5822463824887808,
  "status":'created' #'created' or 'deleted'
  "suborder_list": [
    {
      "email": "example@example.com",
      "amount_usd": "10"
    }
  ],
  "total_amount": 10.0,
  "currency":"USD",
  "num_suborders": 1,
  "payment_method": "ach_credit",
  "payment_method_set_msg":"" #specifies reason if default_payment_method is not set as payment_method
}

Create a payroll order for your company. Will attempt to set Payment Method of the Order to the Company’s Default Payment Method. Default Payment Method options are: “None”, “ach_credit”, “ach_debit”, “wire”, “bitcoin”, “credit_card”. Only the options “ach_credit”, “wire”, and “credit_card” can possibly be automatically set as the Payment Method of the order via API. If fails to set Payment Method, will return a Message Explanation or optionally will delete the Order and not send an Email Notification.

HTTP Request

POST https://api.bitwage.com/v1/company/workers/pay?expire=expiration&company_id=company_id&paywithid=paywithid

Query Parameters

Parameter Type Description
expiration Unix Timestamp Specifies the time after which the call will not process. When included, the nonce is ignored.
company_id Number The company’s ID in the Bitwage database.
paywithid Boolean (optional) If 'true’, specifies option to pay with userID. If nothing specified, defaults to email.
deleteifnotmethod Boolean (optional) If 'true’, specifies that if payment method not automatically set via Default Payment Method to delete Payroll and not send email notification.

Request Body Parameters

Parameter Type Description
email string email of user to pay
user_id string user_id of user to pay (use either email or user_id)
amount_usd string amount usd to pay

Payroll Payment Method

>>> import time, requests, json
>>> company_id = <insert company ID here as int>
>>> payroll_id = <insert payroll ID here as int>
>>> expiration = int(time.time()+300)
>>> body1={'payment_method':'wire'} //valid payment_methods: 'wire', 'ach_credit', 'credit_card'
>>>body = json.dumps(body1)
>>> url = "https://api.bitwage.com/v1/company/workers/pay?expire=" + str(expiration) + "&company_id=" + str(company_id) + "&paywithid=" + str(paywithid)
>>> headers = {}

# Authentication Headers for Key/Secret:
>>> headers['ACCESS_KEY'] = API_KEY
>>> headers['ACCESS_SIGNATURE'] = ACCESS_SIGNATURE
>>> headers['ACCESS_NONCE'] = ACCESS_NONCE
# if using User API Key/Secret
>>> headers['User-Agent'] = USER_AGENT
>>> headers['USER_APP'] = True

# Authentication Headers for Open Authentication
>>> headers['Authorization'] = 'Bearer ' + ACCESS_TOKEN

>>> headers['Content-Type'] = 'application/json'
>>> r = requests.post(url,json=body1,headers=headers)
>>> print r

Request Body JSON structured like this:

{
    "payment_method": "wire"
}

Response JSON structured like this:

{
  "status": "success",
  "payroll_id": "5822463824887808",
  "payment_method": "wire"
  "payment_method_set_msg": "" #only returned if status == 'failure'
}

Specify Payment Method for a Payroll Order. This is required for Bitwage to process order. Bitwage offers: bitcoin transfer, wire, ach credit, ach debit, and credit card, but only wire, ach credit and credit card are available through the API right now.

HTTP Request

POST https://api.bitwage.com/v1/company/payroll/method?expire=expiration&company_id=company_id&payroll_id=payroll_id

Query Parameters

Parameter Type Description
expiration Unix Timestamp Specifies the time after which the call will not process. When included, the nonce is ignored.
company_id Number The company’s ID in the Bitwage database.
payroll_id Number The payroll ID in the Bitwage database.

Request Body Parameters

Parameter Type Description
payment_method string payment_method to set for payroll. valid methods: 'wire’, 'ach_credit’, 'credit_card’

Delete Payroll

>>> import time, requests, json
>>> payroll_id = <insert payroll_id here as int>
>>> expiration = int(time.time()+300)
>>> body1={'to_delete':[payroll_id]} //list of payroll_ids to delete
>>>body = json.dumps(body1)
>>> url = "https://api.bitwage.com/v1/company/payroll/delete?expire=" + str(expiration)
>>> headers = {}

# Authentication Headers for Key/Secret:
>>> headers['ACCESS_KEY'] = API_KEY
>>> headers['ACCESS_SIGNATURE'] = ACCESS_SIGNATURE
>>> headers['ACCESS_NONCE'] = ACCESS_NONCE
# if using User API Key/Secret
>>> headers['User-Agent'] = USER_AGENT
>>> headers['USER_APP'] = True

# Authentication Headers for Open Authentication
>>> headers['Authorization'] = 'Bearer ' + ACCESS_TOKEN

>>> headers['Content-Type'] = 'application/json'
>>> r = requests.post(url,json=body1,headers=headers)
>>> print r

Request Body JSON structured like this:

{
    "to_delete": [ 
        "5822463824887809"
    ]
}

Response JSON structured like this:

{
  "success": [5822463824887809],
  "failure": [
    {
      "payroll_id": 5822463824887808
    }
  ]
}

Delete a payroll order for your company. Cannot delete a payroll already approved.

HTTP Request

POST https://api.bitwage.com/v1/company/payroll/delete?expire=expiration

Query Parameters

Parameter Type Description
expiration Unix Timestamp Specifies the time after which the call will not process. When included, the nonce is ignored.

Request Body Parameters

Parameter Type Description
payroll_id int payroll_id of payroll to delete

Employer: Invoices

Invoices

>>> import time, requests, json
>>> expiration = int(time.time()+300)
>>> url = "https://api.bitwage.com/v1/company/invoices?expire=" + str(expiration) + "&company_id=COMPANYID"
>>> headers = {}

# Authentication Headers for Key/Secret:
>>> headers['ACCESS_KEY'] = API_KEY
>>> headers['ACCESS_SIGNATURE'] = ACCESS_SIGNATURE
>>> headers['ACCESS_NONCE'] = ACCESS_NONCE
# if using User API Key/Secret
>>> headers['User-Agent'] = USER_AGENT
>>> headers['USER_APP'] = True

# Authentication Headers for Open Authentication
>>> headers['Authorization'] = 'Bearer ' + ACCESS_TOKEN

>>> headers['Content-Type'] = 'application/json'
>>> r = requests.get(url, headers = headers)
>>> print r

Response JSON structured like this:

{
  "company": {
    "id": "6122080743456768",
    "name": "Hello, Inc."
  }
  "invoices": 
    [
      {
        "id": 5725981679550464, 
        "worker": {
            "id": 6122080743456722,
            "email": "test@example.com"
        },
        "total_amount_fiat": 1000.0, 
        "time_created": "2016-03-07 22:10:29.049796", 
        "currency": "USD",
        "payroll_id": 6122080743456555,
        "due_date": "2016-03-07",
        "approved": false
      }
    ]
}

View all invoices that users have sent to your company.

HTTP Request

GET https://api.bitwage.com/v1/company/invoices?expire=expiration&company_id=COMPANYID

Query Parameters

Parameter Type Description
expiration Unix Timestamp Specifies the time after which the call will not process. When included, the nonce is ignored.
company_id Number The company’s ID in the Bitwage database.

Invoice

>>> import time, requests, json
>>> expiration = int(time.time()+300)
>>> url = "https://api.bitwage.com/v1/company/invoice?expire=" + str(expiration) + "&company_id=COMPANYID" + "&invoice_id=INVOICEID"
>>> headers = {}

# Authentication Headers for Key/Secret:
>>> headers['ACCESS_KEY'] = API_KEY
>>> headers['ACCESS_SIGNATURE'] = ACCESS_SIGNATURE
>>> headers['ACCESS_NONCE'] = ACCESS_NONCE
# if using User API Key/Secret
>>> headers['User-Agent'] = USER_AGENT
>>> headers['USER_APP'] = True

# Authentication Headers for Open Authentication
>>> headers['Authorization'] = 'Bearer ' + ACCESS_TOKEN

>>> headers['Content-Type'] = 'application/json'
>>> r = requests.get(url, headers = headers)
>>> print r

Response JSON structured like this:

{
  "id": 5769603078684633,
  "company": {
    "id": 5769603078684622,
    "name": "Test, Inc",
    "phone_number": "+1 (204) 200-3963",
    "street_address": "123 First Street",
    "city": "Knoxville",
    "state": "TN",
    "zip": "34443",
    "website_url": "http://example.com",
    "ein": "12-1234567",
    "email" "support@example.com": 
  },
  "worker": {
    "id": 5769603078684611,
    "email": "test@example.com"
  },
  "line_items":[{
    "time": 20.0,
    "amount_fiat": 1000.0,
    "amountpertime": 50.0,
    "currency": "USD",
    "description": "front end development"
  }],
  "time_created": "2016-03-07 22:10:29.049796",
  "currency": "USD", 
  "amount": 1000.0, 
  "due date": "2016-03-07", 
  "approved": true
}

View specific invoice that a worker has sent to your company.

HTTP Request

GET https://api.bitwage.com/v1/company/invoices?expire=expiration&company_id=COMPANYID

Query Parameters

Parameter Type Description
expiration Unix Timestamp Specifies the time after which the call will not process. When included, the nonce is ignored.
company_id Number The company’s ID in the Bitwage database.
invoice_id Number The invoice id of the specific invoice.

Approve Invoice

>>> import time, requests, json
>>> invoice_id = <insert invoice_id here as int>
>>> expiration = int(time.time()+300)
>>> body1={'invoice_id': str(invoice_id)}
>>>body = json.dumps(body1)
>>> url = "https://api.bitwage.com/v1/company/invoice/approve?expire=" + str(expiration) + "&company_id=COMPANYID"
>>> headers = {}

# Authentication Headers for Key/Secret:
>>> headers['ACCESS_KEY'] = API_KEY
>>> headers['ACCESS_SIGNATURE'] = ACCESS_SIGNATURE
>>> headers['ACCESS_NONCE'] = ACCESS_NONCE
# if using User API Key/Secret
>>> headers['User-Agent'] = USER_AGENT
>>> headers['USER_APP'] = True

# Authentication Headers for Open Authentication
>>> headers['Authorization'] = 'Bearer ' + ACCESS_TOKEN

>>> headers['Content-Type'] = 'application/json'
>>> r = requests.post(url,json=body1,headers=headers)
>>> print r

Request Body JSON structured like this:

{
    "invoice_id": "2384192341092834"
}

Response JSON structured like this:

{
    "invoice": {
        "id": 5822463824887808,
        "status": "approved", 
        "currency": "USD", 
        "total_amount_fiat": 10000.0
    },
    "payroll": {
        "id": 5822463824887833,
        "total_amount": 10000.0
        "currency": "USD", 
        "status": "created", 
        "num_suborders": 1,
        "suborder_list": [{
            "amount_usd": "10000.00", 
            "user_id": 5707702298738622, 
            "email": "joasdf@gmail.com"
        }],
        "payment_method":"None",
        "payment_method_set_msg": "None or Unsupported Default Payment Method "
    }
}

Approve an Invoice. Create a payroll order for your company. Will attempt to set Payment Method of the Order to the Company’s Default Payment Method. Default Payment Method options are: “None”, “ach_credit”, “ach_debit”, “wire”, “bitcoin”, “credit_card”. Only the options “ach_credit”, “wire”, and “credit_card” can possibly be automatically set as the Payment Method of the order via API. If fails to set Payment Method, will return a Message Explanation.

HTTP Request

POST https://api.bitwage.com/v1/company/invoice/approve?expire=expiration&company_id=COMPANYID

Query Parameters

Parameter Type Description
expiration Unix Timestamp Specifies the time after which the call will not process. When included, the nonce is ignored.
company_id Number The company’s ID in the Bitwage database.

Request Body Parameters

Parameter Type Description
invoice_id int ID of invoice you want to approve.

Responses and Errors

Responses

The Public Bitwage API v1.0 uses the following error codes:

200

See examples for each API Path.

403

{"Unauthorized": [{"error_list": ["there was an error"]}]}

400

{"Bad Request": [{"error_list": ["there was an error"]}]}

500

{"Server Error": [{"error_list": ["there was an error"]}]}

Errors

The Public Bitwage API v1.0 uses the following error codes:

Error Code Meaning
400 Bad Request – Your request sucks
401 Unauthorized – Your API key is wrong
403 Forbidden – The kitten requested is hidden for administrators only
404 Not Found – The specified kitten could not be found
405 Method Not Allowed – You tried to access a kitten with an invalid method
406 Not Acceptable – You requested a format that isn’t json
410 Gone – The kitten requested has been removed from our servers
418 I’m a teapot
429 Too Many Requests – You’re requesting too many kittens! Slow down!
500 Internal Server Error – We had a problem with our server. Try again later.
503 Service Unavailable – We’re temporarially offline for maintanance. Please try again later.



Bitwage