{"activeVersionTag":"latest","latestAvailableVersionTag":"latest","collection":{"info":{"_postman_id":"622279bb-3fdf-4eab-8a87-3b4170b7d08c","name":"Sage 100 Contractor Cloud Connector","description":"The **Sage 100 Contractor Cloud Connector REST API (Cloud Connector)** is a robust **Restful Application Programming Interface (API)** that provides a standardized framework for building custom applications and integrations with **Sage 100 Contractor**. It enables seamless communication between Sage 100 Contractor and other software platforms or tools.\n\nBy leveraging this API, you can:\n\n- Extend the core functionality of Sage 100 Contractor,\n    \n- Integrate with third-party systems and services,\n    \n- Utilize pre-built integrations developed by other Sage partners, or\n    \n- Develop your own tailored solutions to meet specific business needs.\n    \n\nWhether you're connecting to ERP systems, automating data flows, or building entirely new apps, the Cloud Connector API gives you the flexibility and control to do so efficiently and securely.\n\n# Overview\n\nThe following documentation provides the necessary information to seamlessly connect external applications to Sage 100 Contractor. The Cloud Connector is a RESTFUL API and provides a standardized framework for creating and updating information into Sage 100 Contractor.\n\n# Enabling Communication Between Cloud Connector and Sage 100 Contractor SQL Database\n\nSince **Sage 100 Contractor** is an **on-premise accounting system**, the **Cloud Connector** must be able to communicate directly with the **SQL Server database** to read and write data. However, for security reasons, most server environments **block inbound traffic** by default, especially traffic originating from external networks. To allow secure and reliable communication between the Cloud Connector and your SQL database, **firewall and TCP port access must be explicitly granted** as follows:\n\n**Cloud Connector IP Address:**  \nPlease setup an inbound rule within the Sage SQL Server's Firewall to allow traffic from The Cloud Connector to communicate with the server as follows:\n\nInbound Rule:  \n\\-------------------------------------  \nSource IP: **52.170.130.9**  \nDestination Port: {SQL Port Number - see below}  \nProtocol: TCP\n\n**SQL Server Port Number:**  \nEnsure that the SQL Port number is \"**Static**\" and the specified port is open to the Cloud Connector IP Address\n\n> **Dynamic vs Static Ports**  \nBy default, SQL Server listens on TCP port **1433**, but this can vary—especially for named instances, which commonly use dynamic ports. In the case of Sage 100 Contractor, the software is typically installed against a named SQL Server instance, often named \"**SAGE100CON**\". As a result, in most environments, dynamic port assignment is enabled by default for this instance. \n  \n\nIf dynamic ports are enabled it is highly recommended that a static port be assigned to avoid having the port number change which can happen each time the SQL Server instance is restarted or the Server is rebooted.\n\nThe following steps can be used to identify if Dynamic Ports are enabled and how to update the port to be a static Port number which would then be the port that is opened within the firewall settings:\n\n**Identify the SQL Server Port:**\n\n1\\. On the server where Sage is installed, Open SQL Server Configuration Manager.\n\n2\\. Go to SQL Server Network Configuration → Protocols for \\[_Sage_InstanceName_\\]. (Typically the \\[_SageInstanceName_\\] is \"SAGE100CON\")\n\n3\\. Double-click TCP/IP, then go to the IP Addresses tab. Scroll down until you see the IPAll section:\n\nUnder IPAll, check the values for:\n\nTCP Dynamic Ports (if set, it's using a dynamic port).\n\nTCP Port (**if set and dynamic is blank, this is the static port in use**).\n\nIf the TCP Dynamic Ports is populated with a port number then Dynamic Ports is enabled and should be changed to a static port. To do this clear the value in the \"TCP Dynamic Ports\" field and enter a Port Number in the \"TCP Port\" field. You will need to choose a specific port number (e.g. 14330, 15000 or any available TCP port above 1024). It is not advised to use the Dynamic Port number that was entered in the Dynamic Port field.\n\n<img src=\"https://content.pstmn.io/c574441e-6f7b-4466-82d7-b3dde49d7b9c/aW1hZ2UucG5n\" width=\"821\" height=\"664\">\n\n# Company Connections\n\nCompany Connections are used to establish and manage communication with a Sage database. Each connection record contains essential information such as the server IP address, database name, and SQL login credentials—all of which are required to enable proper integration with the Sage system. The number of company connections is determined by your license and the number of connections that have been purchased.\n\nTo update or manage this information, follow the instructions below:\n\n1. Login to the [Cloud Connector](https://sage100cloud.eidynamics.com)\n    \n2. Navigate to \\[Setup >> Companies\\]\n    \n3. You should see a list of company connection(s) that are available as part of your license. (If you do not see any company connections listed or fewer than expected, contact support.)\n    \n4. Click the link to edit the company you wish to update.\n    \n\n**Connection Information:**\n\n> **Company Code**: Short company code or acronym to identify the company connection \n  \n> **Description**: Short name or description of the connection \n  \n> **SQL Server IP/Domain:** The SQL Server Name generally will consist of a \"Public\" facing IP address or a Fully Qualified Domain Name of the Server where the Sage SQL Server Database is located. (If you are unsure of the correct IP address to enter, a simple method is to login to the server where the Sage SQL Server is installed, open a web browser, and search for \"What is my IP.\" Several sites will display the public IP address of that server.) \n  \n> **Port Number**: Enter the \"static\" port number identified in the steps for enabling communication between the Sage Server and the Cloud Connector outlined above \n  \n> **SQL Database**: The name of the Sage Database that this connection will communicate with \n  \n> **SQL User**: The SQL Server username that the connection will use to login to the SQL Server. Note: Windows Authentication is not supported, this must be a SQL Server login. The user should also be designated as a \"SysAdmin\" in SQL Server. \n  \n\nNote: SysAdmin Logins for Sage can be created using the \"Database Administration Utility\" that is installed on the same server where the Sage software is installed._\n\n> **SQL Password**: The password for the SQL Username being used \n  \n> **Default**: Denotes whether the connection is the default connection when more than one company connection exists. If there is only one company connection then it will always be the default. \n  \n\n# **SQL Database Compatabillity**\n\nIt is required that the compatability level for the Sage database be set to SQL Server 2017 or later.\n\nTo Determine which version of SQL you are running:\n\n1) Launch Microsoft SQL Server Management Studio  \n2) Right Click on your Sage Company Database and select \\[Properties\\]  \n3) Navigate to the \\[Options\\] tab  \n4) Select the \"Compatibility Level\" Drop Down  \n5) Whatever the last option shown is the version of SQL Installed. In most cases the last option will be SQL Server 2014 (120) which means that SQL 2014 is installed and you need to upgrade your instance of SQL Server\n\n<img src=\"https://content.pstmn.io/cabe5e0e-7e36-485c-8f22-9e473b0d7b0e/aW1hZ2UucG5n\" width=\"1050\" height=\"723\">\n\n# Authentication\n\n#### Step 1: Generate an Authentication Token\n\nAll API requests to the Cloud Connector require an authentication token to authorize access. This token must be included in the headers of each API request.\n\nAuthentication tokens are created using the following process:\n\n1. Login to the [Cloud Connector](https://sage100cloud.eidynamics.com)\n    \n2. Navigate to \\[System >> API Auth Token\\]\n    \n3. Click the button to \"Add Token\"\n    \n4. Generate the Token\n    \n\nWhen generating an authentication token, you can control the level of access it provides—such as which companies and endpoints it can access and which tables it can retrieve data from.\n\nThere is no limit to the number of tokens that can be generated. This allows you to create separate tokens for different purposes or applications, ensuring that each token has access only to the specific data required for its intended use case. This helps maintain security and data integrity across multiple integrations.\n\n#### Step 2: Using the Token in API Requests\n\nOnce a token has been generated it can then be used when making API requests. In order to make a request the following header information is required:\n\n**Required Header Elements:**\n\n`Auth-Token: {Generated API Token}`\n\n`Content-Type: application/json`\n\n`customer: {CustomerID}`\n\n`company: {Company Connection Code}`\n\n**Security Note:**\n\n- Treat authentication tokens like passwords—keep them secure and do not expose them in client-side code or expose them publicly\n    \n- It is recommended to set an expiration date on tokens to ensure that they are not indefinitely active, otherwise API tokens do not expire.\n    \n\n# Error/Response Codes\n\nA json response is retruned with every request. Every response will have a \"response\" property which will either be \"ERROR\" or \"SUCCESS\".\n\n{\"response\":\"SUCCESS\"}\n\nIf there is additional information to be provided on an error there will be a \"response\" property with more details.\n\n{\"response\":\"ERROR\",\"message\":\"Invalid Request\"}\n\n# Rate limits\n\nThere are no rate limits. Since Sage 100 Contractor is an on premise accounting solution, there is a unique and separate version of our API installed along side each instance of Sage 100 Contractor. As such, the amount of traffic between our API and any interfacing applications is not monitored or restricted.\n\n# Synchronous vs Asynchronous\n\nFor highly available applications with multiple concurrent users, asynchronous processing is a common design principle for modern web applications. However, due to how Sage 100 Contractor generates key record identifiers, we do not recommend or support making asynchronous endpoint calls to any Accounting Transaction-related endpoints, such as: Accounts Receivable, Accounts Payable, Journal Transactions, Payroll Records etc.\n\nWe strongly recommend batching these records and processing them at one time, or structuring your application to ensure these endpoints are called synchronously to maintain data integrity.\n\nFor master table endpoints, such as Vendors, Employees, or Clients, asynchronous calls can be made. However, if you are processing a large number of updates simultaneously, it is highly advisable to send all updates in a single call using an \"Array\" to optimize performance and reduce server load.\n\nPlease Note: the ability to process large numbers of asynchornous requests may result in errors depending on the stability of the Sage server environment where the API is installed. There are many factors that can impact the stability of the API, including memory, available processors, firewalls, VPN, virus software installed, etc. Proper planning and testing are essential to ensure reliable API performance in your specific environment.","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","isPublicCollection":false,"owner":"18727065","team":2880222,"collectionId":"622279bb-3fdf-4eab-8a87-3b4170b7d08c","publishedId":"2sB2xBBpHh","public":true,"publicUrl":"https://documenter-api.postman.tech/view/18727065/2sB2xBBpHh","privateUrl":"https://go.postman.co/documentation/18727065-622279bb-3fdf-4eab-8a87-3b4170b7d08c","customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"FF6C37"},"documentationLayout":"classic-double-column","customisation":{"metaTags":[{"name":"description","value":""},{"name":"title","value":""}],"appearance":{"default":"light","themes":[{"name":"dark","logo":null,"colors":{"top-bar":"212121","right-sidebar":"303030","highlight":"FF6C37"}},{"name":"light","logo":null,"colors":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"FF6C37"}}]}},"version":"8.10.1","publishDate":"2025-06-19T15:53:20.000Z","activeVersionTag":"latest","documentationTheme":"light","metaTags":{"title":"","description":""},"logos":{"logoLight":null,"logoDark":null}},"statusCode":200},"environments":[],"user":{"authenticated":false,"permissions":{"publish":false}},"run":{"button":{"js":"https://run.pstmn.io/button.js","css":"https://run.pstmn.io/button.css"}},"web":"https://www.getpostman.com/","team":{"logo":"https://res.cloudinary.com/postman/image/upload/t_team_logo_pubdoc/v1/team/0df00e15eaad90d47e2fd61e38674e79a6823fdad33060e20e26bf7c03dec7cf","favicon":""},"isEnvFetchError":false,"languages":"[{\"key\":\"csharp\",\"label\":\"C#\",\"variant\":\"HttpClient\"},{\"key\":\"csharp\",\"label\":\"C#\",\"variant\":\"RestSharp\"},{\"key\":\"curl\",\"label\":\"cURL\",\"variant\":\"cURL\"},{\"key\":\"dart\",\"label\":\"Dart\",\"variant\":\"http\"},{\"key\":\"go\",\"label\":\"Go\",\"variant\":\"Native\"},{\"key\":\"http\",\"label\":\"HTTP\",\"variant\":\"HTTP\"},{\"key\":\"java\",\"label\":\"Java\",\"variant\":\"OkHttp\"},{\"key\":\"java\",\"label\":\"Java\",\"variant\":\"Unirest\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"Fetch\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"jQuery\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"XHR\"},{\"key\":\"c\",\"label\":\"C\",\"variant\":\"libcurl\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Axios\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Native\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Request\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Unirest\"},{\"key\":\"objective-c\",\"label\":\"Objective-C\",\"variant\":\"NSURLSession\"},{\"key\":\"ocaml\",\"label\":\"OCaml\",\"variant\":\"Cohttp\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"cURL\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"Guzzle\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"HTTP_Request2\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"pecl_http\"},{\"key\":\"powershell\",\"label\":\"PowerShell\",\"variant\":\"RestMethod\"},{\"key\":\"python\",\"label\":\"Python\",\"variant\":\"http.client\"},{\"key\":\"python\",\"label\":\"Python\",\"variant\":\"Requests\"},{\"key\":\"r\",\"label\":\"R\",\"variant\":\"httr\"},{\"key\":\"r\",\"label\":\"R\",\"variant\":\"RCurl\"},{\"key\":\"ruby\",\"label\":\"Ruby\",\"variant\":\"Net::HTTP\"},{\"key\":\"shell\",\"label\":\"Shell\",\"variant\":\"Httpie\"},{\"key\":\"shell\",\"label\":\"Shell\",\"variant\":\"wget\"},{\"key\":\"swift\",\"label\":\"Swift\",\"variant\":\"URLSession\"}]","languageSettings":[{"key":"csharp","label":"C#","variant":"HttpClient"},{"key":"csharp","label":"C#","variant":"RestSharp"},{"key":"curl","label":"cURL","variant":"cURL"},{"key":"dart","label":"Dart","variant":"http"},{"key":"go","label":"Go","variant":"Native"},{"key":"http","label":"HTTP","variant":"HTTP"},{"key":"java","label":"Java","variant":"OkHttp"},{"key":"java","label":"Java","variant":"Unirest"},{"key":"javascript","label":"JavaScript","variant":"Fetch"},{"key":"javascript","label":"JavaScript","variant":"jQuery"},{"key":"javascript","label":"JavaScript","variant":"XHR"},{"key":"c","label":"C","variant":"libcurl"},{"key":"nodejs","label":"NodeJs","variant":"Axios"},{"key":"nodejs","label":"NodeJs","variant":"Native"},{"key":"nodejs","label":"NodeJs","variant":"Request"},{"key":"nodejs","label":"NodeJs","variant":"Unirest"},{"key":"objective-c","label":"Objective-C","variant":"NSURLSession"},{"key":"ocaml","label":"OCaml","variant":"Cohttp"},{"key":"php","label":"PHP","variant":"cURL"},{"key":"php","label":"PHP","variant":"Guzzle"},{"key":"php","label":"PHP","variant":"HTTP_Request2"},{"key":"php","label":"PHP","variant":"pecl_http"},{"key":"powershell","label":"PowerShell","variant":"RestMethod"},{"key":"python","label":"Python","variant":"http.client"},{"key":"python","label":"Python","variant":"Requests"},{"key":"r","label":"R","variant":"httr"},{"key":"r","label":"R","variant":"RCurl"},{"key":"ruby","label":"Ruby","variant":"Net::HTTP"},{"key":"shell","label":"Shell","variant":"Httpie"},{"key":"shell","label":"Shell","variant":"wget"},{"key":"swift","label":"Swift","variant":"URLSession"}],"languageOptions":[{"label":"C# - HttpClient","value":"csharp - HttpClient - C#"},{"label":"C# - RestSharp","value":"csharp - RestSharp - C#"},{"label":"cURL - cURL","value":"curl - cURL - cURL"},{"label":"Dart - http","value":"dart - http - Dart"},{"label":"Go - Native","value":"go - Native - Go"},{"label":"HTTP - HTTP","value":"http - HTTP - HTTP"},{"label":"Java - OkHttp","value":"java - OkHttp - Java"},{"label":"Java - Unirest","value":"java - Unirest - Java"},{"label":"JavaScript - Fetch","value":"javascript - Fetch - JavaScript"},{"label":"JavaScript - jQuery","value":"javascript - jQuery - JavaScript"},{"label":"JavaScript - XHR","value":"javascript - XHR - JavaScript"},{"label":"C - libcurl","value":"c - libcurl - C"},{"label":"NodeJs - Axios","value":"nodejs - Axios - NodeJs"},{"label":"NodeJs - Native","value":"nodejs - Native - NodeJs"},{"label":"NodeJs - Request","value":"nodejs - Request - NodeJs"},{"label":"NodeJs - Unirest","value":"nodejs - Unirest - NodeJs"},{"label":"Objective-C - NSURLSession","value":"objective-c - NSURLSession - Objective-C"},{"label":"OCaml - Cohttp","value":"ocaml - Cohttp - OCaml"},{"label":"PHP - cURL","value":"php - cURL - PHP"},{"label":"PHP - Guzzle","value":"php - Guzzle - PHP"},{"label":"PHP - HTTP_Request2","value":"php - HTTP_Request2 - PHP"},{"label":"PHP - pecl_http","value":"php - pecl_http - PHP"},{"label":"PowerShell - RestMethod","value":"powershell - RestMethod - PowerShell"},{"label":"Python - http.client","value":"python - http.client - Python"},{"label":"Python - Requests","value":"python - Requests - Python"},{"label":"R - httr","value":"r - httr - R"},{"label":"R - RCurl","value":"r - RCurl - R"},{"label":"Ruby - Net::HTTP","value":"ruby - Net::HTTP - Ruby"},{"label":"Shell - Httpie","value":"shell - Httpie - Shell"},{"label":"Shell - wget","value":"shell - wget - Shell"},{"label":"Swift - URLSession","value":"swift - URLSession - Swift"}],"layoutOptions":[{"value":"classic-single-column","label":"Single Column"},{"value":"classic-double-column","label":"Double Column"}],"versionOptions":[],"environmentOptions":[{"value":"0","label":"No Environment"}],"canonicalUrl":"https://documenter.gw.postman.com/view/metadata/2sB2xBBpHh"}