Oracle NetSuite is a cloud ERP platform for financials, order management, inventory, procurement, CRM, and analytics. Sim connects through SuiteTalk REST Web Services using NetSuite's OAuth 2.0 client-credentials flow; it does not require a RESTlet or a user-interactive login.
- In Setup → Company → Enable Features, enable REST Web Services and OAuth 2.0. Enable SuiteAnalytics Workbook if you will list or execute datasets.
- Use a dedicated integration role. Grant it REST Web Services and Log in using OAuth 2.0 Access Tokens, plus the record, transaction, and subsidiary permissions needed by your workflows. Dataset access also requires SuiteAnalytics Workbook permission and access to the selected datasets. Oracle recommends a purpose-built role instead of Administrator. See Set Up OAuth 2.0 Roles and Prerequisites and Setup for REST Web Services.
- Create or edit an integration record under Setup → Integration → Manage Integrations. Enable Client Credentials (Machine to Machine) Grant and the REST Web Services OAuth 2.0 scope, then save the Client ID. See Create Integration Records for Applications to Use OAuth 2.0.
- Create either a 3072- or 4096-bit RSA key pair or a P-256, P-384, or P-521 EC key pair and certificate using your organization's certificate process. Sim signs RSA assertions with PS256 and selects ES256, ES384, or ES512 for the corresponding EC curve. Keep the PEM private key secure; upload only the public certificate to NetSuite, and plan renewal because NetSuite limits certificate validity to two years. See OAuth 2.0 Client Credentials Certificate Conditions.
- Go to Setup → Integration → Manage Authentication → OAuth 2.0 Client Credentials (M2M) Setup. Create a mapping for the integration's entity, role, application, and public certificate, then save the generated Certificate ID. Oracle requires this mapping separately in production, sandbox, and Release Preview, and a sandbox refresh clears it. See OAuth 2.0 Client Credentials Setup.
- In Setup → Company → Company Information → Company URLs, copy the SuiteTalk (SOAP and REST Web Services) URL for the current environment. Production, sandbox, and Release Preview environments each have their own authoritative URL.
- Add a NetSuite block, open NetSuite Account, and create a reusable credential with the SuiteTalk URL, Client ID, Certificate ID, and matching private key. See Oracle NetSuite service-account setup for the complete setup and rotation workflow.
- Record fields and supported actions vary by account, enabled features, custom records, forms, role, and permissions. Use List Record Types and Get Record Metadata before constructing create, update, upsert, action, or transform bodies. Sim intentionally accepts JSON for these dynamic record shapes instead of guessing a fixed schema.
- Select the stored NetSuite account once per block. Record Type and known-job Async Task fields use account-backed pickers; switch a field to Advanced mode to type or reference an identifier that is not present in the bounded picker result. Enter SuiteAnalytics dataset IDs manually after finding them with List SuiteAnalytics Datasets.
- Create Record without
replace returns NetSuite's HTTP 204 response with no body; with replace, it returns HTTP 201 and the created record object. Both cases expose the validated location returned by NetSuite. The replace option applies to create and update, not upsert.
- Paged operations return one page only. The default limit is 100, the maximum is 1,000, and the offset must be a non-negative multiple of the limit. Sim never fetches later pages automatically. Requests must stay within NetSuite's first 100,000 results and first 1,000 pages.
- Homogeneous batch operations accept 1–100 records of one record type and always run asynchronously. NetSuite processes records in parallel, and individual tasks can fail independently; submission is not an all-or-none transaction. Preserve the returned
location or jobId, use Get Async Status with Job Status until the job completes, choose List Tasks to collect task IDs, check each ID with Task Status, then use completed IDs with Get Async Operation Result. Canceling or timing out the local Sim request does not cancel a batch that NetSuite has already accepted.
- Sim gives the OAuth token exchange and each SuiteTalk request up to 30 seconds. A timed-out request fails locally, but a mutation that NetSuite already accepted may still finish remotely.
- Sim limits each materialized request body and successful SuiteTalk response to 16 MiB. Request JSON is also limited to 100 levels of nesting and 100,000 JSON values. Split work into smaller pages or batches when a request or response would exceed these ceilings, even if NetSuite would otherwise accept the payload.
- When attaching a contact with a role, provide either the role's internal ID or external ID, not both. File attachments do not use a contact role.
- Attach/Detach, homogeneous batch operations, Get Record Form, and Get Select Options require a NetSuite 2026.1-compatible account. Oracle introduced these SuiteTalk REST capabilities in NetSuite 2026.1.
- Get Governance Limits returns data only for roles allowed by NetSuite; Oracle documents Administrator access for that operation.
- This integration does not include a trigger. SuiteTalk has no generic API for registering record-change webhooks; polling or customer-deployed SuiteScript requires a separate design.
Connect a reusable Oracle NetSuite service-account credential to SuiteTalk REST Web Services. Read and write account-specific records, execute SuiteQL and SuiteAnalytics datasets, run asynchronous record batches, inspect metadata, and monitor async jobs.
List one page of a NetSuite record collection, optionally filtered with a q expression.
| Parameter | Type | Required | Description |
|---|
recordType | string | Yes | NetSuite REST record type script ID, such as customer or salesOrder |
q | string | No | NetSuite record collection filter expression |
limit | number | No | Results to return in this page (1-1000; default 100) |
offset | number | No | Zero-based result offset; must be divisible by limit and stay within the first 100,000 results and 1,000 pages |
| Parameter | Type | Description |
|---|
status | number | HTTP status returned by NetSuite |
data | json | One documented NetSuite collection page |
↳ links | array | Oracle HATEOAS links for the response |
↳ rel | string | Link relationship |
↳ href | string | Link target |
↳ items | array | Matching record references in this page |
↳ id | string | NetSuite record ID |
↳ links | array | Oracle HATEOAS links for the record |
↳ rel | string | Link relationship |
↳ href | string | Link target |
↳ count | number | Number of items in this page |
↳ hasMore | boolean | Whether another page is available |
↳ offset | number | Offset of this page |
↳ totalResults | number | Total number of matching items |
Retrieve one NetSuite record by internal or external ID.
| Parameter | Type | Required | Description |
|---|
recordType | string | Yes | NetSuite REST record type script ID, such as customer or salesOrder |
recordId | string | Yes | NetSuite internal ID or an external-ID reference beginning with eid: |
fields | string | No | Comma-separated record fields to return |
expand | string | No | Comma-separated resources to expand when supported by the record metadata |
expandSubResources | boolean | No | Whether to expand sublists and subrecords in the response |
| Parameter | Type | Description |
|---|
status | number | HTTP status returned by NetSuite |
data | json | NetSuite response body; record fields are account-specific and dynamic |
Create a NetSuite record using the account-specific record metadata schema.
| Parameter | Type | Required | Description |
|---|
recordType | string | Yes | NetSuite REST record type script ID, such as customer or salesOrder |
body | json | Yes | Record fields matching the account-specific NetSuite metadata schema |
replace | string | No | Comma-separated sublists whose default lines should be replaced |
| Parameter | Type | Description |
|---|
status | number | HTTP status returned by NetSuite |
data | json | Empty for standard HTTP 204 creation; replacement creation can return the documented HTTP 201 post-state object |
location | string | Newly created record URL from the Location response header |
Update fields on an existing NetSuite record with PATCH.
| Parameter | Type | Required | Description |
|---|
recordType | string | Yes | NetSuite REST record type script ID, such as customer or salesOrder |
recordId | string | Yes | NetSuite internal ID or an external-ID reference beginning with eid: |
body | json | Yes | Record fields matching the account-specific NetSuite metadata schema |
replace | string | No | Comma-separated sublists whose existing lines should be replaced |
| Parameter | Type | Description |
|---|
status | number | HTTP status returned by NetSuite |
data | json | Empty for the documented HTTP 204 No Content response |
location | string | Updated record URL from the Location response header |
Create or update a NetSuite record by external ID with PUT.
| Parameter | Type | Required | Description |
|---|
recordType | string | Yes | NetSuite REST record type script ID, such as customer or salesOrder |
externalId | string | Yes | External ID without the eid: prefix |
body | json | Yes | Record fields matching the account-specific NetSuite metadata schema |
| Parameter | Type | Description |
|---|
status | number | HTTP status returned by NetSuite |
data | json | Empty for the documented HTTP 204 No Content response |
location | string | URL of the created or updated record, when NetSuite returns a Location header |
Delete one NetSuite record by internal or external ID.
| Parameter | Type | Required | Description |
|---|
recordType | string | Yes | NetSuite REST record type script ID, such as customer or salesOrder |
recordId | string | Yes | NetSuite internal ID or an external-ID reference beginning with eid: |
| Parameter | Type | Description |
|---|
status | number | HTTP status returned by NetSuite |
data | json | Empty for the documented HTTP 204 No Content response |
Retrieve a record sublist, subrecord, referenced record, or nested subresource.
| Parameter | Type | Required | Description |
|---|
recordType | string | Yes | NetSuite REST record type script ID, such as customer or salesOrder |
recordId | string | Yes | NetSuite internal ID or an external-ID reference beginning with eid: |
subresourcePath | string | Yes | Slash-separated subresource path, such as item or item/1/inventoryDetail |
| Parameter | Type | Description |
|---|
status | number | HTTP status returned by NetSuite |
data | json | NetSuite response body; record fields are account-specific and dynamic |
Return a prepopulated create form, or an edit form when a record ID is supplied.
| Parameter | Type | Required | Description |
|---|
recordType | string | Yes | NetSuite REST record type script ID, such as customer or salesOrder |
recordId | string | No | Existing record ID; omit to request a create form |
body | json | No | Record fields matching the account-specific NetSuite metadata schema |
fields | string | No | Comma-separated record fields to return |
expand | string | No | Comma-separated resources to expand when supported by the record metadata |
expandSubResources | boolean | No | Whether to expand sublists and subrecords in the response |
| Parameter | Type | Description |
|---|
status | number | HTTP status returned by NetSuite |
data | json | NetSuite response body; record fields are account-specific and dynamic |
Retrieve valid select values for one or more fields on a new or existing record.
| Parameter | Type | Required | Description |
|---|
recordType | string | Yes | NetSuite REST record type script ID, such as customer or salesOrder |
recordId | string | No | Existing record ID; omit to evaluate options for a new record |
fields | string | Yes | Comma-separated select field IDs |
q | string | No | Optional select-option filter using CONTAIN, IS, or START_WITH |
body | json | No | Record fields matching the account-specific NetSuite metadata schema |
limit | number | No | Results to return in this page (1-1000; default 100) |
offset | number | No | Zero-based result offset; must be divisible by limit and stay within the first 100,000 results and 1,000 pages |
| Parameter | Type | Description |
|---|
status | number | HTTP status returned by NetSuite |
data | json | Select-options response keyed by requested field ID; each dynamic field contains an _selectOptions object with links, items, count, offset, hasMore, and totalResults |
↳ links | array | Oracle HATEOAS links for the response |
↳ rel | string | Link relationship |
↳ href | string | Link target |
Attach a contact or file to another NetSuite record.
| Parameter | Type | Required | Description |
|---|
recordType | string | Yes | NetSuite REST record type script ID, such as customer or salesOrder |
recordId | string | Yes | NetSuite internal ID or an external-ID reference beginning with eid: |
relatedType | string | Yes | Related resource type: contact or file |
relatedId | string | Yes | Internal ID, or external ID prefixed with eid:, of the contact or file |
roleId | string | No | Optional contact role internal ID |
roleExternalId | string | No | Optional contact role external ID |
| Parameter | Type | Description |
|---|
status | number | HTTP status returned by NetSuite |
data | json | Empty for the documented HTTP 204 No Content response |
Detach a contact or file from another NetSuite record.
| Parameter | Type | Required | Description |
|---|
recordType | string | Yes | NetSuite REST record type script ID, such as customer or salesOrder |
recordId | string | Yes | NetSuite internal ID or an external-ID reference beginning with eid: |
relatedType | string | Yes | Related resource type: contact or file |
relatedId | string | Yes | Internal ID, or external ID prefixed with eid:, of the contact or file |
| Parameter | Type | Description |
|---|
status | number | HTTP status returned by NetSuite |
data | json | Empty for the documented HTTP 204 No Content response |
Execute a supported NetSuite record action such as approve, reject, or confirm.
| Parameter | Type | Required | Description |
|---|
recordType | string | Yes | NetSuite REST record type script ID, such as customer or salesOrder |
recordId | string | Yes | NetSuite internal ID or an external-ID reference beginning with eid: |
action | string | Yes | NetSuite record action ID without the @ prefix |
body | json | No | Parameters accepted by the selected NetSuite record action |
| Parameter | Type | Description |
|---|
status | number | HTTP status returned by NetSuite |
data | json | Documented NetSuite record-action response |
↳ result | boolean | True when NetSuite completed the record action |
Transform a supported source record into another NetSuite record type.
| Parameter | Type | Required | Description |
|---|
recordType | string | Yes | NetSuite REST record type script ID, such as customer or salesOrder |
recordId | string | Yes | NetSuite internal ID or an external-ID reference beginning with eid: |
targetRecordType | string | Yes | Target record type supported by the source record metadata |
body | json | No | Record fields matching the account-specific NetSuite metadata schema |
| Parameter | Type | Description |
|---|
status | number | HTTP status returned by NetSuite |
data | json | Empty for the documented HTTP 204 No Content response |
location | string | URL of the transformed record, when NetSuite returns a Location header |
Submit an asynchronous request to retrieve up to 100 records of one type.
| Parameter | Type | Required | Description |
|---|
recordType | string | Yes | NetSuite REST record type script ID, such as customer or salesOrder |
ids | string | Yes | Up to 100 comma-separated internal IDs or eid: external-ID references |
fields | string | No | Comma-separated record fields to return |
expand | string | No | Comma-separated resources to expand when supported by the record metadata |
expandSubResources | boolean | No | Whether to expand sublists and subrecords in the response |
idempotencyKey | string | No | Optional unique idempotency key for retrying the asynchronous request |
| Parameter | Type | Description |
|---|
status | number | HTTP status returned by NetSuite |
data | json | Empty for the documented HTTP 202 Accepted submission response |
location | string | Asynchronous job URL from the Location response header |
jobId | string | Asynchronous job ID parsed from the Location header |
Submit an asynchronous batch that creates up to 100 records of one type.
| Parameter | Type | Required | Description |
|---|
recordType | string | Yes | NetSuite REST record type script ID, such as customer or salesOrder |
items | array | Yes | Array of 1-100 records matching the account-specific metadata schema |
idempotencyKey | string | No | Optional unique idempotency key for retrying the batch |
| Parameter | Type | Description |
|---|
status | number | HTTP status returned by NetSuite |
data | json | Empty for the documented HTTP 202 Accepted submission response |
location | string | Asynchronous job URL from the Location response header |
jobId | string | Asynchronous job ID parsed from the Location header |
Submit an asynchronous batch that updates up to 100 records of one type.
| Parameter | Type | Required | Description |
|---|
recordType | string | Yes | NetSuite REST record type script ID, such as customer or salesOrder |
items | array | Yes | Array of 1-100 records; every item must include an internal or external ID |
idempotencyKey | string | No | Optional unique idempotency key for retrying the batch |
| Parameter | Type | Description |
|---|
status | number | HTTP status returned by NetSuite |
data | json | Empty for the documented HTTP 202 Accepted submission response |
location | string | Asynchronous job URL from the Location response header |
jobId | string | Asynchronous job ID parsed from the Location header |
Submit an asynchronous batch that creates or updates up to 100 records by external ID.
| Parameter | Type | Required | Description |
|---|
recordType | string | Yes | NetSuite REST record type script ID, such as customer or salesOrder |
items | array | Yes | Array of 1-100 records; every item must include externalId |
idempotencyKey | string | No | Optional unique idempotency key for retrying the batch |
| Parameter | Type | Description |
|---|
status | number | HTTP status returned by NetSuite |
data | json | Empty for the documented HTTP 202 Accepted submission response |
location | string | Asynchronous job URL from the Location response header |
jobId | string | Asynchronous job ID parsed from the Location header |
Submit an asynchronous request to delete up to 100 records of one type.
| Parameter | Type | Required | Description |
|---|
recordType | string | Yes | NetSuite REST record type script ID, such as customer or salesOrder |
ids | string | Yes | Up to 100 comma-separated internal IDs or eid: external-ID references |
idempotencyKey | string | No | Optional unique idempotency key for retrying the batch |
| Parameter | Type | Description |
|---|
status | number | HTTP status returned by NetSuite |
data | json | Empty for the documented HTTP 202 Accepted submission response |
location | string | Asynchronous job URL from the Location response header |
jobId | string | Asynchronous job ID parsed from the Location header |
Execute one page of a SuiteQL query through SuiteTalk REST web services.
| Parameter | Type | Required | Description |
|---|
query | string | Yes | SuiteQL SELECT query; use a complete unique ORDER BY when retrieving multiple pages |
limit | number | No | Results to return in this page (1-1000; default 100) |
offset | number | No | Zero-based result offset; must be divisible by limit and stay within the first 100,000 results and 1,000 pages |
| Parameter | Type | Description |
|---|
status | number | HTTP status returned by NetSuite |
data | json | One documented NetSuite collection page |
↳ links | array | Oracle HATEOAS links for the response |
↳ rel | string | Link relationship |
↳ href | string | Link target |
↳ items | array | Items in this page; item fields depend on the record, query, or dataset |
↳ count | number | Number of items in this page |
↳ hasMore | boolean | Whether another page is available |
↳ offset | number | Offset of this page |
↳ totalResults | number | Total number of matching items |
List one page of SuiteAnalytics Workbook datasets available to the authenticated role.
| Parameter | Type | Required | Description |
|---|
limit | number | No | Results to return in this page (1-1000; default 100) |
offset | number | No | Zero-based result offset; must be divisible by limit and stay within the first 100,000 results and 1,000 pages |
| Parameter | Type | Description |
|---|
status | number | HTTP status returned by NetSuite |
data | json | One documented NetSuite collection page |
↳ links | array | Oracle HATEOAS links for the response |
↳ rel | string | Link relationship |
↳ href | string | Link target |
↳ items | array | Items in this page; item fields depend on the record, query, or dataset |
↳ count | number | Number of items in this page |
↳ hasMore | boolean | Whether another page is available |
↳ offset | number | Offset of this page |
↳ totalResults | number | Total number of matching items |
Execute one page of a standard or custom SuiteAnalytics Workbook dataset.
| Parameter | Type | Required | Description |
|---|
datasetId | string | Yes | SuiteAnalytics dataset script ID |
limit | number | No | Results to return in this page (1-1000; default 100) |
offset | number | No | Zero-based result offset; must be divisible by limit and stay within the first 100,000 results and 1,000 pages |
| Parameter | Type | Description |
|---|
status | number | HTTP status returned by NetSuite |
data | json | One documented NetSuite collection page |
↳ links | array | Oracle HATEOAS links for the response |
↳ rel | string | Link relationship |
↳ href | string | Link target |
↳ items | array | Items in this page; item fields depend on the record, query, or dataset |
↳ count | number | Number of items in this page |
↳ hasMore | boolean | Whether another page is available |
↳ offset | number | Offset of this page |
↳ totalResults | number | Total number of matching items |
List record types exposed to the authenticated role by the REST metadata catalog.
| Parameter | Type | Required | Description |
|---|
| Parameter | Type | Description |
|---|
status | number | HTTP status returned by NetSuite |
data | json | NetSuite REST metadata catalog |
↳ links | array | Oracle HATEOAS links for the response |
↳ rel | string | Link relationship |
↳ href | string | Link target |
↳ items | array | Record types exposed to the authenticated role |
↳ name | string | REST record type script ID |
↳ links | array | Oracle HATEOAS links for the response |
↳ rel | string | Link relationship |
↳ href | string | Link target |
↳ mediaType | string | Media type advertised for the linked metadata resource |
Retrieve account-specific metadata for one NetSuite record type.
| Parameter | Type | Required | Description |
|---|
recordType | string | Yes | NetSuite REST record type script ID, such as customer or salesOrder |
format | string | No | Metadata representation: default, openapi, or json_schema |
| Parameter | Type | Description |
|---|
status | number | HTTP status returned by NetSuite |
data | json | NetSuite response body; record fields are account-specific and dynamic |
Retrieve job status, list job tasks, or retrieve one task status.
| Parameter | Type | Required | Description |
|---|
jobId | string | Yes | Asynchronous job ID |
view | string | No | Retrieve job status, list tasks for the job, or retrieve one task status |
taskId | string | No | Task ID; required when view is task |
| Parameter | Type | Description |
|---|
status | number | HTTP status returned by NetSuite |
data | json | Documented NetSuite asynchronous job, task collection, or task status |
↳ completed | boolean | Whether processing has completed |
↳ endTime | string | Task completion time |
↳ id | string | Asynchronous job or task ID |
↳ progress | string | Current task progress state |
↳ startTime | string | Task start time |
↳ count | number | Number of task collection entries returned |
↳ items | array | Collection entries containing links to one or more asynchronous tasks |
↳ links | array | Links to individual tasks |
↳ rel | string | Link relationship |
↳ href | string | Link target |
↳ links | array | HATEOAS links for the job or task collection |
↳ rel | string | Link relationship |
↳ href | string | Link target |
↳ task | object | Link container for the tasks belonging to this asynchronous job |
↳ links | array | Links to the job task collection |
↳ rel | string | Link relationship |
↳ href | string | Link target |
Retrieve the provider response for one task within a completed asynchronous job.
| Parameter | Type | Required | Description |
|---|
jobId | string | Yes | Asynchronous job ID |
taskId | string | Yes | Task ID within the asynchronous job |
| Parameter | Type | Description |
|---|
status | number | HTTP status returned by NetSuite |
data | json | Result payload for the submitted asynchronous operation; record fields are account-specific and dynamic |
Retrieve the current UTC time from the NetSuite server.
| Parameter | Type | Required | Description |
|---|
| Parameter | Type | Description |
|---|
status | number | HTTP status returned by NetSuite |
data | json | NetSuite server time response |
↳ serverTime | string | Current NetSuite server time in UTC |
Retrieve REST web-services concurrency limits for the NetSuite account and integration; NetSuite requires an Administrator role.
| Parameter | Type | Required | Description |
|---|
| Parameter | Type | Description |
|---|
status | number | HTTP status returned by NetSuite |
data | json | Documented NetSuite governance limits |
↳ accountConcurrencyLimit | number | Account concurrency limit |
↳ accountUnallocatedConcurrencyLimit | number | Account concurrency not allocated to integrations |
↳ integrationConcurrencyLimit | number | Concurrency allocated to this integration |
↳ integrationLimitType | string | Limit assignment: integrationSpecific, accountLimit, or internal |