Welcome to the Brink API Portal

Brink is a SOAP-based API service. All of the data is structured via XML, but you can consume the WSDLs (Web Service Description Language) for each Brink Service and generate classes using a WSDL to Class Generator for the language you are programming in.

Using Our API

Web Services
The web services available on the Brink API are separated by focus and contain methods you can call to get or post data for a location.

Services
Service
Calls
Summary
HouseAccounts
Provides data on house accounts, including their charges and payments.
Kitchen
Provides data on kitchen queues and bump times. This is used in tandem with when an order is sent to the kitchen and when the order has been bumped.
Labor2
Provides labor functionalities like the ability to save and retrieve labor schedules, as well as retrieve shifts recorded by the Register at a location.
Loyalty
Provides data on loyalty awards, redeemed or not, for a customer.
Loyalty2
Provides loyalty functionalities like the ability to add adjustments, redeem rewards, and retrieving activity, adjustments, and award redemptions.
Ordering
Provides ordering functionalities like the ability to calculate, submit, and retrieve orders, as well as update or retrieve item availability. The GetMasterTerminalStatus call is heavily used to check that the Register is online before submitting an online order with SubmitOrder.
Sales2
Provides data on the sales at a location, namely Deposits, Orders, Tills, and the current business date of the Register. GetOrders is heavily used for reporting purposes.
Settings2
Provides data about the configuration Settings for a single location, with improved methods for GetEmployees and GetJobs, recommended over their predecessors in Settings.svc. Heavily used for cross-referencing IDs in other calls. Also contains SaveEmployees, a method to add and/or update employees for a location.
Endpoints And WSDLs
The endpoints that you hit to access the Brink API are dependent on what server your group and location is on.

For example, if your restaurant is on production server Admin 2 and you need to call the method SubmitOrder on the Ordering service, your endpoint should be:

https://api2.brinkpos.net/Ordering.svc


If you are testing integration on the Brink development server APIINT for that same SubmitOrder method, your endpoint would be:

https://api-apiint.brinkpos.net/Ordering.svc


A WSDL is Web Service Description Language that describes the functionality of a web service. The version of the API can be determined based on the GetServiceVersion call in Settings2.
All WSDLs are available only on the Brink Dev server at the URLs in the table below. WSDLs are not located on the production servers.

Soap Actions
SOAP Actions identify operations and are used by the services to execute those operations.

The following is a table of SOAP Action formats for each service to determine the SOAP Action for the call needed. You can include this in the Headers of your request.

SOAP Actions
SOAP Action Format
HouseAccounts
  • http://www.brinksoftware.com/webservices/houseaccounts/IHouseAccountsWebService/ {{InsertCallName}}
Kitchen
  • http://www.brinksoftware.com/webservices/kitchen/v1/IKitchenWebService/ {{InsertCallName}}
Labor2
  • http://www.brinksoftware.com/webservices/labor/v2/ILaborWebService2/ {{InsertCallName}}
Loyalty
  • http://www.brinksoftware.com/webservices/loyalty/20140330/ILoyaltyWebService/ {{InsertCallName}}
Loyalty2
  • http://www.brinksoftware.com/webservices/loyalty/v2/ILoyaltyWebService2/ {{InsertCallName}}
Ordering
  • http://www.brinksoftware.com/webservices/ordering/20140219/IOrderingWebService/ {{InsertCallName}}
Sales2
  • http://www.brinksoftware.com/webservices/sales/v2/ISalesWebService2/ {{InsertCallName}}
Settings
  • http://tempuri.org/ISettingsWebService/{{InsertCallName}}
Settings2
  • http://www.brinksoftware.com/webservices/settings/v2/ISettingsWebService2/ {{InsertCallName}}
Recommended Tools
For testing purposes, we recommend using free tools like SoapUI or Postman to make test calls.

With SoapUI, you can create a SOAP-based project by consuming a WSDL from one of the WSDL URLs listed above.
It will generate sample requests for the calls within a given service so that you can visualize the format of the request and response returned.
You will be able to add HTTP Web Request Headers (if necessary for your call) and specify the endpoint that you want to hit.
Note: All fields within the sample requests will appear as "Optional" by default, but that is not necessarily the case.

With Postman, you can make POST calls to your specified endpoint.
You will have to provide a raw request body and include all necessary HTTP Web Request Headers such as tokens, Content-Type ("text/xml"), and SOAPAction (e.g. "http://www.brinksoftware.com/webservices/sales/v2/ISalesWebService2/GetOrders").
We usually recommend that you copy/paste the sample request generated through SoapUI into the body of your Postman request.
                    
                        
                        
                        
                        
GetOrders Sample Code
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.ServiceModel; using System.ServiceModel.Web; using Sales2_GetOrders.Sales2ServiceReference; namespace Sales2_GetOrders { class Program { public static void DisplayModifiers(OrderItemModifier[] modifiers) { //Loop through collection of OrderItemModifier objects returned foreach (var mod in modifiers) { Console.WriteLine("\t\tId: " + mod.Id); Console.WriteLine("\t\tItemId: " + mod.ItemId); Console.WriteLine("\t\tModifierCodeId: " + mod.ModifierCodeId); Console.WriteLine("\t\tModifierGroupId: " + mod.ModifierGroupId); Console.WriteLine("\t\tPrice: " + mod.Price); //Loop through collection of OrderItemModifier objects returned if (mod.Modifiers.Length != 0) { DisplayModifiers(mod.Modifiers); } Console.WriteLine("\t\t------------"); } } static void Main(string[] args) { //Connect to Sales2 service client var client = new SalesWebService2Client(); //Set security protocol to TLS 1.2 System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12; int count = 1; using (var scope = new OperationContextScope(client.InnerChannel)) { //Include tokens in HTTP Web Request Headers var headers = WebOperationContext.Current.OutgoingRequest.Headers; headers["AccessToken"] = @"AccessToken"; headers["LocationToken"] = @"LocationToken"; DateTime businessDate = new DateTime(2001, 01, 01); DateTimeOffset modifiedTime = new DateTimeOffset(2001, 01, 01, 12, 0, 0, new TimeSpan(0)); //Include parameters in request body var request = new GetOrdersRequest() { BusinessDate = businessDate, ExcludeOpenOrders = false, //ModifiedTime = modifiedTime, PriceRollUp = "RollUpAndDetails", }; //Make GetOrders call var response = client.GetOrders(request); //If call is successful if (response.ResultCode == 0) { //Loop through collection of Order objects returned foreach (var order in response.Orders) { Console.WriteLine("Order #" + count); Console.WriteLine("---------------------------"); Console.WriteLine("BusinessDate: " + order.BusinessDate); Console.WriteLine("ClosedTime: " + order.ClosedTime); Console.WriteLine("CustomerId: " + order.CustomerId); Console.WriteLine("EmployeeId: " + order.EmployeeId); Console.WriteLine("Entries:"); //Loop through collection of OrderItem objects returned foreach (var entry in order.Entries.OfType<OrderItem>()) { Console.WriteLine("\tModifiers: "); if (entry.Modifiers.Length != 0) { DisplayModifiers(entry.Modifiers); } } Console.WriteLine("FirstSendTime: " + order.FirstSendTime); Console.WriteLine("Id: " + order.Id); Console.WriteLine("IsClosed: " + order.IsClosed); Console.WriteLine("ModifiedTime: " + order.ModifiedTime); Console.WriteLine("Name: " + order.Name); Console.WriteLine("OpenedTime: " + order.OpenedTime); Console.WriteLine("Payments:"); //Loop through collection of OrderPayment objects returned if (order.Payments.Length != 0) { foreach (var payment in order.Payments) { Console.WriteLine("\tId: " + payment.Id); Console.WriteLine("\tAmount: " + payment.Amount); Console.WriteLine("\tBusinessDate: " + payment.BusinessDate); Console.WriteLine("\t-----------------------"); } } Console.WriteLine("PickUpTime: " + order.PickupTime); Console.WriteLine("Total: " + order.Total); Console.WriteLine("---------------------------"); count++; } Console.WriteLine("End"); Console.ReadKey(); } else { Console.WriteLine("Error Code: " + response.ResultCode); Console.WriteLine("Message: " + response.Message); Console.ReadKey(); } } } } }
GetOrders Sample Code
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v2="http://www.brinksoftware.com/webservices/sales/v2" xmlns:sys="http://schemas.datacontract.org/2004/07/System"> <soapenv:Header/> <soapenv:Body> <v2:GetOrders> <v2:request> <v2:BusinessDate>2001-01-01</v2:BusinessDate> <v2:ExcludeOpenOrders>false</v2:ExcludeOpenOrders> <!--<v2:ModifiedTime> <sys:DateTime>?</sys:DateTime> <sys:OffsetMinutes>?</sys:OffsetMinutes> </v2:ModifiedTime>--> <v2:PriceRollUp>RollUpAndDetails</v2:PriceRollUp> </v2:request> </v2:GetOrders> </soapenv:Body> </soapenv:Envelope>
GetOrders Sample Code
from zeep import Client from zeep.transports import Transport import requests from datetime import datetime def display_modifiers(modifiers, depth = 1): print('\t' * (depth) + 'Modifiers:') #Loop through collection of OrderItemModifier objects returned for mod in modifiers.OrderItemModifier: print('\t' * (depth + 1) + 'Id: ' + str(mod.Id)) print('\t' * (depth + 1) + 'ItemId: ' + str(mod.ItemId)) print('\t' * (depth + 1) + 'ModifierCodeId: ' + str(mod.ModifierCodeId)) print('\t' * (depth + 1) + 'ModifierGroupId: ' + str(mod.ModifierGroupId)) print('\t' * (depth + 1) + 'Price: ' + str(mod.Price)) if (mod.Modifiers != None): display_modifiers(mod.Modifiers, (depth + 2)) else: print('\t' * (depth + 1) + 'Modifiers: None') accessToken = 'AccessToken' locationToken = 'LocationToken' #Include tokens in HTTP Web Request Headers session = requests.Session() session.headers.update({'AccessToken': accessToken, 'LocationToken': locationToken}) transport = Transport(session=session) #Connect to Sales2 service client client = Client(wsdl='{YOUR_WSDL_URL_GOES_HERE}', transport=transport) service = client.create_service( '{http://www.brinksoftware.com/webservices/sales/v2}BasicHttpBinding_ISalesWebService2', 'https://{YourStack}.brinkpos.net/sales2.svc' ) #Prepare the dynamic type for GetOrdersRequest req_type = client.get_type('ns1:GetOrdersRequest') datetime_offset_type = client.get_type('ns3:DateTimeOffset') #Include parameters in request body businessdate = datetime(2001, 01, 01) modified_date = datetime_offset_type(DateTime=businessdate, OffsetMinutes=0) req_data = req_type(BusinessDate=businessdate,ExcludeOpenOrders=False,PriceRollUp='RollupandDetails', ModifiedTime=modified_date) count = 1 try: #Make GetOrders call res = service.GetOrders(req_data) # If call is successful if(res.ResultCode == 0): #Loop through collection of Order objects returned for order in res.Orders.Order: print('Order #' + str(count)) print('---------------------------') print('BusinessDate: ' + str(order.BusinessDate)) print('ClosedTime: ') print('\tDateTime: ' + str(order.ClosedTime.DateTime)) print('\tOffsetMinutes: ' + str(order.ClosedTime.OffsetMinutes)) print('CustomerId: ' + str(order.CustomerId)) print('EmployeeId: ' + str(order.EmployeeId)) if(order.Entries != None): print('Entries:') #Loop through collection of OrderItem objects returned for entry in order.Entries.OrderEntry: if(entry.Modifiers != None): display_modifiers(entry.Modifiers) else: print('\tModifiers: None') else: print('Entries: None') print('FirstSendTime:') print('\tDateTime: ' + str(order.FirstSendTime.DateTime)) print('\tOffsetMinutes: ' + str(order.FirstSendTime.OffsetMinutes)) print('Id: ' + str(order.Id)) print('IsClosed: ' + str(order.IsClosed)) print('ModifiedTime: ') print('\tDateTime: ' + str(order.ModifiedTime.DateTime)) print('\tOffsetMinutes: ' + str(order.ModifiedTime.OffsetMinutes)) print('Name: ' + str(order.Name)) print('OpenedTime:') print('\tDateTime: ' + str(order.OpenedTime.DateTime)) print('\tOffsetMinutes: ' + str(order.OpenedTime.OffsetMinutes)) if(order.Payments != None): print('Payments:') #Loop through collection of OrderPayment objects returned for payment in order.Payments.OrderPayment: print('\tId: ' + str(payment.Id)) print('\tAmount: ' + str(payment.Amount)) print('\tBusinessDate: ' + str(payment.BusinessDate)) print('\t-----------------------') else: print('Payments: None') print('PickupTime: ' + str(order.PickupTime)) print('Total: ' + str(order.Total)) print('---------------------------') count += 1 print('End') else: print('Error Code: ' + str(res.ResultCode)) print('Message: ' + res.Message) except Exception as e: print(e)