The official endpoint of Billy API is
https://billy.balancedpayments.com
When you found a bug, or you have any suggestion to this project, please create an issue in our GitHub repo.
All HTTP responses except errors will be in JSON format. Other format is not supported currently. To access the API, you need an API key, except the one for registering a company. The API key should be passed as the username for HTTP basic authentication, leave the password blank.
A company is an user account for using the Billy system, you need to pass your Balanced API key to create one, so that Billy can process payments via Balanced for you. Company has a generated API key which is required for performing any further operations in Billy system.
Note
You MUST keep these API keys as secret, do not share them with anyone, do not post them on IRC. Also, currently, Billy API key cannot be Retrieved or reset easily, if you lost it, you can only contact administrator to ask them reset it for you.
Create a company and return the entity. Only this method does not require an API key to access as you need it to generate one. Remember to save the API key in response.
Example:
curl https://billy.balancedpayments.com/v1/companies \
-X POST \
-d "processor_key=ef13dce2093b11e388de026ba7d31e6f"
Response:
{
"api_key": "5MyxREWaEymNWunpGseySVGBZkTWDW57FUXsyTo2WtGC",
"created_at": "2014-02-08T08:22:10.629000+00:00",
"guid": "CP4MXZG4ThUdbLpiX8e9Yx3j",
"updated_at": "2014-02-08T08:22:10.629000+00:00"
}
Retrieve a company record
Example:
curl https://billy.balancedpayments.com/v1/companies/CP4MXZG4ThUdbLpiX8e9Yx3j \
-u 5MyxREWaEymNWunpGseySVGBZkTWDW57FUXsyTo2WtGC:
Response:
{
"api_key": "5MyxREWaEymNWunpGseySVGBZkTWDW57FUXsyTo2WtGC",
"created_at": "2014-02-08T08:22:10.629000+00:00",
"guid": "CP4MXZG4ThUdbLpiX8e9Yx3j",
"updated_at": "2014-02-08T08:22:10.629000+00:00"
}
A plan is a setup for recurring charing or paying out, it contains the amount to charge or payout and the frequency of generating invoices.
Create a plan and return the entity.
plan_type - The type of this plan can be either debit for charging customer or credit for paying out.
frequency - The frequency to schedule charging or paying out to customer. Can be one of
When it is monthly and the schedule started at the end of a month, the closest day to the started one in a month will be selected for following invoices. For example, the started date time is 2013-01-30, then following invoices will occur at 2013-02-28, 2013-03-30 and so on.
amount - The amount in USD cents to debit or credit to customer
interval - (optional) The interval of frequency period to multiply, the default value is 1. For example, to debit or credit a customer by two weeks frequency, you can set the frequency to weekly, and set the interval to 2, then the schedule will be in a biweekly manner.
Example:
curl https://billy.balancedpayments.com/v1/plans \
-X POST \
-u 5MyxREWaEymNWunpGseySVGBZkTWDW57FUXsyTo2WtGC: \
-d "plan_type=debit" \
-d "amount=500" \
-d "frequency=monthly"
Response:
{
"amount": 500,
"company_guid": "CP4MXZG4ThUdbLpiX8e9Yx3j",
"created_at": "2014-02-08T08:22:11.508000+00:00",
"deleted": false,
"frequency": "monthly",
"guid": "PL4RHCKW7GsGMjpcozHveQuw",
"interval": 1,
"plan_type": "debit",
"updated_at": "2014-02-08T08:22:11.508000+00:00"
}
Retrieve a plan entity
Example:
curl https://billy.balancedpayments.com/v1/plans/PL4RHCKW7GsGMjpcozHveQuw \
-u 5MyxREWaEymNWunpGseySVGBZkTWDW57FUXsyTo2WtGC:
Response:
{
"amount": 500,
"company_guid": "CP4MXZG4ThUdbLpiX8e9Yx3j",
"created_at": "2014-02-08T08:22:11.508000+00:00",
"deleted": false,
"frequency": "monthly",
"guid": "PL4RHCKW7GsGMjpcozHveQuw",
"interval": 1,
"plan_type": "debit",
"updated_at": "2014-02-08T08:22:11.508000+00:00"
}
Delete a plan and return entity.
Example:
curl https://billy.balancedpayments.com/v1/plans/PL4RHCKW7GsGMjpcozHveQuw \
-X DELETE \
-u 5MyxREWaEymNWunpGseySVGBZkTWDW57FUXsyTo2WtGC:
Response:
{
"amount": 500,
"company_guid": "CP4MXZG4ThUdbLpiX8e9Yx3j",
"created_at": "2014-02-08T08:22:11.508000+00:00",
"deleted": true,
"frequency": "monthly",
"guid": "PL4RHCKW7GsGMjpcozHveQuw",
"interval": 1,
"plan_type": "debit",
"updated_at": "2014-02-08T08:22:11.508000+00:00"
}
List all plans
Example:
curl https://billy.balancedpayments.com/v1/plans \
-u 5MyxREWaEymNWunpGseySVGBZkTWDW57FUXsyTo2WtGC:
Response:
{
"items": [
{
"amount": 500,
"company_guid": "CP4MXZG4ThUdbLpiX8e9Yx3j",
"created_at": "2014-02-08T08:22:11.508000+00:00",
"deleted": true,
"frequency": "monthly",
"guid": "PL4RHCKW7GsGMjpcozHveQuw",
"interval": 1,
"plan_type": "debit",
"updated_at": "2014-02-08T08:22:11.508000+00:00"
}
],
"limit": 20,
"offset": 0
}
List all customers who subscripted to the plan
List all subscriptions owned by the plan
List all invoices generated by subscriptions owned by the plan
List all transactions generated by subscriptions owned by the plan
An entity for customer to your service. Before the first time of debiting or crediting, a corresponding customer record in Balanced system will be created. If you want to map an existing customer in Balanced, you can set the processor_uri to the URI of customer in balanced.
Create a customer and return the record.
Example:
curl https://billy.balancedpayments.com/v1/customers \
-X POST \
-u 5MyxREWaEymNWunpGseySVGBZkTWDW57FUXsyTo2WtGC:
Response:
{
"company_guid": "CP4MXZG4ThUdbLpiX8e9Yx3j",
"created_at": "2014-02-08T08:22:10.904000+00:00",
"deleted": false,
"guid": "CU4NheTMcQqXgmAtg1aGTJPK",
"processor_uri": "/v1/customers/CUCChwFzuMRlBGgoBwjRgqr",
"updated_at": "2014-02-08T08:22:10.904000+00:00"
}
Retrieve a customer entity
Example:
curl https://billy.balancedpayments.com/v1/customers/CU4NheTMcQqXgmAtg1aGTJPK \
-u 5MyxREWaEymNWunpGseySVGBZkTWDW57FUXsyTo2WtGC:
Response:
{
"company_guid": "CP4MXZG4ThUdbLpiX8e9Yx3j",
"created_at": "2014-02-08T08:22:10.904000+00:00",
"deleted": false,
"guid": "CU4NheTMcQqXgmAtg1aGTJPK",
"processor_uri": "/v1/customers/CUCChwFzuMRlBGgoBwjRgqr",
"updated_at": "2014-02-08T08:22:10.904000+00:00"
}
Delete a customer and return entity.
Example:
curl https://billy.balancedpayments.com/v1/customers/CU4NheTMcQqXgmAtg1aGTJPK \
-X DELETE \
-u 5MyxREWaEymNWunpGseySVGBZkTWDW57FUXsyTo2WtGC:
Response:
{
"company_guid": "CP4MXZG4ThUdbLpiX8e9Yx3j",
"created_at": "2014-02-08T08:22:10.904000+00:00",
"deleted": true,
"guid": "CU4NheTMcQqXgmAtg1aGTJPK",
"processor_uri": "/v1/customers/CUCChwFzuMRlBGgoBwjRgqr",
"updated_at": "2014-02-08T08:22:10.904000+00:00"
}
List all customers
Example:
curl https://billy.balancedpayments.com/v1/customers \
-u 5MyxREWaEymNWunpGseySVGBZkTWDW57FUXsyTo2WtGC:
Response:
{
"items": [
{
"company_guid": "CP4MXZG4ThUdbLpiX8e9Yx3j",
"created_at": "2014-02-08T08:22:10.904000+00:00",
"deleted": false,
"guid": "CU4NheTMcQqXgmAtg1aGTJPK",
"processor_uri": "/v1/customers/CUCChwFzuMRlBGgoBwjRgqr",
"updated_at": "2014-02-08T08:22:10.904000+00:00"
}
],
"limit": 20,
"offset": 0
}
List all subscriptions owned by the customer
List all invoices owned by the customer
List all transactions owned by the customer
An entity of subscription relationship between customer and plan. Invoices will be generated for the customer automatically and periodically according to the configuration of plan.
Create a subscription and return the entity. If the funding_instrument_uri is given, it will be used to charge or payout to customer, however, if it is omitted, an invoice without funding_instrument_uri will be generated. You can update the funding_instrument_uri of invoice later. This allows you to generate invoice without knowing funding_instrument_uri at first, defer the fee collection later. If started_at is given, the subscription will be scheduled at that date time, otherwise, current time will be the started time, also, an invoice will be filed immediately.
Example:
curl https://billy.balancedpayments.com/v1/subscriptions \
-X POST \
-u 5MyxREWaEymNWunpGseySVGBZkTWDW57FUXsyTo2WtGC: \
-d "customer_guid=CU4NheTMcQqXgmAtg1aGTJPK" \
-d "plan_guid=PL4RHCKW7GsGMjpcozHveQuw" \
-d "funding_instrument_uri=/v1/marketplaces/TEST-MP6lD3dBpta7OAXJsN766qA/cards/CCBXYdbpYDwX68hv69UH1eS"
Response:
{
"amount": null,
"appears_on_statement_as": null,
"canceled": false,
"canceled_at": null,
"created_at": "2014-02-08T08:22:11.782000+00:00",
"customer_guid": "CU4NheTMcQqXgmAtg1aGTJPK",
"effective_amount": 500,
"funding_instrument_uri": "/v1/marketplaces/TEST-MP6lD3dBpta7OAXJsN766qA/cards/CCBXYdbpYDwX68hv69UH1eS",
"guid": "SU4ST39srWVLGbiTg174QyfF",
"invoice_count": 1,
"next_invoice_at": "2014-03-08T08:22:11.782000+00:00",
"plan_guid": "PL4RHCKW7GsGMjpcozHveQuw",
"started_at": "2014-02-08T08:22:11.782000+00:00",
"updated_at": "2014-02-08T08:22:11.782000+00:00"
}
Retrieve a subscription entity
Example:
curl https://billy.balancedpayments.com/v1/subscriptions/SU4ST39srWVLGbiTg174QyfF \
-u 5MyxREWaEymNWunpGseySVGBZkTWDW57FUXsyTo2WtGC:
Response:
{
"amount": null,
"appears_on_statement_as": null,
"canceled": false,
"canceled_at": null,
"created_at": "2014-02-08T08:22:11.782000+00:00",
"customer_guid": "CU4NheTMcQqXgmAtg1aGTJPK",
"effective_amount": 500,
"funding_instrument_uri": "/v1/marketplaces/TEST-MP6lD3dBpta7OAXJsN766qA/cards/CCBXYdbpYDwX68hv69UH1eS",
"guid": "SU4ST39srWVLGbiTg174QyfF",
"invoice_count": 1,
"next_invoice_at": "2014-03-08T08:22:11.782000+00:00",
"plan_guid": "PL4RHCKW7GsGMjpcozHveQuw",
"started_at": "2014-02-08T08:22:11.782000+00:00",
"updated_at": "2014-02-08T08:22:11.782000+00:00"
}
Cancel the subscription.
Example:
curl https://billy.balancedpayments.com/v1/subscriptions/SU4ST39srWVLGbiTg174QyfF/cancel \
-X POST
-u 5MyxREWaEymNWunpGseySVGBZkTWDW57FUXsyTo2WtGC:
Response:
{
"amount": null,
"appears_on_statement_as": null,
"canceled": true,
"canceled_at": null,
"created_at": "2014-02-08T08:22:11.782000+00:00",
"customer_guid": "CU4NheTMcQqXgmAtg1aGTJPK",
"effective_amount": 500,
"funding_instrument_uri": "/v1/marketplaces/TEST-MP6lD3dBpta7OAXJsN766qA/cards/CCBXYdbpYDwX68hv69UH1eS",
"guid": "SU4ST39srWVLGbiTg174QyfF",
"invoice_count": 1,
"next_invoice_at": "2014-03-08T08:22:11.782000+00:00",
"plan_guid": "PL4RHCKW7GsGMjpcozHveQuw",
"started_at": "2014-02-08T08:22:11.782000+00:00",
"updated_at": "2014-02-08T08:22:11.782000+00:00"
}
List all subscriptions
Example:
curl https://billy.balancedpayments.com/v1/subscriptions \
-u 5MyxREWaEymNWunpGseySVGBZkTWDW57FUXsyTo2WtGC:
Response:
{
"items": [
{
"amount": null,
"appears_on_statement_as": null,
"canceled": false,
"canceled_at": null,
"created_at": "2014-02-08T08:22:11.782000+00:00",
"customer_guid": "CU4NheTMcQqXgmAtg1aGTJPK",
"effective_amount": 500,
"funding_instrument_uri": "/v1/marketplaces/TEST-MP6lD3dBpta7OAXJsN766qA/cards/CCBXYdbpYDwX68hv69UH1eS",
"guid": "SU4ST39srWVLGbiTg174QyfF",
"invoice_count": 1,
"next_invoice_at": "2014-03-08T08:22:11.782000+00:00",
"plan_guid": "PL4RHCKW7GsGMjpcozHveQuw",
"started_at": "2014-02-08T08:22:11.782000+00:00",
"updated_at": "2014-02-08T08:22:11.782000+00:00"
}
],
"limit": 20,
"offset": 0
}
List all invoices owned by the subscription
List all transactions generated from invoices owned by the subscription
An invoice is an entity generated from a subscription periodically, or generated for a customer direcly. You should notice that when the plan of subscription is a payout plan, invoice will also be generated.
Create an invoice for a customer and return the entity.
customer_guid - The guid of customer
amount - The amount to charge customer
title - (optional) The title of this invoice
appears_on_statement_as - (optional) The statement to appears on customer’s credit card or bank account transaction record
funding_instrument_uri - (optional) The URI to Balanced funding instrument to charge
items - (optional) The items which indicate service or goods to charge. Fields of an item:
The parameter key format is item_<field name><number>. For example, you have two items, hosting service A and hosting service B, then you can pass these two items with following key/value pairs of parameters
adjustments - (optional) The adjustments to be applied on this invoice. You should notice that adjustments will affect the effective amount of an invoice. It is useful for discounts or extra fee. There are only two fields for an adjustment:
Similiar to items, the URL encoding rule is adjustments_<field name><number>. For example, to give two discount adjustments, you can pass parameters like this
Example:
curl https://billy.balancedpayments.com/v1/invoices \
-X POST \
-u 5MyxREWaEymNWunpGseySVGBZkTWDW57FUXsyTo2WtGC: \
-d "customer_guid=CU4NheTMcQqXgmAtg1aGTJPK" \
-d "amount=1000" \
-d "appears_on_statement_as=FooBar Hosting" \
-d "item_name1=Hosting Service A" \
-d "item_amount1=1000" \
-d "adjustments_amount1=-100" \
-d "adjustments_reason1=Coupon discount"
Response:
{
"adjustments": [
{
"amount": -100,
"reason": "Coupon discount"
}
],
"amount": 1000,
"appears_on_statement_as": "FooBar Hosting",
"created_at": "2014-02-08T08:22:15.073000+00:00",
"customer_guid": "CU4NheTMcQqXgmAtg1aGTJPK",
"effective_amount": 900,
"external_id": null,
"funding_instrument_uri": null,
"guid": "IV4gVtDyP3CD9zQyv8AtPwx5",
"invoice_type": "customer",
"items": [
{
"amount": 1000,
"name": "Hosting Service A",
"quantity": null,
"type": null,
"unit": null,
"volume": null
}
],
"status": "staged",
"title": null,
"total_adjustment_amount": -100,
"transaction_type": "debit",
"updated_at": "2014-02-08T08:22:15.073000+00:00"
}
Retrieve an invoice entity
Example:
curl https://billy.balancedpayments.com/v1/invoices/IV4gVtDyP3CD9zQyv8AtPwx5 \
-u 5MyxREWaEymNWunpGseySVGBZkTWDW57FUXsyTo2WtGC:
Response:
{
"adjustments": [
{
"amount": -100,
"reason": "Coupon discount"
}
],
"amount": 1000,
"appears_on_statement_as": "FooBar Hosting",
"created_at": "2014-02-08T08:22:15.073000+00:00",
"customer_guid": "CU4NheTMcQqXgmAtg1aGTJPK",
"effective_amount": 900,
"external_id": null,
"funding_instrument_uri": null,
"guid": "IV4gVtDyP3CD9zQyv8AtPwx5",
"invoice_type": "customer",
"items": [
{
"amount": 1000,
"name": "Hosting Service A",
"quantity": null,
"type": null,
"unit": null,
"volume": null
}
],
"status": "staged",
"title": null,
"total_adjustment_amount": -100,
"transaction_type": "debit",
"updated_at": "2014-02-08T08:22:15.073000+00:00"
}
An invoice can be created without a funding_instrument_uri. You can create an invoice first, send it to customer, and let them decide how to pay the bill. Once your customer decided to pay the bill, for example, with their credit card, you can then update the funding_instrument_uri of invoice to the tokenlized credit card number. Billy will then try to settle the invoice with given funding istrument. This could also be useful when previous funding_instrument_uri is incorrect, or something goes wrong while processing, such as there is no sufficient fund in the credit card. In that case, invoice will become failed eventually, and you can ask your customer for another method to pay the bill, and update the funding_instrument_uri again with the new instrument URI.
Example:
curl https://billy.balancedpayments.com/v1/invoices/IVS6Mo3mKLkUJKsJhtqkV7T7 \
-X PUT \
-u 5MyxREWaEymNWunpGseySVGBZkTWDW57FUXsyTo2WtGC: \
-d "funding_instrument_uri=/v1/marketplaces/TEST-MP6lD3dBpta7OAXJsN766qA/cards/CCBXYdbpYDwX68hv69UH1eS"
Response:
{
"adjustments": [
{
"amount": -100,
"reason": "Coupon discount"
}
],
"amount": 1000,
"appears_on_statement_as": "FooBar Hosting",
"created_at": "2014-02-08T08:22:15.073000+00:00",
"customer_guid": "CU4NheTMcQqXgmAtg1aGTJPK",
"effective_amount": 900,
"external_id": null,
"funding_instrument_uri": "/v1/marketplaces/TEST-MP6lD3dBpta7OAXJsN766qA/cards/CCBXYdbpYDwX68hv69UH1eS",
"guid": "IV4gVtDyP3CD9zQyv8AtPwx5",
"invoice_type": "customer",
"items": [
{
"amount": 1000,
"name": "Hosting Service A",
"quantity": null,
"type": null,
"unit": null,
"volume": null
}
],
"status": "staged",
"title": null,
"total_adjustment_amount": -100,
"transaction_type": "debit",
"updated_at": "2014-02-08T08:22:15.073000+00:00"
}
Issue an refund to customer. Only settled invoices can be refunded.
Example:
curl https://billy.balancedpayments.com/v1/invoices/IVS6Mo3mKLkUJKsJhtqkV7T7/refund \
-X POST \
-u 5MyxREWaEymNWunpGseySVGBZkTWDW57FUXsyTo2WtGC: \
-d "amount=1000"
Response:
{
"adjustments": [
{
"amount": -100,
"reason": "Coupon discount"
}
],
"amount": 1000,
"appears_on_statement_as": "FooBar Hosting",
"created_at": "2014-02-08T08:22:15.073000+00:00",
"customer_guid": "CU4NheTMcQqXgmAtg1aGTJPK",
"effective_amount": 900,
"external_id": null,
"funding_instrument_uri": "/v1/marketplaces/TEST-MP6lD3dBpta7OAXJsN766qA/cards/CCBXYdbpYDwX68hv69UH1eS",
"guid": "IV4gVtDyP3CD9zQyv8AtPwx5",
"invoice_type": "customer",
"items": [
{
"amount": 1000,
"name": "Hosting Service A",
"quantity": null,
"type": null,
"unit": null,
"volume": null
}
],
"status": "staged",
"title": null,
"total_adjustment_amount": -100,
"transaction_type": "debit",
"updated_at": "2014-02-08T08:22:15.073000+00:00"
}
List all invoices
Example:
curl https://billy.balancedpayments.com/v1/invoices \
-u 5MyxREWaEymNWunpGseySVGBZkTWDW57FUXsyTo2WtGC:
Response:
{
"items": [
{
"adjustments": [
{
"amount": -100,
"reason": "Coupon discount"
}
],
"amount": 1000,
"appears_on_statement_as": "FooBar Hosting",
"created_at": "2014-02-08T08:22:15.073000+00:00",
"customer_guid": "CU4NheTMcQqXgmAtg1aGTJPK",
"effective_amount": 900,
"external_id": null,
"funding_instrument_uri": "/v1/marketplaces/TEST-MP6lD3dBpta7OAXJsN766qA/cards/CCBXYdbpYDwX68hv69UH1eS",
"guid": "IV4gVtDyP3CD9zQyv8AtPwx5",
"invoice_type": "customer",
"items": [
{
"amount": 1000,
"name": "Hosting Service A",
"quantity": null,
"type": null,
"unit": null,
"volume": null
}
],
"status": "staged",
"title": null,
"total_adjustment_amount": -100,
"transaction_type": "debit",
"updated_at": "2014-02-08T08:22:15.073000+00:00"
}
],
"limit": 20,
"offset": 0
}
List all transactions generated from the invoice
Transactions are entities generated from an invoice. It represents transactions we submited to underlying payment processor. A transaction has attributes like the current submit status, status of transaction in processor, type of transaction, amount, funding instrument URI and failures. The submit state transition of a transaction is shown in following diagram.
For all status:
- STAGED - just created transaction
- RETRYING - attempt to submit but failed, retrying
- CANCELED - the invoice is canceled before the transaction is done or failed
- FAILED - the transaction failure count exceeded limitation
- DONE - the transaction is submitted successfully
Retrieve a transaction entity
Example:
curl https://billy.balancedpayments.com/v1/transactions/TX4SVWm156bBTSY17KJKW88y \
-u 5MyxREWaEymNWunpGseySVGBZkTWDW57FUXsyTo2WtGC:
Response:
{
"amount": 500,
"appears_on_statement_as": null,
"created_at": "2014-02-08T08:22:11.792000+00:00",
"failure_count": 0,
"failures": [],
"funding_instrument_uri": "/v1/marketplaces/TEST-MP6lD3dBpta7OAXJsN766qA/cards/CCBXYdbpYDwX68hv69UH1eS",
"guid": "TX4SVWm156bBTSY17KJKW88y",
"invoice_guid": "IV4SUGxQ3hu2ZB6FU5NXNj4u",
"processor_uri": "/v1/marketplaces/TEST-MP6lD3dBpta7OAXJsN766qA/debits/WDFd93gSV8Sb27bUP5GREjt",
"status": "succeeded",
"submit_status": "done",
"transaction_type": "debit",
"updated_at": "2014-02-08T08:22:15.047000+00:00"
}
List all transactions
Example:
curl https://billy.balancedpayments.com/v1/transactions \
-u 5MyxREWaEymNWunpGseySVGBZkTWDW57FUXsyTo2WtGC:
Response:
{
"items": [
{
"amount": 500,
"appears_on_statement_as": null,
"created_at": "2014-02-08T08:22:11.792000+00:00",
"failure_count": 0,
"failures": [],
"funding_instrument_uri": "/v1/marketplaces/TEST-MP6lD3dBpta7OAXJsN766qA/cards/CCBXYdbpYDwX68hv69UH1eS",
"guid": "TX4SVWm156bBTSY17KJKW88y",
"invoice_guid": "IV4SUGxQ3hu2ZB6FU5NXNj4u",
"processor_uri": "/v1/marketplaces/TEST-MP6lD3dBpta7OAXJsN766qA/debits/WDFd93gSV8Sb27bUP5GREjt",
"status": "succeeded",
"submit_status": "done",
"transaction_type": "debit",
"updated_at": "2014-02-08T08:22:15.047000+00:00"
}
],
"limit": 20,
"offset": 0
}