API: Difference between revisions

From Fishbowl Advanced
m (Text replacement - "wikitable" to "prettytable")
No edit summary
 
(81 intermediate revisions by 2 users not shown)
Line 1: Line 1:
{{CategoryBox|Customize Fishbowl}}
The API allows developers to integrate with Fishbowl Advanced. Fishbowl only provides documentation for the API. Fishbowl Support will not troubleshoot the API, but several resources are listed below to help you get started.__TOC__
Just as Fishbowl integrates with QuickBooks, we allow developers to integrate their own software with Fishbowl. The Fishbowl API allows users to log in from third-party applications. These applications can run certain procedures when connected to the Fishbowl Server. This provides developers with the connection they need to customize applications to meet your business's specific needs. The API also has the responsibility to validate and process the requests that are sent to it from third-party integrated applications and send the response back.


The Fishbowl API provides integration with the data and objects stored on the Fishbowl Server. When scoping out a potential application, it would be beneficial to view the [https://www.fishbowlinventory.com/developer-network/tools/ developer tools] and the documentation below to verify that the data and requests you need are accessible through the API. All of the documentation and examples were obtained by using the demo Fishbowl database and the [[Fishbowl Developer Hook]].
= FAQs =
==What alternatives are there to using the API?==
Many customers that are interested in the API are looking for ways to import data, run queries, automate reports, or update orders. This can all be done '''''without''''' the API.
# The {{Module|Data Import}} allows files to be imported, even if the column headers don't match the Fishbowl format. This allows many external files to be imported into Fishbowl without modification.
# Nearly all functions can be performed using Fishbowl's built-in [[Imports and Exports]].
# All of the database tables can be viewed, queried, and exported from the {{Module|Data}}.
# The {{Module|Schedule}} can automatically email reports, run data queries, import local files, or import files on a server, such as an FTP server.


When connecting to the Fishbowl API you will need to create a socket connection to the port. We do have some very basic [https://www.fishbowlinventory.com/developer-network/tools/ sample code] available to demonstrate how to make a connection in Java and C#.
==Is Fishbowl Advanced an on-premise application, or is it in the cloud?==
* Traditionally, Fishbowl Advanced is installed on your computer as an on-premise solution that can be accessed from your local network. You can also open ports and configure the Fishbowl Server to allow connections from anywhere in the world.
* With [[Fishbowl Hosted Services]], we install Fishbowl Advanced for you on our high-performance servers, and configure it so that you can access it from anywhere in the world.
* [https://help.fishbowlonline.com/s/article/Drive-Getting-Started Fishbowl Drive] is a similar, but separate product that is 100% web based and hosted in the cloud with its own API.


More objects, requests, and examples, are available in the [[Fishbowl Legacy API|Fishbowl Legacy API]] and in the new [[{{REST API}}|Fishbowl REST API]].
==How do I connect to the API?==
* The API is automatically installed when you install the Fishbowl server. It can be accessed anywhere from your local network, or configured to allow connections from anywhere in the world. The easiest way to get started is to use our [[#Postman|Postman collection]].


=Requests=
==Do I need a certificate to encrypt the API traffic?==
* Yes. For security, we recommend that you use a [https://en.wikipedia.org/w/index.php?title=Java_KeyStore .JKS certificate file] for the [[Fishbowl_Server_Administration#Server_tab|Fishbowl Server]]. The certificate can be self-signed or purchased online from a Certificate Authority.


{| class="prettytable"
==What is the difference between a parameter, an attribute, and a variable?==
|-
* These are all ways to pass information to the API.
! Request
** A path variable is typically an ID that is part of the URL path: '''/api/parts/:id/inventory/add'''
! Syntax
** A parameter comes after the path in the URL, often as part of a search filter: '''?vendorId=25&quantity=5'''
! Brief Description
** An attribute is sent in the body of the request and is often included in the JSON to add information to an object: '''"name": "FG2100"'''
|-
| {{l|Execute Query}}
| ExecuteQueryRq
| Returns results of sql query in csv format
|-
| {{l|Import}}
| ImportRq
| Request allows you to import data
|-
| {{l|Import Headers}}
| ImportHeaderRq
| Returns a list of import header for a specific import.
|-
| {{l|Issue SO}}
| IssueSORq
| Issues an SO.
|-
| {{l|Login}}
| LoginRq
| Logs a user in to Fishbowl.
|-
| {{l|Logout}}
| LogoutRq
| Logs a user out of Fishbowl.
|-
| {{l|QuickShip}}
| QuickShipRq
| Will do an automatic pick, pack, and ship on a SO.
|-
| {{l|Void SO}}
| VoidSORq
| This request is used to void sales orders
|-
| [[Fishbowl Legacy API]]
|
| More objects, requests, and examples, are available in the [[Fishbowl Legacy API|Fishbowl Legacy API]].
|-
| [[Fishbowl_Server_Administration#Server_tab|Fishbowl REST API]]
|
| More objects, requests, and examples, are available in the [[Fishbowl_Server_Administration#Server_tab|Fishbowl REST API]].
|}


=Examples=
==How can I test the API without altering my production database?==
* When testing the API, you should make a copy of your database to use as a [[Sandbox]].


Each example listed below will include 3 things.
==How do I import and modify orders with the REST API?==
# A description
* Nearly all Fishbowl functions can be performed through the API by using the '''Import''' endpoint to bring in CSV or JSON data: [[Imports_and_Exports#List_of_imports_and_exports|List of imports]].
# The generic syntax
# An example using the demo database included with Fishbowl


{{Request|Execute Query}}
==What is the logout API call for?==
'''Description:''' Returns results of sql query in csv format. The ExecuteQueryRq can run a query saved in the {{Module|Data}}, or a custom query included in the request. The {{Module|Data}} may be helpful for testing queries and [[Data#Extract_a_query|extracting]] queries based on reports.<br/>
* Your license key determines the number of users that can be logged in to Fishbowl Advanced at the same time. The logout API call closes the connection so that more users can connect if needed.
'''Note:''' Using this request requires the user to have view access to the {{Module|Data}}.


'''Syntax:'''
==Is there another version of the API?==
<source>
* The previous version of the API uses a socket connection. It does not provide as much data validation and it is not recommended. If needed, resources for the previous version of the API can be downloaded by clicking [https://help.fishbowlinventory.com/advanced/s/Legacy-API.zip here].
{
"ExecuteQueryRq": {
"Query": "",
"Name": ""
}
}
</source>


'''Example:'''
= Documentation =
<source>
The REST API documentation is automatically installed on your Fishbowl Server. This allows you to see the documentation that is intended for your version of Fishbowl Advanced.
{
* To see the API documentation, you will need to which '''Port''' your server is using. By default, this is '''2456''' or '''80'''. You can confirm this by double-clicking the Fishbowl Server tray icon and then selecting the '''Server''' tab.<br>[[File:Web Port.png]]
"FbiJson": {
* If you are using the default port of '''2456''' and you are on the <u>Fishbowl Server</u> computer, you can view the documentation by clicking this link: http://localhost:2456/apidocs<br>[[File:REST API.png|class=noinvert|600px]]
"Ticket": {
* To see the documentation from <u>other computers</u> on the network, enter the IP address of the Fishbowl Server computer, replacing '''2456''' with your '''Web Port'''. For example: '''<nowiki>192.168.29.37:2456/apidocs</nowiki>'''
"Key": "5ef615e9-5ae0-4ab6-9c44-323254cedf5e"
* An example of the API documentation can be accessed [https://help.fishbowlinventory.com/advanced/s/apidocs/introduction.html here].
},
"FbiMsgsRq": {
"ExecuteQueryRq": {
"Name": "PartList"
}
}
}
}
</source>
or
<source>
{
"FbiJson": {
"Ticket": {
"Key": "5ef615e9-5ae0-4ab6-9c44-323254cedf5e"
},
"FbiMsgsRq": {
"ExecuteQueryRq": {
"Query": "SELECT part.num AS partNumber, part.description AS partDescription FROM part"
}
}
}
}
</source>


{{Request|Import}}
= Postman =
'''Description:''' This request allows you to run any of the [[Imports_and_Exports#List_of_imports_and_exports|CSV imports]]. The type is formatted as "ImportCsvName" with no spaces. Data columns can be blank, but each data column must be represented in the request.
The example uses the import to edit/add a vendor. '''It is best practice to always include the header rows when importing data.'''


'''Syntax:'''
Postman is a free application that can help you explore many APIs, including the API for Fishbowl Advanced. If you've configured your server to allow remote access, you can use the web version of Postman. Otherwise, you can install the free app and connect over your local network. Follow the instructions below to get started.
<source>
{
"ImportRq": {
"Type": "",
"Rows": ["",
""
]
}
}
</source>


'''Example:'''
# Download and install '''Postman''' from this page: https://postman.com/downloads
<source>
# Open '''Postman''' and sign in to your free account.
{
# Open your '''Workspace''', go to the '''Collections''' tab, click the '''Import''' button, and then ''paste'' the following URL: '''https''':'''//fishbowlhelp'''.'''com/pm
"FbiJson": {
# If you are not on the Fishbowl Server computer, highlight '''Fishbowl Advanced''', click the '''Variables''' tab, and change the '''URL Current Value''' to the IP address of your Fishbowl Server. Then click '''Save'''.
"Ticket": {
# Expand the '''Login''' folder and select the line that says '''POST Login'''.<br>[[File:Postman Login.png|border]]
"Key": "5ef615e9-5ae0-4ab6-9c44-323254cedf5e"
# Click the '''Body''' tab and change the username and password if needed. Then click '''Save'''.
},
# Click the '''Send''' button near the top-right corner.
"FbiMsgsRq": {
# Open the {{Module|Settings|Integrated_Apps_tab}} in Fishbowl Advanced and [[Settings#Integrated_Apps_tab|approve the integrated app]].
"ImportRq": {
# Return to the '''Login''' request in Postman, and send it again using the keyboard shortcut ('''CTRL+Enter''' or '''CMD+Enter''').
"Type": "ImportVendors",
# On the Fishbowl Server computer you can double-click the Fishbowl Server tray icon and select the '''Connections''' tab to see your new connection. Each login request will add a new connection.<br>[[File:Postman Connection.png]]
"Rows": {
# Open Postman and send a few example requests, like the ones below:
"Row": [
#* Expand '''Vendors''', select the line that says '''GET Search Vendors''', and then send the request. You should get a JSON response listing your vendors.
"\"Name\",\"AddressName\",\"AddressContact\",\"AddressType\",\"IsDefault\",\"Address\",\"City\",\"State\",\"Zip\",\"Country\",\"Main\",\"Home\",\"Work\",\"Mobile\",\"Fax\",\"Email\",\"Pager\",\"Web\",\"Other\",\"DefaultTerms\",\"DefaultShippingTerms\",\"Status\",\"AlertNotes\",\"URL\",\"DefaultCarrier\",\"MinOrderAmount\",\"Active\",\"AccountNumber\",\"CurrencyName\",\"CurrencyRate\",\"CF-Custom1\",\"CF-Custom2\",\"CF-Custom3\",\"CF-Custom4\"",
#* Expand '''Inventory''', select the line that says '''GET Inventory''', and then click the '''Params''' tab. Change '''B201''' to one of your part numbers, and then send the request.
"\"Monroe Bike Company\",\"Williams Bike Company - 210\",\"Williams Bike Company\",\"50\",\"true\",\"Wall st.\",\"New York\",\"NY\",\"21004\",\"UNITED STATES\",\"212-321-5643\",,,,,,,,,,,,,"
#* Expand '''Parts''', select the line that says '''GET Part Best Cost''', and then click the '''Params''' tab. Notice the difference between '''Query Params''' and '''Path Variables'''.
]
# Expand '''Login''', select the line that says '''POST Logout''', and then send the request.
}
# On the Fishbowl Server computer, double-click the Fishbowl Server tray icon, select the '''Connections''' tab, and then click the '''Refresh''' button. Your connection will be removed from the list.
}
}
}
}
</source>
 
{{Request|Import Headers}}
'''Description:''' This request allows you to get the headers of an import. The type is formatted as "ImportCsvName" with no spaces.
The example retrieves the import headers of the Add Inventory import.
 
'''Syntax:'''
<source>
{
"ImportHeaderRq": {
"Type": ""
}
}
</source>
 
'''Example:'''
<source>
{
"FbiJson": {
"Ticket": {
"Key": "5ef615e9-5ae0-4ab6-9c44-323254cedf5e"
},
"FbiMsgsRq": {
"ImportHeaderRq": {
"Type": "ImportAddInventory"
}
}
}
}
</source>
 
{{Request|Issue SO}}
'''Description:''' Will issue a sales order.
 
'''Syntax:'''
<source>
{
"IssueSORq": {
"SONumber": ""
}
}
</source>
 
'''Example:'''
<source>
{
"FbiJson": {
"Ticket": {
"Key": "5ef615e9-5ae0-4ab6-9c44-323254cedf5e"
},
"FbiMsgsRq": {
"IssueSORq": {
"SONumber": "50054"
}
}
}
}
</source>
 
{{Request|Login}}
'''Description:''' Logs a user in to Fishbowl. The IAID can be any randomly generated integer value as long as the IAID and the IAName are unique per Fishbowl server.
 
'''{{r|Note:}}''' Because the password is sent as plain text, use of the LoginRq is discouraged. Instead, the [[{{REST API}}|REST API Login]] should be used with a certificate to encrypt the traffic. The '''token''' returned by the REST API login can then be used as the '''Key''' in any of the older API calls.  
 
'''Syntax:'''
<source>
{
"LoginRq": {
"IAID": 111111,
"IADescription": "",
"UserName": "",
"IAName": "",
"UserPassword": ""
}
}
</source>
 
'''Example:'''
<source>
{
"FbiJson": {
"Ticket": {
"Key": "5ef615e9-5ae0-4ab6-9c44-323254cedf5e"
},
"FbiMsgsRq": {
"LoginRq": {
"IAID": 1234,
"IADescription": "Fishbowl Developer Hook an API test application for Fishbowl Inventory",
"IAName": "Fishbowl Developer Hook",
"UserName": "admin",
"UserPassword": "admin"
}
}
}
}
</source>
 
{{Request|Logout}}
'''Description:''' Logs a user out of Fishbowl.
 
'''Syntax:'''
<source>
{
"LogoutRq": ""
}
</source>
 
'''Example:'''
<source>
{
"FbiJson": {
"Ticket": {
"Key": "5ef615e9-5ae0-4ab6-9c44-323254cedf5e"
},
"FbiMsgsRq": {
"LogoutRq": ""
}
}
}
</source>
 
{{Request|QuickShip}}
'''Description:''' Will do an automatic pick, pack, and ship on a SO.
 
'''Syntax:'''
<source>
{
"QuickShipRq": {
"SONumber": "",
"FulfillServiceItems": boolean,
"ErrorIfNotFulfilled": boolean,
"ShipDate": ""
}
 
}
</source>
 
'''Example:'''
<source>
{
"FbiJson": {
"Ticket": {
"Key": "5ef615e9-5ae0-4ab6-9c44-323254cedf5e"
},
"FbiMsgsRq": {
"QuickShipRq": {
"SONumber": "50052"
}
}
}
}
</source>
 
{{Request|Void SO}}
'''Description:''' This request is used to void sales orders
 
'''Syntax:'''
<source>
{
"VoidSORq": {
"SONumber": ""
}
 
}
</source>
 
'''Example:'''
<source>
{
"FbiJson": {
"Ticket": {
"Key": "5ef615e9-5ae0-4ab6-9c44-323254cedf5e"
},
"FbiMsgsRq": {
"VoidSORq": {
"SONumber": "50052"
}
}
}
}
</source>
 
{{:Fishbowl Legacy API}}
 
=Best practices=
==First integration==
When you first connect your application you will receive a status code 1110 or 1112 which indicates you will need to [[Fishbowl_Developer_Hook#Application_approval|approve]] your application.
 
==Creating Orders==
In order to create orders through the API, the recommended method is to use the [[#Import|ImportRq]] and specify the type of ImportSalesOrder. The ImportRq allows you to run any of the [[Imports_and_Exports#List_of_imports_and_exports|CSV imports]], and specifying the ImportSalesOrder defines that you want to import a Sales Order. Going through the ImportRq is the fastest, easiest, and safest way to create an order in Fishbowl.
 
==Updating Orders==
Occasionally once an order has been entered into the system it requires some changes. If you are changing order details such as the shipping or billing address you can use the [[#Import|ImportRq]] using a type of [[Imports_and_Exports#List_of_imports_and_exports|ImportSalesOrderDetails]] in order to update order level information. If you need to make changes to order items through the API then you will need to run the [[#Void_SO|VoidSORq]] in order to close the current order and recreate the order using the order creation process above. The VoidSORq will either void out the order or close it short if it has already been partially shipped. The easiest way to ensure track-ability in this case is to append "-1" or "-2" to the end of the order number. This will allow you to search back the original order number in Fishbowl and find the historical orders.
 
==Troubleshooting tips==
The following general tips may be helpful for developers when troubleshooting an issue. Completing these steps will often reveal the source of the problem and eliminate the need to submit a developer ticket.
 
* Use the {{Module|Data}} to examine the database tables.
* Run [[Support#Run_eve.bat_and_client.bat|eve.bat and client.bat]] and examine the output or errors displayed in the command window.<br>[[File:Eve.bat example.png]]
* To increase the logging level of the server, double-click the server tray icon and then click the '''Logging''' tab. '''Debug''' is the recommended level to show all relevant data. '''Trace''' may overwhelm the logging with too much information.<br>[[File:Increase Logging Level.png]]
* If an error is being displayed in Fishbowl, clicking the {{Icon Button|Double Arrow}} will display [[Support#Understanding_Fishbowl_Errors|more information about the error]].
* It is highly recommended to have a separate installation of Fishbowl that can be used for testing and troubleshooting purposes.
* '''NOTE: Fishbowl can assist in troubleshooting issues, but will not debug your code for you.'''
 
=Error codes=
{| class="prettytable"
|-
! Code
! Error
|-
|'''900'''
| Success! This API request is deprecated and could be removed in the future.
|-
|'''1000'''
| Success!
|-
|'''1001'''
| Unknown message received.
|-
|'''1002'''
| Connection to Fishbowl server was lost.
|-
|'''1003'''
| Some requests had errors.
|-
|'''1004'''
| There was an error with the database.
|-
|'''1009'''
| Fishbowl server has been shut down.
|-
|'''1010'''
| You have been logged off the server by an administrator.
|-
|'''1011'''
| Not found.
|-
|'''1012'''
| General error.
|-
|'''1013'''
| Dependencies need to be deleted
|-
|'''1014'''
| Unable to establish network connection.
|-
|'''1015'''
| Your subscription date is greater than your server date.
|-
|'''1016'''
| Incompatible database version.
|-
|'''1100'''
| Unknown login error occurred.
|-
|'''1109'''
| This integrated application registration key is already in use.
|-
|'''1110'''
| A new integrated application has been added to Fishbowl. Please contact the Fishbowl administrator to approve this integrated application.
|-
|'''1111'''
| This integrated application registration key does not match.
|-
|'''1112'''
| This integrated application has not been approved by the Fishbowl administrator.
|-
|'''1120'''
| Invalid username or password.
|-
|'''1130'''
| Invalid ticket passed to Fishbowl server.
|-
|'''1131'''
| Invalid ticket key passed to Fishbowl server.
|-
|'''1140'''
| Initialization token is not correct type.
|-
|'''1150'''
| Request was invalid.
|-
|'''1161'''
| Response was invalid.
|-
|'''1162'''
| The login limit has been reached for the server's key.
|-
|'''1163'''
| Your API session has timed out.
|-
|'''1164'''
| Your API session has been logged out.
|-
|'''1200'''
| Custom field is invalid.
|-
|'''1300'''
| Was not able to find the memo _________.
|-
|'''1301'''
| The memo was invalid.
|-
|'''1400'''
| Was not able to find the order history.
|-
|'''1401'''
| The order history was invalid.
|-
|'''1500'''
| The import was not properly formed.
|-
|'''1501'''
| That import type is not supported.
|-
|'''1502'''
| File not found.
|-
|'''1503'''
| That export type is not supported.
|-
|'''1504'''
| Unable to write to file.
|-
|'''1505'''
| The import data was of the wrong type.
|-
|'''1506'''
| Import requires a header.
|-
|'''1600'''
| Unable to load the user.
|-
|'''1601'''
| Unable to find the user.
|-
|'''2000'''
| Was not able to find the part _________.
|-
|'''2001'''
| The part was invalid.
|-
|'''2002'''
| Was not able to find a unique part.
|-
|'''2003'''
| BOM had an error on the part
|-
|'''2100'''
| Was not able to find the product _________.
|-
|'''2101'''
| The product was invalid.
|-
|'''2102'''
| The product is not unique
|-
|'''2120'''
| The kit item was invalid.
|-
|'''2121'''
| The associated product was invalid.
|-
|'''2200'''
| Yield failed.
|-
|'''2201'''
| Commit failed.
|-
|'''2202'''
| Add initial inventory failed.
|-
|'''2203'''
| Cannot adjust committed inventory.
|-
|'''2204'''
| Invalid quantity.
|-
|'''2205'''
| Quantity must be greater than zero.
|-
|'''2206'''
| Serial number _________ already committed.
|-
|'''2207'''
| Part _________ is not an inventory part.
|-
|'''2208'''
| Not enough available quantity in _________.
|-
|'''2209'''
| Move failed.
|-
|'''2210'''
| Cycle count failed.
|-
|'''2300'''
| Was not able to find the tag number _________.
|-
|'''2301'''
| The tag was invalid.
|-
|'''2302'''
| The tag move failed.
|-
|'''2303'''
| Was not able to save tag number _________.
|-
|'''2304'''
| Not enough available inventory in tag number _________.
|-
|'''2305'''
| Tag number _________ is a location.
|-
|'''2400'''
| Invalid UOM.
|-
|'''2401'''
| UOM _________ not found.
|-
|'''2402'''
| Integer UOM _________ cannot have non-integer quantity.
|-
|'''2403'''
| The UOM is not compatible with the part's base UOM.
|-
|'''2404'''
| Cannot convert to the requested UOM
|-
|'''2405'''
| Cannot convert to the requested UOM
|-
|'''2406'''
| The quantity must be a whole number.
|-
|'''2407'''
| The UOM conversion for the quantity must be a whole number.
|-
|'''2500'''
| The tracking is not valid.
|-
|'''2501'''
| Part tracking not found.
|-
|'''2502'''
| The part tracking name is required.
|-
|'''2503'''
| The part tracking name ''_________'' is already in use.
|-
|'''2504'''
| The part tracking abbreviation is required.
|-
|'''2505'''
| The part tracking abbreviation ''_________'' is already in use.
|-
|'''2506'''
| The part tracking ''_________'' is in use or was used and cannot be deleted.
|-
|'''2510'''
| Serial number is missing.
|-
|'''2511'''
| Serial number is null.
|-
|'''2512'''
| Duplicate serial number.
|-
|'''2513'''
| The serial number is not valid.
|-
|'''2514'''
| Tracking is not equal.
|-
|'''2515'''
| The tracking ''_________'' was not found in location ''_________' or is committed to another order.
|-
|'''2600'''
| Location _________ not found.
|-
|'''2601'''
| Invalid location.
|-
|'''2602'''
| Location group _________ not found.
|-
|'''2603'''
| Default customer not specified for location _________.
|-
|'''2604'''
| Default vendor not specified for location _________.
|-
|'''2605'''
| Default location for part _________ not found.
|-
|'''2606'''
| _________ is not a pickable location.
|-
|'''2607'''
| _________ is not a receivable location.
|-
|'''2700'''
| Location group not found.
|-
|'''2701'''
| Invalid location group.
|-
|'''2702'''
| User does not have access to location group _________.
|-
|'''3000'''
| Customer _________ not found.
|-
|'''3001'''
| Customer is invalid.
|-
|'''3002'''
| Customer _________ must have a default main office address.
|-
|'''3100'''
| Vendor _________ not found.
|-
|'''3101'''
| Vendor is invalid.
|-
|'''3300'''
| Address not found
|-
|'''3301'''
| Invalid address
|-
|'''4000'''
| There was an error loading PO _________.
|-
|'''4001'''
| Unknown status _________.
|-
|'''4002'''
| Unknown carrier _________.
|-
|'''4003'''
| Unknown QuickBooks class _________.
|-
|'''4004'''
| PO does not have a PO number. Please turn on the auto-assign PO number option in the purchase order module options.
|-
|'''4005'''
| Duplicate order number _________.
|-
|'''4006'''
| Cannot create PO with configurable parts: _________.
|-
|'''4007'''
| The following parts were not added to the purchase order. They have no default vendor:
|-
|'''4008'''
| Unknown type _________.
|-
|'''4100'''
| There was an error loading SO _________.
|-
|'''4101'''
| Unknown salesman _________.
|-
|'''4102'''
| Unknown tax rate _________.
|-
|'''4103'''
| Cannot create SO with configurable parts: _________.
|-
|'''4104'''
| The sales order item is invalid: _________.
|-
|'''4105'''
| SO does not have a SO number. Please turn on the auto-assign SO numbers option in the sales order module options.
|-
|'''4106'''
| Cannot create SO with kit products
|-
|'''4107'''
| A kit item must follow a kit header.
|-
|'''4108'''
| Sales order cannot be found.
|-
|'''4200'''
| There was an error loading BOM _________.
|-
|'''4201'''
| Bill of materials cannot be found.
|-
|'''4202'''
| Duplicate BOM number _________.
|-
|'''4203'''
| The bill of materials is not up to date and must be reloaded.
|-
|'''4204'''
| Bill of materials was not saved.
|-
|'''4205'''
| Bill of materials is in use and cannot be deleted
|-
|'''4206'''
| requires a raw good and a finished good, or a repair.
|-
|'''4207'''
| This change would make this a recursive bill of materials.
|-
|'''4210'''
| There was an error loading MO _________.
|-
|'''4211'''
| Manufacture order cannot be found.
|-
|'''4212'''
| No manufacture order was created. Duplicate order number _________.
|-
|'''4213'''
| The manufacture order is not up to date and must be reloaded.
|-
|'''4214'''
| Manufacture order was not saved.
|-
|'''4215'''
| Manufacture order is closed and cannot be modified.
|-
|'''4220'''
| There was an error loading WO _________.
|-
|'''4221'''
| Work order cannot be found.
|-
|'''4222'''
| Duplicate work order number _________.
|-
|'''4223'''
| The work order is not up to date and must be reloaded.
|-
|'''4224'''
| Work order was not saved.
|-
|'''4300'''
| There was an error loading TO _________.
|-
|'''4301'''
| Unknown status _________.
|-
|'''4302'''
| Unknown carrier _________.
|-
|'''4303'''
| Transfer order cannot be found.
|-
|'''4304'''
| TO does not have a TO number. Please turn on the auto-assign TO number option in the Transfer Order module options.
|-
|'''4305'''
| Duplicate order number _________.
|-
|'''4306'''
| Unknown type _________.
|-
|'''4307'''
| Transfer order was not saved.
|-
|'''4308'''
| The transfer order is not up to date and must be reloaded.
|-
|'''5000'''
| There was a receiving error.
|-
|'''5001'''
| Receive ticket invalid.
|-
|'''5002'''
| Could not find a line item for part number _________.
|-
|'''5003'''
| Could not find a line item for product number _________.
|-
|'''5004'''
| Not a valid receive type.
|-
|'''5005'''
| The receipt is not up to date and must be reloaded.
|-
|'''5006'''
| A location is required to receive this part. Part num: _________
|-
|'''5007'''
| Cannot receive or reconcile more than the quantity ordered on a TO.
|-
|'''5008'''
| Receipt not found _________.
|-
|'''5100'''
| Pick invalid
|-
|'''5101'''
| Pick not found _________.
|-
|'''5102'''
| Pick not saved.
|-
|'''5103'''
| An order on pick _________ has a problem.
|-
|'''5104'''
| Pick item not found _________.
|-
|'''5105'''
| Could not finalize pick. Quantity is not correct.
|-
|'''5106'''
| The pick is not up to date and must be reloaded.
|-
|'''5107'''
| The part in tag _________ does not match part _________.
|-
|'''5108'''
| Incorrect slot for this item. Item must be placed with others for this order.
|-
|'''5109'''
| Wrong number of serial numbers sent for pick.
|-
|'''5110'''
| Pick items must be started to assign tag.
|-
|'''5111'''
| Order must be picked from location group _________.
|-
|'''5112'''
| The item must be picked from _________.
|-
|'''5200'''
| Shipment invalid
|-
|'''5201'''
| Shipment not found _________.
|-
|'''5202'''
| Shipment status error
|-
|'''5203'''
| Unable to process shipment.
|-
|'''5204'''
| Carrier not found _________.
|-
|'''5205'''
| The shipment _________ has already been shipped.
|-
|'''5206'''
| Cannot ship order _________. The customer has a ship hold.
|-
|'''5207'''
| Cannot ship order _________. The vendor has a ship hold.
|-
|'''5300'''
| Could not load RMA.
|-
|'''5301'''
| Could not find RMA.
|-
|'''5400'''
| Could not take payment.
|-
|'''5500'''
| Could not load the calendar.
|-
|'''5501'''
| Could not find the calendar.
|-
|'''5502'''
| Could not save the calendar.
|-
|'''5503'''
| Could not delete the calendar.
|-
|'''5504'''
| Could not find the calendar activity.
|-
|'''5505'''
| Could not save the calendar activity.
|-
|'''5506'''
| Could not delete the calendar activity.
|-
|'''5507'''
| The start date must be before the stop date.
|-
|'''6000'''
| Account invalid
|-
|'''6001'''
| Discount invalid
|-
|'''6002'''
| Tax rate invalid
|-
|'''6003'''
| Accounting connection failed
|-
|'''6005'''
| Accounting system not defined
|-
|'''6006'''
| Accounting brought back a null result
|-
|'''6007'''
| Accounting synchronization error
|-
|'''6008'''
| The export failed
|-
|'''6009'''
| Fishbowl and Quickbooks multiple currency features don't match
|-
|'''6010'''
| The data validation for the export has failed.
|-
|'''6011'''
| Accounting integration is not configured. Please reintegrate.
|-
|'''6100'''
| Class already exists
|-
|'''7000'''
| Pricing rule error
|-
|'''7001'''
| Pricing rule not found
|-
|'''7002'''
| The pricing rule name is not unique
|-
|'''8000'''
| Unknown FOB _________.
|}

Latest revision as of 05:30, 13 March 2025

The API allows developers to integrate with Fishbowl Advanced. Fishbowl only provides documentation for the API. Fishbowl Support will not troubleshoot the API, but several resources are listed below to help you get started.

FAQs

What alternatives are there to using the API?

Many customers that are interested in the API are looking for ways to import data, run queries, automate reports, or update orders. This can all be done without the API.

  1. The Icon.Data Import.png Data Import module allows files to be imported, even if the column headers don't match the Fishbowl format. This allows many external files to be imported into Fishbowl without modification.
  2. Nearly all functions can be performed using Fishbowl's built-in Imports and Exports.
  3. All of the database tables can be viewed, queried, and exported from the Icon.Data.png Data module.
  4. The Icon.Schedule.png Schedule module can automatically email reports, run data queries, import local files, or import files on a server, such as an FTP server.

Is Fishbowl Advanced an on-premise application, or is it in the cloud?

  • Traditionally, Fishbowl Advanced is installed on your computer as an on-premise solution that can be accessed from your local network. You can also open ports and configure the Fishbowl Server to allow connections from anywhere in the world.
  • With Fishbowl Hosted Services, we install Fishbowl Advanced for you on our high-performance servers, and configure it so that you can access it from anywhere in the world.
  • Fishbowl Drive is a similar, but separate product that is 100% web based and hosted in the cloud with its own API.

How do I connect to the API?

  • The API is automatically installed when you install the Fishbowl server. It can be accessed anywhere from your local network, or configured to allow connections from anywhere in the world. The easiest way to get started is to use our Postman collection.

Do I need a certificate to encrypt the API traffic?

What is the difference between a parameter, an attribute, and a variable?

  • These are all ways to pass information to the API.
    • A path variable is typically an ID that is part of the URL path: /api/parts/:id/inventory/add
    • A parameter comes after the path in the URL, often as part of a search filter: ?vendorId=25&quantity=5
    • An attribute is sent in the body of the request and is often included in the JSON to add information to an object: "name": "FG2100"

How can I test the API without altering my production database?

  • When testing the API, you should make a copy of your database to use as a Sandbox.

How do I import and modify orders with the REST API?

  • Nearly all Fishbowl functions can be performed through the API by using the Import endpoint to bring in CSV or JSON data: List of imports.

What is the logout API call for?

  • Your license key determines the number of users that can be logged in to Fishbowl Advanced at the same time. The logout API call closes the connection so that more users can connect if needed.

Is there another version of the API?

  • The previous version of the API uses a socket connection. It does not provide as much data validation and it is not recommended. If needed, resources for the previous version of the API can be downloaded by clicking here.

Documentation

The REST API documentation is automatically installed on your Fishbowl Server. This allows you to see the documentation that is intended for your version of Fishbowl Advanced.

  • To see the API documentation, you will need to which Port your server is using. By default, this is 2456 or 80. You can confirm this by double-clicking the Fishbowl Server tray icon and then selecting the Server tab.
    Web Port.png
  • If you are using the default port of 2456 and you are on the Fishbowl Server computer, you can view the documentation by clicking this link: http://localhost:2456/apidocs
    REST API.png
  • To see the documentation from other computers on the network, enter the IP address of the Fishbowl Server computer, replacing 2456 with your Web Port. For example: 192.168.29.37:2456/apidocs
  • An example of the API documentation can be accessed here.

Postman

Postman is a free application that can help you explore many APIs, including the API for Fishbowl Advanced. If you've configured your server to allow remote access, you can use the web version of Postman. Otherwise, you can install the free app and connect over your local network. Follow the instructions below to get started.

  1. Download and install Postman from this page: https://postman.com/downloads
  2. Open Postman and sign in to your free account.
  3. Open your Workspace, go to the Collections tab, click the Import button, and then paste the following URL: https://fishbowlhelp.com/pm
  4. If you are not on the Fishbowl Server computer, highlight Fishbowl Advanced, click the Variables tab, and change the URL Current Value to the IP address of your Fishbowl Server. Then click Save.
  5. Expand the Login folder and select the line that says POST Login.
    Postman Login.png
  6. Click the Body tab and change the username and password if needed. Then click Save.
  7. Click the Send button near the top-right corner.
  8. Open the Icon.Settings.png Settings module in Fishbowl Advanced and approve the integrated app.
  9. Return to the Login request in Postman, and send it again using the keyboard shortcut (CTRL+Enter or CMD+Enter).
  10. On the Fishbowl Server computer you can double-click the Fishbowl Server tray icon and select the Connections tab to see your new connection. Each login request will add a new connection.
    Postman Connection.png
  11. Open Postman and send a few example requests, like the ones below:
    • Expand Vendors, select the line that says GET Search Vendors, and then send the request. You should get a JSON response listing your vendors.
    • Expand Inventory, select the line that says GET Inventory, and then click the Params tab. Change B201 to one of your part numbers, and then send the request.
    • Expand Parts, select the line that says GET Part Best Cost, and then click the Params tab. Notice the difference between Query Params and Path Variables.
  12. Expand Login, select the line that says POST Logout, and then send the request.
  13. On the Fishbowl Server computer, double-click the Fishbowl Server tray icon, select the Connections tab, and then click the Refresh button. Your connection will be removed from the list.