Suite Talk Web Services Platform Guide
Suite Talk Web Services Platform Guide
Platform Guide
September 30, 2009
Version: 2009.2.0
Copyright NetSuite, Inc. 2009 All rights reserved.
SuiteTalk Platform Guide - Version 2009_2
September 30, 2009
This document is the property of NetSuite, Inc., and may not be reproduced in whole or in part without
prior written approval of NetSuite, Inc.
Trademarks
The following marks are registered trademarks or service marks of NetSuite, Inc. in the United States and
other countries.
• NETSUITE
• The "N" in NetSuite Logo
• SUITESCRIPT
• SUITEFLEX
• ONE SYSTEM. NO LIMITS.
• PREMIER PAYROLL SERVICE
OpenAir is a trademark of OpenAir Inc.
Other trademarks and service marks used or referenced in this document are the property of their
respective owners and are hereby acknowledged.
Contents
Chapter 6 Types
Task IDs
The SuiteTalk Platform provides programmatic access to your NetSuite data and business
processes through an XML-based application programming interface (API). Generally
speaking, the SuiteTalk Platform has the following characteristics:
• SOAP encoded Web services: the SuiteTalk Platform uses SOAP-based Web services
with document style, or Doc style, encoding.
Doc style encoding consists of message-oriented exchanges where an XML schema
specified within the SOAP message defines the structure of any messages sent between
two applications. RPC exchanges are NOT supported.
• HTTPS Transport: currently the only transport supported is HTTPS as defined in the
WSDL document.
All of the following material pertains to the SuiteTalk 2009.2 WSDL, and provides an overview
of the SuiteTalk Platform with detailed requirements and sample code for each of the core Web
services operations.
For a list of NetSuite records that are supported in Web services development, see the SuiteTalk
(Web Services) Records Guide in the NetSuite Help Center.
Important: Although the material in this guide pertains to the 2009.2 WSDL, NetSuite
continues to support endpoints released prior to 2009.2.
In this Guide
This manual contains the following sections:
Chapter 1 "SuiteTalk Platform Overview": provides a general overview of this guide, Web
services and the NetSuite WSDL, and the NetSuite Web services governance model.
Chapter 2 "Getting Started": provides steps for quickly getting your Web services development
environment set up to create your first service. It also describes how to modify or set Web
services preferences. This section also describes general concepts that pertains to SuiteTalk
development.
Chapter 3 "Understanding NetSuite Roles and Permissions": defines the concept of a role
within NetSuite and the necessity of providing a role ID during authentication. This section
also describes how to assign a default role to a Web services user as well as how to set a “Web
Services Only” role for a user.
Chapter 4 "Web Services Processing": describes how to process requests synchronously versus
asynchronously. Also provided are steps for monitoring your web services requests.
Chapter 5 "Platform Features": describes basic features of the SuiteTalk Web Services Platform,
including all aspects related to security, session management, the Web Services Concurrent
License, and working with internal and external IDs.
Chapter 6 "Types": describes the various types available in the SuiteTalk Platform.
Chapter 7 "Web Services Operations": describes each operation that can be performed through
Web services and provides SOAP, C# and Java code samples.
Chapter 8 "Web Services Error Handling and Error Codes": provides tables of possible SOAP
faults, fault status codes and error status codes that can be thrown for a given request.
NetSuite defines WSDL versioning, the location of schemas, namespaces, and the endpoint as
follows:
WSDL: https://webservices.netsuite.com/wsdl/v2009_2_0/netsuite.wsdl
<xsd:import namespace="urn:core_2009_2_0.platform.webservices.netsuite.com"
schemaLocation="https://webservices.netsuite.com/xsd/platform/v2009_2_0/core.xsd"/>
<port name="NetSuitePort" binding="tns:NetSuiteBinding">
<soap:address location="https://webservices.netsuite.com/servicesNetSuitePort_2009_1_0" />
</port>
Note: For more information on WSDL versioning, upgrading, and testing, see NetSuite
WSDL Versioning in the NetSuite Help Center. For all supported WSDL versions and
supporting documentation, see the SuiteTalk archives in the Developer Resources
section of the NetSuite Web site.
The WSDL is composed of numerous NetSuite-specific types that are defined in related XSDs.
Each XSD URL has an alias that can be used as a reference to the corresponding XSD file. The
following tables show the organization of the XSD files.
URL Alias
https://webservices.netsuite.com/xsd/platform/v2009_2_0/core.xsd platformCore
https://webservices.netsuite.com/xsd/platform/v2009_2_0/ platformMsgs
messages.xsd
https://webservices.netsuite.com/xsd/platform/v2009_2_0/faults.xsd platformFaults
https://webservices.netsuite.com/xsd/platform/v2009_2_0/ platformCom
common.xsd mon
Schema
URL Record Types
Alias
https://webservices.netsuite.com/xsd/activities/v2009_2_0/ actSched ContactCategory
scheduling.xsd CustomerCategory
SalesRole
PriceLevel
WinLossReason
Term
NoteType
PaymentMethod
CalendarEvent
CalendarEventSearch
CalendarEventSearchAdvanced
Task
TaskSearch
TaskSearchAdvanced
PhoneCall
PhoneCallSearch
PhoneCallSearchAdvanced
ProjectTask
https://webservices.netsuite.com/xsd/general/v2009_2_0/ generalCom Note
communication.xsd m NoteSearch
NoteSearchAdvanced
Message
MessageSearch
MessageSearchAdvanced
https://webservices.netsuite.com/xsd/lists/v2009_2_0/ listMkt Campaign
marketing.xsd CampaignSearch
CampaignSearchAdvanced
CampaignCategory
CampaignAudience
CampaignFamily
CampaignSearchEngine
CampaignChannel
CampaignOffer
CampaignResponse
CampaignVertical
CampaignSubscription
PromotionCode
PromotionCodeSearch
PromotionCodeSearchAdvance
d
Schema
URL Record Types
Alias
https://webservices.netsuite.com/xsd/lists/v2009_2_0/ listAcct ContactCategory
accounting.xsd CustomerCategory
SalesRole
PriceLevel
WinLossReason
Term
NoteType
PaymentMethod
LeadSource
InventoryItem
DescriptionItem
DiscountItem
MarkupItem
PaymentItem
SubtotalItem
NonInventoryPurchaseItem
NonInventorySaleItem
NonInventoryResaleItem
OtherChargeResaleItem
OtherChargePurchaseItem
ServiceResaleItem
ServicePurchaseItem
ServiceSaleItem
OtherChargeSaleItem
Currency
ExpenseCategory
Account
AccountSearch
AccountSearchAdvanced
Department
DepartmentSearch
DepartmentSearchAdvanced
Classification
ClassificationSearch
ClassificationSearchAdvanced
Location
LocationSearch
LocationSearchAdvanced
State
AccountingPeriod
BudgetCategory
Schema
URL Record Types
Alias
https://webservices.netsuite.com/xsd/lists/v2009_2_0/ listAcct ItemSearchAdvanced
accounting.xsd ContactRole
Bin
BinSearch
BinSearchAdvanced
SalesTaxItem
TaxGroup
TaxType
SerializedInventoryItem
LotNumberedInventoryItem
GiftCertificateItem
Subsidiary
UnitsType
ItemSearch
SubsidiarySearch
SubsidiarySearchAdvanced
GiftCertificate
GiftCertificateSearch
GiftCertificateSearchAdvanced
PartnerCategory
VendorCategory
KitItem
AssemblyItem
SerializedAssemblyItem
LotNumberedAssemblyItem
https://webservices.netsuite.com/xsd/lists/v2009_2_0/ listRel Contact
relationships.xsd ContactSearch
ContactSearchAdvanced
Customer
CustomerSearch
CustomerSearchAdvanced
CustomerStatus
Partner
PartnerSearch
PartnerSearchAdvanced
Vendor
VendorSearch
VendorSearchAdvanced
EntityGroup
EntityGroupSearch
EntityGroupSearchAdvanced
Job
JobSearch
JobSearchAdvanced
JobType
JobStatus
Schema
URL Record Types
Alias
https://webservices.netsuite.com/xsd/lists/v2009_2_0/ listSupport SupportCase
support.xsd SupportCaseSearch
SupportCaseSearchAdvanced
SupportCaseStatus
SupportCaseType
SupportCaseOrigin
SupportCaseIssue
SupportCasePriority
Solution
SolutionSearch
SolutionSearchAdvanced
Topic
TopicSearch
TopicSearchAdvanced
Issue
IssueSearch
IssueSearchAdvanced
https://webservices..netsuite.com/xsd/lists/v2009_2_0/ listEmp Employee
employees.xsd EmployeeSearch
EmployeeSearchAdvanced
https://webservices.netsuite.com/xsd/lists/v2009_2_0/ listSite SiteCategory
website.xsd SiteCategorySearch
SiteCategorySearchAdvanced
https://webservices.netsuite.com/xsd/setup/v2009_2_0/ setupCustom CustomRecord
customization.xsd CustomRecordSearch
CustomRecordSearchAdvanced
CustomList
CustomRecordType
EntityCustomField
CrmCustomField
OtherCustomField
ItemCustomField
TransactionBodyCustomField
TransactionColumnCustomField
ItemOptionCustomField
CustomRecordCustomField
https://webservices..netsuite.com/xsd/documents/ docfileCab File
v2009_2_0/fileCabinet.xsd FileSearch
FileSearchAdvanced
Folder
FolderSearch
FolderSearchAdvanced
https://webservices.netsuite.com/xsd/transactions/ tranBank Check
v2009_2_0/bank.xsd
https://webservices.netsuite.com/xsd/transactions/ tranInvt InventoryAdjustment
v2009_2_0/inventory.xsd AssemblyBuild
AssemblyUnbuild
Schema
URL Record Types
Alias
https://webservices.netsuite.com/xsd/transactions/ tranPurch VendorBill
v2009_2_0/purchases.xsd VendorPayment
PurchaseOrder
ItemReceipt
https://webservices.netsuite.com/xsd/transactions/ tranCust CashRefund
v2009_2_0/customers.xsd CustomerPayment
ReturnAuthorization
CreditMemo
CustomerRefund
CustomerDeposit
DepositApplication
https://webservices.netsuite.com/xsd/transactions/ tranEmp TimeBill
v2009_2_0/employees.xsd TimeBillSearch
TimeBillSearchAdvanced
ExpenseReport
https://webservices.netsuite.com/xsd/transactions/ tranFin Budget
v2009_2_0/financial.xsd BudgetSearch
BudgetSearchAdvanced
https://webservices.netsuite.com/xsd/transactions/ tranSales Opportunity
v2009_2_0/sales.xsd OpportunitySearch
OpportunitySearchAdvanced
SalesOrder
TransactionSearch
TransactionSearchAdvanced
ItemFulfillment
Invoice
CashSale
Estimate
https://webservices.netsuite.com/xsd/transactions/ tranGeneral JournalEntry
v2009_2_0/general.xsd InterCompanyJournalEntry
Example
For example, the addRequest message type has three levels of referencing.
platformCore XSD
addRequest
Record
Notice that the element called platformMsgs:add is not contained in the WSDL itself but is
referenced from the related platformMsgs XSD file. In this case, the platformMsgs alias refers
to the xsd file at:
https://webservices.netsuite.com/xsd/platform/v2009_2_0/messages.xsd
In this file, the addRequest element is defined again as:
<complexType name="AddRequest">
<sequence>
<element name="record" type="platformCore:Record" />
</sequence>
</complexType>
Again there is a reference that is not contained in this XSD file called platformCore:Record.
The platformCore alias refers to the xsd file at:
https://webservices.netsuite.com/xsd/platform/v2009_2_0/core.xsd
The abstract type Record is defined as:
<complexType name="Record" abstract="true">
<sequence>
<element name="nullFieldList" type="platformCore:NullField" minOccurs="0" maxOccurs="1" />
</sequence>
</complexType>
Note: In the SuiteTalk Platform, Record is the base for all record types.
version, see the SuiteTalk documentation or go to the Developer Resources section of the
NetSuite Web site.
NetSuite will issue an end-of-life announcement one year prior to retiring a WSDL. NetSuite
will also contact all customers using the version to be retired. Note that if you do not upgrade
when your WSDL is retired, your integrations may cease to run as intended and the endpoint
for that version may be shut down.
Peak Hours
Operation
Record Count
(on a per request basis)
Add 100
Update 50
Delete 100
Search Page Size 500
Off-Peak Hours
Operation
Record Count
(on a per request basis)
Add 200
Update 100
Delete 200
Search Page Size 1000
Asynchronous Operations
Record limits for asynchronous requests are the same regardless of whether they are sent
during peak or off-peak hours.
Operation
Record Count
(on a per request basis)
Add 400
Update 200
Delete 400
Search Page Size 2000
Request limiting is also governed by your License agreement, but in general, no more than 1
long or 3 short requests can occur concurrently on a single account.
Note that request limiting also pertains to the size of your SOAP request. The size of a request
cannot exceed 10M. If the request size exceeds 10M, an ExceededRequestSizeFault is thrown.
Vocabulary
You should be familiar with the following terms before implementing SuiteTalk integration
technology.
• Type: A type is an element defined in the XML Schema.
• Record Type: A NetSuite business record type, such as customer, event, or custom
record, that has an entry form in the user interface (UI).
• Search Record Type: A type that encapsulates the available search criteria for a given
NetSuite business record type.
• System: The NetSuite application.
These sections provide the basic information you need to get started with the SuiteTalk
Platform.
• Quick Start: provides step-by-step instructions on how to setup your Web services
environment and start building applications to interface with the SuiteTalk Platform.
Also includes a section that describes how to run a sample application provided by
NetSuite.
• Setting Web Services Preferences: describes how to set preferences specific to the
SuiteTalk Platform and in your SOAP requests.
• General Concepts: provides information about the NetSuite data model that is useful
to consider when building your own applications to interface with the SuiteTalk
Platform.
Before building a Web services application to interface with the SuiteTalk Platform, the Web
services feature must be enabled in your NetSuite account. See “Enabling the Web Services
Feature” on page 29.
Once you have enabled Web services in your account, you must set your Web services
preferences. See “Setting Web Services Preferences” on page 37.
Quick Start
This section provides details on using Microsoft .NET or Java to build an application that uses
NetSuite Web services. This section covers the following areas:
• SuiteTalk Development Considerations
• Enabling the Web Services Feature
• Building an Application with Microsoft .NET
• Building an Application with Java using Apache Axis
• Downloading Sample Applications
Notes:
• For information on working with SuiteTalk and PHP, see Using Web Services with
PHP.
• Although some customers have built SuiteTalk applications using Perl, currently Perl is
not offically supported by NetSuite.
Visual Studio inspects the WSDL and displays a summary of the available
operations.
Note: Although the material in this guide pertains to the 2009.1 WSDL, NetSuite
continues to support endpoints released prior to version 2009.1.
e. Click Add Reference to generate the classes.
Once complete, you can view these classes in the Solution Explorer by expanding
the Web Reference icon.
The generated proxy classes are available in a file named Reference.cs. In order to
view this file, you may first need to enable the Show All Files option under the
Project menu.
If using only the Microsoft .NET Framework SDK (NOT recommended):
a. Locate the wsdl.exe file under the Microsoft .NET Framework SDK installation
and add it to your system path.
b. Open a command prompt, and type the following to generate the proxy classes:
wsdl /language:<language>cs <url>
Where <language> is your preferred language and <url> is the URL for the
NetSuite WSDL.
For example, generate the proxy classes in C# as follows:
C:\project>wsdl /language:cs https://webservices.netsuite.com/wsdl/
v2008_1_0/netsuite.wsdl
A C# file called NetSuiteService.cs is generated.
c. Compile the source code for your proxy into a .NET Assembly using the .NET
Framework C# compiler or any other supported compiler.
d. Locate the csc.exe file under the Microsoft .NET Framework SDK installation and
add it to your system path.
csc.exe /out: NetSuiteService.dll /target:library
reference:system.xml.serialization.dll /
reference:system.web.services.dll
NetSuiteService.cs
3. Implement your application by writing your business logic using the generated .NET
proxy classes.
Note that the following code snippets are shown in C#.
a. Instantiate the NetSuite service.
NetSuiteService service = new NetSuiteService();
d. Implement your business logic. For example, create a new customer in NetSuite.
6. Ensure that the Ant executables are available on the system path. Run the Ant task as
follows:
ant generate.interfaces
7. Implement your application by writing your business logic using the generated axis
proxy classes.
a. Locate the NetSuite service.
NetSuiteServiceLocator service = new NetSuiteServiceLocator();
d. Create a valid session by populating the Passport object and then invoking the
login operation.
passport.setEmail( "username@netsuite.com" );
passport.setPassword( "mypassword" );
role.setid( "3" );
passport.setRole( role );
passport.setAccount( "TSTDRV96" );
Status status = port.login( passport ).getStatus();
e. Implement your business logic. For example, create a new customer in NetSuite.
Customer cust = new Customer();
cust.setEntityID( “XYZ Inc” );
WriteResponse response = port.add( cust );
4. Choose where to send your requests when you create your client object by adding one
of the following statements:
Problem Solution
The following error is returned when Edit the php.ini file by uncommenting
attempting to send requests over https: "extension=php_openssl.dll" under Dynamic Extensions
Fatal error: Uncaught SoapFault exception: Make sure that libeay32.dll and ssleay32.dll files are in your
[WSDL] SOAP-ERROR: Parsing WSDL: path. In Windows you can do this by copying the files to your
Couldn't load from 'https:// System32 folder.
webservices.netsuite.com/wsdl/
v2009_1_0/netsuite.wsdl'
The following time out error is returned: Edit the php.ini file and change max_execution_time - 30 (or
Fatal error: Maximum execution time of 30 default value) to 200
seconds exceeded
The following error message is returned: Edit the php.ini file and by setting default_socket_timeout =
Debug Error: Uncaught SoapFault 200
exception: [HTTP] Error Fetching http
headers
The following error message is returned: Open the php.ini file and edit error_reporting. Set it to
Warning: It is not yet possible to assign E_ERROR instead of E_ALL
complex types to properties
The execution of script stops and error was Open the php.ini file and set error_reporting = E_ERROR &
not shown, or notices are being shown on ~E_NOTICE
the page
The following error is returned: Open the php.ini file and set memory_limit = 80M
Fatal error: Allowed memory size of
8388608 bytes exhausted (tried to allocate
3024 bytes)
Problem Solution
Performance issue: Look for property soap.wsdl_cache_dir in the php.ini file and
Every time a web services request executes, make sure that the specified folder ("/tmp" -> c:\tmp) exists in
PHP performs a GET on the wsdl. the host.
You have made a change in your php.ini file, Make sure that the php.ini properties exist only once in the file
yet the value you set is not respected. (in other words, make sure error_reporting is defined only
once).
Using SOAPScope
Mindreef ’s SOAPScope utility allows you to capture and analyze SOAP request and response
messages associated with an operation call. To use SOAPScope with a NetSuite Web services
client, follow the instructions in this section to set up SOAPScope’s SSL forwarding feature.
Mindreef ’s SOAPscope 4.1's SSL forwarding feature allows you to use SOAPscope to capture
SOAP traffic over SSL/TLS/HTTPS, logging the messages in cleartext while still using
encryption between the client and server.
Note: You can also use SOAPScope to manually invoke requests for a specific operation. When
invoking requests from within SOAPScope, remember that you must first submit the login operation
just as with any other web services application. Also, to deselect all optional elements for a record,
hit CTRL/Click on any element to deselect it’s siblings.
To set up SOAPScope:
1. Install SOAPscope 4.1
You can obtain a trial version of SOAPscope at:
http://www.mindreef.com/order/eval.php?partner=NETSUITE02
2. Configure SOAPScope.
To use the SSL Forwarding feature, you must configure SOAPscope to listen for SSL
traffic on a specified port. When your client connects to that port, SOAPscope
decrypts the data, logs it, re-encrypts it and forwards the data to and from the Web
service. SOAPscope uses a self-signed SSL certificate to validate the forwarding socket.
However, most client applications treat a self-signed certificate as untrusted, because it
has not been signed by a trusted Certificate Authority, and will refuse the connection.
Therefore your client app may need to be modified slightly to allow it to connect.
Modifying a .NET/C# client application:
• Add the following class to your code:
class OverrideCertificatePolicy : ICertificatePolicy
{
public bool CheckValidationResult(ServicePoint srvPoint,
System.Security.Cryptography.X509Certificates.X509Certificate certificate,
WebRequest request, int certificateProblem)
{
return true;
}
}
5. Restart SOAPscope.
6. Compile your Web Services client and run.
you turn off system generated notes for custom fields, specific changes related to
custom fields within the imported record are NOT recorded in NetSuite. All changes
for standard fields are logged as usual. Therefore, if a custom field contains sensitive
information that is critical for audit purposes, you should NOT disable system
generated notes.
• Disable Client SuiteScript: When enabled, Client SuiteScript is not run during a Web
services operation. The default setting is TRUE.
Important: If you have enabled this preference and are experiencing unexpected
errors during a Web services operation on a form that has Client SuiteScript associated
with it, disable Client SuiteScript and then run the operation again to verify if Client
SuiteScript is the cause of the problem.
• Disable Server SuiteScript: If you are doing a historical import, it is recommended
that you disable Server SuiteScript. If you are syncing live data or running a partner
application (for example, Outlook Sync) it is recommended that you enable Server
SuiteScript to ensure your business logic is run for your integrated application. Note
that running Server SuiteScript will have a negative performance impact.
Important: To ensure that certain business logic is always executed for your integrated
processes, use Server SuiteScript instead of Client SuiteScript for a more robust
implementation.
Important: You can NOT change the default behavior of calculated fields. Calculated fields are
always reset when related fields are changed. However, you can override the value of the
calculated field by submitting a value for that field in the request. Also, some fields within
NetSuite are set as having slaving performed regardless of any default settings — the slaving
values are mandatory. For these fields, unless a value is explicitly set, the field value is set as
defined in the slaving definition regardless of default settings.
Example
When updating an Opportunity transaction, a change to the Status field causes the Probability
field to automatically default to a new conditional default value. However, the Probability field
can also be overridden by the user. Therefore, in a Web services implementation, if the
Probability field has already been adjusted based on information unknown to the NetSuite, it
may be undesirable to have the field automatically populated with the conditional default
value.
Note: Endpoints prior to version 2.0.0 also included a Use Defaults preference. If enabled, this
preference allowed the use of Default values for records. If not enabled, default values were not
set, forcing the Web services application to provide all required values. When upgrading to
version 2.0.0 or later from an earlier endpoint, you must adjust your code accordingly since this
preference is no longer available.
• warningAsError
• useConditionalDefaultsOnAdd
• useConditionalDefaultsOnUpdate
• disableMandatoryCustomFieldValidation
• disableSystemNotesForCustomFields
• ignoreReadOnlyFields (see “Setting the ignoreReadOnlyFields Preference” on
page 42 for details)
• Set the header (Java Only)
• If executing a search, set your search preferences. To set search preferences, create a
SearchPreferences object and set available search preference elements. See “Setting
Search Preferences” on page 42.
Sample Code
SOAP Request
<soap:Header>
<platformMsgs:preferences>
<platformMsgs:warningAsError>true</platformMsgs:warningAsError>
<platformMsgs:useConditionalDefaultsOnAdd>true</platformMsgs:useConditionalDefaultsOnAdd>
<platformMsgs:useConditionalDefaultsOnUpdate>true
</platformMsgs:useConditionalDefaultsOnUpdate>
<platformMsgs:disableMandatoryCustomFieldValidation>true
</platformMsgs:disableMandatoryCustomFieldValidation>
<platformMsgs:disableSystemNotesForCustomFields>true
</platformMsgs:disableSystemNotesForCustomFields>
</platformMsgs:preferences>
</soap:Header>
C#
In this example, a SearchPreference object is set as well as a warnAsError object. See “Setting
Search Preferences” on page 42 for more information on the SearchPreference object.
// Set up request level preferences as a SOAP header
Preferences prefs = new Preferences();
_service.preferences = prefs;
// Preference to ask NS to treat all warnings as errors
prefs.warningAsErrorSpecified = true;
prefs.warningAsError = false;
// Invoke search() web services operation
_service.searchPreferences.pageSize = 20;
_service.searchPreferences.pageSizeSpecified = true;
SearchResult response = _service.search( custSearch );
Java
private void setPreferences() throws SOAPException
{
stub = (NetSuiteBindingStub) _port;
stub.clearHeaders();
SOAPHeaderElement prefHeader =
stub.setHeader(prefHeader);
}
Note: For information and code samples regarding setting additional request-level preferences
not related to search, see “Setting Request Level Preferences” on page 40.
Returning Body Fields Only
When performing searches on records, by default only the body fields are returned only. To
return field (line item) values for all sublists on a record, you must set the bodyFieldsOnly
element to FALSE.
It is recommended that the default settings are used wherever sublist values are not necessary
since this significantly improves performance.
Pagination
Pagination breaks up a large number of records that are part of a search result set into smaller
pages. You then have the ability to retrieve these pages of records one at a time. Pagination is
used mainly to make processing large result sets earier and more manageable.
There are two different ways for a page size to be determined:
• System-defined maximum page size: This is set to 1000 records for synchronous Web
service requests by default
• User-defined page size parameter: The pageSize element in the searchPreference type
is used to specify a value for the page size. The value must be greater than 10 and less
than the system-defined maximum of 1000.
If the number of records for the search results exceeds the page size, the remaining results must
be retrieved in a subsequent operation using the searchMore operation.
Returning Search Columns
When executing an advanced search, you can set the SearchPreferences.returnSearchColumns
preference to TRUE to ensure that only search return columns are returned in a search. An
error is thrown if returnSearchColumns is set to TRUE and you have not specified search return
columns in your request. Note that in an advanced search, the bodyFieldsOnly preference is
ignored.
The default value for returnSearchColumns is TRUE.
For information on advanced search in Web services, see “Advanced Searches in Web Services”
on page 193.
Sample Code
Java
In this example, a SearchPreference object is instantiated and search preferences are set.
NetSuiteBindingStub stub = (NetSuiteBindingStub)aPort;
stub.clearHeaders();
SOAPHeaderElement searchPrefHeader = new
SOAPHeaderElement("urn:messages_2008_1_0.platform.webservices.netsuite.com",
"searchPreferences");
SearchPreferences searchPrefs = new SearchPreferences();
searchPrefs.setPageSize(new Integer(nPageSize));
searchPrefs.setBodyFieldsOnly(isBodyFieldsOnly);
searchPrefHeader.setObjectValue(searchPrefs);
stub.setHeader(searchPrefHeader);
General Concepts
Understanding NetSuite Features
The NetSuite UI allows you to enable or disable certain features. When designing your Web
services, it is important to know which features must be enabled in order for the service to
execute properly. If the service calls for a function which is NOT available because the
associated feature is disabled, a SOAP InsufficientPermissionFault occurs causing the entire
service to fail.
For example, in the NetSuite UI you can enable or disable the Opportunities feature for CRM.
If disabled, a Web service call to add an OpportunityItem will fail.
Web services is itself a feature that must be enabled prior to submitting Web services requests.
To enable the NetSuite Web Services feature, see “Enabling the Web Services Feature” on
page 29.
Note: For all record types that support custom forms, if a form is specified in the WS request, then
that form is used for validation. If a form is NOT specified then the default preferred form for that
record or transaction is used. If a custom form is saved with a record in the UI, that form is not used in
the Web services request unless it is also the default form for that record type or is explicitly set as
the form in the Web services request.
When working with sublists, the method for searching on, updating, or replacing sublists
varies depending on whether the sublists are Keyed Sublists or Non-keyed Sublists.
Important: Be aware that when searching records, by default sublists are NOT returned in the result
set, which increases the search response time. However, if you want to return all sublist data in your
search, set the SearchPreferences.bodyFieldsOnly preferences to FALSE in your search request. For
more details, see Setting Search Preferences.
Keyed Sublists
These sublists have a line field (typically on transaction sublists). Individual lines in the list can
be searched for by referencing the line value. For example, the Items sublist
(OpportunityItemList) on the Opportunity record is a keyed sublist.
The value of the replaceAll attribute on keyed sublists determines the behavior of your request
for these sublists.
• replaceAll = TRUE: When set to TRUE, the existing sublist is replaced with the line
items submitted in your Web services request. Lines that do not match the newly
submitted lines will be removed. Currently existing lines that match the new sublist
submission will be updated.
• replaceAll = FALSE: When set to FALSE, line items in your Web services request are
added to the existing list. If you specify a value for the line field on a specific line item,
then that line is updated in the existing list.
Note: The line field simply references the existing lines numerically, starting at one.
The default value for replaceAll is TRUE.
Example
For example, suppose you want to add an item to an Opportunity record and modify an
existing item in that record. To do this, set replaceAll to FALSE, add the new item, and modify
the existing item by referencing the desired item in the line field. In the following code, the
existing line item is modified to change the quantity.
<soapenv:Body>
<platformMsgs:update xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:s0="urn:sales_2008_1_0.transactions.webservices.netsuite.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:platformMsgs="urn:messages_2008_1_0.platform.webservices.netsuite.com">
<platformMsgs:record xsi:type="s0:Opportunity" internalId="1638">
<s0:itemList replaceAll="false">
<s0:item>
<s0:item internalId="380" type="inventoryItem" />
<s0:quantity>1.0</s0:quantity>
<s0:amount>20.0</s0:amount>
</s0:item>
<s0:item>
<s0:line>2</s0:line>
<s0:quantity>10.0</s0:quantity>
</s0:item>
</s0:itemList>
</platformMsgs:record>
</platformMsgs:update>
</soapenv:Body>
Important:
• When working with the addressbookList on the Customer record, use the internalId
field as the key for entity addressbook updates. Do not use the label field.
• Also note that the subscriptionsList sublist on the Customer record can be updated.
Use the replaceAll flag to update specific lines in this sublist, using subscription as the
key. Be aware that Web services updates to this sublist follow the logic that is permitted
in the NetSuite UI. Once an entity is unsubscribed from a category, only the entity
itself can re-subscribe.
• For more general information on working with customer sublists, see Working with
Customer Sublists in the NetSuite Help Center.
Non-keyed Sublists
These sublists have no line field or internalId element. The lines are recorded in flat lists. For
example, the Sales Team sublist (CustomSalesTeamList) on the Customer record does not have
a key or internalId.
Since these sublists are NOT keyed, you can NOT update a specific line in the sublist. Instead,
you must interact with the sublist as a whole. In this way an update operation is similar to the
add operation with respect to sublists, and the replaceALL attribute is always assumed to be
TRUE.
Important: For Non-keyed sublists, the replaceAll attribute is ignored and behaves as if it were
TRUE for all requests.
Example
Suppose you want to modify the addressbookList associated with a Customer record.
• To update a single address in the sublist, retrieve the entire sublist of addresses, change
a single address as desired, and then resubmit the entire sublist.
• To replace the addressbookList with a subset of addresses, retrieve the entire sublist,
and then resubmit the subset of addresses. The original addressbookList is purged and
replaced by the new sublist containing the subset of addresses.
• To delete the addressbookList, submit an empty sublist.
Note: When adding or updating an addressbookList entry, ensure that you do NOT set the
internalId field as this is read-only.
Example Code
The addressbookList refers to the ContactAddressbookList type:
<xsd:complexType name="Contact">
<xsd:complexContent>
<xsd:extension base="platformCore:Record">
<xsd:sequence>
<xsd:element name="entityId" type="xsd:string" minOccurs="0"/>
...
<xsd:element name="addressbookList"
type="listRel:ContactAddressbookList"
minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="id" type="xsd:string"/>
</xsd:extension>
<!-- primary record key -->
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="ContactAddressbookList">
<xsd:sequence>
<xsd:element name="addressbook" type="listRel:ContactAddressbook"
minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:attribute name="replaceAll" type="xsd:boolean" default="true"/>
</xsd:complexType>
SOAP
<update xmlns="urn:messages_2_5.platform.webservices.netsuite.com">
<record internalId="724" xsi:type="ns1:Customer"
xmlns:ns1="urn:relationships_2_5.lists.webservices.netsuite.com">
<ns1:addressbookList replaceAll="true" xsi:type="ns1:CustomerAddressbookList"/>
</record>
</update>
The next sample shows how to delete all line items from the Item sublist (OpportunityItemList)
on an Opportunity record.
Java
Opportunity update = new Opportunity();
update.setInternalId(opp.getInternalId());
update.setItemList(new OpportunityItemList(new OpportunityItem[0], true));
SOAP
<update xmlns="urn:messages_2_5.platform.webservices.netsuite.com">
<record internalId="6147" xsi:type="ns1:Opportunity"
xmlns:ns1="urn:sales_2_5.transactions.webservices.netsuite.com">
<ns1:itemList replaceAll="true" xsi:type="ns1:OpportunityItemList"/>
</record>
</update>
NetSuite provides many standard roles with predefined permissions. A role is a set of
permissions that allows customers, vendors, partners and employees access to specific aspects
of your data. Each role grants access at a certain level for each permission.
When logging in using Web services you may provide a role id along with your credentials.
The role id that you provide must have Web services permissions, otherwise an
INSUFFICIENT_PERMISSION error is returned. If no role id is provided, then the user’s
default role is used. If the default role does NOT have Web services permissions, then a
ROLE_REQUIRED fault is returned.
The following topics are provided in this section. They do not need to be read in order.
However if you are new to NetSuite Web services, it is recommended that you read each topic
to understand how NetSuite roles and permissions apply in a Web services context.
• Role and Permission Considerations When Developing in SuiteTalk
• “Assigning the Web Services Permission to a Role” on page 52
• “Setting a Default Role for a Web Services User” on page 52
• “Setting a Web Services Only Role for a User” on page 53
• “Customer Center, Vendor Center, and Partner Center Roles” on page 54
• “Internal IDs Associated with Roles” on page 55
The solution to these problems is to define a custom role and custom forms for the SuiteTalk
application. The custom role should have the correct access permissions and operations
permissions that the SuiteTalk application needs. The custom forms should give access to fields
and sublists that are relevant to the SuiteTalk application. All SuiteTalk supported records have
a customForm field for the application to reference specific custom forms.
Best Practice: During testing phase, QA engineers should test SuiteTalk applications using the
intended role(s), in addition to the administrator role, to catch permission-related defects.
• First, any role specified in the Passport object of the request is used. The role defined
here must be a valid role contained in the Employee record of the given user. (For
information on the Passport object, see “login” on page 174. The Passport object is
defined in the platformCore XSD.)
• If a role preference is not set at the request level, then any default Web services role as
defined in the Web Services Preference page for the given user is used.
Only one default Web services role can be assigned per user and only roles that contain
the Web services permission can be specified as a default Web services role. Note that
the user may be assigned a different role than those specified in their Employee record.
In other words, a user may have greater or lesser permissions using Web services as
compared to the UI.
• If neither the request nor the Web services default role is set, then the user’s default UI
role is used, provided it has the Web services permission.
Note: All standard roles have the Web services permission by default when the Web
services feature is enabled. Custom roles, however, must be explicitly set to have Web
services permissions.
To set a specific default role for a Web services user:
1. Click Setup > Integration > Web Services Preferences.
2. Select the desired user from the Name drop-down list.
3. Select the default role to use for Web services requests for this user.
Note: The internal ID for the selected role automatically populates the ID field.
4. Click Add.
5. Click Save.
Note: Your account must have the Web services feature enabled for the Web Services Only check
box to appear. See “Enabling the Web Services Feature” on page 29 for steps on enabling the Web
services feature in NetSuite.
To designate a role as Web Services Only:
1. Click Setup > Users/Roles > Manage Roles.
2. On the Manage Roles list page, select Customize next to the role you want to set as
Web Services Only.
3. Select the Web Services Only Role check box.
4. Click Save.
ID Is Settable Role
1 Y Accountant
2 Y Accountant (Reviewer)
3 Y Administrator
4 Y A/P Clerk
5 Y A/R Clerk
6 Y Bookkeeper
7 Y CEO (Hands Off )
8 Y CEO
9 Y Sales Manager
10 Y Sales Person
11 Y Store Manager
12 Y Support Manager
13 Y Support Person
14 Y Customer Center
15 Y Employee Center
16 Y Vendor Center
17 N Shopper
18 Y Full Access
19 Y Warehouse Manager
20 Y Payroll Manager
21 N Partner Center
22 Y Intranet Manager
23 Y Marketing Manager
24 Y Marketing Assistant
ID Is Settable Role
25 Y System Administrator
26 Y Sales Administrator
27 Y Support Administrator
28 Y Marketing Administrator
29 N Advanced Partner Center
30 Y NetSuite Support Center
31 N Online Form User
The response, however differs in that only information about the request is returned instead of
the actual record. You can then use the jobId to reference the request later.
Response
<soapenv:Body>
<asyncGetListResponse xmlns="urn:messages_2_6.platform.webservices.netsuite.com">
<asyncStatusResult xmlns="urn:core_2_6.platform.webservices.netsuite.com">
<jobId>ASYNCWEBSERVICES_563214_053120061943428686160042948_4bee0685</jobId>
<status>pending</status>
<percentCompleted>0.0</percentCompleted>
<estRemainingDuration>0.0</estRemainingDuration>
</asyncStatusResult>
</asyncGetListResponse>
</soapenv:Body>
checkAsyncStatus
The checkAsyncStatus operation can be used to check the status of an asynchronous Web
services submission. When a jobId is submitted, the status, percent complete, and estimated
remaining duration are returned.
Possible status values that can be returned include:
• failed
• finishedWithErrors
• pending
• processing
• finished
If the status is failed, finishedWithErrors, or finished, you can use the getAsyncResult
operation to provide the detailed of the response whether that be the record results, or error
and fault messages.
Note: The percent complete and estimated remaining duration, although generally accurate,
may vary depending on increases or decreases in database activity during the web services
processing.
Request
<soap:Body>
<platformMsgs:checkAsyncStatus>
<platformMsgs:jobId>ASYNCWEBSERVICES_563214_053120061943428686160042948_4bee0685
</platformMsgs:jobId>
</platformMsgs:checkAsyncStatus>
</soap:Body>=
Response
<soapenv:Body>
<checkAsyncStatusResponse
xmlns="urn:messages_2_6.platform.webservices.netsuite.com">
<asyncStatusResult xmlns="urn:core_2_0.platform.webservices.netsuite.com">
<jobId>ASYNCWEBSERVICES_563214_053120061943428686160042948_4bee0685</jobId>
<status>pending</status>
<percentCompleted>0.0</percentCompleted>
<estRemainingDuration>0.0</estRemainingDuration>
</asyncStatusResult>
</checkAsyncStatusResponse>
</soapenv:Body>
Faults
This operation can throw one of the following faults. See “SOAP Fault Status Codes” on
page 252 for more information on faults.
• InvalidSessionFault
• AsyncFault
• UnexpectedErrorFault
getAsyncResult
The getAsyncResult operation can be used to retrieve the results of an asynchronous web
services submission.
You can use the getAsyncResult operation up to 20 times within a 30 day time period to
retrieve the results of an asynchronous job. If this limit is exceeded, you will receive an
INVALID_JOBID user error for the following reasons:
• You cannot download results of an asynch job more than 20 times within a 30 day
period.
• You have attempted to retrieve job results that have already been purged from the
system. Async JobIDs are purged from the system every 30 days. If you attempt to
download the results 31 days after your initial request, the JobID results will no longer
exist.
Faults
This operation can throw one of the following faults. See “SOAP Fault Status Codes” on
page 252 for more information on faults.
• InvalidSessionFault
• ExceededRequestLimitFault
• ExceededUsageLimitFault
• ExceededRecordCountFault
• AsyncFault
• UnexpectedErrorFault
Note: The Web Services Usage Log does not show asynchronous requests. See Monitoring
Asynchronous Jobs in the UI for details.
The Web Services Usage Log allows users to easily filter their Web services requests by
specified date and time periods, record type, and action (operation). Results can be filtered
down to the minute. Note, however, the results that are returned provide second-level
granularity. Also note that all SOAP requests/responses accessible through the Web Services
Usage Log are accessible for 30 days.
Although non-admin roles can access the Web Services Usage Log, administrators must first
assign the Web Services permission to any non-admin. This will be necessary for
administrators working with third-party Web services developers who may need to monitor
Web services requests. For information on assigning the Web Services permission to a role, see
“Assigning the Web Services Permission to a Role” on page 52.
Web Services Integration reports are also useful for administrators who need to diagnose and
troubleshoot issues. Note that each report can be customized to display only the desired
information. To customize a report, click Customize next to the desired report and then
modify the report as desired.
Integration and Automation Usage Summary by Job
This report can be used for performance statistics. It shows the duration of each Web services
processing job, the number of records modified in each job, the number of successful versus
failed record modifications for each job, and the number of records queried for each job.
Any related SOAP files are stored in View links in the reports Request Doc and Response Doc
columns. Be aware that NetSuite purges SOAP files every 30 days.
To view the Integration and Automation Usage Summary by Job report:
Go to Reports > Integration > Integration and Automation Usage Summary by Job.
A message appears indicating that your report is loading. The status bar in the footer of the
report indicates the progress as your report loads. You can click Cancel Report next to the
status bar to stop the report from loading.
Integration and Automation Usage Summary by Record Type
This report lists the record types modified by Web services processing, and the number of
records added, updated, deleted, and queried for each record type.
To view the Integration and Automation Usage Summary by Record Type report:
Go to Reports > Integration > Integration and Automation Usage Summary by Record Type.
A message appears indicating that your report is loading. The status bar in the footer of the
report indicates the progress as your report loads. You can click Cancel Report next to the
status bar to stop the report from loading.
Note: The Job Status page does not automatically refresh. Click refresh in your browser
window to get the current status of a job.
NetSuite leverages the latest industry security standards in order to ensure high levels of
security around your business data. All Web service requests are controlled by the same
security measures used in the NetSuite UI. This includes:
• Authentication
• Authorization
• Session Management
• Encryption
Additional security-related topics include:
• PCI Compliance Password Requirements - for information on password requirements
associated with the Payment Card Industry (PCI) Data Security Standard
• Working with Custom Field Security - for information on security applied at the field
level and its affect on Web services
Authentication
Authentication is the process of determining the identity of requesters by verifying they are
who they claim to be based on the credentials they present.
Important: All Web services operations require authentication.
The SuiteTalk Platform supports two separate approaches to authentication:
1. Users can define their credentials in the Passport object and then call the login
operation during their request. This approach initiates a session that is governed by
timeout and user limits. See “Authentication Using the Login Operation” on page 64
for details.
2. Users also have the choice of sending their user credentials in the SOAP header of
every request. This approach initiates a “stateless” form of Web services
communication in which login is not invoked and timeouts do not apply. See
“Authentication Using Request Level Credentials” on page 65 for details.
<complexType name="Passport">
<sequence>
<element name="email" type="xsd:string"/>
<element name="password" type="xsd:string"/>
<element name="account" type="xsd:string"/>
<element name="role" type="platformCore:RecordRef " minOccurs="0"/>
</sequence>
</complexType>
After the requester has been successfully authenticated, a new session is created for that user.
When using the login operation to authenticate to NetSuite, user credentials are stored in
HTTP headers and a JSESSIONID is assigned to every session.
Important: In order for session information to be successfully transported in SOAP, you must
enable support for multiple cookie management in your application. For example, in Microsoft
.NET, include the following line:
<platformCore:account>000034</platformCore:account>
<platformCore:role internalId="3"/>
</platformMsgs:passport>
</soapenv:Header>
Java
private void setRequestLevelCredentials(NetSuitePortType aPort, String sEmail, String sPassword,
String sAccount, int iRole) throws SOAPException
{
NetSuiteBindingStub stub = (NetSuiteBindingStub)aPort;
stub.clearHeaders();
org.apache.axis.message.SOAPHeaderElement passportHeader = new
org.apache.axis.message.SOAPHeaderElement("urn:messages_2008_2.platform.webservices.netsuite.com",
"passport");
// use the Passport object to create credentials and add to soap header
RecordRef role = new RecordRef();
role.setInternalId(String.valueOf(iRole));
Passport passport = new Passport();
passport.setEmail(sEmail);
passport.setPassword(sPassword);
passport.setAccount(sAccount);
passport.setRole( role);
passportHeader.setObjectValue(passport);
Important: Users who send request level credentials in a search request must use the
searchMoreWithId operation to paginate through search results. See searchMoreWithId for
more information.
Authorization
Authorization is the process of ensuring that the requester has the appropriate entitlement to
perform the requested operation. When users request to be authenticated, they also provide
their NetSuite role. For every Web services request, the system uses the role definition to
ensure that the user has the required permission for the requested operation as well as the
requested record type. The role must be provided in the Passport type via the login operation:
Example
<login xmlns="urn:messages_2008_2.platform.webservices.netsuite.com">
<passport>
<ns1:email xmlns:ns1="urn:core_2008_2.platform.webservices.netsuite.com">jblow@webservices.com
</ns1:email>
<ns2:password xmlns:ns2="urn:core_2008_2.platform.webservices.netsuite.com">mypassword<
ns2:password>
<ns3:account xmlns:ns3="urn:core_2008_2.platform.webservices.netsuite.com">555555</ns3:account>
<ns4:role internalId="3" xmlns:ns4="urn:core_2008_2.platform.webservices.netsuite.com"/>
</passport>
</login>
For detailed information on NetSuite roles and permissions and how the SuiteTalk Platform
implements roles and permissions rules, refer to Understanding NetSuite Roles and
Permissions in the NetSuite Help Center.
Session Management
After a user has been successfully authenticated using the login operation, a sessionID is
created that must be passed to each subsequent request. Additional logins are not required as
long as the session is active.
In NetSuite, sessions management includes:
• Session Timeouts
• Session Limits
• Manually Managing Cookies
• Reusing Session IDs During Login
Important: The following topics pertain to sessions that have been initiated using the login
operation. Users who authenticate to NetSuite by submitting their credentials in the SOAP
header of their request should see “Authentication Using Request Level Credentials” on
page 65.
Session Timeouts
Similar to the UI, Web services sessions automatically timeout after 15 minutes of inactivity,
requiring a login to resume activity. However, if the server resubmits the cookie during the first
15 minutes, the inactivity timer is reset.
Note: If you need shorter sessions for security reasons, you should create a login route for the
client that calls logout when operations are complete.
If you explicitly logout of a session, and then attempt to use the same session, a
SESSION_TIMED_OUT error message is returned. Your code should be prepared to handle
session timeouts by retrying if an InvalidSessionFault (SESSION_TIMED_OUT) is seen.
Session Limits
A given login (username/password) is limited to two sessions, one through the browser and
one through Web services. These two sessions can occur concurrently. The UI session and the
Web services session do not cause termination of each other.
However, if two Web services clients attempt to establish two concurrent sessions, the first
session is terminated. Note that more than two independent concurrent sessions are possible
with the purchase of products such as Offline Client or Outlook Integration.
Important: Using the same login from multiple client applications, or multiple instances of the
same application is NOT supported. However, NetSuite does offer a Web Services Concurrent
License for purchase. This license allows designated employees to use the same credentials five
times concurrently before their first session is invalidated. For details see “Web Services
Concurrent License (Web Services Plus)” on page 71.
For each subsequent request, all of the cookies must be returned in the HTTP header to
maintain the session as follows:
Sample Code (C#)
NetSuiteService nss = new NetSuiteService();
nss.Url = https://webservices.netsuite.com/services/NetSuitePort_2008_1_0 ;
nss.CookieContainer = new CookieContainer();
of creating a new session. Reusing an existing session (returning the same JSESSIONID)
eliminates the overhead of generating a new session and thereby improves performance.
For multi-threaded applications, the primary benefit to session ID resuse is that a thread
executing a login does not invalidate sessions of existing threads. Instead, multiple threads
share the same reference to a session. The trade-off is that the session returned by login may be
in use, and as expected, any attempt to execute an operation with a busy session will result in a
WS_CONCUR_SESSION_DISALLWD error.
Note that the strategy for sharing a single set of credentials across threads remains the same as
it was for endpoints older than v2008.1. Because only one session can exist for a given set of
credentials, and a session cannot be used for more than one operation at a time, multiple
threads sharing those credentials should synchronize usage of the session. If collisions are not
expected often, a simpler alternative is to implement a retry strategy for operations that fail due
to a WS_CONCUR_SESSION_DISALLWD error.
Important: Be aware that session ID reuse does not apply to the following:
• Sessions managed through a Web Services Plus license. These users require multiple
JSESSIONIDs to continue their multi-threaded access through the SuiteTalk APIs.
• Users who have logged in with a different account or role than the initial (existing)
session. In this case, as expected, the first session becomes invalid, and a new session is
created. Note, however, if a role is not provided during a second login, and a session
already exists, users will assume the role of their initial session, regardless of their
settings (for example, UIdefault, WSdefault, or last role used).
Encryption
Web services communications are not viewable by a third party as they travel on the Internet.
Encryption is implemented using 128-bit encryption with HTTPS/SSL at the transport level.
No non-secure Web service requests are granted.
is set to expire passwords every sixty days, your password expiration date does not change.
However, if your company is set to expire passwords every 120 days, this setting automatically
changes to 90 days for employees using these roles.
In addition, passwords for those with access to unencrypted credit card numbers must have a
minimum of seven (7) characters. If the number of characters set in the Minimum Password
Length field on the General Preferences field is greater, that requirement also remains in effect.
All employees using roles with access to unencrypted credit card numbers will be asked to
change passwords to meet the PCI compliance requirements.
The SuiteTalk Platform refers to the software infrastructure used to expose NetSuite
application functionality via Web services. This section describes some of the core features of
the SuiteTalk Platform and includes the following sections:
• Web Services Concurrent License (Web Services Plus): provides an overview of the
Web Serivces Plus license type.
• Using Internal IDs, External IDs, and References: describes IDs and references and
how they are used.
• Invoking a UI Session from an External Application: describes how to submit an https
POST for single login between Web services applications and the NetSuite UI.
Note: Your account must have the Web services feature enabled before you can assign the Web
Services Plus License to a user. See “Enabling the Web Services Feature” on page 29 for steps on
enabling Web services.
Additionally, the Web Services Plus License offers reduced administrative overhead since
administrators only have to manage one user with five sessions compared to five separate users.
(For example, when passwords expire, administrators only have to maintain one password on
the client side rather than five.)
The RecordRef type is described by three attributes — the internal ID, external ID, and the
type:
<complexType name="RecordRef ">
<complexContent>
<extension base="platformCore:BaseRef ">
<attribute name="internalId" type="xsd:string"/>
<attribute name="externalId" type="xsd:string"/>
<attribute name="type" type="platformCoreTyp:RecordType"/>
</extension>
</complexType>
Important: When referencing records, you must provide the internalId OR the externalId
attribute for all update operations, but not both in the same operations. If both are provided,
the internalId is used to locate the record and the externalId is ignored.
Understanding ExternalIds
The externalId attribute of a recordRef provides a means to reference an object by its foreign
key in an external database.
ExternalIds can be set during an add or update operation. ExternalIds are useful in the
following situations:
• Maintaining client ID relationships
In cases where a client application already maintains references between records, set
the externalID for each record during imports. In subsequent API calls, you can then
reference associated records by the known external ID.
• Establishing relationships during a single import operation:
For example, suppose you want to import customer records with references to sales
reps into NetSuite. If no externalID is used, you would need to import the customer
records, determine the IDs of the related sales reps employee records and then re-
import the customer records with the sales reps ID references. By providing an
externalID you can import the customer records in a single API call using the
externalID references to the sales reps.
Important: ExternalIds can be updated through CSV or Web services. Therefore, it is
recommended that your organization use a single approach for maintaining externalIds so that
externalIds are not unknowingly updated using two separate methods.
Copying smbXML Handles into ExternalIDs
To facilitate migrations from smbXML to Web services, NetSuite copies over the handles of all
new and existing records that were created using smbXML into Web services externalId fields.
Existing handles will not be copied if there is already a value in the externalId field.
It is important to note that externalIds in Web services can be edited. Therefore, it is
recommended that once you migrate your data from smbXML to Web services, you should
maintain the data using Web services.
Important: Updating an externalId in Web services does not update its corresponding
smbXML handle.
Note: You cannot copy the value of an externalId into an smbXML handle.
The following samples show the use of internal IDs as they pertain to operations. Click to see
samples for any of the following:
• add operation
• update operation
• deleteList operation
• getList operation
• search operation
add operation
For an add operation, an internal ID is not required in the request since the record does not yet
exist. The internal ID (in this case 100101) is returned in the response.
Note: There are internal IDs listed in the request, but these internal IDs are embedded in the
request and do not correspond to the actual record being added (an event) but to other existing
records associated with the event record being added.
(Request)
<soap:Body>
<platformMsgs:add>
<platformMsgs:record xsi:type="actSched:CalendarEvent">
<actSched:title>Web Services Meeting</actSched:title>
<actSched:organizer internalId="-5" type="calendarEvent" xsi:type="platformCore:RecordRef ">
<platformCore:name>Mr. Wolfe</platformCore:name>
</actSched:organizer>
<actSched:location>Main Conference Room</actSched:location>
<actSched:attendeeList replaceAll="true" xsi:type="actSched:CalendarEventAttendeeList">
<actSched:attendee xsi:type="actSched:CalendarEventAttendee">
<actSched:sendEmail>false</actSched:sendEmail>
<actSched:attendee internalId="21" type="calendarEvent"
xsi:type="platformCore:RecordRef "/>
<actSched:response>_accepted</actSched:response>
<actSched:attendance>_optional</actSched:attendance>
</actSched:attendee>
<actSched:attendee xsi:type="actSched:CalendarEventAttendee">
<actSched:sendEmail>false</actSched:sendEmail>
<actSched:attendee internalId="27" type="calendarEvent"
xsi:type="platformCore:RecordRef "/>
<actSched:response>_accepted</actSched:response>
<actSched:attendance>_optional</actSched:attendance>
</actSched:attendee>
</actSched:attendeeList>
</platformMsgs:record>
</platformMsgs:add>
</soap:Body>
(Response)
<soapenv:Body>
<addResponse xmlns="urn:messages_2_6.platform.webservices.netsuite.com">
<writeResponse xmlns="urn:messages_2_6.platform.webservices.netsuite.com">
<ns1:status isSuccess="true" xmlns:ns1="urn:core_2_6.platform.webservices.netsuite.com"/>
<baseRef internalId="100101" type="calendarEvent" xsi:type="ns2:RecordRef "
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns2="urn:core_2_6.platform.webservices.netsuite.com"/>
</writeResponse>
</addResponse>
</soapenv:Body>
update operation
In this example the record added above is being updated — since the internal ID matches the
one created in the add operation (100101). Here, the internal ID and the record type are
required in the request and both are also returned in the response.
(Request)
<soap:Body>
<platformMsgs:update>
<platformMsgs:record internalId="100101" xsi:type="actSched:CalendarEvent">
<actSched:title>Web Services Meeting (Platform)</actSched:title>
</platformMsgs:record>
</platformMsgs:update>
</soap:Body>
(Response)
<soapenv:Body>
<updateResponse xmlns="urn:messages_2_6.platform.webservices.netsuite.com">
<writeResponse xmlns="urn:messages_2_6.platform.webservices.netsuite.com">
<ns1:status isSuccess="true" xmlns:ns1="urn:core_2_6.platform.webservices.netsuite.com"/>
<baseRef internalId="100101" type="calendarEvent" xsi:type="ns2:RecordRef "
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns2="urn:core_2_6.platform.webservices.netsuite.com"/>
</writeResponse>
</updateResponse>
</soapenv:Body>
deleteList operation
In the following delete request, the internal IDs are required for the request and returned in the
response. In this case, three Event records are deleted (100101, 100102, and 100103).
(Request)
<soap:Body>
<platformMsgs:deleteList>
<platformMsgs:baseRef internalId="100101" type="calendarEvent" xsi:type="platformCore:RecordRef "/>
<platformMsgs:baseRef internalId="100102" type="calendarEvent" xsi:type="platformCore:RecordRef "/>
<platformMsgs:baseRef internalId="100103" type="calendarEvent" xsi:type="platformCore:RecordRef "/>
</platformMsgs:deleteList>
</soap:Body>
(Response)
<soapenv:Body>
<deleteListResponse xmlns="urn:messages_2_6.platform.webservices.netsuite.com">
<writeResponseList xmlns="urn:messages_2_6.platform.webservices.netsuite.com">
<writeResponse>
<ns1:status isSuccess="true" xmlns:ns1="urn:core_2_6.platform.webservices.netsuite.com"/>
<baseRef internalId="100101" type="calendarEvent" xsi:type="ns2:RecordRef "
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns2="urn:core_2_6.platform.webservices.netsuite.com"/>
</writeResponse>
<writeResponse>
<ns3:status isSuccess="true" xmlns:ns3="urn:core_2_6.platform.webservices.netsuite.com"/>
<baseRef internalId="100102" type="calendarEvent" xsi:type="ns4:RecordRef "
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns4="urn:core_2_6.platform.webservices.netsuite.com"/>
</writeResponse>
<writeResponse>
<ns5:status isSuccess="true" xmlns:ns5="urn:core_2_6.platform.webservices.netsuite.com"/>
<baseRef internalId="100103" type="calendarEvent" xsi:type="ns6:RecordRef "
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns6="urn:core_2_6.platform.webservices.netsuite.com"/>
</writeResponse>
</writeResponseList>
</deleteListResponse>
</soapenv:Body>
getList operation
In this example, an internal ID is called for each record to be retrieved — in this case, three
different Event records. Again, the internal ID is required for the request and returned in the
response.
(Request)
<soap:Body>
<platformMsgs:getList>
<platformMsgs:baseRef internalId="100104" type="calendarEvent" xsi:type="platformCore:RecordRef "/>
<platformMsgs:baseRef internalId="100105" type="calendarEvent" xsi:type="platformCore:RecordRef "/>
<platformMsgs:baseRef internalId="100106" type="calendarEvent" xsi:type="platformCore:RecordRef "/>
</platformMsgs:getList>
</soap:Body>
(Response)
<soapenv:Body>
<getListResponse xmlns="urn:messages_2_6.platform.webservices.netsuite.com">
<readResponseList xmlns="urn:messages_2_6.platform.webservices.netsuite.com">
<readResponse>
<ns1:status isSuccess="true" xmlns:ns1="urn:core_2_6.platform.webservices.netsuite.com"/>
<record internalId="100104" xsi:type="ns2:CalendarEvent"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns2="urn:scheduling_2_6.activities.webservices.netsuite.com">
<ns2:title>Customization Meeting</ns2:title>
<ns2:organizer internalId="-5">
.........[more fields]
</record>
</readResponse>
<readResponse>
<ns8:status isSuccess="true" xmlns:ns8="urn:core_2_6.platform.webservices.netsuite.com"/>
<record internalId="100105" xsi:type="ns9:CalendarEvent"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns9="urn:scheduling_2_6.activities.webservices.netsuite.com">
<ns9:title>Web Services Meeting (Records)</ns9:title>
<ns9:organizer internalId="-5">
.........[more fields]
</record>
</readResponse>
<readResponse>
<ns15:status isSuccess="true" xmlns:ns15="urn:core_2_6.platform.webservices.netsuite.com"/>
<record internalId="100106" xsi:type="ns16:CalendarEvent"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns16="urn:scheduling_2_6.activities.webservices.netsuite.com">
<ns16:title>Web Services Meeting</ns16:title>
<ns16:organizer internalId="-5">
.........[more fields]
</record>
</readResponse>
</readResponseList>
</getListResponse>
</soapenv:Body>
search operation
For the search operation, an internal ID is not required for the request but is returned for each
record found that matches the specified criteria. In this case, two Event records are returned for
a search request calling for each Event record that contains Web Services in the title field.
(Request)
<soap:Body>
<platformMsgs:search>
<platformMsgs:searchRecord xsi:type="actSched:CalendarEventSearch">
<actSched:title operator="contains" xsi:type="platformCore:SearchStringField">
<platformCore:searchValue>Web Services</platformCore:searchValue>
</actSched:title>
</platformMsgs:searchRecord>
</platformMsgs:search>
</soap:Body>
(Response)
<soapenv:Body>
<searchResponse xmlns="urn:messages_2_6.platform.webservices.netsuite.com">
<searchResult xmlns="urn:core_2_6.platform.webservices.netsuite.com">
<status isSuccess="true"/>
<totalRecords>2</totalRecords>
<pageSize>10</pageSize>
<totalPages>1</totalPages>
<pageIndex>1</pageIndex>
<recordList>
<record internalId="100105" xsi:type="ns1:CalendarEvent"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns1="urn:scheduling_2_6.activities.webservices.netsuite.com">
<ns1:title>Web Services Meeting (Records)</ns1:title>
<ns1:organizer internalId="-5">
.....[more fields]
</record>
<record internalId="100106" xsi:type="ns2:CalendarEvent"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns2="urn:scheduling_2_6.activities.webservices.netsuite.com">
<ns2:title>Web Services Meeting</ns2:title>
<ns2:organizer internalId="-5">
.....[more fields]
</record>
</recordList>
</searchResult>
</searchResponse>
</soapenv:Body>
Required for
Parameter Type Description
Authentication
email text Yes Must reflect a valid email address of an entity in your
account.
password password Yes The password of the entity associated with the email
provided.
taskid text Yes For a list of currently exposed NetSuite TaskIDs, refer to
“Task IDs” on page 325. To find the TaskID for a given
page while in NetSuite, view the source of the page and
search for main_help_anchor. A snippet similar to the
following is found:
'main_help_anchor' href="#"
onclick="nlPopupHelp('LIST_SAVEDSEARCH','Full');
(where LIST_SAVEDSEARCH is the taskID of the page)
id text Yes The ID of a record type available in your NetSuite
account.
role text Optional Sets the role for the login. This must be a valid role for
the user logging in.
e text Optional If set to T, the record is displayed in edit mode. Any other
value is ignored and causes the record to be displayed in
view mode.
Built-in Types
Built-in (or primitive) types are those that are not defined in terms of other datatypes. They are
used as a standardized way to define, send, receive and interpret basic data types in SOAP
messages. Primitive data types used in the SuiteTalk Platform can be modified for display
purposes. For example, although a price field may be passed in the SOAP messages using an
integer primitive data type, the NetSuite UI may format the value with a currency symbol for
display purposes.
Of the extensive set of built-in (or primitive) types provided by the XML Schema language
specification, the SuiteTalk Platform implementation uses the following built-in types. For
detailed information on XML Schema built-in types, refer to http://www.w3.org/TR/
xmlschema-2/.
• string: represents character strings in XML
• int: derived from the decimal type and represents the standard concept of the integer
numbers
• double: is patterned after the IEEE double-precision 64-bit floating point type
• boolean: represents the concept of binary-valued logic: {true, false}. In NetSuite, a
boolean field can either be set to true or false. If your Web service does not explicitly
set the field as true or false the field returns false.
Note: In SuiteTalk, a boolean field can also be set to 1 to indicate true. You can set the
field to 0 to indicate false.
• dateTime: represents integer-valued year, month, day, hour and minute properties, a
decimal-valued second property and a boolean timezoned property (timestamp). For
example, 2005-09-21T15:24:00.000-07:00, where 2005-09-21 is the date, 15:24:00.000
is the time and -07:00 is the timezone offset.
Important: When posting dateTime values to NetSuite, it is recommended that you
indicate timezone. If no timezone is indicated, the “America/Los_Angeles” timezone
will be used. (Note that for backward compatibility reasons NetSuite does not use
GMT.)
Note: SOAP encoding is NOT sensitive to your NetSuite Timezone preference as
defined in the user preferences. When using Axis, an Axis Web Services client encodes
in GMT, regardless of how the machine/JVM is configured. Netsuite will generally
encode in PST.
• date: represents the top-open intervals of exactly one day in length on the timelines of
dateTime, beginning on the beginning moment of each day
• time: represents an instant of time that recurs every day
Note: Date, time and dateTime types listed above conform to the ISO 8601 standard for
international dates.
Please see http://www.w3.org/TR/2001/RED-xmlschema-2-20010502/datatypes#dateTime for
more details.
Complex Types
Complex types are structured types built by aggregating elements of simple or previously
defined complex types. NetSuite complex types are defined in the platform core and platform
core types XSDs. All NetSuite record types ultimately reference one of these complex types.
NetSuite complex types include the following:
• Passport
• Record
• RecordList
• BaseRef
• RecordRef
• CustomRecordRef
• ListOrRecordRef
• Status
• StatusDetail
• NullField
• ReadResponse
• ListReadResponse
• ListWriteResponse
• WriteResponse
Passport
The Passport type is used by the login operation to encapsulate the security credentials
required for authentication. The passport type is defined in the core.xsd.
The default Web services role for a given user is dependent on the values set when setting the
permissions for given role. These are set through the UI in Setup > Users/Roles > Manage
Roles.
Record
The Record type is an abstract type used as the parameter for the add, addList, delete,
deleteList, update and updateList operations. It is also returned in the get, getList, search,
searchMore and searchNext operations. All business object types extend the Record type. The
record type is defined in core.xsd.
RecordList
The RecordList type is an array of the Record type. The recordList type is defined in core.xsd.
BaseRef
The BaseRef type is an abstract type used to reference any existing record in NetSuite
including other business records and custom records. The BaseRef type is defined in core.xsd.
RecordRef
The RecordRef type is used to reference an existing record in NetSuite in get operations.
Typically, a RecordRef references one of the following:
• Another business object such as a customer or sales order
• An entry in a user defined list such as the category list for contacts or sales tax items
The recordRef type descends from BaseRef and is defined in core.xsd.
CustomRecordRef
The CustomRecordRef type is used to reference any existing custom record in NetSuite. The
CustomRecordRef type descends from BaseRef and is defined in core.xsd.
Important: Setting the RecordRef.type to customRecord on an add does NOT return a
CustomRecord. You must use CustomRecordRef. The CustomRecordRef has a typeId to indicate
which kind of CustomRecord it is.
ListOrRecordRef
The listOrRecordRef type is defined in core.xsd.
Status
The Status type contains an array of objects of type StatusDetail. The status type is defined in
core.xsd.
StatusDetail
The StatusDetail type is used to capture the specific details for the status. The statusDetail type
is defined in core.xsd.
NullField
The NullField type is defined in core.xsd. It contains the following fields.
ReadResponse
The ReadResponse type is used by the following read operations.
• The getResponse output message for the get operation.
• The searchResponse output message for the search operations.
These types have a field named readResponse of the type ReadResponse. The ReadResponse
type is defined in message.xsd.
ListReadResponse
The ListReadResponse type is used by the following operations.
• The GetListResponse output message for the getList operation.
These types have a field named response of type ListReadResponse. The ListReadResponse
type is defined in message.xsd.
ListWriteResponse
The ListWriteResponse type is used by the following operations.
• The AddListResponse output message for the addList operation.
• The UpdateListResponse output message for the updateList operation.
• The DeleteListResponse output message for the deleteList operation.
These types have a field named response of type ListWriteResponse. The ListWriteResponse
type is defined in message.xsd.
WriteResponse
The WriteResponse type is used by the following operations:
• The AddResponse output message for the add operation
• The UpdateResponse output message for the update operation
• The DeleteResponse output message for the delete operation
These types have a field named writeResponse of type WriteResponse. The WriteResponse
type is defined in message.xsd.
CustomFieldRef
The CustomFieldRef type is an abstract type.
To locate the internal ID for a given custom field in the UI, go to Setup > Customization >
[Custom Field] (where [Custom Field] is the type of custom field such as CRM). The internal
IDs for each custom field that has been created is listed in the ID column.
LongCustomFieldRef
The LongCustomFieldRef type extends the CustomFieldRef abstract type.
DoubleCustomFieldRef
The DoubleCustomFieldRef type extends the CustomFieldRef abstract type.
BooleanCustomFieldRef
The BooleanCustomFieldRef type extends the CustomFieldRef abstract type.
StringCustomFieldRef
The StringCustomFieldRef type extends the CustomFieldRef abstract type.
DateCustomFieldRef
The DateCustomFieldRef type extends the CustomFieldRef abstract type.
SelectCustomFieldRef
The SelectCustomFieldRef type extends the CustomFieldRef abstract type. This references a
single ListOrRecordRef and also requires an InternalId attribute to indicate the field name.
MultiSelectCustomFieldRef
The MultiSelectCustomFieldRef type extends the CustomFieldRef abstract type. This
references an array of ListOrRecordRef 's and also requires an InternalId attribute to indicate
the field name.
CustomFieldList
Field Name XML Schema Type Req Notes
value customFieldRef [] Y An array of type customFieldRef. The actual
entries in the array will be of a concrete type
that extends customFieldRef.
The following is an XML excerpt from a SOAP body that illustrates a custom field list that
contains all the available custom field types.
<customFieldList>
<customField xsi:type=”BooleanCustomFieldRef ” internalId=”CUSTEVENT7”>
<value>true</value>
</customField>
<customField xsi:type=”DateCustomFieldRef ” internalId=”CUSTEVENT4”>
<value>2003-01-20T18:47:00</value>
</customField>
<customField xsi:type=”DoubleCustomFieldRef ” internalId=”CUSTEVENT2”>
<value>23.465</value>
</customField>
<customField xsi:type=”LongCustomFieldRef ” internalId=”CUSTEVENT5”>
<value>23</value>
</customField>
<customField xsi:type=”ListCustomFieldRef ” internalId=”CUSTEVENT3”>
<value internalId=”offsite”/>
</customField>
<customField xsi:type=”StringCustomFieldRef ” internalId=”CUSTEVENT12”>
<value>John Williams</value>
</customField>
<customField xsi:type=”MultiSelectCustomFieldRef ” internalId=”CUSTEVENT11”>
<value internalId=”important”/>
<value internalId=”strategic”/>
</customField>
<customFieldList>
Search Types
Every NetSuite record that supports search has corresponding search and advanced search
objects. For example, the SuiteTalk listRel XSD contains a Customer object, as well as its
corresponding CustomerSearch, CustomerSearchAdvanced, and CustomerSearchRow search
objects.
• When using a <Record>Search object, all search fields within this search object belong
to one of the types decribed in “Search XML Schema Types” on page 92.
• When searching on custom records or custom fields, all search fields belong to one of
the types described in “Search Custom Field XML Schema Types” on page 95.
• When using either the <Record>SearchAdvanced or <Record>SearchRow search
objects, all search fields within these “advanced search” objects belong to one of the
types described in “Search Column Custom XML Schema Types” on page 100 or
“Search Column Custom XML Schema Types” on page 100.
SearchRequest
SearchResult
SearchStringField
SearchBooleanField
SearchDoubleField
SearchLongField
SearchTextNumberField
SearchDateField
SearchMultiSelectField
This search type is used to specify a list of one or more internal IDs that reference other user
defined records in the system.
SearchEnumMultiSelectField
This search type is used to specify a list of one or more system defined constants.
SearchStringCustomField
The SearchStringCustomField type extends the SearchCustomField abstract type.
SearchBooleanCustomField
The SearchBooleanCustomField type extends the SearchCustomField abstract type.
SearchLongCustomField
The SearchLongCustomField type extends the SearchCustomField abstract type.
SearchDoubleCustomField
The SearchDoubleCustomField type extends the SearchCustomField abstract type.
SearchDateCustomField
The SearchDateCustomField type extends the SearchCustomField abstract type.
SearchMultiSelectCustomField
The SearchMultiSelectCustomField type extends the SearchCustomField abstract type.
SearchEnumMultiSelectCustomField
The SearchEnumMultiSelectCustomField type extends the SearchCustomField abstract type.
SearchCustomFieldList
SearchColumnBooleanField
The SearchColumnBooleanField type extends the SearchColumnField abstract type.
SearchColumnStringField
The SearchColumnStringField type extends the SearchColumnField abstract type.
SearchColumnLongField
The SearchColumnLongField type extends the SearchColumnField abstract type.
SearchColumnTextNumberField
The SearchColumnStringField type extends the SearchColumnField abstract type.
SearchColumnDoubleField
The SearchColumnDoubleField type extends the SearchColumnField abstract type.
SearchColumnDateField
The SearchColumnDateField type extends the SearchColumnField abstract type.
SearchColumnEnumSelectField
The SearchColumnEnumSelectField type extends the SearchColumnField abstract type.
SearchColumnSelectField
The SearchColumnSelectField type extends the SearchColumnField abstract type. This
references a single ListOrRecordRef and also requires an internalId attribute to indicate the
field name.
SearchColumnBooleanCustomField
The SearchColumnBooleanField type extends the SearchColumnCustomField abstract type.
SearchColumnStringCustomField
The SearchColumnStringCustomField type extends the SearchColumnCustomField abstract
type.
SearchColumnLongCustomField
The SearchColumnLongCustomField type extends the SearchColumnCustomField abstract
type.
SearchColumnDoubleCustomField
The SearchColumnDoubleCustomField type extends the SearchColumnCustomField abstract
type.
SearchColumnDateCustomField
The SearchColumnDateCustomField type extends the SearchColumnCustomField abstract
type.
SearchColumnEnumMultiSelectCustomField
The SearchColumnEnumMultiSelectCustomField type extends the
SearchColumnCustomField abstract type.
SearchColumnSelectCustomField
The SearchColumnSelectCustomField type extends the SearchColumnCustomField abstract
type. This references a single ListOrRecordRef and also requires an internalId attribute to
indicate the field name.
SearchColumnMultiSelectCustomField
The SearchColumnMultiSelectCustomField type extends the SearchColumnCustomField
abstract type. This references an array of ListOrRecordRefs.
SearchColumnCustomFieldList
The SearchColumnCustomFieldList type extends the SearchColumnCustomField abstract
type.
Sample Code
SOAP Request — Opportunity Search
Following is an example that contains an excerpt of the SOAP body that illustrates an
opportunity search containing several search field types.
<opportunitySearch>
<projectedTotal operator="lessThan">
<searchValue>100000</searchValue>
</projectedTotal>
<title operator="contains">
<searchValue>Enterprise</searchValue>
</title>
<createdDateRange operator="between">
<fromValue>2003-10-02</fromValue>
<toValue>2003-10-12</toValue>
</createdDateRange>
<opportunityStatusList operator="anyOf ">
<searchValue>inProgress</searchValue>
<searchValue>closedWon</searchValue>
</opportunityStatusList>
<customFieldList>
<customField xsi:type="SearchSelectCustomField" internalId="SalesEngineer"
operator="equals">
<searchValue>Buddy Williams</searchValue>
</customField>
<customField xsi:type="SearchBooleanCustomField" internalId="hasSalesEngineer"
operator="true"/>
<customField xsi:type="SearchStringCustomField" internalId="DemoNotes"
operator="startsWith">
<searchValue>CRM</searchValue>
</customField>
<customField xsi:type="SearchMultiSelectCustomField" internalId="ProductAreas"
operator="noneOf ">
<searchValue>Inventory</searchValue>
<searchValue>Warehousing</searchValue>
</customField><
</customFieldList>
</opportunitySearch>
Platform Enumerations
The following search types are used throughout Web services to populate system defined lists.
The tables below outline the available values that should be used to populate these fields in
your Web services requests. These enumerations are defined in the platformCoreTyp XSD.
add
The add operation is used to add a new instance of a record in NetSuite. It is similar to the
addList operation except that it allows only one record to be added at a time.
Request
The AddRequest type is used for the request. It contains the following fields.
Response
The AddResponse type is used for the response. It contains the following fields.
Faults
This operation can throw one of the following faults. See “SOAP Fault Status Codes” on
page 252 for more information on faults.
• InvalidSessionFault
• InvalidCredentialsFault
• ExceededRequestLimitFault
• ExceededUsageLimitFault
• ExceededRecordCountFault
• ExceededRequestSizeFault
• UnexpectedErrorFault
Sample Code
SOAP Request
In this example, a single customer record is added.
<soap:Body>
<platformMsgs:add>
<platformMsgs:record xsi:type="listRel:Customer">
<listRel:entityId>Shutter Fly</listRel:entityId>
<listRel:companyName>Shutter Fly, Inc</listRel:companyName>
</platformMsgs:record>
</platformMsgs:add>
</soap:Body>
SOAP Response
In the response, notice that the internalID for the record added is returned.
<soapenv:Body>
<addResponse xmlns="urn:messages_2_6.platform.webservices.netsuite.com">
<writeResponse xmlns="urn:messages_2_6.platform.webservices.netsuite.com">
<ns1:status isSuccess="true" xmlns:ns1="urn:core_2_6.platform.webservices.netsuite.com"/>
<baseRef internalId="979" type="customer" xsi:type="ns2:RecordRef "
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns2="urn:core_2_6.platform.webservices.netsuite.com"/>
</writeResponse>
</addResponse>
</soapenv:Body>
C#
private void addCustomer()
{
// This operation requires a valid session
this.login( true );
//salesRep.type = RecordType.contact;
//salesRep.typeSpecified = true;
customer.salesRep = salesRep;
}
else
{
customer.entityId = "XYZ Inc";
customer.companyName = "XYZ, Inc.";
customer.email = "bsanders@yahoo.com";
}
// Set entity status. The nsKey can be obtained from Setup > SFA > Customer Statuses.
// The default status is "Closed Won" which has an nsKey of 13
RecordRef status = new RecordRef();
if ( "true".Equals( _dataCollection["promptForFieldValues"] ) )
{
_out.write( "Entity status nsKey (press enter for default value of Closed Won): " );
String statusKey = _out.readLn();
if ( statusKey.Equals( "" ) )
{
status.internalId = "13";
}
else
{
status.internalId = statusKey;
}
}
else
{
status.internalId = "13";
}
customer.entityStatus = status;
// Populate the address list for this customer. You can put in as many
// adresses as you like.
CustomerAddressbook address = new CustomerAddressbook();
address.defaultShipping = true;
address.defaultShippingSpecified = true;
address.defaultBilling = false;
address.defaultBillingSpecified = true;
address.label = "Shipping Address";
address.addressee = "William Sanders";
address.attention = "William Sanders";
address.addr1 = "4765 Sunset Blvd";
address.city = "San Francisco";
address.state = "CA";
address.zip = "94131";
address.country = Country._unitedStates;
*/
}
else
{
_out.error( "The customer was not added:", true );
_out.error( getStatusDetails( response.status ) );
}
}
Java
public void addCustomer() throws RemoteException, ExceededRecordCountFault,
ExceededUsageLimitFault, InsufficientPermissionFault,
InvalidSessionFault {
// This operation requires a valid session
this.login(true);
// Set entity status. The nsKey can be obtained from Setup > SFA >
// Customer Statuses.
// The default status is "Closed Won" which has an nsKey of 13
RecordRef status = new RecordRef();
if ("true".equals(_properties.getProperty("promptForFieldValues"))) {
_console.write("Entity status nsKey (press enter for default value of Closed Won): ");
String statusKey = _console.readLn();
if (statusKey.equals("")) {
status.setInternalId("13");
} else {
status.setInternalId(statusKey);
}
} else {
status.setInternalId("13");
}
customer.setEntityStatus(status);
// Populate the address list for this customer. You can put in as many
// adresses as you like.
CustomerAddressbook address = new CustomerAddressbook();
address.setDefaultShipping(Boolean.TRUE);
address.setDefaultBilling(Boolean.FALSE);
address.setLabel("Shipping Address");
address.setAddressee("William Sanders");
address.setAttention("William Sanders");
address.setAddr1("4765 Sunset Blvd");
address.setCity("San Francisco");
address.setState(“CA”);
address.setZip("94131");
address.setCountry(Country._unitedStates);
addList
The addList operation is used to add one or more new instances of a record to NetSuite.
If there are multiple records, they can either be of the same record type or different record
types. For example, it’s possible to add a customer and a contact within a single request using
this operation. However, each record entered must have a unique signature. Adding two
records with the same signature results in a SOAP fault. The signature consists of parameters
required to identify a record as unique.
For example, in the case of entities, a record is uniquely identified by its name, its type and its
parent hierarchy. So you could have two records with the same entityId (or name) belonging to
two different record types as follows:
Customer (the type):
John Smith
MyCompany: John Smith
Contact
John Smith
But a second record such as the following would be invalid:
Contact
John Smith
Request
The AddListRequest type is used for the request.
Response
The AddListResponse type is used for the response.
Faults
This operation can throw one of the following faults. See “SOAP Fault Status Codes” on
page 252 for more information on faults.
• InvalidSessionFault
• InvalidCredentialsFault
• ExceededRequestLimitFault
• ExceededUsageLimitFault
• ExceededRecordCountFault
• ExceededRequestSizeFault
• UnexpectedErrorFault
Sample Code
SOAP Request
In the following example, two customer records are added. When using the addList operation
you can submit two different record types in the same request.
<soap:Body>
<platformMsgs:addList>
<platformMsgs:record xsi:type="listRel:Customer">
<listRel:entityId>Shutter Fly</listRel:entityId>
<listRel:companyName>Shutter Fly, Inc</listRel:companyName>
</platformMsgs:record>
<platformMsgs:record xsi:type="listRel:Customer">
<listRel:entityId>GNC</listRel:entityId>
<listRel:companyName>GNC Corp</listRel:companyName>
</platformMsgs:record>
</platformMsgs:addList>
</soap:Body>
SOAP Response
In the response, notice that the internalID for each record added is returned.
<soapenv:Body>
<addListResponse xmlns="urn:messages_2_6.platform.webservices.netsuite.com">
<writeResponseList xmlns="urn:messages_2_6.platform.webservices.netsuite.com">
<writeResponse>
<ns1:status isSuccess="true" xmlns:ns1="urn:core_2_6.platform.webservices.netsuite.com"/>
<baseRef internalId="980" type="customer" xsi:type="ns2:RecordRef "
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns2="urn:core_2_6.platform.webservices.netsuite.com"/>
</writeResponse>
<writeResponse>
<ns3:status isSuccess="true" xmlns:ns3="urn:core_2_6.platform.webservices.netsuite.com"/>
<baseRef internalId="981" type="customer" xsi:type="ns4:RecordRef "
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns4="urn:core_2_6.platform.webservices.netsuite.com"/>
</writeResponse>
</writeResponseList>
</addListResponse>
</soapenv:Body>
attach / detach
The attach and detach operations can be used to define or remove a relationship between two
records. For example, a Contact record can be associated with a Partner record, or an
Opportunity record can be associated with a Customer record.
Important: A user error is thrown if you attempt to attach files or records that do not exist.
You can also use the attach / detach operations to attach or detach a file to or from a record.
Any file that is in the NetSuite file cabinet, for example an MS Word or Excel file or a PDF can
be attached to any record other than a custom record.
Note that when attaching Contacts to other entity records, the Contact’s role can also be
specified during the request. Contact Roles are roles available in a user defined list at List >
Relationships > Contacts. This list has been exposed as ContactRole in accounting.xsd.
Notes: Contact records can be attached to all entity records except for other Contact or Group
records.
The following tables lists all records that support the attach/detach operations. It also lists
which records can accept file attachements as well as which records can be attached to Contact
records.
Request (attach)
The AttachRequest type is used for this request. It contains the following fields:
Request (detach)
The DetachRequest type is used for this request. It contains the following fields:
Response (attach)
The AttachResponse type is used for this response. It contains the following fields:
Response (detach)
The DetachResponse type is used for this response. It contains the following fields:
Faults
This operation can throw one of the following faults. See “SOAP Fault Status Codes” on
page 252 for more information on faults.
• InvalidSessionFault
• InvalidCredentialsFault
• ExceededRequestLimitFault
• ExceededUsageLimitFault
• ExceededRecordCountFault
• ExceededRequestSizeFault
• UnexpectedErrorFault
Sample Code
SOAP Request (attach)
<attach xmlns="urn:messages_2_6.platform.webservices.netsuite.com">
<attachReferece xsi:type="ns1:AttachContactReference"
xmlns:ns1="urn:core_2_6.platform.webservices.netsuite.com">
<ns1:attachTo internalId="176" type="customer" xsi:type="ns1:RecordRef ">
<ns1:name xsi:type="xsd:string">Adelina Shonkwiler</ns1:name>
</ns1:attachTo>
<ns1:contact internalId="1467" xsi:type="ns1:RecordRef "/>
<ns1:contactRole internalId="-10" xsi:type="ns1:RecordRef ">
<ns1:name xsi:type="xsd:string">Primary Contact</ns1:name>
</ns1:contactRole>
</attachReferece>
</attach>
</ns1:attachTo>
<ns1:attachedRecord internalId="1467" type="contact" xsi:type="ns1:RecordRef "/>
</attachReferece>
</detach>
changePasswordOrEmail
Use the changePasswordOrEmail operation to change a user’s email or password.
Request
The ChangePasswordOrEmailRequest type is used for the request.
Response
The ChangePasswordOrEmailResponse type is used for the response. It does not contain any
fields.
Faults
This operation can throw one of the following faults. See “SOAP Fault Status Codes” on
page 252 for more information on faults.
• InsufficientPermissionFault
• InvalidAccountFault
• InvalidCredentialsFault
• ExceededRequestLimitFault
• UnexpectedErrorFault
• InvalidVersionFault
Sample Code
SOAP Request
<changePasswordOrEmail xmlns="urn:messages_2_6.platform.webservices.netsuite.com">
<changePasswordOrEmailCredentials>
<ns1:currentPassword xmlns:ns1="urn:core_2_6.platform.webservices.netsuite.com">xxxxxx</
ns1:currentPassword>
<ns2:newEmail xmlns:ns2="urn:core_2_6.platform.webservices.netsuite.com">newEmail@ws.com</
ns2:newEmail>
<ns3:newEmail2 xmlns:ns3="urn:core_2_6.platform.webservices.netsuite.com">newEmail@ws.com</
ns3:newEmail2>
<ns4:newPassword xmlns:ns4="urn:core_2_6.platform.webservices.netsuite.com">yyyyyyy</
ns4:newPassword>
<ns5:newPassword2 xmlns:ns5="urn:core_2_6.platform.webservices.netsuite.com">yyyyyyy</
ns5:newPassword2>
</changePasswordOrEmailCredentials>
</changePasswordOrEmail>
SOAP Response
<changePasswordOrEmailResponse xmlns="urn:messages_2_6.platform.webservices.netsuite.com">
<sessionResponse>
<ns1:status isSuccess="true"
xmlns:ns1="urn:core_2_6.platform.webservices.netsuite.com"/>
</sessionResponse>
</changePasswordOrEmailResponse>
Java
public void test_ChangePwdOrEmail() throws Exception {
sessMgr.loginWithEmail("oldEmail@ws.com");
ChangePasswordOrEmailCredentials c = new ChangePasswordOrEmailCredentials();
c.setCurrentPassword("xxxxxx");
c.setNewEmail("newEmail@ws.com");
c.setNewEmail2("newEmail@ws.com");
c.setNewPassword("yyyyyyy");
c.setNewPassword2("yyyyyyy");
sessMgr.getPort().changePasswordOrEmail(c);
sessMgr.loginWithEmail("newEmail@ws.com");
}
delete
The delete operation is used to delete an existing instance of a record in NetSuite. It is identical
in terms of functionality to the deleteList operation but only allows one record to be deleted per
request.
Request
The DeleteRequest type is used for the request. It contains the following fields.
Response
The DeleteResponse type is used for the response. It contains the following fields.
Faults
This operation can throw one of the following faults. See “SOAP Fault Status Codes” on
page 252 for more information on faults.
• InvalidSessionFault
• InvalidCredentialsFault
• ExceededRequestLimitFault
• ExceededUsageLimitFault
• ExceededRecordCountFault
• ExceededRequestSizeFault
• UnexpectedErrorFault
Sample Code
SOAP Request
In this example, a single customer record is deleted.
<soap:Body>
<platformMsgs:delete>
<platformMsgs:baseRef internalId="980" type="customer" xsi:type="platformCore:RecordRef "/>
</platformMsgs:delete>
</soap:Body>
SOAP Response
<soapenv:Body>
<deleteResponse xmlns="urn:messages_2_6.platform.webservices.netsuite.com">
<writeResponse xmlns="urn:messages_2_6.platform.webservices.netsuite.com">
<ns1:status isSuccess="true" xmlns:ns1="urn:core_2_6.platform.webservices.netsuite.com"/>
<baseRef internalId="980" type="customer" xsi:type="ns2:RecordRef "
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns2="urn:core_2_6.platform.webservices.netsuite.com"/>
</writeResponse>
</deleteResponse>
</soapenv:Body>
C#
private void deleteCustomRecord()
{
// This operation requires a valid session
this.login( true );
CustomRecordRef customRecordRef = new CustomRecordRef();
//Prompt user for the nsKey for Custom Record type to be deleted
_out.write( "Enter nsKey for Custom Record type to be deleted: " );
customRecordRef.typeId = _out.readLn();;
//Prompt user for nsKey for Custom Record to be deleted
_out.write( "Enter nsKey for Custom Record to be deleted: " );
customRecordRef.internalId = _out.readLn();
System.Console.Out.Write( "Delete the record above? [Y/N]:" );
String userResponse = _out.readLn().ToUpper();
// Delete records
if ( userResponse.Equals( "Y" ) )
{
WriteResponse delResponse = _service.delete( customRecordRef );
// process response
_out.info( "\nThe following Custom Record deleted:\n" );
if ( delResponse.status.isSuccess )
{
_out.info( "key=" + ((CustomRecordRef) delResponse.baseRef).internalId );
}
else
{
_out.errorForRecord( getStatusDetails( delResponse.status ) );
}
}
else
{
_out.info( "\nSince your answer was not Y, the records were not deleted." );
}
}
Java
public void deleteCustomRecord() throws RemoteException,
ExceededUsageLimitFault, UnexpectedErrorFault, InvalidSessionFault,
ExceededRecordCountFault {
// This operation requires a valid session
this.login(true);
CustomRecordRef customRecordRef = new CustomRecordRef();
// Prompt user for the nsKey for Custom Record type to be deleted
// process response
_console.info("\nThe following Custom Record deleted:\n");
if (delResponse.getStatus().isIsSuccess()) {
_console
.info("key="
+ ((CustomRecordRef) delResponse.getBaseRef())
.getInternalId());
} else {
_console.errorForRecord(getStatusDetails(delResponse
.getStatus()));
}
} else {
_console
.info("\nSince your answer was not Y, the records were not deleted.");
}
}
deleteList
The deleteList operations is used to delete one or more existing instances of a certain record
type in NetSuite.
If there are multiple records, they can either be of the same record type or different record
types. For example, it’s possible to delete a customer and a contact within a single request using
this operation.
Request
The DeleteListRequest type is used for the request. It contains the following fields.
Response
The DeleteListResponse type is used for the response. It contains the following fields.
Faults
This operation can throw one of the following faults. See “SOAP Fault Status Codes” on
page 252 for more information on faults.
• InvalidSessionFault
• InvalidCredentialsFault
• ExceededRequestLimitFault
• ExceededUsageLimitFault
• ExceededRecordCountFault
• ExceededRequestSizeFault
• UnexpectedErrorFault
Sample Code
SOAP Request
In the following example, two customer records are deleted. You can delete records of different
types in the same request.
<soap:Body>
<platformMsgs:deleteList>
<platformMsgs:baseRef internalId="981" type="customer" xsi:type="platformCore:RecordRef "/>
<platformMsgs:baseRef internalId="982" type="customer" xsi:type="platformCore:RecordRef "/>
</platformMsgs:deleteList>
</soap:Body>
SOAP Response
Note that the status for each item in the request is returned. If a single item in the list errors, the
other records submitted will still be processed.
<soapenv:Body>
<deleteListResponse xmlns="urn:messages_2_6.platform.webservices.netsuite.com">
<writeResponseList xmlns="urn:messages_2_6.platform.webservices.netsuite.com">
<writeResponse>
<ns1:status isSuccess="true" xmlns:ns1="urn:core_2_6.platform.webservices.netsuite.com"/>
<baseRef internalId="981" type="customer" xsi:type="ns2:RecordRef "
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns2="urn:core_2_6.platform.webservices.netsuite.com"/>
</writeResponse>
<writeResponse>
<ns3:status isSuccess="true" xmlns:ns3="urn:core_2_6.platform.webservices.netsuite.com"/>
<baseRef internalId="982" type="customer" xsi:type="ns4:RecordRef "
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns4="urn:core_2_6.platform.webservices.netsuite.com"/>
</writeResponse>
</writeResponseList>
</deleteListResponse>
</soapenv:Body>
C#
private void deleteCustomerList()
{
// This operation requires a valid session
this.login( true );
// Delete records
if ( userResponse.Equals( "Y" ) )
{
WriteResponse[] delResponses = _service.deleteList( recordRefs );
// process response
_out.info( "\nThe following customers were deleted:\n" );
for (int i=0; i<delResponses.Length; i++ )
{
if ( delResponses[i].status.isSuccess )
{
_out.info( "Customer[" + i + "]:" );
_out.info( "key=" + ((RecordRef) delResponses[i].baseRef).internalId );
}
else
{
_out.info( "Customer[" + i + "]:" );
Java
public void deleteCustomerList() throws RemoteException,
ExceededUsageLimitFault, UnexpectedErrorFault, InvalidSessionFault,
ExceededRecordCountFault {
// This operation requires a valid session
this.login(true);
// Delete records
if (userResponse.equals("Y")) {
WriteResponseList delResponseList = _port
.deleteList(recordRefs);
// process response
WriteResponse[] delResponses = delResponseList
.getWriteResponse();
get
The get operation is used to retrieve a record by providing the unique id that identifies that
record.
Request
The getRequest type is used for the request. It contains the following fields.
Response
The getListResponse type is used for the response. It contains the following fields.
Faults
This operation can throw one of the following faults. See “SOAP Fault Status Codes” on
page 252 for more information on faults.
• InvalidSessionFault
• InvalidCredentialsFault
• ExceededRequestLimitFault
• ExceededUsageLimitFault
• ExceededRecordCountFault
• ExceededRequestSizeFault
• UnexpectedErrorFault
Sample Code
SOAP Request
In this example, a single customer record is retrieved. Note that the internal ID for the specific
instance of the record and the record type (customer) must be specified.
<soap:Body>
<platformMsgs:get>
<platformMsgs:baseRef internalId="983" type="customer" xsi:type="platformCore:RecordRef ">
<platformCore:name/>
</platformMsgs:baseRef>
</platformMsgs:get>
</soap:Body>
SOAP Response
<soapenv:Body>
<getResponse xmlns="urn:messages_2_6.platform.webservices.netsuite.com">
<readResponse xmlns="urn:messages_2_6.platform.webservices.netsuite.com">
<ns1:status isSuccess="true" xmlns:ns1="urn:core_2_6.platform.webservices.netsuite.com"/>
<record internalId="983" xsi:type="ns2:Customer"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns2="urn:relationships_2_6.lists.webservices.netsuite.com">
<ns2:entityId>Shutter Fly</ns2:entityId><ns2:isInactive>false</ns2:isInactive>
<ns2:companyName>Shutter Fly, Inc</ns2:companyName>
<ns2:entityStatus internalId="6">
.
...[more fields]
.
<ns2:customFieldList>
<ns6:customField internalId="custentity_map" xsi:type="ns6:StringCustomFieldRef "
xmlns:ns6="urn:core_2_6.platform.webservices.netsuite.com">
<ns6:value>http://maps.google.com</ns6:value>
</ns6:customField>
</ns2:customFieldList>
</record>
</readResponse>
</getResponse>
</soapenv:Body>
C#
private void getCustomer()
{
Java
public void getCustomer() throws RemoteException, ExceededUsageLimitFault,
UnexpectedErrorFault, InvalidSessionFault, ExceededRecordCountFault {
// This operation requires a valid session
this.login(true);
getAll
The getAll operation is used to retrieve a list of all records of the specified type. Records that
support the getAll operation are listed in the GetAllRecordType as defined in the
platformCoreType system constants XSD file:
Note: You cannot use the search operation to retrieve state values. You must use the getAll
operation to retrieve all state values in the system. The getAll operation will return all states,
not just the legal ones for your default country. Also note that the country and state must match
on the address.
Request
The getAllRequest type is used for the request. It contains the following fields.
Response
The getList response type is used for the response. It contains the following fields.
Faults
This operation can throw one of the following faults. See “SOAP Fault Status Codes” on
page 252 for more information on faults.
• InvalidSessionFault
• InvalidCredentialsFault
• ExceededRequestLimitFault
• ExceededUsageLimitFault
• ExceededRecordCountFault
• ExceededRequestSizeFault
• UnexpectedErrorFault
getBudgetExchangeRate
On the Budget Exchange Rates table, you can maintain exchange rates between the root-parent
and child subsidiaries for use in the budgeting process. Use the getBudgetExchangeRate
operation to get and filter all data related to this table.
Important: This operation can only be used in NetSuite OneWorld accounts.
In the UI, you can see the Budget Exchange Rates table by going to List > Accounting > Budget
Exchange Rates. Note that in Web services, this table is read-only.
For general information on the Budget Exchange Rate table, see “Administering Budget
Exchange Rates” in the NetSuite Help Center.
Request
The GetBudgetExchangeRateRequest type is used for the request.
BudgetExchangeRateFilter
Response
The GetBudgetExchangeRateResult type is used for the response.
BudgetExchangeRateList
BudgetExchangeRate
Faults
This operation can throw one of the following faults. See “SOAP Fault Status Codes” on
page 252 for more information on faults.
• InvalidSessionFault
• InvalidCredentialsFault
• ExceededRequestLimitFault
• ExceededUsageLimitFault
• ExceededRecordCountFault
• ExceededRequestSizeFault
• UnexpectedErrorFault
Sample Code
SOAP Request
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://
www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<getBudgetExchangeRate xmlns="urn:messages_2009_1.platform.webservices.netsuite.com">
<budgetExchangeRateFilter>
<ns1:period internalId="3" xmlns:ns1="urn:core_2009_1.platform.webservices.netsuite.com"/>
<ns2:fromSubsidiary internalId="4" xmlns:ns2="urn:core_2009_1.platform.webservices.
netsuite.com"/>
</budgetExchangeRateFilter>
</getBudgetExchangeRate>
</soapenv:Body>
</soapenv:Envelope>
SOAP Response
<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://
www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<getBudgetExchangeRateResponse xmlns="urn:messages_2009_1.platform.webservices.netsuite.com">
<platformCore:getBudgetExchangeRateResult
xmlns:platformCore="urn:core_2009_1.platform.webservices.netsuite.com">
<platformCore:status isSuccess="true"/>
<platformCore:budgetExchangeRateList>
<platformCore:budgetExchangeRate>
<platformCore:period internalId="3"/>
<platformCore:fromSubsidiary internalId="4"/>
<platformCore:toSubsidiary internalId="1"/>
<platformCore:currentRate>1.9586</platformCore:currentRate>
<platformCore:averageRate>1.9586</platformCore:averageRate>
<platformCore:historicalRate>1.9586</platformCore:historicalRate>
</platformCore:budgetExchangeRate>
</platformCore:budgetExchangeRateList>
</platformCore:getBudgetExchangeRateResult>
</getBudgetExchangeRateResponse>
</soapenv:Body>
</soapenv:Envelope>
Java
/* Make Record Ref out of an internalId */
public static RecordRef mrr(String internalId)
{
RecordRef toRet = new RecordRef();
toRet.setInternalId(internalId);
return toRet;
}
c.getPort().getBudgetExchangeRate(new BudgetExchangeRateFilter(mrr("3"),mrr("4"),null));
getConsolidatedExchangeRate
On the Consolidated Exchange Rates table, you can maintain exchange rates between the root-
parent and child subsidiaries. Use the getConsolidatedExchangeRate operation to get and filter
all data related to this table.
Important: This operation can only be used in NetSuite OneWorld accounts.
In the UI, you can see the Consolidated Exchange Rates table by going to List > Accounting >
Consolidated Exchange Rates. Note that in Web services, this table is read-only.
For general information on currencies and working with the Consolidated Exchange Rate
table, see these topics in the NetSuite Help Center:
• Creating Currency Records
• Setting Currency Exchange Rates - Note: If you choose, you can set exchange rates in
the Consolidated Exchange Rates table directly. See the steps under “To set exchange
rates in the Consolidated Exchange Rates table” for details.
• Using the Currency Exchange Rate Integration Feature
• Working with Currencies
Request
The GetConsolidatedExchangeRateRequest type is used for the request.
ConsolidatedExchangeRateFilter
Response
The GetConsolidatedExchangeRateResult type is used for the response.
ConsolidatedExchangeRateList
ConsolidatedExchangeRate
Faults
This operation can throw one of the following faults. See “SOAP Fault Status Codes” on
page 252 for more information on faults.
• InvalidSessionFault
• InvalidCredentialsFault
• ExceededRequestLimitFault
• ExceededUsageLimitFault
• ExceededRecordCountFault
• ExceededRequestSizeFault
• UnexpectedErrorFault
Sample Code
The getConsolidatedExchangeRate and getBudgetExchangeRate operations are used in the
same way. Therefore, please refer to the Sample Code for getBudgetExchangeRate.
getCustomization
Because any record in NetSuite can be fully customized to suit the needs of a given business, it
is critical to consider these customizations when developing generic web services applications.
Use the getCustomization operation to dynamically retrieve and manage the metadata for
Custom Fields, Lists, and Record Types in order to handle some of the custom business logic
included at the record level.
Following are the custom objects currently supported by the getCustomization operation.
These are enumerated in the coreTypes XSD.
• crmCustomField
• customList
• customRecordType
• entityCustomField
• itemCustomField
• itemOptionCustomField
• otherCustomField
• transactionBodyCustomField
• transactionColumnCustomField
Note: Normally, you can NOT add or update the internalId of an object. Customization is an
exception to this rule. You can specify the ID on add, but can NOT update the ID thereafter.
InternalIds for custom objects can be set to any unique alphanumeric string up to 30 characters
long. This string must not include any spaces but can include underscores ("_").
Request
The getCustomizationRequest type is used for this request. It contains the following fields:
Response
The getCustomizationResult type is used for the Response. It contains the following fields:
Faults
This operation can throw one of the following faults. See “SOAP Fault Status Codes” on
page 252 for more information on faults.
• InvalidSessionFault
• InvalidCredentialsFault
• ExceededRequestLimitFault
• ExceededUsageLimitFault
• ExceededRecordCountFault
• ExceededRequestSizeFault
• UnexpectedErrorFault
Sample Code
SOAP Request
<soap:Body>
<platformMsgs:getCustomization>
<platformMsgs:customizationType getCustomizationType="crmCustomField"/>
</platformMsgs:getCustomization>
</soap:Body>
</soap:Envelope>
SOAP Response
<soapenv:Body>
<getCustomizationResponse
xmlns="urn:messages_2_0.platform.webservices.netsuite.com">
<getCustomizationResult xmlns="urn:core_2_6.platform.webservices.netsuite.com">
<status isSuccess="true"/>
<totalRecords>1</totalRecords>
<recordList>
<record internalId="CUSTEVENT1" xsi:type="ns1:CrmCustomField"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns1="urn:customization_2_6.setup.webservices.netsuite.com">
<ns1:label>test</ns1:label>
<ns1:fieldType>_freeFormText</ns1:fieldType>
<ns1:storeValue>true</ns1:storeValue>
<ns1:showInList>false</ns1:showInList>
<ns1:isParent>false</ns1:isParent>
<ns1:displayType>_normal</ns1:displayType>
<ns1:isMandatory>false</ns1:isMandatory>
<ns1:defaultChecked>false</ns1:defaultChecked>
<ns1:isFormula>false</ns1:isFormula>
<ns1:appliesToTask>false</ns1:appliesToTask>
<ns1:appliesToPhoneCall>false</ns1:appliesToPhoneCall>
<ns1:appliesToEvent>false</ns1:appliesToEvent>
<ns1:appliesToCase>false</ns1:appliesToCase>
<ns1:appliesToCampaign>false</ns1:appliesToCampaign>
<ns1:appliesPerKeyword>false</ns1:appliesPerKeyword>
<ns1:appliesToSolution>false</ns1:appliesToSolution>
<ns1:availableExternally>false</ns1:availableExternally>
</record>
</recordList>
</getCustomizationResult>
</getCustomizationResponse>
</soapenv:Body>
Java Sample
port.getCustomization(new CustomizationType(GetCustomizationType.transactionBodyCustomField));
C# Sample
private void getCustomization()
{
this.login(true);
CustomizationType ct = new CustomizationType();
ct.getCustomizationType = GetCustomizationType.customRecordType;
ct.getCustomizationTypeSpecified = true;
GetCustomizationResult response = _service.getCustomization(ct);
if (!response.status.isSuccess)
Console.WriteLine("ERROR: addRigLocation - no records found");
else
{
CustomRecordType[] rl = null;
rl = new CustomRecordType[response.recordList.Length];
for (int i = 0; i < response.recordList.Length; i++)
{
rl[i] = (CustomRecordType)response.recordList[i];
getDeleted
The getDeleted operation is used to retrieve a list of deleted records of a given type during a
specified period. The response does not differentiate between which records were deleted via
Web services versus the UI. This operation is useful in order to easily synchronize information
in a client application to the data currently in NetSuite.
For example, an Outlook client application plugin maintains a list of contacts and synchronizes
that list with NetSuite. The getDeleted operation can be used to determine contact deletions
since the last synchronization with NetSuite.
Deleted records in NetSuite are tracked by internalID and record type. In cases where
internalIDs are NOT unique within a record type, the deletions are NOT tracked and therefore
can not be retrieved using the getDeleted operation. Examples include items, bins, and serial
numbers. For a complete list of record types, refer to the DeletedRecordType enumeration in
the coreTypes xsd.
Important: Entity records are unique in that you may have an entity that belongs to several different
subtypes. For example, a partner that is also a contact. If the partner record is deleted, the contact
record remains intact.
Also note that the getDeleted operation returns a maximum of 1000 records. If there are more
than a 1000 records in the time interval you specify using the deletedDate filter, the
ExceededRecordCountFault will be thrown.
Request
The GetDeletedRequest type is used for the request.
GetDeletedFilter
The GetDeletedFilter allows you to retrieve data based on the date or record type of the deleted
record.
Response
The DeletedRecord type is used for the response.
Faults
This operation can throw one of the following faults. See “SOAP Fault Status Codes” on
page 252 for more information on faults.
• InvalidSessionFault
• InvalidCredentialsFault
• ExceededRequestLimitFault
• ExceededUsageLimitFault
• ExceededRecordCountFault
• ExceededRequestSizeFault
• UnexpectedErrorFault
Sample Code
SOAP Request
<soapenv:Body>
<platformMsgs:getDeleted xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://
www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:platformCoreTyp="urn:types.core_2_5.platform.webservices.netsuite.com"
xmlns:platformCore="urn:core_2_5.platform.webservices.netsuite.com"
xmlns:platformMsgs="urn:messages_2_5.platform.webservices.netsuite.com">
<platformMsgs:getDeletedFilter>
<platformCore:deletedDate>
<platformCore:predefinedSearchValue>lastBusinessWeek
</platformCore:predefinedSearchValue>
</platformCore:deletedDate>
<platformCore:type>
<platformCore:searchValue>contact</platformCore:searchValue>
</platformCore:type>
</platformMsgs:getDeletedFilter>
</platformMsgs:getDeleted>
</soapenv:Body>
C# Sample
private void getDeleted()
{
this.login(true);
searchDate = DateTime.Now;
searchDate = DateTime.Parse(searchDate.ToString("dd/MM/yyyy"));
fil.type = type;
fil.deletedDate = srchdtfldSearchDate;
Java Sample
public void getDeleted() throws RemoteException {
this.login(true);
getItemAvailability
The getItemAvailability operation can be used to retrieve the inventory availability for a given
list of items. You can filter the returned list using a lastQtyAvailableChange filter. If set, only
items with quantity available changes recorded as of this date are returned.
Request
The GetItemAvailabilityRequest type is used for the request.
ItemAvailabilityFilter
Response
The GetItemAvailabilityResult type is used for the response.
ItemAvailabilityList
ItemAvailabilityFilter
Faults
This operation can throw one of the following faults. See “SOAP Fault Status Codes” on
page 252 for more information on faults.
• InvalidSessionFault
• InvalidCredentialsFault
• ExceededRequestLimitFault
• ExceededUsageLimitFault
• ExceededRecordCountFault
• ExceededRequestSizeFault
• UnexpectedErrorFault
Sample Code
SOAP Request
<soap:Body>
<platformMsgs:getItemAvailability>
<platformMsgs:itemAvailabilityFilter>
<platformCore:item>
<platformCore:recordRef internalId="390" type="inventoryItem">
<platformCore:name/>
</platformCore:recordRef>
</platformCore:item>
<platformCore:lastQtyAvailableChange/>
</platformMsgs:itemAvailabilityFilter>
</platformMsgs:getItemAvailability>
</soap:Body>
SOAP Response
<soapenv:Body>
<getItemAvailabilityResponse xmlns="urn:messages_2_6.platform.webservices.netsuite.com">
<getItemAvailabilityResult
xmlns="urn:core_2_6.platform.webservices.netsuite.com">
<status isSuccess="true"/>
<itemAvailabilityList>
<itemAvailability>
<item internalId="390" type="inventoryItem">
<name>testItem</name>
</item>
<locationId internalId="1" type="location">
<name>East Coast</name>
</locationId>
<quantityOnHand>20.0</quantityOnHand>
<onHandValueMli>0.0</onHandValueMli>
<quantityCommitted>0.0</quantityCommitted>
<quantityAvailable>20.0</quantityAvailable>
</itemAvailability>
<itemAvailability>
<item internalId="390" type="inventoryItem">
<name>testItem</name>
</item>
<locationId internalId="2" type="location">
<name>West Coast</name>
</locationId>
</itemAvailability>
</itemAvailabilityList>
</getItemAvailabilityResult>
</getItemAvailabilityResponse>
</soapenv:Body>
C# Sample
private void getItemAvailability()
{
this.login(true);
getList
The getList operation is used to retrieve a list of one or more records by providing the unique
ids that identify those records.
If there are multiple ids provided, they can either belong to the same record type or different
record types. For example, it is possible to retrieve a customer and a contact within a single
request using this operation.
If some of the provided ids are invalid, the request is still processed for the valid ids and the
response will contain a warning that indicates that some of the ids were invalid.
Request
The getListRequest type is used for the request. It contains the following fields.
Response
The getListResponse type is used for the response. It contains the following fields.
Faults
This operation can throw one of the following faults. See “SOAP Fault Status Codes” on
page 252 for more information on faults.
• InvalidSessionFault
• ExceededRequestLimitFault
• ExceededUsageLimitFault
• ExceededRecordCountFault
• ExceededRequestSizeFault
• UnexpectedErrorFault
Sample Code
SOAP Request
In the following example, 2 records are retrieved — one customer record and one employee
record. Note that you must provide the internal ID of the specify instance of the record and the
record type for the getList.
<soap:Body>
<platformMsgs:getList>
<platformMsgs:baseRef internalId="983" type="customer" xsi:type="platformCore:RecordRef "/>
<platformMsgs:baseRef internalId="-5" type="employee" xsi:type="platformCore:RecordRef "/>
</platformMsgs:getList>
</soap:Body>
SOAP Response
<soapenv:Body>
<getListResponse xmlns="urn:messages_2_6.platform.webservices.netsuite.com">
<readResponseList xmlns="urn:messages_2_6.platform.webservices.netsuite.com">
<readResponse>
<ns1:status isSuccess="true" xmlns:ns1="urn:core_2_6.platform.webservices.netsuite.com"/>
<record internalId="983" xsi:type="ns2:Customer"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns2="urn:relationships_2_6.lists.webservices.netsuite.com">
<ns2:entityId>Shutter Fly</ns2:entityId>
<ns2:isInactive>false</ns2:isInactive>
<ns2:companyName>Shutter Fly, Inc</ns2:companyName>
.
...[more fields]
.
<ns2:customFieldList>
<ns6:customField internalId="custentity_map"
xsi:type="ns6:StringCustomFieldRef "
xmlns:ns6="urn:core_2_6.platform.webservices.netsuite.com">
<ns6:value>http://maps.google.com</ns6:value>
</ns6:customField>
</ns2:customFieldList>
</record>
</readResponse>
<readResponse>
<ns8:status isSuccess="true" xmlns:ns8="urn:core_2_6.platform.webservices.netsuite.com"/>
<record internalId="-5" xsi:type="ns9:Employee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns9="urn:employees_2_6.lists.webservices.netsuite.com">
<ns9:entityId>A Wolfe</ns9:entityId>
<ns9:isInactive>false</ns9:isInactive>
.
...[more fields]
.
</record>
</readResponse>
</readResponseList>
</getListResponse>
</soapenv:Body>
C#
private int getCustomerList()
{
// This operation requires a valid session
this.login( true );
Java
public int getCustomerList() throws RemoteException,
ExceededUsageLimitFault, UnexpectedErrorFault, InvalidSessionFault,
ExceededRecordCountFault {
// This operation requires a valid session
this.login(true);
getPostingTransactionSummary
The getPostingTransactionSummary operation allows you to retrieve a summary of the actual
data that posted to the general ledger in an account. You can use available filters/fields to
generate reports that are similar to what you see when you run financial reports such as a Trial
Balance, Balance Sheet, or an Income Statement.
Note: For information about NetSuite financial reports and financial statements, see these
topics in the NetSuite Help Center:
• Financial Reports
• Financial Statements Overview
The getPostingTransactionSummary operation returns the fields defined in
PostingTransactionSummary. You can query by any filter defined in
PostingTransactionSummaryFilter and group the results by any field defined in
PostingTransactionSummaryField.
The first call to the operation returns the first page, total number of hits (totalRecords), and the
number of pages. You can then retrieve subsequent pages by giving the page number. NetSuite
caches the results after the first call to getPostingTransactionSummary as subsequent pages are
being retrieved. The cache is reset if the session expires, or if you make another call to this
operation with a page index of 1.
Also note:
• This operation can only be executed in a role that has the Financial Statements
permission assigned. To enable this permission for a role, a NetSuite administrator
must go to Setup > User Roles > Manage Roles > click the Reports tab > select
Financial Statments from the Permission drop-down > click Save.
• Because the same operation is used for every page, make sure the fields and filters
supplied are the same for every page requested, otherwise an error will be thrown.
• To search for null, specify -1. If the return is null, the element will be skipped (not -1).
• For very large reports (for example, you have chosen all the columns), the query will
take a very long time on first request, but subsequent requests will be fast. Make sure
your timeout limit is set high.
Important: The information in the following paragraph pertains to NetSuite OneWorld
accounts only.
The amounts returned from getPostingTransactionSummary are in the currency of the
subsidiary, not the parent. If you want the amounts in the currency of the parent, you must
programmatically apply the appropriate exchange rate. To obtain exchange rates, you must call
getConsolidatedExchangeRate, which reads data from NetSuite’s Consolidated Exchange Rate
table. In your code, you must then multiply amount values returned by
getPostingTransactionSummary by the exchange rate values returned by
getConsolidatedExchangeRate.
Although the NetSuite UI automatically consolidates all amounts, you must perform your own
exchange rate calculations in Web services.
Note: You may want to do planning in your local currency, in which case there is no need for
exchange rate conversions.
Request
The GetPostingTransactionSummaryRequest type is used for the request.
PostingTransactionSummaryField
PostingTransactionSummaryFilter
Response
The GetPostingTransactionSummaryResult type is used for the response.
PostingTransactionSummaryList
PostingTransactionSummary
Faults
This operation can throw one of the following faults. See “SOAP Fault Status Codes” on
page 252 for more information on faults.
• InvalidSessionFault
• InvalidCredentialsFault
• ExceededRequestLimitFault
• ExceededUsageLimitFault
• ExceededRecordCountFault
• ExceededRequestSizeFault
• UnexpectedErrorFault
Sample Code
Example 1
The sample provided shows how to get and print account values using the
getPostingTransactionSummary operation.
SOAP Request
To be provided
SOAP Response
To be provided
Java
/* Make Record Ref out of an internalId */
public static RecordRef mrr(String internalId)
{
RecordRef toRet = new RecordRef();
toRet.setInternalId(internalId);
return toRet;
}
/*
pagb.set_class(Boolean.FALSE);
pagb.setItem(Boolean.FALSE);
pagb.setCustomer(Boolean.FALSE);
pagb.setLocation(Boolean.FALSE);
*/
System.out.println("Account:" +
res.getPostingTransactionSummaryList().getPostingTransactionSummary(i).getAccount().getInternalId());
if (res.getPostingTransactionSummaryList().getPostingTransactionSummary(i).getPeriod() != null)
System.out.println("Period:" +
res.getPostingTransactionSummaryList().getPostingTransactionSummary(i).getPeriod().getInternalId());
if (res.getPostingTransactionSummaryList().getPostingTransactionSummary(i).getCustomer() != null)
System.out.println("Customer:" +
res.getPostingTransactionSummaryList().getPostingTransactionSummary(i).getCustomer().getInternalId());
if (res.getPostingTransactionSummaryList().getPostingTransactionSummary(i).get_class() != null)
System.out.println("_class:" +
res.getPostingTransactionSummaryList().getPostingTransactionSummary(i).get_class().getInternalId());
if (res.getPostingTransactionSummaryList().getPostingTransactionSummary(i).getDepartment() != null)
System.out.println("Department:" +
res.getPostingTransactionSummaryList().getPostingTransactionSummary(i).getDepartment().getInternalId())
;
if (res.getPostingTransactionSummaryList().getPostingTransactionSummary(i).getLocation() != null)
System.out.println("Location:" +
res.getPostingTransactionSummaryList().getPostingTransactionSummary(i).getLocation().getInternalId());
if (res.getPostingTransactionSummaryList().getPostingTransactionSummary(i).getSubsidiary() != null)
System.out.println("Subsidiary:" +
res.getPostingTransactionSummaryList().getPostingTransactionSummary(i).getSubsidiary().getInternalId());
if (res.getPostingTransactionSummaryList().getPostingTransactionSummary(i).getItem() != null)
System.out.println("Item:" +
res.getPostingTransactionSummaryList().getPostingTransactionSummary(i).getItem().getInternalId());
System.out.println("Amount:" +
res.getPostingTransactionSummaryList().getPostingTransactionSummary(i).getAmount());
}
for (int i=res.getPageIndex(); i<res.getTotalPages(); i++)
{
System.err.println("Elapsed Time : " + (System.currentTimeMillis() - start));
res = c.getPort().getPostingTransactionSummary(pagb,paf,i+1);
}
System.err.println("Elapsed Time : " + (System.currentTimeMillis() - start));
Example 2
The following SOAP and Java show how to get the posting activity for posting period 109. The
sample prints the unconsolidated and consolidated amounts in the parent subsidiary by child
subsidiary and account – for example, if subsidiary 2 is in Euros and subsidiary 1, the parent
company, is in dollars, show the amount in Euros and the amount in dollars for that account in
period 109.
SOAP Request
<soapenv:Body>
<getPostingTransactionSummary xmlns="urn:messages_2009_1.platform.webservices.netsuite.com">
<fields>
<ns6:period xmlns:ns6="urn:core_2009_1.platform.webservices.netsuite.com">true</ns6:period>
<ns7:account xmlns:ns7="urn:core_2009_1.platform.webservices.netsuite.com">true</ns7:account>
<ns8:subsidiary xmlns:ns8="urn:core_2009_1.platform.webservices.netsuite.com">true<
ns8:subsidiary>
</fields>
<filters>
<ns9:period xmlns:ns9="urn:core_2009_1.platform.webservices.netsuite.com">
<ns9:recordRef internalId="109"/>
</ns9:period>
</filters>
<pageIndex>1</pageIndex>
</getPostingTransactionSummary>
</soapenv:Body>
SOAP Reponse
<soapenv:Body>
<getPostingTransactionSummaryResponse
xmlns="urn:messages_2009_1.platform.webservices.netsuite.com">
<platformCore:getPostingTransactionSummaryResult
xmlns:platformCore="urn:core_2009_1.platform.webservices.netsuite.com">
<platformCore:status isSuccess="true"/>
<platformCore:totalRecords>19</platformCore:totalRecords>
<platformCore:pageSize>1000</platformCore:pageSize>
<platformCore:totalPages>0</platformCore:totalPages>
<platformCore:pageIndex>1</platformCore:pageIndex>
<platformCore:postingTransactionSummaryList>
<platformCore:postingTransactionSummary>
<platformCore:period internalId="109"/>
<platformCore:account internalId="2"/>
<platformCore:subsidiary internalId="1"/>
<platformCore:amount>500.0</platformCore:amount>
</platformCore:postingTransactionSummary>
<platformCore:postingTransactionSummary>
<platformCore:period internalId="109"/>
<platformCore:account internalId="6"/>
<platformCore:subsidiary internalId="1"/>
<platformCore:amount>19.0</platformCore:amount>
</platformCore:postingTransactionSummary>
<platformCore:postingTransactionSummary>
<platformCore:period internalId="109"/>
<platformCore:account internalId="6"/>
<platformCore:subsidiary internalId="2"/>
<platformCore:amount>5.0</platformCore:amount>
</platformCore:postingTransactionSummary>
<platformCore:postingTransactionSummary>
<platformCore:period internalId="109"/>
<platformCore:account internalId="6"/>
<platformCore:subsidiary internalId="4"/>
<platformCore:amount>6.0</platformCore:amount>
</platformCore:postingTransactionSummary>
<platformCore:postingTransactionSummary>
<platformCore:period internalId="109"/>
<platformCore:account internalId="6"/>
<platformCore:subsidiary internalId="8"/>
<platformCore:amount>-3.0</platformCore:amount>
</platformCore:postingTransactionSummary>
<platformCore:postingTransactionSummary>
<platformCore:period internalId="109"/>
<platformCore:account internalId="16"/>
<platformCore:subsidiary internalId="6"/>
<platformCore:amount>-4.0</platformCore:amount>
</platformCore:postingTransactionSummary>
<platformCore:postingTransactionSummary>
<platformCore:period internalId="109"/>
<platformCore:account internalId="24"/>
<platformCore:subsidiary internalId="8"/>
<platformCore:amount>-100.0</platformCore:amount>
</platformCore:postingTransactionSummary>
<platformCore:postingTransactionSummary>
<platformCore:period internalId="109"/>
<platformCore:account internalId="58"/>
<platformCore:subsidiary internalId="8"/>
<platformCore:amount>100.0</platformCore:amount>
</platformCore:postingTransactionSummary>
<platformCore:postingTransactionSummary>
<platformCore:period internalId="109"/>
<platformCore:account internalId="112"/>
<platformCore:subsidiary internalId="1"/>
<platformCore:amount>-496.0</platformCore:amount>
</platformCore:postingTransactionSummary>
<platformCore:postingTransactionSummary>
<platformCore:period internalId="109"/>
<platformCore:account internalId="112"/>
<platformCore:subsidiary internalId="5"/>
<platformCore:amount>-1.0</platformCore:amount>
</platformCore:postingTransactionSummary>
<platformCore:postingTransactionSummary>
<platformCore:period internalId="109"/>
<platformCore:account internalId="139"/>
<platformCore:subsidiary internalId="4"/>
<platformCore:amount>-9.0</platformCore:amount>
</platformCore:postingTransactionSummary>
<platformCore:postingTransactionSummary>
<platformCore:period internalId="109"/>
<platformCore:account internalId="142"/>
<platformCore:subsidiary internalId="8"/>
<platformCore:amount>3.0</platformCore:amount>
</platformCore:postingTransactionSummary>
<platformCore:postingTransactionSummary>
<platformCore:period internalId="109"/>
<platformCore:account internalId="145"/>
<platformCore:subsidiary internalId="5"/>
<platformCore:amount>1.0</platformCore:amount>
</platformCore:postingTransactionSummary>
<platformCore:postingTransactionSummary>
<platformCore:period internalId="109"/>
<platformCore:account internalId="148"/>
<platformCore:subsidiary internalId="2"/>
<platformCore:amount>-5.0</platformCore:amount>
</platformCore:postingTransactionSummary>
<platformCore:postingTransactionSummary>
<platformCore:period internalId="109"/>
<platformCore:account internalId="153"/>
<platformCore:subsidiary internalId="6"/>
<platformCore:amount>4.0</platformCore:amount>
</platformCore:postingTransactionSummary>
<platformCore:postingTransactionSummary>
<platformCore:period internalId="109"/>
<platformCore:account internalId="155"/>
<platformCore:subsidiary internalId="1"/>
<platformCore:amount>-23.0</platformCore:amount>
</platformCore:postingTransactionSummary>
<platformCore:postingTransactionSummary>
<platformCore:period internalId="109"/>
<platformCore:account internalId="175"/>
<platformCore:subsidiary internalId="4"/>
<platformCore:amount>3.0</platformCore:amount>
</platformCore:postingTransactionSummary>
<platformCore:postingTransactionSummary>
<platformCore:period internalId="109"/>
<platformCore:account internalId="186"/>
<platformCore:subsidiary internalId="8"/>
<platformCore:amount>0.0</platformCore:amount>
</platformCore:postingTransactionSummary>
<platformCore:postingTransactionSummary>
<platformCore:period internalId="109"/>
<platformCore:account internalId="187"/>
<platformCore:subsidiary internalId="8"/>
<platformCore:amount>0.0</platformCore:amount>
</platformCore:postingTransactionSummary>
</platformCore:postingTransactionSummaryList>
</platformCore:getPostingTransactionSummaryResult>
</getPostingTransactionSummaryResponse>
</soapenv:Body>
Java
getSavedSearch
This operation allows users to retrieve a list of existing saved search IDs on a per-record-type
basis (for example, all saved search IDs for every Customer saved search). Note that once you
retrieve the list of saved search IDs, you may need to look in the NetSuite UI to see the criteria
defined for the saved search. To navigate to the list of saved searches in the NetSuite UI, go to
Lists > Search > Saved Searches.
This API takes a search record type as a request argument and returns a list of record references
of the saved search.
For use cases explaining why you would want to get a list of saved search IDs and then
reference a specific ID in your code, see “Reference Existing Saved Searches” on page 194.
Note: There is no async equivalent for this operation.
Request
The GetSavedSearchRequest type is used for the request. It contains the following fields.
Response
The GetSavedSearchResponse type is used for the response. It contains the following fields.
Faults
This operation can throw one of the following faults. See “SOAP Fault Status Codes” on
page 252 for more information on faults.
• InvalidSessionFault
• InvalidCredentialsFault
• ExceededRequestLimitFault
• ExceededUsageLimitFault
• ExceededRecordCountFault
• ExceededRequestSizeFault
• UnexpectedErrorFault
Sample Code
SOAP Request
<getSavedSearch xmlns="urn:messages_2008_2.platform.webservices.netsuite.com">
<record searchType="transaction" />
</getSavedSearch>
SOAP Response
<getSavedSearchResponse xmlns="urn:messages_2008_2.platform.webservices.netsuite.com">
<platformCore:getSavedSearchResult
xmlns:platformCore="urn:core_2008_2.platform.webservices.netsuite.com">
<platformCore:status isSuccess="true"/>
<platformCore:totalRecords>4</platformCore:totalRecords>
<platformCore:recordRefList>
<platformCore:recordRef internalId="32">
<platformCore:name>Open Sales Orders</platformCore:name>
</platformCore:recordRef>
<platformCore:recordRef internalId="48">
<platformCore:name>Open Invoices by Due Date</platformCore:name>
</platformCore:recordRef>
<platformCore:recordRef internalId="47">
<platformCore:name>Orders Scheduled to Ship This Month</platformCore:name>
</platformCore:recordRef>
<platformCore:recordRef internalId="45">
<platformCore:name>Open Purchase Orders</platformCore:name>
</platformCore:recordRef>
<platformCore:recordRef internalId="57">
<platformCore:name>Open Transactions</platformCore:name>
</platformCore:recordRef>
</platformCore:recordRefList>
</platformCore:getSavedSearchResult>
</getSavedSearchResponse>
C#
GetSavedSearchRecord record = new GetSavedSearchRecord();
record.searchTypeSpecified = true;
record.searchType = SearchRecordType.transaction;
GetSavedSearchResult result = nss.getSavedSearch(record);
Java
public void getSavedSearches() throws RemoteException{
this.login(true);
getSelectValue
Important: The interface to this operation has been completely redefined in the 2009.2 endpoint. If
you plan to upgrade to the 2009.2 endpoint or later, NetSuite recommends that you see Changes to
getSelectValue Operation in the 2009.2 Release Notes. If you are not planning to upgrade, but have
questions about how getSelectValue works in pre-2009.2 endpoints, see the SuiteTalk
documentation in the Developer Resources archives.
Use the getSelectValue operation to retrieve valid select options for a given RecordRef,
CustomRecordRef, or enumerated static field. This is useful if you are writing an application UI
that needs to mimic NetSuite UI logic, if the referenced record type is not yet exposed in
SuiteTalk, or when the logged-in user’s role does not have permission to the instances of the
referenced record type. A call to getSelectValue may return different results for the same field
for different roles.
The getSelectValue operation can be used on standard body fields and custom body fields. It
can also be used on sublist fields that appear on both standard and custom records.
These topics describe each aspect of the operation:
• GetSelectValue Overview
• Paginating Select Values
• Filtering Select Value Text
• Getting Dependent Select Values
• Sample Code
Important: If you reference a field or a select value that is renamed in future versions of NetSuite,
your requests will still be handled, however, a warning will be returned. Also, when working with this
operation be aware of any special permissions applied to a field. For example, a permission error will
be thrown if you attempt to get select values on a field that has been disabled on a form.
GetSelectValue Overview
The following figure shows the UI equivalent of a RecordRef field and a list of select values for
this field. You can use getSelectValue to return the entire list of values or just a subset of values.
In accounts where there are levels of field dependencies, such as OneWorld accounts, you can
use getSelectValue to get select values for field “B” based on the value of field “A”. The figure
below shows an Opportunity record in a OneWorld account. The select values associated with
the Department field are based on the value specified in the Customer field. In this scenario,
you can use getSelectValue to get the values on the Department field by specifying the internal
ID of its filterBy (“master”) field, which is Customer (internal ID - entity). See Getting
Dependent Select Values for additional details.
This figure shows the UI equivalent of filtering a list of select values based on the contains
search operator. Of the hundreds of possible select values, only two containing the string
“Adam” are returned.
<complexType name="GetSelectFilterByFieldValueList">
<sequence>
<element name="filterBy" type="platformCore:GetSelectFilterByFieldValue" minOccurs="1"
maxOccurs="unbounded"/>
</sequence>
</complexType>
<complexType name="GetSelectFilterByFieldValue">
<sequence>
<element name="sublist" type="xsd:string" minOccurs="0" maxOccurs="1"/>
<element name="field" type="xsd:string" minOccurs="1" maxOccurs="1"/>
<element name="internalId" type="xsd:string" minOccurs="1" maxOccurs="1"/>
</sequence>
</complexType>
• the name of the sublist the filterBy field appears on (if it appears on a sublist)
• the schema name of the filterBy field (for example, “entity”)
• the internalId of the specific entity record (for example, “87”)
Important: Currently there is no programmatic way to discover what the filterBy field is for another
field. Note, however, on transaction records the Customer (entity) field is always the filterBy field for
any dependent RecordRef field. For all other record types, you must use the UI to see which field is
the filterBy field.
Request
The getSelectValueRequest type is used for the request. It contains the following elements.
GetSelectValueFieldDescription
sublist = null
field = “entity”
internalId = “87” (87 being the internalId of a specific
customer record, such as the Abe Simpson customer
record)
Response
The getSelectValueResponse type is used for the response. It contains the following elements.
Faults
This operation can throw one of the following faults. See “SOAP Fault Status Codes” on
page 252 for more information on faults.
• InvalidSessionFault
• InvalidCredentialsFault
• ExceededRequestLimitFault
• ExceededUsageLimitFault
• ExceededRecordCountFault
• ExceededRequestSizeFault
• UnexpectedErrorFault
Sample Code
SOAP Request
<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org
soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001
XMLSchema-instance">
<soapenv:Header>
<ns1:passport soapenv:actor="http://schemas.xmlsoap.org/soap/actor/next" soapenv:mustUnderstand="0"
xmlns:ns1="urn:messages_2009_2.platform.webservices.netsuite.com">
<ns2:email xmlns:ns2="urn:core_2009_2.platform.webservices.netsuite.com">kwolfe@netsuite.com<
ns2:email>
<ns3:password xmlns:ns3="urn:core_2009_2.platform.webservices.netsuite.com">mypassword<
ns3:password>
<ns4:account xmlns:ns4="urn:core_2009_2.platform.webservices.netsuite.com">000071</ns4:account
<ns5:role internalId="3" xmlns:ns5="urn:core_2009_2.platform.webservices.netsuite.com"/>
</ns1:passport>
</soapenv:Header>
<soapenv:Body>
<getSelectValue xmlns="urn:messages_2009_2.platform.webservices.netsuite.com">
<fieldDescription>
<ns6:recordType xmlns:ns6="urn:core_2009_2.platform.webservices.netsuite.com">salesOrder<
ns6:recordType>
<ns7:sublist xmlns:ns7="urn:core_2009_2.platform.webservices.netsuite.com">itemList</ns7:sublist>
<ns8:field xmlns:ns8="urn:core_2009_2.platform.webservices.netsuite.com">item</ns8:field>
<ns9:filterByValueList xmlns:ns9="urn:core_2009_2.platform.webservices.netsuite.com">
<ns9:filterBy>
<ns9:field>entity</ns9:field>
<ns9:internalId>8</ns9:internalId>
</ns9:filterBy>
</ns9:filterByValueList>
</fieldDescription>
<pageIndex>1</pageIndex>
</getSelectValue>
</soapenv:Body>
</soapenv:Envelope>
Java
This sample shows how get select values for the Item field that appears on the Item sublist of a
Sales Order record.
BaseRef[] br = c.getSelectValue(myGSVField);
getServerTime
This operation takes no arguments and returns the NetSuite server time in GMT, regardless of
a user’s time zone. Developers do not have to rely on client time when writing synchronization
procedures because the client time may not be in synch with the NetSuite server time.
If you choose, you can write client code that takes the GMT returned by NetSuite and convert
the time to your local time zone. The format of the dateTime value returned by getServerTime
contains integer-valued year, month, day, hour and minute properties, a decimal-valued second
property and a boolean time-zoned property (timestamp) – for example, 2005-09-
21T15:24:00.000-07:00, where 2005-09-21 is the date, 15:24:00.000 is the time and -07:00 is
your own time zone offset, if you choose to set one.
Any user with an active session can call getServerTime. There are no explicit permissions for
this operation. For example, if you need to synchronize customer data with NetSuite, you can
call getServerTime to initialize your synchronization process. To synchronize new or changed
customers records, you can search customers and filter by lastModifiedDate using the value
returned in getServerTime. To synchronize deleted customer records, you can call the
getDeleted operation and use the value returned in getServerTime. This makes your
synchronization process independent of your client time,which may not be in sync with the
NetSuite server time and hence the timestamp we use to track changes.
Request
The GetServerTimeRequest type is used for the request. It takes no arguments.
Response
The GetServerTimeResponse type is used for the response. It contains the following elements.
GetServerTimeResult
The GetServerTimeResult type contains the following elements.
Faults
This operation can throw one of the following faults. See “SOAP Fault Status Codes” on
page 252 for more information on faults.
• InvalidSessionFault
• InvalidCredentialsFault
• ExceededRequestLimitFault
• ExceededUsageLimitFault
• UnexpectedErrorFault
Sample Code
Java
public void testGetServerTime() throws Exception
{
c.login();
GetServerTimeResult rs = c.getPort().getServerTime();
System.out.println("Welcome to NetSuite. At the sound of the tone the NetSuite time will be : " + new
SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(rs.getServerTime().getTime()));
initialize / initializeList
Use the initialize operation to emulate the UI workflow by prepopulating fields on transaction
line items with values from a related record. Your Web services application can then modify
only the values it needs to before submitting the record.
For example, in the UI clicking Bill from a Sales Order record loads an Invoice record where
fields are populated with values from the Sales Order. When loading an invoice record in Web
services, you can reference the related Sales Order record to initialize fields with values from
that sales order.
The following table outlines all the transaction types that can be used with the initialize
operation and the valid reference types they can use.
Faults
This operation can throw one of the following faults. See “SOAP Fault Status Codes” on
page 252 for more information on faults.
• InvalidSessionFault
• InvalidCredentialsFault
• ExceededRequestLimitFault
• ExceededUsageLimitFault
• ExceededRecordCountFault
• ExceededRequestSizeFault
• UnexpectedErrorFault
Sample Code
SOAP Request (initialize)
<soapenv:Body>
<platformMsgs:initialize xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://
www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:platformCoreTyp="urn:types.core_2_6.platform.webservices.netsuite.com"
xmlns:platformCore="urn:core_2_6.platform.webservices.netsuite.com"
xmlns:platformMsgs="urn:messages_2_6.platform.webservices.netsuite.com">
<platformMsgs:initializeRecord>
<platformCore:type>invoice</platformCore:type>
<platformCore:reference internalId="1513" type="salesOrder">
<platformCore:name>1511</platformCore:name>
</platformCore:reference>
</platformMsgs:initializeRecord>
</platformMsgs:initialize>
</soapenv:Body>
<ns3:type xmlns:ns3="urn:core_2_6.platform.webservices.netsuite.com">
invoice</ns3:type>
<ns4:reference internalId="176" type="customer"
xmlns:ns4="urn:core_2_6.platform.webservices.netsuite.com"/>
</initializeRecord>
</initializeList>
Java (initializeList)
InitializeRef iRef1 = new InitializeRef();
iRef1.setInternalId("176");
iRef1.setType(InitializeRefType.customer);
C# (initialize)
private void Initialize()
{
this.login(true);
login
The login operation is used to authenticate a user and start a new Web services session in
NetSuite. The login operation is similar to the login for the UI. This operation provides a
passport that includes a username, password, account and role. On success, the NetSuite server
sets a cookie and establishes a session.
Important: Users can also authenticate to NetSuite by providing their user credentials in the SOAP
header of each request; they do not need to invoke the login operation. With user credentials
provided in each request, the need for session management and separate logins is eliminated. For
more information, see “Authentication Using Request Level Credentials” on page 65.
All available Web services operations require that the user first be logged in. Once successfully
completed, a login creates a session that allows subsequent operations to be performed without
having to log in again until the session expires or the logout operation is invoked. If the session
times out, the next operation fails. Web services requests initiated through a client application
must have the ability to execute the login operation when a session has timed out and then
submit the original request again.
Note: For information on session management, refer to “Session Management” on page 67.
If an operation is executed before a login is performed, it fails and the InvalidSessionFault is
returned. Also note that after login, only one Web services request may be in flight at a time for
a given session. Any attempt to violate this will result in a SOAP fault.
NetSuite Web services will use the last logged-in role when users do not specify a role in the
login request and no default role is set. This makes the Web services login behavior consistent
with the UI login behavior. Partner applications that rely on a specific role should be careful to
specify that role in the login request, otherwise their users might be logged in with a role that is
not appropriate for that application.
The login operation also verifies that the specified account has the Web Services feature
enabled. If Web services is not enabled in your account, the SOAP fault InvalidCredentialsFault
is returned with a code of WEB_SERVICES_NOT_ENABLED. (See “Enabling the Web
Services Feature” on page 29 for steps on enabling this feature.)
Request
The LoginRequest type is used for this request. It contains the following fields:
• role
Note: You can confirm your accountID in the NetSuite UI. As administrator, go to Support >
Customer Service > Contact Support by Phone. Your account number is displayed in a pop-up box.
Also, Role is not a required parameter in the WS login. However, if you don't specify a role, the user's
default role must have WS permissions.
Response
The LoginResponse type is used for the response. This references the SessionResponse type,
which includes the status and wsRoleList elements.
The wsRoleList element returns a list of roles available for the user specified in the passport.
You can then use this list of roles to execute different routines depending on available roles or
to re-login with a different role.
Faults
This operation can throw one of the following faults. See “SOAP Fault Status Codes” on
page 252 for more information on faults.
• InsufficientPermissionFault
• InvalidAccountFault
• InvalidSessionFault
• InvalidCredentialsFault
• UnexpectedErrorFault
Sample Code
SOAP Request
In the following example a user is logged in with the Administrator role as indicated by the
internalId of 3. For a list of available role IDs see “Internal IDs Associated with Roles” on
page 55.
<soap:Body>
<platformMsgs:login>
<platformMsgs:passport>
<platformCore:email>jsmith@yahoo.com</platformCore:email>
<platformCore:password>password123</platformCore:password>
<platformCore:account>121511</platformCore:account>
<platformCore:role internalId="3"/>
</platformMsgs:passport>
</platformMsgs:login>
</soap:Body>
SOAP Response
<soapenv:Body>
<loginResponse xmlns="urn:messages_1_2.platform.webservices.netsuite.com">
<sessionResponse xmlns="urn:messages_1_2.platform.webservices.netsuite.com">
<ns1:status isSuccess="true" xmlns:ns1="urn:core_1_2.platform.webservices.netsuite.com"/>
<ns2:wsRoleList xmlns:ns2="urn:core_1_2.platform.webservices.netsuite.com">
<ns2:wsRole>
<ns2:role internalId="3">
<ns2:name>Administrator</ns2:name>
</ns2:role>
<ns2:isDefault>false</ns2:isDefault>
<ns2:isInactive>false</ns2:isInactive>
</ns2:wsRole>
<ns2:wsRole>
<ns2:role internalId="15">
<ns2:name>Employee Center</ns2:name>
</ns2:role>
<ns2:isDefault>false</ns2:isDefault>
<ns2:isInactive>false</ns2:isInactive>
</ns2:wsRole>
<ns2:wsRole>
<ns2:role internalId="22">
<ns2:name>Intranet Manager</ns2:name>
</ns2:role>
<ns2:isDefault>false</ns2:isDefault>
<ns2:isInactive>false</ns2:isInactive>
</ns2:wsRole>
<ns2:wsRole>
<ns2:role internalId="25">
<ns2:name>System Administrator</ns2:name>
</ns2:role>
<ns2:isDefault>false</ns2:isDefault>
<ns2:isInactive>false</ns2:isInactive>
</ns2:wsRole>
</ns2:wsRoleList>
</sessionResponse>
</loginResponse>
</soapenv:Body>
C#
private void login( bool isAuto )
{
if ( !_isAuthenticated )
{
// Check whether this is a forced login as part of another operation
if ( isAuto )
_out.writeLn( "\nYou need to first login before invoking this operation ..." );
// Login to NetSuite
_out.info( "\nLogging into NetSuite" );
_out.info( "Username: " + passport.email );
_out.info( "Account: " + passport.account );
Status status = (_service.login( passport )).status;
// Process response
if ( status.isSuccess == true )
{
_isAuthenticated = true;
_out.info( "\nThe user with nsKey=" + _service.sessionInfo.userId + " was logged
in successful and a new session has been created." );
}
else
{
Java
public void login(boolean isAuto) throws RemoteException {
if (!_isAuthenticated) {
// Check whether this is a forced login as part of another operation
if (isAuto)
_console
.writeLn("\nYou need to first login before invoking this operation ...");
// Login to NetSuite
_console.info("\nLogging into NetSuite");
_console.info("Username: " + passport.getEmail());
_console.info("Account: " + passport.getAccount());
logout
The logout operation is used to terminate an active session.
Note: If you explicitly logout of a session, and then attempt to utilize the same session, the
SESSION_TIMED_OUT error message is returned.
Request
The logoutRequest type is used for the request. It does not contain any fields.
Response
The status type is used for the response. It does not contain any fields.
Faults
This operation can throw one of the following faults. See “SOAP Fault Status Codes” on
page 252 for more information on faults.
• InvalidSessionFault
• ExceededRequestLimitFault
• UnexpectedErrorFault
Sample Code
Following is an example that contains an excerpt of the SOAP body for both the request and
response.
SOAP Request
<logout/>
SOAP Response
<logoutResponse>
<status isSuccess=”true”/>
</logoutRespinse>
C#
private void logout()
{
if ( _isAuthenticated )
{
_out.info( "\nLogging out of NetSuite\n" );
if ( status.isSuccess == true )
{
_isAuthenticated = false;
_out.info( "Logout successful" );
}
else
{
// Should never get here since any problems with the
// logout should have resulted in a SOAP fault
_out.error( getStatusDetails( status ) );
}
}
else
{
_out.info(
"\nThe logout() operation cannot be invoked because there is no active session. " +
"You must be first logged on before attempting to logout.\n" );
}
}
Java
public void logout() throws RemoteException {
if (_isAuthenticated) {
_console.info("\nLogging out of NetSuite\n");
if (status.isIsSuccess() == true) {
_isAuthenticated = false;
_console.info("Logout successful");
} else {
// Should never get here since any problems with the
// logout should have resulted in a SOAP fault
_console.error(getStatusDetails(status));
}
} else {
_console
.info("\nThe logout() operation cannot be invoked because there is no active session. "
+ "You must be first logged on before attempting to logout.\n");
}
}
mapSso
Single Signon (SSO) refers to the procedure that allows a user of two or more user-
authenticating Web applications to move between these applications using a browser, only
presenting authentication information once per session.
The mapSso operation streamlines the provisioning of Single Signon User Accounts by
providing the ability to correlate a partner/customer specified internal ID with a Netsuite
credential. This automates the mapping between external applications credentials and
NetSuite’s credentials for a user.
Important: This operation is a one time mapping — NOT a login. The operation does NOT include
the ability to login via a Single Signon Token, nor does it allow for the provisioning of a partner — it
does not aid with public/private key exchange. Also, this operation implies that the user already has
SSO set up and has access to the associated partner ID and encryption keys needed to generate the
SSO token.
Note: For more detailed information on NetSuite’s SSO technology, contact your NetSuite
Account Manager or Professional Services Manager for the Single Signon Developer’s Guide.
Request
The MapSsoRequest type is used for this request. It contains the following fields:
• partnerId
Note: You can confirm your accountID in the NetSuite UI. As administrator, go to Support >
Customer Service > Contact Support by Phone. Your account number is displayed in a pop-up box.
Response
The MapSsoResponse type is used for the response. It does not contain any fields.
Faults
This operation can throw one of the following faults. See “SOAP Fault Status Codes” on
page 252 for more information on faults.
• InvalidAccountFault
• InvalidCredentialsFault
• InvalidVersionFault
• ExceededRequestLimitFault
• UnexpectedErrorFault
Sample Code
SOAP Request
<soap:Body>
<platformMsgs:mapSso>
<platformMsgs:ssoCredentials>
<platformCore:email>bbrown@yahoo.com</platformCore:email>
<platformCore:password>mypassword</platformCore:password>
<platformCore:account>TSTDRV211915</platformCore:account>
<platformCore:authenticationToken>[enter token here]</platformCore:authenticationToken>
<platformCore:partnerId>[enter partner id here]</platformCore:partnerId>
</platformMsgs:ssoCredentials>
</platformMsgs:mapSso>
</soap:Body>
Java
/* Generate a NetSuitePort */
NetSuiteServiceLocator nss = new NetSuiteServiceLocator();
NetSutePortType myNetSuitePort = nss.getNetSuitePort();
SessionResponse sr = myNetSuitePort.mapSso(sc);
if (!sr.getStatus().isIsSuccess())
throw new Exception("Mapping Failed: " + sr.getStatus().getStatusDetail(0).getMessage());
}
search
The search operation is used to execute a search on a specific record type based on a set of
criteria. You can search by defining search filter fields on the record, joined fields on an
associated record, search return columns, or joined search return columns from an associated
record. The results of the search can be complete records, or a select set of fields specified
through search return columns.
Note that you can also use the search operation to return an existing saved search. You cannot
use the search operation to retrieve state values. You must use the getAll operation to retrieve
all state values in the system. The getAll operation will return all states, not just the legal ones
for your default country. Also note that the country and state must match on the address.
Important: Be aware that the search preferences you set in SearchPreferences object affect the
search request and response. See “Setting Search Preferences” on page 42 for details.
Use the search operation to execute the following types of searches:
• Basic search: Execute a search on a record type based on search filter fields that are
specific to that type. See “Basic Searches in Web Services” on page 187.
• Joined search: Execute a search on a record type based on search filter fields on an
associated record type. See “Joined Searches in Web Services” on page 190
• Advanced search: Execute a search on a record type in which you specify search filter
fields and/or search return columns or joined search columns. Using advanced search,
you can also return an existing saved search. See “Advanced Searches in Web Services”
on page 193.
Also see the following sections for information on setting additional search filtering values and
searching for custom fields:
• “Setting Valid Search Values” on page 201
• “Setting the anyof, mine, or myteam Filtering Values” on page 202
• “Searching for a Multi-select Custom Field” on page 218.
Important: To go directly to search-related code samples, see “Sample Code” on page 205.
In a basic search, field criteria are the only values you set. You do not specify search return
columns on the Results tab. In Web services, specifying search return columns is the equivalent
of performing an advanced search. (See “Advanced Searches in Web Services” on page 193 for
details.)
In the example of a basic Customer search (see previous figure), the results returned include
the record ID of every customer that has the Category field set to From Advertisement and the
Status field set to Customer-Closed Won. Note that ALL the other data associated with these
specific customer records are returned as well. As a consequence, in Web services a basic search
tends to increase the search response time.
</sequence>
</extension>
</complexContent>
</complexType>
Note: <Record>Search objects reside in the same XSD as their corresponding record objects. In
this case, both the Customer and CustomerSearch objects reside in the listRel XSD. Also note
that the CustomerSearch object, like all <Record>Search objects, provide available search joins
for that record type. For information on joined searches, see “Joined Searches in Web Services”
on page 190.
This snippet shows the CustomerSearchBasic object. All <Record>SearchBasic objects are
defined in the platformCommon XSD. This sample shows four of the available fields
(accountNumber, address, addressee, addressLabel) that can be used as search criteria on the
Customer record.
<complexType name="CustomerSearchBasic">
<complexContent>
<extension base="platformCore:SearchRecord">
<sequence>
<element name="accountNumber" type="platformCore:SearchStringField" minOccurs="0" />
<element name="address" type="platformCore:SearchStringField" minOccurs="0" />
<element name="addressee" type="platformCore:SearchStringField" minOccurs="0" />
<element name="addressLabel" type="platformCore:SearchStringField" minOccurs="0" />
...
</sequence>
</extension>
</complexContent>
</complexType>
For a code sample of a basic search, see “Basic Search Code Sample” on page 206.
Important: For a list of SuiteTalk-supported records, see the section called “Supported
Records” in the SuiteTalk (Web Services) Records Guide.
</sequence>
</extension>
</complexContent>
</complexType>
In this case, all search filter criteria from the PhoneCallSearchBasic, CampaignSearchBasic,
and SupportCaseSearchBasic objects are available to the Customer record as joined search
filters. Note that all <Record>SearchBasic objects in NetSuite Web services are defined in the
platformCommon XSD.
For a code sample of a joined search, see “Joined Search Code Samples” on page 211.
Important: Only fields on SuiteTalk-supported records can be specified as filter criteria for a
joined search request. For a list of SuiteTalk-supported records, see the section called
“Supported Records” in the SuiteTalk (Web Services) Records Guide.
• You have a complex search that compiles data from many different records. You can
create a saved search in the NetSuite UI, and then reference this search in Web services
rather than try to code the search in Web services.
• You want to reference an existing saved search based on Leads, for example. You can
return all the data provided in this search, and then define additional criteria for the
search response. For example, you can return a Leads saved search and then provide
additional criteria that returns the leads from this search created with today’s date. In
other words, if you reference a saved search and add any filter criteria to the search
request, the additional criteria will be conjunctive with the saved search criteria.
How do I reference an existing saved search?
First must first obtain the saved search ID. You can do so through the UI by going to Lists >
Search > Saved Searches. The saved search ID appears in the ID column.
You can also use the getSavedSearch operation to programmatically retrieve a list of saved
search IDs for a specific record type. Note that this operation does nothing more than return a
list of saved search IDs on a per-record-type basis (for example, all saved search IDs for the
Customer record type).
You can then use the search() operation, along with the <Record>SearchAdvanced object to
return the details of the saved search. The following is a simple example that shows how to
instantiate the CustomerSearchAdvanced object and specify a savedSearchId to return.
// create search object
CustomerSearchAdvanced customerSearch = new CustomerSearchAdvanced();
For more detailed samples, see “Advanced Search Code Samples” on page 212.
Important: Note the following about saved searches in Web services:
• Only one saved search can be referenced as part of the search call.
• If you reference a saved search that contains search functions, you will get the results
back. However, you cannot create an advanced search that uses search functions.
Creating a search in Web services that uses search functions is not currently supported.
• If you reference a saved search that contains summary results, you will get the
following error:
We cannot return search columns for summary saved search <saved search ID>
The following figure shows the UI equivalent of setting a summary type on a search
return column. If a value is set, the saved search cannot be returned.
2. Next, click the Results tab to define the search return columns. When your search is
executed, your search response will return only the company name, phone, and contact
name of all customers whose company starts with the letter A.
This figure shows the results of the search. Only the relevant data are returned.
</sequence>
</complexType>
Note that all search return columns reference SearchColumn<xxx>Field objects. See “Search
Column Custom XML Schema Types” on page 100 for definitions of each search column
object.
Important: When executing an advanced search, you can set the
SearchPreferences.returnSearchColumns preference to TRUE to ensure that only search return
columns are returned in a search. An error is thrown if returnSearchColumns is set to TRUE
and you have not specified search return columns in your request. (Note that you will not
receive an error if you are using advanced search functionality to return a saved search that
already includes search return columns.)
Also note that in an advanced search, the bodyFieldsOnly preference is ignored.
The default value for returnSearchColumns is TRUE.
<complexType name="SearchPreferences">
<sequence>
<element name="bodyFieldsOnly" minOccurs="0" type="xsd:boolean" default="true"/>
<element name="returnSearchColumns" minOccurs="0" type="xsd:boolean"
default="true"/>
<element name="pageSize" minOccurs="0" type="xsd:int"/>
</sequence>
</complexType>
For detailed information on setting search preferences, see “Setting Search Preferences” on
page 42.
(rather than the supported enum value _unitedStates), you would still get results from your
search. Although the value "United States" was not recognized, you continued to get customer
records. Note, however, the search results returned ALL customers in the system, since the
value “United States” was invalid.
Starting with the 2008.2 endpoint, instead of simply ignoring any invalid search enum values,
and still returning search results, NetSuite now returns 0 records and a no-match warning.
Therefore, when setting search values, be sure to use the values defined in the schema.
The following is an example of what is now returned if invalid values are specified:
<platformCore:searchResult
xmlns:platformCore="urn:core_2008_2.platform.webservices.netsuite.com">
<platformCore:status isSuccess="true">
<platformCore:statusDetail type="WARN">
<platformCore:code>WARNING</platformCore:code>
<platformCore:message>The field country's enum value <United States> is
invalid for this search.</platformCore:message>
</platformCore:statusDetail>
</platformCore:status>
<platformCore:totalRecords>0</platformCore:totalRecords>
<platformCore:totalPages>0</platformCore:totalPages>
<platformCore:searchId>WEBSERVICES_MSTRWLF_10212008563721605896842316_60315faa132
ad</platformCore:searchId>
<platformCore:searchRowList/>
Filter Note
@NONE@ Equates to anyof (see Filtering Lists that Contain Null Values) or
unassigned depending on the field.
@CURRENT@ Equates to mine. For example, use this filter to return all of your own
events.
@HIERARCHY@ Equates to my team. For example, use this filter on a salesRep field for
Customer records. If you have previously defined the members of your
sales team, using the @HIERARCHY@ filter will return only the
customers that have worked with members of your sales team.
Request
The SearchRequest type is used for the request. It contains the following field.
Response
The SearchResponse type is used for the response. It contains the following fields.
Faults
This operation can throw one of the following faults. See “SOAP Fault Status Codes” on
page 252 for more information on faults.
• InvalidSessionFault
• InvalidCredentialsFault
• ExceededRequestLimitFault
• ExceededUsageLimitFault
• ExceededRecordCountFault
• ExceededRequestSizeFault
• UnexpectedErrorFault
Sample Code
See the following search-related code samples:
• “Basic Search Code Sample” on page 206
• “Joined Search Code Samples” on page 211
• “Advanced Search Code Samples” on page 212
• “Searching for a Multi-select Custom Field” on page 218
SOAP Response
Notice that in this example, only one matching record was found. You can see that the page size
was set such that if multiple records were found, only 10 would be returned at a time. The
searchMore or searchNext operation could then be performed to return additional results.
<soapenv:Body>
<searchResponse xmlns="urn:messages_2_6.platform.webservices.netsuite.com">
<searchResult xmlns="urn:core_2_6.platform.webservices.netsuite.com">
<status isSuccess="true"/>
<totalRecords>1</totalRecords>
<pageSize>10</pageSize>
<totalPages>1</totalPages>
<pageIndex>1</pageIndex>
<recordList>
<record internalId="983" xsi:type="ns1:Customer"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns1="urn:relationships_2_6.lists.webservices.netsuite.com">
<ns1:entityId>Shutter Fly</ns1:entityId>
<ns1:isInactive>false</ns1:isInactive>
<ns1:companyName>Shutter Fly, Inc</ns1:companyName>
<ns1:entityStatus internalId="6"><name>LEAD-New</name>
.
.
.
<ns1:customFieldList>
<customField internalId="custentity_map" xsi:type="StringCustomFieldRef ">
<value>http://maps.google.com</value>
</customField>
<customField internalId="custentity_had_order_problems"
xsi:type="BooleanCustomFieldRef "><value>false</value></customField>
</ns1:customFieldList>
</record>
</recordList>
</searchResult>
</searchResponse>
</soapenv:Body>
C#
private void searchCustomer()
{
// This operation requires a valid session
this.login( true );
// Process response
if ( response.status.isSuccess )
{
// Process the records returned in the response and print to console
processCustomerSearchResponse( response );
Java
public void searchCustomer() throws RemoteException,
ExceededUsageLimitFault, UnexpectedErrorFault, InvalidSessionFault,
ExceededRecordCountFault {
// This operation requires a valid session
this.login(true);
// Process result
if (result.getStatus().isIsSuccess()) {
// Process the records returned in the result and print to console
processCustomerSearchResponse(result);
SOAP
<search xmlns="urn:messages_2008_1.platform.webservices.netsuite.com">
<searchRecord xsi:type="ns4:ContactSearch"
xmlns:ns4="urn:relationships_2008_1.lists.webservices.netsuite.com">
<ns4:basic xsi:type="ns5:ContactSearchBasic"
xmlns:ns5="urn:common_2008_1.platform.webservices.netsuite.com">
<ns5:email operator="is" xsi:type="ns6:SearchStringField"
xmlns:ns6="urn:core_2008_1.platform.webservices.netsuite.com">
<ns6:searchValue xsi:type="xsd:string">contact@email.com</ns6:searchValue>
</ns5:email>
</ns4:basic>
<ns4:customerJoin xsi:type="ns7:CustomerSearchBasic"
xmlns:ns7="urn:common_2008_1.platform.webservices.netsuite.com">
<ns7:entityId operator="is" xsi:type="ns8:SearchStringField"
xmlns:ns8="urn:core_2008_1.platform.webservices.netsuite.com">
<ns8:searchValue xsi:type="xsd:string">My Customer</ns8:searchValue>
</ns7:entityId>
</ns4:customerJoin>
</searchRecord>
</search>
Sample 2
The following sample shows how to return an associated joined list of records. In this case, all
contacts associated with customers of internalId 1, 2 and 3 are returned.
Java
RecordRef[] rr = new RecordRef[]{new RecordRef("1", RecordType.customer),
new RecordRef("2", RecordType.customer), new RecordRef("3", RecordType.customer)};
CustomerSearchBasic customerSearchBasic = new CustomerSearchBasic();
customerSearchBasic.setInternalId(new SearchMultiSelectField(rr,
SearchMultiSelectFieldOperator.anyOf));
ContactSearch contactSearch = new ContactSearch();
contactSearch.setCustomerJoin(customerSearchBasic);
SOAP
<soapenv:Body>
<search xmlns="urn:messages_2_6.platform.webservices.netsuite.com">
<searchRecord xsi:type="ns1:ContactSearch"
xmlns:ns1="urn:relationships_2_6.lists.webservices.netsuite.com">
<ns1:customerJoin xsi:type="ns2:CustomerSearchBasic"
xmlns:ns2="urn:common_2_6.platform.webservices.netsuite.com">
<ns2:internalId operator="anyOf " xsi:type="ns3:SearchMultiSelectField"
xmlns:ns3="urn:core_2_6.platform.webservices.netsuite.com">
<ns3:searchValue internalId="1" type="customer"
xsi:type="ns3:RecordRef "/>
<ns3:searchValue internalId="2" type="customer"
xsi:type="ns3:RecordRef "/>
<ns3:searchValue internalId="3" type="customer"
xsi:type="ns3:RecordRef "/>
</ns2:internalId>
</ns1:customerJoin>
</searchRecord>
</search>
</soapenv:Body>
// Perform the search. Note that you can get the saved search ID using
// either getSavedSearch() or through the UI
TransactionSearchAdvanced tsa1 = new TransactionSearchAdvanced();
tsa1.savedSearchId="57"; //substitute your own saved search internal ID
nss.search(tsa1);
SOAP Request
<search xmlns="urn:messages_2008_2.platform.webservices.netsuite.com">
<searchRecord xmlns:q1="urn:sales_2008_2.transactions.webservices.netsuite.com"
xsi:type="q1:TransactionSearchAdvanced" savedSearchId="57" />
</search>
SOAP Response
// The default is to return search rows
<platformCore:searchRow xsi:type="tranSales:TransactionSearchRow"
xmlns:tranSales="urn:sales_2008_2.transactions.webservices.netsuite.com">
<tranSales:basic xmlns:platformCommon="urn:common_2008_2.platform.webservices.netsuite.com">
<platformCommon:account>
<platformCore:searchValue internalId="125"/>
</platformCommon:account>
<platformCommon:amount>
<platformCore:searchValue>12481.9</platformCore:searchValue>
</platformCommon:amount>
<platformCommon:entity>
<platformCore:searchValue internalId="78"/>
</platformCommon:entity>
<platformCommon:mainline>
<platformCore:searchValue>false</platformCore:searchValue>
</platformCommon:mainline>
<platformCommon:number>
<platformCore:searchValue>102</platformCore:searchValue>
</platformCommon:number>
<platformCommon:postingPeriod>
<platformCore:searchValue internalId="72"/>
</platformCommon:postingPeriod>
<platformCommon:tranDate>
<platformCore:searchValue>2005-02-10T00:00:00.000-08:00</platformCore:searchValue>
</platformCommon:tranDate>
<platformCommon:tranId>
<platformCore:searchValue>102</platformCore:searchValue>
</platformCommon:tranId>
<platformCommon:type>
<platformCore:searchValue internalId="SalesOrd"/>
</platformCommon:type>
</tranSales:basic>
</platformCore:searchRow>
// return internId
SearchColumnSelectField [] orderIdCols = new SearchColumnSelectField[1];
SearchColumnSelectField orderIdCol = new SearchColumnSelectField();
orderIdCol.customLabel = "Sales Order ID"; // Define a custom label
orderIdCols[0] = orderIdCol;
tsrb.internalId = orderIdCols;
tsr.basic = tsrb;
tsa3.columns = tsr;
nss.search(tsa3);
SOAP Request
<search xmlns="urn:messages_2008_2.platform.webservices.netsuite.com">
<searchRecord xmlns:q1="urn:sales_2008_2.transactions.webservices.netsuite.com"
xsi:type="q1:TransactionSearchAdvanced" savedSearchId="57">
<q1:columns>
<q1:basic>
<internalId xmlns="urn:common_2008_2.platform.webservices.netsuite.com">
<customLabel xmlns="urn:core_2008_2.platform.webservices.netsuite.com">Sales Order ID
</customLabel>
</internalId>
<shipRecvStatus xmlns="urn:common_2008_2.platform.webservices.netsuite.com">
<customLabel xmlns="urn:core_2008_2.platform.webservices.netsuite.com">Order Fulfilled
</customLabel>
</shipRecvStatus>
<tranDate xmlns="urn:common_2008_2.platform.webservices.netsuite.com" />
</q1:basic>
</q1:columns>
</searchRecord>
</search>
SOAP Response
<platformCore:searchRow xsi:type="tranSales:TransactionSearchRow"
xmlns:tranSales="urn:sales_2008_2.transactions.webservices.netsuite.com">
<tranSales:basic xmlns:platformCommon="urn:common_2008_2.platform.webservices.netsuite.com">
<platformCommon:internalId>
<platformCore:searchValue internalId="117"/>
<platformCore:customLabel>Sales Order ID</platformCore:customLabel>
</platformCommon:internalId>
<platformCommon:tranDate>
<platformCore:searchValue>2005-04-23T00:00:00.000-07:00</platformCore:searchValue>
</platformCommon:tranDate>
</tranSales:basic>
</platformCore:searchRow>
// condition 1: on SO only
SearchEnumMultiSelectField semsfTranType = new SearchEnumMultiSelectField();
semsfTranType.operatorSpecified = true;
semsfTranType.@operator = SearchEnumMultiSelectFieldOperator.anyOf;
String [] tranTypes = new String[1];
String tranType = "_salesOrder";
tranTypes[0] = tranType;
semsfTranType.searchValue = tranTypes;
tsb.type = semsfTranType;
// condition 4: Open SO
SearchBooleanField sbfTranStatus = new SearchBooleanField();
sbfTranStatus.searchValue = true;
sbfTranStatus.searchValueSpecified = true;
tsb.shipRecvStatusLine = sbfTranStatus;
ts.basic = tsb;
tsa4.criteria = ts;
SOAP Request
<searchRecord xmlns:q1="urn:sales_2008_2.transactions.webservices.netsuite.com"
xsi:type="q1:TransactionSearchAdvanced">
<q1:criteria>
<q1:basic>
<tranId operator="contains" xmlns="urn:common_2008_2.platform.webservices.netsuite.com">
<searchValue xmlns="urn:core_2008_2.platform.webservices.netsuite.com">182</searchValue>
</tranId>
<type operator="anyOf " xmlns="urn:common_2008_2.platform.webservices.netsuite.com">
<searchValue xmlns="urn:core_2008_2.platform.webservices.netsuite.com">_salesOrder
</searchValue>
</type>
</q1:basic>
</q1:criteria>
<q1:columns>
<q1:basic>
<internalId xmlns="urn:common_2008_2.platform.webservices.netsuite.com">
<customLabel xmlns="urn:core_2008_2.platform.webservices.netsuite.com">Sales Order ID
</customLabel>
</internalId>
<shipRecvStatus xmlns="urn:common_2008_2.platform.webservices.netsuite.com">
<customLabel xmlns="urn:core_2008_2.platform.webservices.netsuite.com">Order Fulfilled
</customLabel>
</shipRecvStatus>
<shipRecvStatusLine xmlns="urn:common_2008_2.platform.webservices.netsuite.com">
<customLabel xmlns="urn:core_2008_2.platform.webservices.netsuite.com">
Order Line Fulfilled</customLabel>
</shipRecvStatusLine>
<tranDate xmlns="urn:common_2008_2.platform.webservices.netsuite.com" />
<tranId xmlns="urn:common_2008_2.platform.webservices.netsuite.com" />
</q1:basic>
</q1:columns>
</searchRecord>
</customLabel>
</internalId>
<shipRecvStatus xmlns="urn:common_2008_2.platform.webservices.netsuite.com">
<customLabel xmlns="urn:core_2008_2.platform.webservices.netsuite.com">Order Fulfilled
</customLabel>
</shipRecvStatus>
<tranDate xmlns="urn:common_2008_2.platform.webservices.netsuite.com" />
</q1:basic>
</q1:columns>
</searchRecord>
SOAP Response
<platformCore:searchRow xsi:type="tranSales:TransactionSearchRow"
xmlns:tranSales="urn:sales_2008_2.transactions.webservices.netsuite.com">
<tranSales:basic xmlns:platformCommon="urn:common_2008_2.platform.webservices.netsuite.com">
<platformCommon:internalId>
<platformCore:searchValue internalId="986"/>
<platformCore:customLabel>Sales Order ID</platformCore:customLabel>
</platformCommon:internalId>
<platformCommon:shipRecvStatusLine>
<platformCore:searchValue>true</platformCore:searchValue>
<platformCore:customLabel>Order Line Fulfilled</platformCore:customLabel>
</platformCommon:shipRecvStatusLine>
<platformCommon:tranDate>
<platformCore:searchValue>2008-09-11T00:00:00.000-07:00</platformCore:searchValue>
</platformCommon:tranDate>
</tranSales:basic>
</platformCore:searchRow>
processRowList(rowList);
processRowList(rowList);
}
}
}
searchCustomFieldList.setCustomField(new SearchCustomField[]{searchMultiSelectCustomField});
SearchResult sr = _port.search(transactionSearch);
C#
private void searchForMultiSelectCustomField()
{
if (_isAuthenticated)
{
_out.info("\nExecuting search ..... \n");
// transaction search by custom column field
TransactionSearch transactionSearch = new TransactionSearch();
TransactionSearchBasic transactionSearchBasic = new TransactionSearchBasic();
//custom list called colors with typei id 1, values blue - internalid 1, green - id2 etc
//we are looking for transactions which have transaction body field
//of type multi select set to color blue
ListOrRecordRef listOrRecordRef = new ListOrRecordRef();
listOrRecordRef.internalId = "3";
listOrRecordRef.typeId = "1";
//Java
//searchCustomFieldList.setCustomField(new SearchCustomField[]{searchMultiSelectCustomField});
transactionSearchBasic.customFieldList = searchCustomFieldList;
transactionSearch.basic = transactionSearchBasic;
SearchResult searchRes = _service.search(transactionSearch);
_out.info("\nSearch Result contains " + searchRes.totalRecords + " record(s) \n");
}
else
{
_out.info(
"\nCannot call search operation because there is no active session. " +
"You must be first logged on before attempting to call saved search.\n");
}
}
searchMore
The seachMore operation is used to retrieve more records after an initial search operation.
Important: Users who authenticate to NetSuite through login can use either searchMore or
searchMoreWithId to paginate through search results. Users who authenticate to NetSuite by
providing user credentials in the header of their SOAP requests can use only searchMoreWithId to
paginate through search results, since searchMore requires an active session.
(See “Authentication Using Request Level Credentials” on page 65 for information on request-level-
credential authentication.)
The results returned in a searchMore operation reflect the records in the next segment as
defined in the original search operation. Therefore, if a record is deleted before all records have
been returned, the total number of records may differ from the total record count returned in
the search operation — the deleted record is not returned. If a record is added, that record is
not returned in subsequent searchMore operations. However, the data in each record returned
is current such that if a change to a record occurs in between the time of the original search
operation and the searchMore operation, the updated data is returned.
Example
Suppose you submit the following request for all employees whose firstName contains ‘Susan’
and set the pagesize to 10 records:
<soap:Header>
<platformMsgs:searchPreferences>
<platformMsgs:bodyFieldsOnly>true</platformMsgs:bodyFieldsOnly>
<platformMsgs:pageSize>10</platformMsgs:pageSize>
</platformMsgs:searchPreferences>
</soap:Header>
<soap:Body>
<platformMsgs:search>
<platformMsgs:searchRecord xsi:type="listEmp:EmployeeSearch">
<listEmp:firstName operator="contains" xsi:type="platformCore:SearchStringField">
<platformCore:searchValue>Susan</platformCore:searchValue>
</listEmp:firstName>
</platformMsgs:searchRecord>
</platformMsgs:search>
</soap:Body>
As illustrated in the following figure, if the database contains 12 matches at the time of the
initial Search, the Search result would provide the first 10 records as defined in the pageSize
preference. A subsequent SearchMore operation would return only the remaining two records
from the original search result even if another employee record, Susan Cook, is added prior to
the SearchMore request being submitted.
Request
The SearchMoreRequest type is used for the request. It contains the following fields.
Response
The SearchMoreResponse type is used for the response. It contains the following fields.
Faults
This operation can throw one of the following faults. See “SOAP Fault Status Codes” on
page 252 for more information on faults.
• InvalidSessionFault
• ExceededRequestLimitFault
• ExceededUsageLimitFault
• ExceededRecordCountFault
• ExceededRequestSizeFault
• UnexpectedErrorFault
Sample Code
SOAP Request
In this example, page 2 of the search result set is requested.
<soap:Body>
<platformMsgs:searchMore>
<platformMsgs:pageIndex>2</platformMsgs:pageIndex>
</platformMsgs:searchMore>
</soap:Body>
SOAP Response
<soapenv:Body>
<searchMoreResponse xmlns="urn:messages_2_6.platform.webservices.netsuite.com">
<searchResult xmlns="urn:core_2_6.platform.webservices.netsuite.com">
<status isSuccess="true"/>
<totalRecords>93</totalRecords>
<pageSize>10</pageSize>
<totalPages>10</totalPages>
<pageIndex>2</pageIndex>
<recordList>
<record internalId="80" xsi:type="ns1:Customer"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns1="urn:relationships_2_6.lists.webservices.netsuite.com">
<ns1:entityId>Jackson Alexander</ns1:entityId>
<ns1:isInactive>false</ns1:isInactive>
.
...[more fields]
.
<ns1:customFieldList>
<customField internalId="custentity_map" xsi:type="StringCustomFieldRef ">
<value>http://maps.google.com</value>
</customField>
</ns1:customFieldList>
</record>
<record internalId="227" xsi:type="ns2:Customer"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns2="urn:relationships_2_6.lists.webservices.netsuite.com">
<ns2:entityId>Seena Thomas</ns2:entityId>
<ns2:isInactive>false</ns2:isInactive>
<ns2:companyName>Seena Thom Inc.</ns2:companyName>
.
...[more fields]
.
<ns2:customFieldList>
<customField internalId="custentity_map" xsi:type="StringCustomFieldRef ">
<value>http://maps.google.com</value>
</customField>
</ns2:customFieldList>
</record>
.
...[more records]
.
</recordList>
</searchResult>
</searchMoreResponse>
</soapenv:Body>
C#
private void searchMore( SearchResult response )
{
//SearchResponse response;
bool isGetAllPages = false;
// Process response
if ( response.status.isSuccess )
{
processCustomerSearchResponse( response );
}
else
{
_out.error( getStatusDetails( response.status ) );
}
}
}
Java
public void searchMore(SearchResult result) throws RemoteException,
ExceededUsageLimitFault, UnexpectedErrorFault, InvalidSessionFault,
ExceededRecordCountFault {
// SearchResult response;
boolean isGetAllPages = false;
// Process result
if (result.getStatus().isIsSuccess()) {
processCustomerSearchResponse(result);
} else {
_console.error(getStatusDetails(result.getStatus()));
}
}
}
searchMoreWithId
Users who authenticate to NetSuite by providing their credentials in the SOAP header of their
requests must use searchMoreWithId to retrieve search results that span multiple pages. They
cannot use searchMore or searchNext, since both operations require an active session. (For
information on request-level-credential authentication, see “Authentication Using Request
Level Credentials” on page 65.)
Note: Users who authenticate to NetSuite through login can use searchMore or
searchMoreWithId to paginate through search results.
The searchMoreWithId operation allows users to reference a specific search result set by its
searchId, a parameter included in all search results. As with searchMore, users must set the
pageIndex value to specify which page in the search to return.
Note that a given entity is allowed to have two search IDs alive at a time. The oldest ID is
expunged if a third is created. For Web Services Plus users, a maximum of 10 search IDs are
stored for a single Web Services Plus user (two IDs per session x five current logins). (For
information on the Web Services Plus license, see “Web Services Concurrent License (Web
Services Plus)” on page 71.)
Search IDs expire if they have not been used within 15 minutes after their creation. Passing an
expired or invalid searchId will return search results with a “failed” status and
StatusDetailCode=INVALID_JOB_ID.
Note: There is no async equivalent for this operation.
Request
The SearchMoreWithIdRequest type is used for the request. It contains the following fields.
Response
The SearchMoreWithIdResponse type is used for the response. It contains the following fields.
Faults
This operation can throw one of the following faults. See “SOAP Fault Status Codes” on
page 252 for more information on faults.
• InvalidSessionFault
• InvalidCredentialsFault
• ExceededRequestLimitFault
• ExceededUsageLimitFault
• ExceededRecordCountFault
• ExceededRequestSizeFault
• UnexpectedErrorFault
Sample Code
The following samples show the SOAP for the initial search as well as the SOAP for subsequent
searchMoreWithId operation used to specify the next page of the search. The ID returned in
the initial search is specified as the searchId when executing searchMoreWithId.
Note: Prefix-to-namespace mappings have been omitted for readability.
SOAP Request for Initial Search
<soapenv:Envelope>
<soapenv:Header>
<platformMsgs:searchPreferences>
<platformMsgs:bodyFieldsOnly>true</platformMsgs:bodyFieldsOnly>
<platformMsgs:pageSize>100</platformMsgs:pageSize>
</platformMsgs:searchPreferences>
<platformMsgs:passport>
<platformCore:email>jdoe@netsuite.com</platformCore:email>
<platformCore:password>mypassword</platformCore:password>
<platformCore:account>000034</platformCore:account>
<platformCore:role internalId="3"/>
</platformMsgs:passport>
</soapenv:Header>
<soapenv:Body>
<platformMsgs:search>
<searchRecord xsi:type="platformCommon:ContactSearchBasic">
<platformCommon:city operator="is" xsi:type="platformCore:SearchStringField">
<platformCore:searchValue xsi:type="xsd:string">San Francisco</platformCore:searchValue>
</platformCommon:city>
</searchRecord>
</platformMsgs:search>
</soapenv:Body>
</soapenv:Envelope>
<platformCore:searchResult>
<platformCore:status isSuccess="true"/>
<platformCore:totalRecords>231</platformCore:totalRecords>
<platformCore:pageSize>100</platformCore:pageSize>
<platformCore:totalPages>3</platformCore:totalPages>
<platformCore:pageIndex>1</platformCore:pageIndex>
<platformCore:searchId>WEBSERVICES_528736_07012008543995006307049233_d53ef4d2273b15
<platformCore:searchId>
<platformCore:recordList>
<platformCore:recordList>
<platformCore:record internalId="4" externalId="entity-4" xsi:type="listRel:Contact">
<listRel:entityId>john</listRel:entityId>
<listRel:firstName>John</listRel:firstName>
.....
</platformCore:record>
</platformCore:recordList>
</platformCore:searchResult>
</searchMoreWithIdResponse>
</soapenv:Body>
</soapenv:Envelope>
<platformCore:pageSize>100</platformCore:pageSize>
<platformCore:totalPages>3</platformCore:totalPages>
<platformCore:pageIndex>1</platformCore:pageIndex>
<platformCore:searchId>WEBSERVICES_528736_07012008543995006307049233_d53ef4d2273b15
</platformCore:searchId>
<platformCore:recordList>
<platformCore:record internalId="5" externalId="entity-5" xsi:type="listRel:Contact">
<listRel:entityId>mike</listRel:entityId>
<listRel:firstName>Mike</listRel:firstName>
.....
</platformCore:record>
</platformCore:recordList>
</platformCore:searchResult>
</platformMsgs:searchMoreWithIdResponse>
</soapenv:Body>
</soapenv:Envelope>
Java
public List<Contact> searchContactsByCity(NetSuitePortType port, String city) throws Exception
{
SearchResult searchResult = null; // search result for each page
Record [] contacts = null; // contacts for each page
List<Contact> consolidatedResults = new ArrayList<Contact>(); // to return
searchNext
The searchNext operation is used to retrieve the next set of records after an initial search
operation.
Important: Users who authenticate to NetSuite through login can use either searchNext or
searchMoreWithId to paginate through search results. Users who authenticate to NetSuite by
providing user credentials in the header of their SOAP requests can use only searchMoreWithId to
paginate through search results, since searchNext requires an active session.
(See “Authentication Using Request Level Credentials” on page 65 for information on request-level-
credential authentication.)
Request
The SearchNextRequest type is used for the request. It does not contain any fields.
Response
The SearchNextResponse type is used for the response. It contains the following fields.
Faults
This operation can throw one of the following faults. See “SOAP Fault Status Codes” on
page 252 for more information on faults.
• InvalidSessionFault
• ExceededRequestLimitFault
• ExceededUsageLimitFault
• ExceededRecordCountFault
• ExceededRequestSizeFault
• UnexpectedErrorFault
Sample Code
SOAP Request
<soap:Body>
<platformMsgs:searchNext/>
</soap:Body>
SOAP Response
<soapenv:Body>
<searchNextResponse xmlns="urn:messages_2_6.platform.webservices.netsuite.com">
<searchResult xmlns="urn:core_2_6.platform.webservices.netsuite.com">
<status isSuccess="true"/>
<totalRecords>93</totalRecords>
<pageSize>10</pageSize>
<totalPages>10</totalPages>
<pageIndex>3</pageIndex>
<recordList>
<record internalId="865" xsi:type="ns1:Customer"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns1="urn:relationships_2_6.lists.webservices.netsuite.com">
<ns1:entityId>John Bauer</ns1:entityId>
<ns1:isInactive>false</ns1:isInactive>
.
...[more fields]
.
<ns1:customFieldList>
<customField internalId="custentity_map" xsi:type="StringCustomFieldRef ">
<value>http://maps.google.com</value>
</customField>
</ns1:customFieldList>
</record>
.
...[more records]
.
</recordList>
</searchResult>
</searchNextResponse>
</soapenv:Body>
ssoLogin
The ssoLogin operation provides a mechanism for a partner application to login on behalf of
the user into NetSuite, without the user’s credentials (such as the user’s password) ever going
through the partner servers.
Users have to go through the set of steps outlined in NetSuite’s Single Sign-On Guide to setup
single sign-on. The external application must establish a single sign-on mapping for every user
that access NetSuite through their site. The following provides the general workflow:
1. User authenticates at the partner site
2. Partner provides the Single SignOn link to user
3. Partner produces an encrypted token containing the account/username pair and the
timestamp, using a private key and redirects the user to Single SignOn landing page
4. User logs into NetSuite and the authentication link for the user is created
After the SSO mapping is created, the partner invokes ssoLogin operation via Web services to
access NetSuite on behalf of the user.
Important: Please note the important following details about this operation:
• The ssoLogin operation is for establishing inbound connections only. To create an
outbound connection that goes from NetSuite to a third-party application, see the
information on Outbound Single Sign-on (SuiteSignOn) in the NetSuite Help Center.
• Web services users who want to use single sign-on need to purchase the “Single Sign
On Configuration” line item. Contact your NetSuite Sales Representative for details.
• The SuiteTalk mapSso operation has no relevance to the ssoLogin operation. The
purpose of mapSsO is to establish the mapping between a user identity in an external
application and the user’s identity in NetSuite. NetSuite does not recommend
customers use the mapSsO functionality to enable single sign-on, unless under very
special circumstances which would have to be sanctioned by NetSuite under a specific
contract.
• Users who authenticate to NetSuite through the login operation can use ssoLogin.
Users who authenticate to NetSuite by providing user credentials in the header of their
SOAP requests cannot use this operation.
Request
The SsoPassportRequest type is used for this request. It contains the following fields:
• authenticationToken
• partnerId
Response
The SsoLoginResponse type is used for the response.
Faults
This operation can throw one of the following faults. See “SOAP Fault Status Codes” on
page 252 for more information on faults.
• InvalidAccountFault
• InvalidCredentialsFault
• InvalidVersionFault
• ExceededRequestLimitFault
• UnexpectedErrorFault
Sample Code
SOAP Request
<ssoLogin xmlns="urn:messages_2008_2.platform.webservices.netsuite.com">
<SsoPassport>
<ns1:authenticationToken xmlns:ns1="urn:core_2008_2.platform.webservices.netsuite.com"><my
token></ns1:authenticationToken>
<ns2:partnerId xmlns:ns2="urn:core_2008_2.platform.webservices.netsuite.com">1</ns2:partnerId>
</SsoPassport>
</ssoLogin>
Java
public void ssoLogin() throws Exception {
SsoPassport sso = new SsoPassport();
sso.setAuthenticationToken("<my token>");
sso.setPartnerId("1");
sessMgr.getPort().ssoLogin(sso);
}
update
The update operation is used to update an instance of a record in NetSuite. It is similar to the
updateList operation, which allows users to update more than one record at a time.
Only the fields that have been populated in each submitted record are updated in the system. If
a field has NOT been populated, it is not updated in the system and it retains its previous value.
If a field is set to an empty string, the previous value of the field is replaced with an empty
string. Therefore, when updating records, it is recommended that you get the desired record,
instantiate a new record of the same type, populate only the fields that require an update and
then submit the updated record. This ensures that only the fields requiring an update are
written on submission.
Important: Calculated and hidden fields in records are always updated by the system unless your
service explicitly overrides the system values. For more information, refer to “Working with Hidden
Fields” on page 50. Also, custom fields can only be set to NULL by submitting the field in
nullFieldList. For more information, refer to “CustomFieldList” on page 18 of the Records Guide.
To ensure that the most recent data for a given record is being modified, when a Web service
request is received, the values for that record are retrieved at the time of the Update request
rather than with the initial Get of the associated record. The record is then updated by the
values submitted in the request. It is possible that between the time of the retrieval of the record
field values and the submission of the updated fields that the record is altered from another
source (for example from a UI submission). In this case an error message is returned to
indicate that the fields have been modified since your service retrieved the record.
Request
The UpdateRequest type is used for the request. It contains the following fields.
Response
The UpdateResponse type is used for the response. It contains the following fields.
Faults
This operation can throw one of the following faults. See “SOAP Fault Status Codes” on
page 252 for more information on faults.
• InvalidSessionFault
• InvalidCredentialsFault
• ExceededRequestLimitFault
• ExceededUsageLimitFault
• ExceededRecordCountFault
• ExceededRequestSizeFault
• UnexpectedErrorFault
Sample Code
SOAP Request
In the following example, a customer’s companyName is updated. The internal ID for the
customer must be provided in the request.
<soap:Body>
<platformMsgs:update>
<platformMsgs:record internalId="980" xsi:type="listRel:Customer">
<listRel:companyName>Shutter Fly Corporation</listRel:companyName>
</platformMsgs:record>
</platformMsgs:update>
</soap:Body>
SOAP Response
<soapenv:Body>
<updateResponse xmlns="urn:messages_2_6.platform.webservices.netsuite.com">
<writeResponse xmlns="urn:messages_2_6.platform.webservices.netsuite.com">
<ns1:status isSuccess="true" xmlns:ns1="urn:core_2_6.platform.webservices.netsuite.com"/>
<baseRef internalId="980" type="customer" xsi:type="ns2:RecordRef "
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns2="urn:core_2_6.platform.webservices.netsuite.com"/>
</writeResponse>
</updateResponse>
</soapenv:Body>
C#
private void updateCustomer()
{
// This operation requires a valid session
this.login( true );
Java
public void updateCustomer() throws RemoteException,
ExceededUsageLimitFault, UnexpectedErrorFault, InvalidSessionFault,
ExceededRecordCountFault {
// This operation requires a valid session
this.login(true);
updateList
The updateList operation is used to update one or more instances of a record type in NetSuite.
If there are multiple records, they can either be of the same record type or different record
types. For example, it’s possible to update a customer and a contact within a single request
using this operation.
Only the fields that have been populated in each submitted record are updated in the system. If
a field has not been populated, it is not updated in the system and it retains its previous value. If
a field is set to an empty string, the previous value of the field is replaced with an empty string.
Important: Calculated and hidden fields in records are always updated by the system unless
your service explicitly overrides the system values. For more information, refer to “Working
with Hidden Fields” on page 50.
Request
The UpdateListRequest type is used for the request. It contains the following fields.
Response
The UpdateListResponse type is used for the response. It contains the following fields.
Faults
This operation can throw one of the following faults. See “SOAP Fault Status Codes” on
page 252 for more information on faults.
• InvalidSessionFault
• InvalidCredentialsFault
• ExceededRequestLimitFault
• ExceededUsageLimitFault
• ExceededRecordCountFault
• ExceededRequestSizeFault
• UnexpectedErrorFault
Sample Code
SOAP Request
In the following example, two customer records are updated. The first has the single field
companyName updated, while the second updates two fields, entityID and companyName.
The internalID for each record must be provided and the type of record (Customer) to be
updated.
<soap:Body>
<platformMsgs:updateList>
<platformMsgs:record internalId="980" xsi:type="listRel:Customer">
SOAP Response
<soapenv:Body>
<updateListResponse xmlns="urn:messages_2_6.platform.webservices.netsuite.com">
<writeResponseList xmlns="urn:messages_2_6.platform.webservices.netsuite.com">
<writeResponse>
<ns1:status isSuccess="true" xmlns:ns1="urn:core_2_6.platform.webservices.netsuite.com"/>
<baseRef internalId="980" type="customer" xsi:type="ns2:RecordRef "
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns2="urn:core_2_6.platform.webservices.netsuite.com"/>
</writeResponse>
<writeResponse>
<ns3:status isSuccess="true" xmlns:ns3="urn:core_2_6.platform.webservices.netsuite.com"/>
<baseRef internalId="981" type="customer" xsi:type="ns4:RecordRef "
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns4="urn:core_2_6.platform.webservices.netsuite.com"/>
</writeResponse>
</writeResponseList>
</updateListResponse>
</soapenv:Body>
C#
private void updateCustomerList()
{
// This operation requires a valid session
this.login( true );
// Update name
customer.entityId = "XYZ Inc " + i;
customer.companyName = "XYZ, Inc. " + i;
customer.internalId = nsKeys[i].Trim();
records[i] = customer;
}
Java
public void updateCustomerList() throws RemoteException,
ExceededUsageLimitFault, UnexpectedErrorFault, InvalidSessionFault,
ExceededRecordCountFault {
// This operation requires a valid session
this.login(true);
// Update name
customer.setEntityId("XYZ Inc " + i);
customer.setCompanyName("XYZ, Inc. " + i);
customer.setInternalId(nsKeys[i].trim());
records[i] = customer;
}
updateInviteeStatus
The updateInviteeStatus operation lets users respond to NetSuite events that have been sent to
them. This operation takes both the internal ID of the event as well as a calendar event status as
arguments.
After invitees have responded to the event invitation, the Event record is updated with their
response. Possible responses include accepted, declined, tentative, and noResponse.
Notes:
• For information on the Event record in Web services, see the Web Services (SuiteTalk)
Records Guide. For general information on scheduling events in NetSuite, see
Scheduling Events in the NetSuite Help Center.)
• There is no async equivalent for the updateInviteeStatus operation.
Note the following when using this operation:
• Users must have a valid session. This operation does include a passport header to
support request level credentials. (For information on request level authentication, see
Authentication Using Request Level Credentials.)
• To update other properties on the Event record, the event owner should still use the
update operation. Note, however, event owners are not exempt from using
updateInviteeStatus if they have to update their own event response status. There may
be cases in which event owners must decline their own event and have another person
run the event for them.
• Unlike in the NetSuite UI (see figure), invitees will not be able to send a message back
to the organizer. Web services does not currently support messages attached to events.
An event invitee’s response can include only one of the following values: _accepted,
_declined, _tentative, _noResponse.
Request
The UpdateInviteeStatusRequest type is used for the request.
Response
The UpdateInviteeStatusResponse type is used for the response.
Faults
This operation can throw one of the following faults. See “SOAP Fault Status Codes” on
page 252 for more information on faults.
• InvalidSessionFault
• InvalidCredentialsFault
• ExceededRequestLimitFault
• ExceededUsageLimitFault
• ExceededRecordCountFault
• ExceededRequestSizeFault
• UnexpectedErrorFault
Sample Code
C#
NetSuiteService nss = new NetSuiteService();
// login details omitted
SOAP Request
<updateInviteeStatus xmlns="urn:messages_2009_1.platform.webservices.netsuite.com">
<updateInviteeStatusReference>
<eventId internalId="100" xmlns="urn:core_2009_1.platform.webservices.netsuite.com" />
<responseCode xmlns="urn:core_2009_1.platform.webservices.netsuite.com">_accepted
</responseCode>
</updateInviteeStatusReference>
</updateInviteeStatus>
SOAP Response
<updateInviteeStatusResponse xmlns="urn:messages_2009_1.platform.webservices.netsuite.com">
<writeResponse>
<platformCore:status isSuccess="true"
xmlns:platformCore="urn:core_2009_1.platform.webservices.netsuite.com"/>
<baseRef internalId="100" type="calendarEvent" xsi:type="platformCore:RecordRef "
xmlns:platformCore="urn:core_2009_1.platform.webservices.netsuite.com"/>
</writeResponse>
</updateInviteeStatusResponse>
updateInviteeStatusList
The updateInviteeStatusList operation is used to update one or more NetSuite events. For
general details on the updateInviteeStatus operation, see updateInviteeStatus.
Request
The UpdateInviteeStatusListRequest type is used for the request.
Response
The UpdateInviteeStatusListResponse type is used for the response.
Faults
This operation can throw one of the following faults. See “SOAP Fault Status Codes” on
page 252 for more information on faults.
• InvalidSessionFault
• InvalidCredentialsFault
• ExceededRequestLimitFault
• ExceededUsageLimitFault
• ExceededRecordCountFault
• ExceededRequestSizeFault
• UnexpectedErrorFault
Sample Code
C#
UpdateInviteeStatusReference [] inviteeStatusRefList = new UpdateInviteeStatusReference[2];
for (int i=0; i<2; i++)
{
RecordRef eventIdRef = new RecordRef();
if (i==0)
eventIdRef.internalId = “100”;
else
eventIdRef.internalId = “101”;
UpdateInviteeStatusReference statusRef = new UpdateInviteeStatusReference();
statusRef.eventId = eventIdRef;
statusRef.responseCode = CalendarEventAttendeeResponse._accepted;
inviteeStatusRefList[i] = statusRef;
}
nss.updateInviteeStatusList(inviteeStatusRefList);
SOAP Request
<updateInviteeStatusList xmlns="urn:messages_2009_1.platform.webservices.netsuite.com">
<updateInviteeStatusReference>
<eventId internalId="100" xmlns="urn:core_2009_1.platform.webservices.netsuite.com" />
<responseCode xmlns="urn:core_2009_1.platform.webservices.netsuite.com">_accepted
</responseCode>
</updateInviteeStatusReference>
<updateInviteeStatusReference>
<eventId internalId="101" xmlns="urn:core_2009_1.platform.webservices.netsuite.com" />
<responseCode xmlns="urn:core_2009_1.platform.webservices.netsuite.com">_accepted
</responseCode>
</updateInviteeStatusReference>
</updateInviteeStatusList>
SOAP Response
<updateInviteeStatusListResponse xmlns="urn:messages_2009_1.platform.webservices.netsuite.com">
<writeResponseList>
<writeResponse>
<platformCore:status isSuccess="true"
xmlns:platformCore="urn:core_2009_1.platform.webservices.netsuite.com"/>
<baseRef internalId="100" type="calendarEvent" xsi:type="platformCore:RecordRef "
xmlns:platformCore="urn:core_2009_1.platform.webservices.netsuite.com"/>
</writeResponse>
<writeResponse>
<platformCore:status isSuccess="true"
xmlns:platformCore="urn:core_2009_1.platform.webservices.netsuite.com"/>
<baseRef internalId="101" type="calendarEvent" xsi:type="platformCore:RecordRef "
xmlns:platformCore="urn:core_2009_1.platform.webservices.netsuite.com"/>
</writeResponse>
</writeResponseList>
</updateInviteeStatusListResponse>
Warnings
A warning is a notification sent to a user in order to prevent a subsequent error or to ensure
better data quality. In the Netsuite UI, a warning is presented to the user through a dialog box
and generally requires an action from the user. Since there is no interaction of this nature in the
Web services model, the request must specify what to do in the case of a warning. The options
are:
• Ignore the warning and submit the record to the database
• Heed the warning and abort the submission — treat as an error
You can set a company wide preference on the Web Services Preferences page on how to handle
warnings or you can specify how warnings should be handled in a specific request. Request
level preferences override company-wide preferences. Refer to “Setting Web Services
Preferences” on page 37 for information on how to set company-wide preferences.
Following is an example of a warning message in the response to a request to add a customer
record without a zip code (with the Treat Warnings as Errors preference set to false):
<addResponse xmlns="urn:messages.platform_2_5.webservices…">
<writeResponse xmlns="urn:messages.platform_2_5…">
<ns1:status isSuccess="true" xmlns:ns1="urn:core.platform_2_5…">
<ns1:statusDetail type="WARN">
<ns1:code>WARNING</ns1:code>
<ns1:message>Without a zip/postal code it will not be possible to use
this address with 3rd Party shippers. Click Cancel to edit the address.
</ns1:message>
</ns1:statusDetail>
</ns1:status>
<ns2:recordRef internalId="50" type="customer" xmlns:ns2="urn:core.platform_2_5…"/>
</writeResponse>
</addResponse>
The above customer was added because no error occurred. However, future errors could be
avoided by responding appropriately to the warning message.
For a detailed list of all warning messages and the associated codes generated by NetSuite, see
“Warning Status Codes” on page 324.
Errors
Errors result if invalid or incomplete data is submitted when performing an operation. For
example, if a client attempts to update a customer record with an invalid internal ID, the
operation fails and the response contains an error code and message.
When numerous records are submitted within the same request, each is treated individually.
For example, if a client attempts to update two events within the same request, where one
record has invalid data and the other has valid data, only one of the records has an error and is
not updated.
<updateListResponse xmlns="urn:messages.platform_2_5…">
<listWriteResponse>
<writeResponse>
<ns1:status isSuccess="true" xmlns:ns1="urn:core.platform_2_5… />
<ns2:recordRef internalId="100010" type="event"
xmlns:ns2="urn:core.platform…" />
</writeResponse>
<writeResponse>
<ns3:status isSuccess="false" xmlns:ns3="urn:core.platform_2_5…">
<ns3:statusDetail type="ERROR">
<ns3:code>USER_EXCEPTION</ns3:code>
<ns3:message>Invalid record:
type=event,id=100015,scompid=TSTDRV96
</ns3:message>
</ns3:statusDetail>
</ns3:status>
For a detailed list of all error messages and the associated codes, see “Error Status Codes” on
page 253.
Faults
Faults are exceptions that are of a more fundamental nature than errors. A key distinction
between errors and faults is that a fault prevents any operation within a request from being
processed whereas an error prevents only a single operation from succeeding on an individual
record.
For example, continuing from the case above, if the user’s session has timed out when making
the request, neither update for either event record is processed and an invalidSessionFault is
returned in the response.
<soapenv:Fault>
<faultcode>soapenv:Server.userException</faultcode>
<faultstring>com.netledger.dto.faults.InvalidSessionFault: Your connection has
timed out. Please log in again.
</faultstring>
<detail>
<invalidSessionFault xmlns="urn:faults.platform_2_5.webservices.netsuite.com">
<code>INVALID_SESSION</code>
<message>Your connection has timed out. Please log in again.</message>
</invalidSessionFault>
<ns1:stackTrace xmlns:ns1="http://xml.apache.org/
axis">com.netledger.dto.faults.InvalidSessionFault: Your connection has timed
out. Please log in again.
</ns1:stackTrace>
</detail>
</soapenv:Fault>
SOAP uses the detail element to capture the error code through the code element and the error
message through the message element. The faultcode and faultstring are automatically
populated by the server.
Following is an example of a SOAP fault named InvalidCredentialsFault for an invalid e-mail
address that is returned as part of the login operation.
<soapenv:Fault>
<faultcode>soapenv:Server.userExveption</faultcode>
<faultstring>com.netledger.dto.faults.InvalidCredentialsFault: You have entered an
invalid e-mail address or account number. Please try again.</faultstring>
<detail>
<InvalidCredentialsFault
xmlns=”urn:faults.platform_2_5.webservices.netsuite.com”>
<code>INVALID_USERNAME</code>
<message>You have entered an invalid e-mail address or account number.
Please try again.</message>
</InvalidCredentialsFault>
</detail>
</soapenv:Fault>
For a detailed list of all fault messages and the associated codes, see “SOAP Fault Status Codes”
on page 252.
Important: Unexpected errors return an error ID that can be provided to NetSuite Support to
help them isolate the error in your account. The following is an example of the error ID:
<ns2:code>UNEXPECTED_ERROR</ns2:code>
<ns2:message>An unexpected error occurred. Error ID: fevsjhv41tji2juy3le73</ns2:message>
Error IDs will be especially helpful for async operations, as the ID will indicate the error that
occurred during the execution of the job, not the retrieval. The exception is if the async error
occurred at the platform-level. In this case, the stack will be attached to the job itself.
Login throws…
ACCT_TEMP_UNAVAILABLE
EMAIL_ADDRS_REQD
INVALID_ACCT
INVALID_JOB_ID
INVALID_LOGIN_CREDENTIALS
INVALID_PAGE_INDEX
INVALID_ROLE
INVALID_WS_VERSION
JOB_NOT_COMPLETE
LOGIN_DISABLED
PSWD_REQD
UNEXPECTED_ERROR
WS_CONCUR_SESSION_DISALLWD
WS_FEATURE_REQD
WS_PERMISSION_REQD
MapSso throws…
ACCT_TEMP_UNAVAILABLE
EMAIL_ADDRS_REQD
INVALID_ACCT
INVALID_LOGIN_CREDENTIALS
INVALID_VERSION
MapSso throws…
PSWD_REQD
UNEXPECTED_ERROR
WS_CONCUR_SESSION_DISALLWD
WS_FEATURE_REQD
WS_PERMISSION_REQD
Logout throws...
INVALID_VERSION
UNEXPECTED_ERROR
WS_CONCUR_SESSION_DISALLWD
SESSION_TIMED_OUT
getList/getAll throw...
INVALID_VERSION
MAX_RCRDS_EXCEEDED
SESSION_TIMED_OUT
UNEXPECTED_ERROR
USER_ERROR
getList/getAll throw...
WS_CONCUR_SESSION_DISALLWD
WS_LOG_IN_REQD
get throws...
INVALID_VERSION
SESSION_TIMED_OUT
UNEXPECTED_ERROR
USER_ERROR
WS_CONCUR_SESSION_DISALLWD
WS_LOG_IN_REQD
The following table lists currently exposed TaskIDs that can be referenced in an https POST
for use in single login between a Web services application and the NetSuite UI. For more
information, refer to “Invoking a UI Session from an External Application” on page 80.