Frequently Asked Questions
- Web Services
- Why am I getting an error about an invalid Web Services authorization?
- How do I get a Web Services developer license?
- Can I change the password for my Web Services sender ID?
- How do I monitor and increase throughput for API calls, CSV imports, and offline reports?
- Why are users getting connection errors about non-secure connections or other SSL issues?
- XML API
- How do I verify/troubleshoot my API calls?
- Where can I find information about generic and/or object-specific functions?
- Are legacy functions going away?
- Can I use an undocumented function?
- What return format should I use for best results when using readByQuery and readMore?
- How do you get information about related or owned objects?
- How do I update an owned object?
- How do I query for an object based on a joined field (or how do I query for an employee by name)?
- How do you add a contact to the Contact List for a customer?
- Can I update a statistical journal entry via the API?
- Why aren’t my dates working correctly?
- What field do I use for attachments?
- How do I update a record at the entity level for a multi-entity shared company?
- General Ledger
- Customization Services
- Are the injections in my Smart Event condition correct?
- Why aren’t integration codes working for picklist fields on a standard object?
- Can I use a smart event to pull data from the first line of the line item section into a field in the header section?
- How can I restrict a record to only be created privately in an entity, instead of at the root/top level?
- Platform Services
- Construction Application
- Accounting terminology for non-US countries
- Miscellaneous
This topic provides answers for frequently asked questions.
Web Services
Why am I getting an error about an invalid Web Services authorization?
If your Web Services call, AJAX gateway call, or SDK function fails with the following error, it means your Web Services sender ID is not authorized for the target company:
Ask the company administrator to review the Web Services authorizations list on the Company Configuration Security tab, and add your sender ID if it’s not present. Note that the ajax
sender ID must be included in the list when the Platform Services AJAX gateway is used.
For more information, see Web Services authorizations in the Sage Intacct product help.
How do I get a Web Services developer license?
We use the term “Marketplace Partners” for companies that develop add-ons and applications that integrate with Sage Intacct. Please see Become a Partner on the Sage Intacct website for information on how to get started.
Can I change the password for my Web Services sender ID?
If you must change the password for a Web Services sender ID, open a case with Sage Intacct’s support team by logging in to the Sage Intacct Community.
How do I monitor and increase throughput for API calls, CSV imports, and offline reports?
In Sage Intacct, companies use offline processes for activities such as API transactions (asynchronous Web Services requests, Platform Services triggers, Customization Services smart events, or CSV imports) and offline reports. With the standard level of service (LOS), each company is allowed one API transaction job (online or offline) and one offline report job that can run concurrently. Offline processes from different companies share computing resources, so you might have to wait in line even if you have only one job.
If a company receives more than two requests at a time, the third one is held for 30 seconds. If a spot does not open up in that time, an error is thrown:
There are too many operations running for this company
You can use queue administration to view a list of all offline jobs queued to run in your company. If you have a premium level of service (LOS), you can also prioritize and cancel jobs. You can use APIs or the UI to use queue administration.
If you need greater throughput for offline jobs or if you need dedicated resources for your company, consider upgrading your LOS package. Contact your account manager for details.
Why are users getting connection errors about non-secure connections or other SSL issues?
Sage Intacct uses CloudFlare as the content delivery network (CND) that provides internet connections to Sage Intacct applications. When Sage Intacct and/or CloudFlare upgrade SSL certificates, Web Services integrations that use certificate authorities that stay up to date will not experience any issues.
However, Web Services integrations that save a certificate locally must upgrade that certificate or users will experience connection errors. While Sage Intacct makes every effort to communicate these changes in advance, it’s possible that some integrations may miss having their SSL certificates upgraded. In this case, users will experience connection errors that mention security certificates, SSL, or insecure/non-private connections. The solution to this problem is to upgrade old SSL certificates on the servers, or better yet, set up a certificate authority. This covers all of the Sage Intacct sub domains, such as:
- api.intacct.com
- www.intacct.com
- www-p02.intacct.com
- www-p03.intacct.com
- www-p03.intacct.com
- www-p04.intacct.com
Integrations should not hardcode certificate authority files in their code. If these hardcoded entries exist, they need to be changed as well (it is strongly recommended that a modern/standard approach be used instead).
XML API
How do I verify/troubleshoot my API calls?
Before doing any serious XML API work, it’s strongly recommended that you become familiar with the use of Postman and the Sage Intacct API collection for Postman. With this approach, you can easily learn to use the API, and test and verify your API calls before hard coding them. See Your First XML API Calls to get started.
Also, consider adding a flag to enable debug logging in your application/integration to help as you develop.
Even better, consider using one of the Sage Intacct SDKs, which nicely wrap the XML APIs for you:
Where can I find information about generic and/or object-specific functions?
Find the object of interest in the API documentation, then look for the functions on that page. For example, if you want to perform some action on a bill, look at the APBILL page, which includes the certified generic functions, the object-specific/legacy functions, and examples for both.
For custom objects, use the Platform Services Objects API documentation, which provides functions that let you get information about fields of custom objects. You can then use this information to compose your generic function calls.
Are legacy functions going away?
When implementing new APIs, Sage Intacct provides generic or open functions that can operate on multiple types of objects. The older, object-specific functions are labeled as legacy in the documentation, which simply means they will not be enhanced. There are no plans to deprecate legacy functions, and in fact, there are cases in which they are the only functions available.
Can I use an undocumented function?
If an object or function is not included in the API documentation, it is likely not yet supported and subject to change. You can post an idea on the Sage Intacct Community or log a support case to inquire about the status of such objects and functions.
What return format should I use for best results when using readByQuery
and readMore
?
When you usereadByQuery
with the XML returnFormat
, which is the recommended format for all
API calls, the returned data element has attributes about how many results are available:
<data listtype="contract" count="2" totalcount="1588" numremaining="1586" resultId="7765623331WQdg3cCoA4MAAH4trhIAAAAD5">
If you use a different return format such as JSON, this information isn’t provided - particularly the resultId
.
How do you get information about related or owned objects?
When using readByQuery
, be aware that you cannot perform queries involving many-to-many or one-to-many relationships. Similarly, you cannot use readByQuery
to return multiple owned objects.
If you need information about multiple related or owned objects, first use readByQuery
to get the unique key (typically record number) for the record, then supply the key to the read
function to get details about owned and related objects.
For example, a read
on an APBILL record returns any owned bill lines:
<APBILL>
<RECORDNO>259</RECORDNO>
...
<APBILLITEMS>
<apbillitem>
<RECORDNO>4354</RECORDNO>
<RECORDKEY>259</RECORDKEY>
<ACCOUNTKEY>131</ACCOUNTKEY>
<ACCOUNTNO>7700</ACCOUNTNO>
...
</apbillitem>
<apbillitem>
<RECORDNO>4356</RECORDNO>
<RECORDKEY>259</RECORDKEY>
<ACCOUNTKEY>132</ACCOUNTKEY>
<ACCOUNTNO>7710</ACCOUNTNO>
...
</apbillitem>
</APBILLITEMS>
...
</APBILL>
The same limitation is true for custom relationships. If you have a one-to-many relationship from a custom object to a Contract, for example, you cannot use readByQuery
to list the custom object’s related contracts. Instead, you can use read
on the custom object.
Note: You can use readByQuery
for a many-to-one relationship if you start from the many side of the relationship.
How do I update an owned object?
Certain sub-components of Sage Intacct standard objects are referred to as owned objects. An owned object belongs to another object and typically cannot be manipulated directly. Instead, you work with owned objects by making API calls on the owner.
For example, in almost all cases, the line items of a transaction are objects owned by the header. Accordingly, you cannot perform an update operation directly on a transaction’s line item record. Instead you perform an update operation on the transaction header and pass in the line item information.
The following show two examples that update owned objects:
<update>
<APBILL>
<RECORDNO>65</RECORDNO>
<APBILLITEMS>
<APBILLITEM>
<LINE_NO>1</LINE_NO>
<ACCOUNTNO>6225</ACCOUNTNO>
<TRX_AMOUNT>100.12</TRX_AMOUNT>
<ENTRYDESCRIPTION>Additional service call</ENTRYDESCRIPTION>
<DEPARTMENTID>D300</DEPARTMENTID>
</APBILLITEM>
</APBILLITEMS>
</APBILL>
</update>
<update_sotransaction key="Sales Order-SO1234">
<updatesotransitems>
<updatesotransitem line_num="1">
<memo>Testing1234</memo>
</updatesotransitem>
</updatesotransitems>
</update_sotransaction>
How do I query for an object based on a joined field (or how do I query for an employee by name)?
If you query for objects based on a field whose value is part of an associated object (a joined field), you will likely get an error processing the request. You can recognize a joined field by the period in the result element when you list objects, as shown:
<data listtype="employee" count="82" totalcount="82" numremaining="0" resultId="">
<employee>
<RECORDNO>38</RECORDNO>
...
<PERSONALINFO.FIRSTNAME>Melissa</PERSONALINFO.FIRSTNAME>
<PERSONALINFO.INITIAL>Q</PERSONALINFO.INITIAL>
<PERSONALINFO.LASTNAME>Fandel</PERSONALINFO.LASTNAME>
...
For such fields, use the query
function. For example, the following returns the employee record for the above first and last names:
<query>
<object>EMPLOYEE</object>
<filter>
<and>
<equalto>
<field>personalinfo.firstname</field>
<value>Melissa</value>
</equalto>
<equalto>
<field>personalinfo.lastname</field>
<value>Fandel</value>
</equalto>
</and>
</filter>
</query>
How do you add a contact to the Contact List for a customer?
The generic functions for creating and updating customers do not support adding to the Contact List. You can use the legacy functions (create_customer / update_customer) for this purpose.
Can I update a statistical journal entry via the API?
Yes, but be aware that the update is treated as a complete replacement of any entries. Be careful you pass every entry you want to keep so you do not clear out the whole thing, for example:
<update>
<GLBATCH>
<RECORDNO>21</RECORDNO>
<BATCH_DATE>03/31/2016</BATCH_DATE>
<BATCH_TITLE>Headcount 03/31/2016</BATCH_TITLE>
<ENTRIES>
<GLENTRY>
<ACCOUNTNO>HEADS</ACCOUNTNO>
<DEPARTMENT>ADMIN</DEPARTMENT>
<LOCATION>100</LOCATION>
<TR_TYPE>1</TR_TYPE>
<AMOUNT>2.00</AMOUNT>
<DESCRIPTION>Headcount 03/31/2016</DESCRIPTION>
</GLENTRY>
</ENTRIES>
</GLBATCH>
</update>
Note that GLBATCH
is used for all of the types of journal entry objects, so make sure you are providing the correct RECORDNO.
Why aren’t my dates working correctly?
Dates in Sage Intacct do not have associated timezones. Third-party integrators are responsible for any adjustments to account for timezone differences. For example, if an integration stores everything in GMT and the client requires a different timezone, the integrator is responsible for translating the dates to the correct timezone for the client. In addition, ISO 8601 date formats are not supported in Sage Intacct. An integration that uses these formats must translate them into accepted date formats. See Dates for more information.
What field do I use for attachments?
In the Sage Intacct UI, the Attachments label indicates that you can provide supporting documents. However, in XML API calls, the corresponding field name is SUPDOCID
.
How do I update a record at the entity level for a multi-entity shared company?
Add a location ID to your login. See login element for an example.
General Ledger
GL Outlier Detection
If GL Outlier Detection is enabled for a company, information about outliers is included in journal entries and allocation splits.
For example, the following shows part of a read response on a journal entry with outlier information (PREDICTIONS
) for a SPLIT
:
<GLBATCH>
...
<ENTRIES>
<glentry>
...
<SPLIT>
<RECORDNO>267</RECORDNO>
...
<AMOUNT>50</AMOUNT>
<TRX_AMOUNT>50</TRX_AMOUNT>
<SPAMOUNT>50</SPAMOUNT>
<SPBASEAMOUNT>50</SPBASEAMOUNT>
<SPLOCATIONID>Central Region--Central Region</SPLOCATIONID>
<SPDEPARTMENTID>1--Accounting</SPDEPARTMENTID>
<PREDICTIONS>
<glentryprediction>
<RECORDNO>13</RECORDNO>
<GLENTRYKEY>267</GLENTRYKEY>
<GLBATCHKEY>84</GLBATCHKEY>
<FEATUREID>GLOD</FEATUREID>
<ISOUTLIER>!</ISOUTLIER>
<REASON>This Department with this Location is unusual</REASON>
</glentryprediction>
</PREDICTIONS>
</SPLIT>
...
</glentry>
</ENTRIES>
</GLBATCH>
More information about GL Outlier Detection is available in the Sage Intacct product help.
Customization Services
Are the injections in my Smart Event condition correct?
If you are having trouble setting up a condition, it’s useful to verify that your injections are correct. You can modify the Smart Event to send you an email that provides the injections in the email body. For example, if your condition uses {!APBILL.VENDORNAME!}
, include this in your email:
The vendor name is: {!APBILL.VENDORNAME!}
Why aren’t integration codes working for picklist fields on a standard object?
Using name/value pairs for picklist fields is not supported for custom picklists on standard objects. This capability is only supported on custom picklists for custom objects (Platform Services).
Can I use a smart event to pull data from the first line of the line item section into a field in the header section?
You can create an API Smart Event on the detail line, and the event criteria can include LINE_NO = 0
(the underlying data is 0-based even though the UI starts at line 1). The API call in the API event can look something like this:
<update_potransaction key="{!PODOCUMENTENTRY.PODOCUMENT.DOCID!}">
<projectid>{!PODOCUMENTENTRY.PROJECTID!}</projectid>
</update_potransaction>
For more info, check out some of the Customization Services Smart Event examples and Smart Rule examples.
If you only need this information in the printed PDF, you can get creative with Microsoft Word merge field codes. A SET field nested in an IF statement looking for the first line does the trick. See the Microsoft documentation on merge fields for more information.
How can I restrict a record to only be created privately in an entity, instead of at the root/top level?
Check out the Prevent creating records at the top level
section in the Customization Services Smart Rule examples.
Platform Services
How do I get the targets of to-one relationships when working with dimension restrictions?
The getDimensionRestrictedData
function lists the IDs of related dimensions that are the target(s) of to-many relationships from the source dimension, but does not list the related dimensions that are the targets of to-one relationships. Consider the following example, which shows the relationships for three UDDs.
The following call on the PARTNER_TYPE
dimension with the value of Full Service
returns the IDs for all the PARTNERS that are the targets of to-many relationships:
<getDimensionRestrictedData>
<DimensionValue>
<dimension>PARTNER_TYPE</dimension>
<value>Full Service</value>
</DimensionValue>
</getDimensionRestrictedData>
Three PARTNER
dimension values are returned (by ID), but no LINE_OF_BUSINESS
values are:
<RestrictedData>
<dimension>PARTNER</dimension>
<value>10008</value> <!-- Almanido LLP PARTNER -->
<value>10122</value> <!-- BigBoy LLP PARTNER -->
<value>10009</value> <!-- Sarderra PARTNER-->
</RestrictedData>
To get to-one relationships, list the dimensions using readByQuery
and look for related fields (Rfields) in the output that were not listed by getDimensionRestrictedData
. For example, to list all PARTNER_TYPE
dimensions:
<readByQuery>
<object>PARTNER_TYPE</object>
<fields>*</fields>
<query/>
<pagesize>100</pagesize>
</readByQuery>
The results for the Full Service
dimension show that the Rline_of_business
to-one relationship has the Channel
dimension value. The Rpartner
field lists the three names of the PARTNER
dimension values whose IDs were previously returned by getDimensionRestrictedData
:
<partner_type>
<name>Full Service</name>
<comment></comment>
...
<Rline_of_business>Channel</Rline_of_business>
<Rpartner>Almanido LLP, Sarderra, BigBoy LLP</Rpartner>
...
</partner_type>
How do I set relationship values for dimensions, custom objects, or standard objects?
Continuing with our example (from above):
You might set a to-one relationship from the given PARTNER_TYPE
to the target LINE_OF_BUSINESS
as follows:
<update>
<PARTNER_TYPE>
<id>10120</id>
<Rline_of_business>10002</Rline_of_business>
</PARTNER_TYPE>
</update>
You can also set the values of a to-many relationship from the given LINE_OF_BUSINESS
to the target PARTNER_TYPE
records:
<update>
<LINE_OF_BUSINESS>
<id>10002</id>
<Rpartner_type>10005,10006,10007</Rpartner_type>
</LINE_OF_BUSINESS>
</update>
If you read the LINE_OF_BUSINESS
record, you can see the values you just set:
<LINE_OF_BUSINESS>
<name>Direct</name>
<comment></comment>
...
<Rpartner_type>Services, Software, Full Service</Rpartner_type>
...
You can typically use these approaches when setting relationships between custom and standard objects. For example, the following sets multiple target TEST_OBJECT
records on the given APBILL
:
<update>
<APBILL>
<recordno>259</recordno>
<RTEST_OBJECT>10027,10032</RTEST_OBJECT>
</APBILL>
</update>
Construction Application
How do I interpret fields for Purchasing or Order Entry transactions that accept change orders? (Construction subscription)
When you read
a source Purchasing or Order Entry transaction in the API, new output parameters help identify the changes that led to the current state:
Transaction (header) fields:
HASCHANGE
istrue
if there are draft or posted change orders to this transaction. Once change orders have been applied, the amounts or dimensions for the source transaction cannot be modified with anupdate
call, nor can you delete the source transaction. However, you can submit additional change orders.REVISEDTOTAL
is the total base currency amount including line items and subtotal amounts.REVISEDSUBTOTAL
is the total base currency amount for line items only.TRX_REVISEDTOTAL
is the total transaction currency amount including line items and subtotal amounts.TRX_REVISEDSUBTOTAL
is the total transaction currency amount for line items only.POSTEDCHANGESTOTAL
is the sum of all amounts posted to this source transaction by change orders.
Transaction line fields:
REVISEDUNITQTY
is the original quantity (before applying the unit of measure) plus changes from posted change order lines.REVISEDQTY
is the original quantity (after applying the unit of measure) plus changes from posted change order lines.DRAFTCHANGEUNITQTY
is sum of all the quantities (before applying the units of measure) of all draft change order lines.DRAFTCHANGEQTY
is sum of all the quantities (after applying the units of measure) of all draft change order lines.REVISEDUNITVALUE
is the revised extended price.REVISEDVALUE
is the revised base currency extended price.TRX_REVISEDVALUE
is the revised transaction currency extended price.REVISEDUNITPRICE
is the revised price.REVISEDPRICE
is the revised base currency price.TRX_REVISEDPRICE
is the revised transaction currency price.DRAFTCHANGEPRICE
is the sum of the price values of all applicable lines in draft change orders whereconversiontype
isPrice
.POSTEDQTYCHANGES
is the sum of the quantity values of all applicable lines in posted changes orders whereconversiontype
isQuantity
.POSTEDCHANGEEXTPRICE
is the sum of the price values of all applicable lines in posted change orders whereconversiontype
isPrice
.POSTEDCHANGEEXTBASEPRICE
is the sum of the base price values of all applicable lines in posted change orders whereconversiontype
isPrice
.
Accounting terminology for non-US countries
How do I map accounting terms from my country to US accounting terms?
Refer to the mapping table in the Sage Intacct product help (AU, GB only).
Miscellaneous
How can I search across the Sage Intacct Developer Community group?
-
Click the search icon (magnifying glass) in the upper right of the Sage Intacct Developers group page.
-
On the resulting page, click Search Feeds on the left, provide the search term, then click Search Feeds, which is now on the right side: