Mastering NetSuite REST Web Services in 2025

NetSuite REST Web Services 2025 guide hero image

NetSuite just made its REST Web Services API generally available across 140-plus record types and promoted OAuth 2.0 to the default authentication flow. This 2025.1-ready guide walks you through authentication, CRUD operations, SuiteQL improvements, and hard-won best practices.

1 · Prerequisites

RequirementDetails
NetSuite roleREST Web Services + OAuth 2.0 Authorized Applications
API clientPostman, curl, or any library with OAuth 2.0 (or legacy TBA)
Core skillsJSON, HTTP verbs, NetSuite record terminology

2 · Enable REST & OAuth 2.0

  1. Setup ▸ Company ▸ Enable Features ▸ SuiteCloud
  2. Confirm REST Web Services is on (default in new accounts).
  3. Tick OAuth 2.0. Keep Token-Based Auth only if legacy traffic needs it.
Heads-up — the old “REST Record Service (Beta)” checkbox is gone: REST is GA.

3 · Create Integration & Tokens

3.1 Integration record

  1. Setup ▸ Integration ▸ Manage Integrations ▸ New
  2. Name → REST Web Services – 2025
  3. Enable OAuth 2.0 Authorization Code Grant (plus TBA if needed).
  4. Scope → REST Web Services
  5. Save → copy Client ID / Client Secret (shown once).

3.2 OAuth 2.0 handshake (example)

# Authorize
GET https://<ACCOUNT>.suitetalk.api.netsuite.com/services/rest/auth/oauth2/v1/authorize.nl?client_id=...&redirect_uri=...&response_type=code&scope=rest_webservices

# Exchange code → token
POST /services/rest/auth/oauth2/v1/token
grant_type=authorization_code&code=...&redirect_uri=...

# Use it
Authorization: Bearer <access_token>

4 · Base URL Quick-Check

https://<ACCOUNT_ID>.suitetalk.api.netsuite.com/services/rest/record/v1/

5 · CRUD Operations

Customers

# List
GET /customer

# Retrieve one
GET /customer/123

# Create
POST /customer
{
  "companyName": "Robbie Test Company",
  "subsidiary": { "id": "1" }
}

# Update
PATCH /customer/123
{ "comments": "Best customer ever" }

Sales Orders

# Retrieve
GET /salesorder/456

# Create
POST /salesorder
{
  "entity": { "id": "123" },
  "items": { "items": [ { "item": { "id": "108" }, "quantity": 1 } ] }
}

# Update existing line
PATCH /salesorder/456
{
  "items": { "items": [ { "line": 1, "quantity": 2 } ] }
}

Gotcha — omit "line" and NetSuite adds, rather than updates, a line.

6 · SuiteQL 2025 Enhancements

  • Endpoint: /services/rest/query/v1/suiteql
  • New headers: hasMore, totalResults, next
POST /services/rest/query/v1/suiteql
Prefer: transient
{
  "q": "SELECT id, email FROM customer WHERE isinactive = 'F' ORDER BY id LIMIT 50"
}

If hasMore: true, follow the next URL until exhausted.

7 · Pagination Cheat-Sheet

Goal2025 Method
Quick slice?limit=<n>
Full exportFollow next header
> 100 K rowsUse SuiteAnalytics Connect

8 · Best Practices & Troubleshooting

  • Mirror the UI — replicate actions inside NetSuite to reveal required fields.
  • Minimal PATCH — send only changed data for speed.
  • Internal IDs over names for multi-language safety.
  • Token refresh — renew at ~80 % of expires_in.
  • Check weekly Help Center updates for off-cycle tweaks.

9 · Changelog 2022 → 2025

2022.22025.1
REST Beta flagGA by default
Token-Based Auth defaultOAuth 2.0 recommended
Manual offset mathsnext header simplifies paging
≈ 70 record types140 + GA record types
No AI endpointsEarly AI helper preview

⬆︎ Back to top


Need deeper help? Email support@getknit.dev — we ❤️ tough NetSuite integrations.

#1 in Ease of Integrations

Trusted by businesses to streamline and simplify integrations seamlessly with GetKnit.