@bijection/connectors/netsuite entrypoint to declare NetSuite resources.
Availability
This page describes the pinned source package. Published availability is unestablished for this artifact. Source build and package availability.Resources and modes
| Resource | Mode | Description |
|---|---|---|
| Captured REST record | captured | Account-specific metadata, discovery and exact detail observations |
| SuiteQL table | observed | Keyset walk by last modification with deleted records |
Captured REST record
captured: Account-specific metadata, discovery and exact detail observations
The following example matches configurationcustomer.
import { netsuite } from "@bijection/connectors/netsuite";
import { v } from "bijection/values";
import { makeFunctionReference } from "bijection/server";
export const customers = netsuite.record.captured({
recordType: "customer",
schema: {
id: v.string(),
companyName: v.string(),
balance: v.optional(v.string()),
currency: v.optional(v.union(v.string(), v.null())),
},
metadata: {
provider: { kind: "netsuite" },
object: "customer",
schema: {
acquisition_profile: "netsuite_discovery_detail_v1",
native_type: "customer",
keys: ["id"],
fields: {
id: {
native_type: "string",
encoding: "json_string",
representation: "string",
nullable: false,
optional: false,
length: null,
length_facet: null,
precision: null,
scale: null,
reference_to: [],
picklist_values: [],
readable: true,
createable: false,
updateable: false,
external_id: false,
unique: true,
},
companyName: {
native_type: "string",
encoding: "json_string",
representation: "string",
nullable: false,
optional: false,
length: null,
length_facet: null,
precision: null,
scale: null,
reference_to: [],
picklist_values: [],
readable: true,
createable: true,
updateable: true,
external_id: false,
unique: false,
},
balance: {
native_type: "number",
encoding: "netsuite_decimal",
representation: "decimal_text",
nullable: false,
optional: true,
length: null,
length_facet: null,
precision: null,
scale: null,
reference_to: [],
picklist_values: [],
readable: true,
createable: false,
updateable: false,
external_id: false,
unique: false,
},
currency: {
native_type: "reference",
encoding: "netsuite_reference",
representation: "string",
nullable: true,
optional: true,
length: null,
length_facet: null,
precision: null,
scale: null,
reference_to: ["currency"],
picklist_values: [],
readable: true,
createable: true,
updateable: true,
external_id: false,
unique: false,
},
},
relationships: [],
queryable: true,
retrieveable: true,
semantics: {
fields: {},
joins: {},
lookups: {},
unsupported: [],
actions: {
create: {
parameters: {
companyName: {
native_type: "string",
encoding: "json_string",
representation: "string",
nullable: false,
optional: false,
length: null,
length_facet: null,
precision: null,
scale: null,
reference_to: [],
picklist_values: [],
readable: true,
createable: true,
updateable: true,
external_id: false,
unique: false,
},
email: {
native_type: "string",
encoding: "json_string",
representation: "string",
nullable: false,
optional: false,
length: null,
length_facet: null,
precision: null,
scale: null,
reference_to: [],
picklist_values: [],
readable: true,
createable: true,
updateable: true,
external_id: false,
unique: false,
},
phone: {
native_type: "string",
encoding: "json_string",
representation: "string",
nullable: false,
optional: false,
length: null,
length_facet: null,
precision: null,
scale: null,
reference_to: [],
picklist_values: [],
readable: true,
createable: true,
updateable: true,
external_id: false,
unique: false,
},
},
return_type: "customer",
},
updateContact: {
parameters: {
email: {
native_type: "string",
encoding: "json_string",
representation: "string",
nullable: false,
optional: false,
length: null,
length_facet: null,
precision: null,
scale: null,
reference_to: [],
picklist_values: [],
readable: true,
createable: true,
updateable: true,
external_id: false,
unique: false,
},
phone: {
native_type: "string",
encoding: "json_string",
representation: "string",
nullable: false,
optional: false,
length: null,
length_facet: null,
precision: null,
scale: null,
reference_to: [],
picklist_values: [],
readable: true,
createable: true,
updateable: true,
external_id: false,
unique: false,
},
},
return_type: null,
},
},
},
},
reference_targets: {},
},
access: {
read: makeFunctionReference<"query", any, [null]>("policies:read"),
reads: [],
},
actions: {
create: {
operation: "create",
args: { companyName: v.string(), email: v.string(), phone: v.string() },
governingRule: makeFunctionReference<"query", any, [null]>(
"policies:write",
),
maxDeliveryHours: 1,
},
updateContact: {
operation: "updateContact",
args: { email: v.string(), phone: v.string() },
governingRule: makeFunctionReference<"query", any, [null]>(
"policies:write",
),
maxDeliveryHours: 1,
},
},
});
Inferred record types
Inferred record types
{
}
Configuration: customer
Case:netsuite/record/captured/customer.
Connection and resource configuration are declared by this exact case.
Credential kind: netsuite. Keep credential material in the private credential inventory.
| Setting | Type | Required | Owner |
|---|---|---|---|
baseUrl | string | Yes | Shared connection |
accountId | string | Yes | Shared connection |
incarnation | string | Yes | Shared connection |
Complete configuration contract
Complete configuration contract
{
"setup": [],
"resource": {
"access": {
"records": {
"read": {
"query": "policies:read"
},
"reads": []
}
},
"defaults": {},
"metadata": {
"provider": {
"kind": "netsuite"
},
"object": "customer",
"schema": {
"acquisition_profile": "netsuite_discovery_detail_v1",
"native_type": "customer",
"keys": [
"id"
],
"fields": {
"id": {
"native_type": "string",
"encoding": "json_string",
"representation": "string",
"nullable": false,
"optional": false,
"length": null,
"length_facet": null,
"precision": null,
"scale": null,
"reference_to": [],
"picklist_values": [],
"readable": true,
"createable": false,
"updateable": false,
"external_id": false,
"unique": true
},
"companyName": {
"native_type": "string",
"encoding": "json_string",
"representation": "string",
"nullable": false,
"optional": false,
"length": null,
"length_facet": null,
"precision": null,
"scale": null,
"reference_to": [],
"picklist_values": [],
"readable": true,
"createable": true,
"updateable": true,
"external_id": false,
"unique": false
},
"balance": {
"native_type": "number",
"encoding": "netsuite_decimal",
"representation": "decimal_text",
"nullable": false,
"optional": true,
"length": null,
"length_facet": null,
"precision": null,
"scale": null,
"reference_to": [],
"picklist_values": [],
"readable": true,
"createable": false,
"updateable": false,
"external_id": false,
"unique": false
},
"currency": {
"native_type": "reference",
"encoding": "netsuite_reference",
"representation": "string",
"nullable": true,
"optional": true,
"length": null,
"length_facet": null,
"precision": null,
"scale": null,
"reference_to": [
"currency"
],
"picklist_values": [],
"readable": true,
"createable": true,
"updateable": true,
"external_id": false,
"unique": false
}
},
"relationships": [],
"queryable": true,
"retrieveable": true,
"semantics": {
"fields": {},
"joins": {},
"lookups": {},
"unsupported": [],
"actions": {
"create": {
"parameters": {
"companyName": {
"native_type": "string",
"encoding": "json_string",
"representation": "string",
"nullable": false,
"optional": false,
"length": null,
"length_facet": null,
"precision": null,
"scale": null,
"reference_to": [],
"picklist_values": [],
"readable": true,
"createable": true,
"updateable": true,
"external_id": false,
"unique": false
},
"email": {
"native_type": "string",
"encoding": "json_string",
"representation": "string",
"nullable": false,
"optional": false,
"length": null,
"length_facet": null,
"precision": null,
"scale": null,
"reference_to": [],
"picklist_values": [],
"readable": true,
"createable": true,
"updateable": true,
"external_id": false,
"unique": false
},
"phone": {
"native_type": "string",
"encoding": "json_string",
"representation": "string",
"nullable": false,
"optional": false,
"length": null,
"length_facet": null,
"precision": null,
"scale": null,
"reference_to": [],
"picklist_values": [],
"readable": true,
"createable": true,
"updateable": true,
"external_id": false,
"unique": false
}
},
"return_type": "customer"
},
"updateContact": {
"parameters": {
"email": {
"native_type": "string",
"encoding": "json_string",
"representation": "string",
"nullable": false,
"optional": false,
"length": null,
"length_facet": null,
"precision": null,
"scale": null,
"reference_to": [],
"picklist_values": [],
"readable": true,
"createable": true,
"updateable": true,
"external_id": false,
"unique": false
},
"phone": {
"native_type": "string",
"encoding": "json_string",
"representation": "string",
"nullable": false,
"optional": false,
"length": null,
"length_facet": null,
"precision": null,
"scale": null,
"reference_to": [],
"picklist_values": [],
"readable": true,
"createable": true,
"updateable": true,
"external_id": false,
"unique": false
}
},
"return_type": null
}
}
}
},
"reference_targets": {}
},
"connector": "netsuite",
"output": {
"kind": "single",
"collection": "records"
},
"credential_kind": "netsuite",
"connection_fields": [
"baseUrl",
"accountId",
"incarnation"
],
"address": {
"kind": "setup",
"field": "baseUrl"
}
},
"connection_setup": {
"type": "object",
"value": {
"baseUrl": {
"fieldType": {
"type": "string"
},
"optional": false
},
"accountId": {
"fieldType": {
"type": "string"
},
"optional": false
},
"incarnation": {
"fieldType": {
"type": "string"
},
"optional": false
}
}
},
"execution": null
}
| Contract | Meaning |
|---|---|
| Initial | Enumeration of observed records |
| Changes | Repeated observations of current records |
| Deletions | Deletion detection unsupported |
| Resume | Opaque cursor |
| Gap | Explicit repair required after a gap |
| Retention | Unspecified |
Complete native profile
Complete native profile
{
"movement": {
"exchanges": {
"detail": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": true,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"403": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"404": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"503": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
},
"listing": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": true,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"503": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
}
},
"nativeInputLimitBytes": null,
"steps": [
{
"id": "acquire.1",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange detail",
"limitBytes": null
}
},
{
"id": "acquire.2",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange listing",
"limitBytes": null
}
},
{
"id": "retain.1",
"inputs": [
"acquire.1",
"acquire.2"
],
"action": {
"operation": "retain",
"subject": "acquisition evidence",
"reason": "recovery",
"release": "acquisition_custody"
}
},
{
"id": "interpret.1",
"inputs": [
"retain.1"
],
"action": {
"operation": "interpret",
"subject": "acquired input",
"produces": "records"
}
},
{
"id": "materialize.1",
"inputs": [
"interpret.1"
],
"action": {
"operation": "materialize",
"subject": "source rows",
"reason": "serving",
"release": "replacement"
}
},
{
"id": "publish.1",
"inputs": [
"materialize.1"
],
"action": {
"operation": "publish",
"subject": "source rows",
"visibility": "with_acquisition"
}
}
]
},
"initial": "enumeration",
"changes": "observations",
"deletions": "unsupported",
"resume": "opaque_cursor",
"retentionMs": null,
"gap": "explicit_repair",
"limits": {
"http_response_bytes": "524288"
},
"restrictions": [],
"commands": {
"create": {
"target": "records",
"delivery": "single_attempt",
"condition": "unconditional",
"replayWindowMs": null,
"maxDeliveryHours": "1",
"providerEnforcedExpiry": false
},
"updateContact": {
"target": "records",
"delivery": "single_attempt",
"condition": "unconditional",
"replayWindowMs": null,
"maxDeliveryHours": "1",
"providerEnforcedExpiry": false
}
}
}
| Command | Target | Condition | Delivery |
|---|---|---|---|
create | records | Unconditional | Single dispatch attempt |
updateContact | records | Unconditional | Single dispatch attempt |
Commands, occurrences and artifacts
Commands, occurrences and artifacts
{
"records": {
"records": {
"protocol": "record_observation",
"coverage": "records",
"consistency": "observations",
"atomicity": "record",
"history": "observations",
"recordRefresh": true,
"reconciliation": true,
"notifications": false,
"snapshotMaxRows": null,
"profile": {
"movement": {
"exchanges": {
"detail": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": true,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"403": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"404": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"503": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
},
"listing": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": true,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"503": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
}
},
"nativeInputLimitBytes": null,
"steps": [
{
"id": "acquire.1",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange detail",
"limitBytes": null
}
},
{
"id": "acquire.2",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange listing",
"limitBytes": null
}
},
{
"id": "retain.1",
"inputs": [
"acquire.1",
"acquire.2"
],
"action": {
"operation": "retain",
"subject": "acquisition evidence",
"reason": "recovery",
"release": "acquisition_custody"
}
},
{
"id": "interpret.1",
"inputs": [
"retain.1"
],
"action": {
"operation": "interpret",
"subject": "acquired input",
"produces": "records"
}
},
{
"id": "materialize.1",
"inputs": [
"interpret.1"
],
"action": {
"operation": "materialize",
"subject": "source rows",
"reason": "serving",
"release": "replacement"
}
},
{
"id": "publish.1",
"inputs": [
"materialize.1"
],
"action": {
"operation": "publish",
"subject": "source rows",
"visibility": "with_acquisition"
}
}
]
},
"initial": "enumeration",
"changes": "observations",
"deletions": "unsupported",
"resume": "opaque_cursor",
"retentionMs": null,
"gap": "explicit_repair",
"limits": {
"http_response_bytes": "524288"
},
"restrictions": [],
"commands": {
"create": {
"target": "records",
"delivery": "single_attempt",
"condition": "unconditional",
"replayWindowMs": null,
"maxDeliveryHours": "1",
"providerEnforcedExpiry": false
},
"updateContact": {
"target": "records",
"delivery": "single_attempt",
"condition": "unconditional",
"replayWindowMs": null,
"maxDeliveryHours": "1",
"providerEnforcedExpiry": false
}
}
}
}
},
"occurrences": null,
"artifacts": {
"raw_archive": false,
"native_file_transfer_limit_bytes": null,
"external_versions": false,
"files": {}
},
"commands": {
"create": {
"target": "records",
"condition": {
"kind": "unconditional"
},
"delivery": {
"kind": "single_attempt",
"retention": {
"kind": "unknown"
},
"max_delivery_hours": 1
}
},
"updateContact": {
"target": "records",
"condition": {
"kind": "unconditional"
},
"delivery": {
"kind": "single_attempt",
"retention": {
"kind": "unknown"
},
"max_delivery_hours": 1
}
}
}
}
| Requirement | Scope | Evidence | Result |
|---|---|---|---|
| page-publication-recovery | {“kind”:“collection”,“name”:“records”} | No retained check covers this scoped NetSuite requirement; no NetSuite account has been reached. | Execution result unavailable |
| command-response-lost | {“kind”:“command”,“name”:“create”} | No retained check covers this scoped NetSuite requirement; no NetSuite account has been reached. | Execution result unavailable |
| command-response-lost | {“kind”:“command”,“name”:“updateContact”} | No retained check covers this scoped NetSuite requirement; no NetSuite account has been reached. | Execution result unavailable |
| identity-account | {“kind”:“connection”} | Fixture: ./src/connectors/netsuite/fixtures/captured-identity.json | passed (2026-10-24T21:36:12.099Z) |
Configuration: vendor
Case:netsuite/record/captured/vendor.
Connection and resource configuration are declared by this exact case.
Credential kind: netsuite. Keep credential material in the private credential inventory.
| Setting | Type | Required | Owner |
|---|---|---|---|
baseUrl | string | Yes | Shared connection |
accountId | string | Yes | Shared connection |
incarnation | string | Yes | Shared connection |
Complete configuration contract
Complete configuration contract
{
"setup": [],
"resource": {
"access": {
"records": {
"read": {
"query": "policies:read"
},
"reads": []
}
},
"defaults": {},
"metadata": {
"provider": {
"kind": "netsuite"
},
"object": "vendor",
"reference_targets": {},
"schema": {
"acquisition_profile": "netsuite_discovery_detail_v1",
"native_type": "vendor",
"keys": [
"id"
],
"fields": {
"id": {
"native_type": "string",
"encoding": "json_string",
"representation": "string",
"nullable": false,
"optional": false,
"length": null,
"length_facet": null,
"precision": null,
"scale": null,
"reference_to": [],
"picklist_values": [],
"readable": true,
"createable": false,
"updateable": false,
"external_id": false,
"unique": true
}
},
"relationships": [],
"queryable": true,
"retrieveable": true,
"semantics": {
"fields": {},
"actions": {},
"lookups": {},
"joins": {},
"unsupported": []
}
}
},
"connector": "netsuite",
"output": {
"kind": "single",
"collection": "records"
},
"credential_kind": "netsuite",
"connection_fields": [
"baseUrl",
"accountId",
"incarnation"
],
"address": {
"kind": "setup",
"field": "baseUrl"
}
},
"connection_setup": {
"type": "object",
"value": {
"baseUrl": {
"fieldType": {
"type": "string"
},
"optional": false
},
"accountId": {
"fieldType": {
"type": "string"
},
"optional": false
},
"incarnation": {
"fieldType": {
"type": "string"
},
"optional": false
}
}
},
"execution": null
}
| Contract | Meaning |
|---|---|
| Initial | Enumeration of observed records |
| Changes | Repeated observations of current records |
| Deletions | Deletion detection unsupported |
| Resume | Opaque cursor |
| Gap | Explicit repair required after a gap |
| Retention | Unspecified |
Complete native profile
Complete native profile
{
"movement": {
"exchanges": {
"detail": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": true,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"403": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"404": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"503": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
},
"listing": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": true,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"503": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
}
},
"nativeInputLimitBytes": null,
"steps": [
{
"id": "acquire.1",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange detail",
"limitBytes": null
}
},
{
"id": "acquire.2",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange listing",
"limitBytes": null
}
},
{
"id": "retain.1",
"inputs": [
"acquire.1",
"acquire.2"
],
"action": {
"operation": "retain",
"subject": "acquisition evidence",
"reason": "recovery",
"release": "acquisition_custody"
}
},
{
"id": "interpret.1",
"inputs": [
"retain.1"
],
"action": {
"operation": "interpret",
"subject": "acquired input",
"produces": "records"
}
},
{
"id": "materialize.1",
"inputs": [
"interpret.1"
],
"action": {
"operation": "materialize",
"subject": "source rows",
"reason": "serving",
"release": "replacement"
}
},
{
"id": "publish.1",
"inputs": [
"materialize.1"
],
"action": {
"operation": "publish",
"subject": "source rows",
"visibility": "with_acquisition"
}
}
]
},
"initial": "enumeration",
"changes": "observations",
"deletions": "unsupported",
"resume": "opaque_cursor",
"retentionMs": null,
"gap": "explicit_repair",
"limits": {
"http_response_bytes": "524288"
},
"restrictions": [],
"commands": {}
}
Commands, occurrences and artifacts
Commands, occurrences and artifacts
{
"records": {
"records": {
"protocol": "record_observation",
"coverage": "records",
"consistency": "observations",
"atomicity": "record",
"history": "observations",
"recordRefresh": true,
"reconciliation": true,
"notifications": false,
"snapshotMaxRows": null,
"profile": {
"movement": {
"exchanges": {
"detail": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": true,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"403": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"404": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"503": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
},
"listing": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": true,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"503": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
}
},
"nativeInputLimitBytes": null,
"steps": [
{
"id": "acquire.1",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange detail",
"limitBytes": null
}
},
{
"id": "acquire.2",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange listing",
"limitBytes": null
}
},
{
"id": "retain.1",
"inputs": [
"acquire.1",
"acquire.2"
],
"action": {
"operation": "retain",
"subject": "acquisition evidence",
"reason": "recovery",
"release": "acquisition_custody"
}
},
{
"id": "interpret.1",
"inputs": [
"retain.1"
],
"action": {
"operation": "interpret",
"subject": "acquired input",
"produces": "records"
}
},
{
"id": "materialize.1",
"inputs": [
"interpret.1"
],
"action": {
"operation": "materialize",
"subject": "source rows",
"reason": "serving",
"release": "replacement"
}
},
{
"id": "publish.1",
"inputs": [
"materialize.1"
],
"action": {
"operation": "publish",
"subject": "source rows",
"visibility": "with_acquisition"
}
}
]
},
"initial": "enumeration",
"changes": "observations",
"deletions": "unsupported",
"resume": "opaque_cursor",
"retentionMs": null,
"gap": "explicit_repair",
"limits": {
"http_response_bytes": "524288"
},
"restrictions": [],
"commands": {}
}
}
},
"occurrences": null,
"artifacts": {
"raw_archive": false,
"native_file_transfer_limit_bytes": null,
"external_versions": false,
"files": {}
},
"commands": {}
}
| Requirement | Scope | Evidence | Result |
|---|---|---|---|
| page-publication-recovery | {“kind”:“collection”,“name”:“records”} | No retained check covers this scoped NetSuite requirement; no NetSuite account has been reached. | Execution result unavailable |
| identity-account | {“kind”:“connection”} | Fixture: ./src/connectors/netsuite/fixtures/captured-identity.json | passed (2026-10-24T21:36:12.099Z) |
Configuration: salesOrder
Case:netsuite/record/captured/salesOrder.
Connection and resource configuration are declared by this exact case.
Credential kind: netsuite. Keep credential material in the private credential inventory.
| Setting | Type | Required | Owner |
|---|---|---|---|
baseUrl | string | Yes | Shared connection |
accountId | string | Yes | Shared connection |
incarnation | string | Yes | Shared connection |
Complete configuration contract
Complete configuration contract
{
"setup": [],
"resource": {
"access": {
"records": {
"read": {
"query": "policies:read"
},
"reads": []
}
},
"defaults": {},
"metadata": {
"provider": {
"kind": "netsuite"
},
"object": "salesOrder",
"reference_targets": {},
"schema": {
"acquisition_profile": "netsuite_discovery_detail_v1",
"native_type": "salesOrder",
"keys": [
"id"
],
"fields": {
"id": {
"native_type": "string",
"encoding": "json_string",
"representation": "string",
"nullable": false,
"optional": false,
"length": null,
"length_facet": null,
"precision": null,
"scale": null,
"reference_to": [],
"picklist_values": [],
"readable": true,
"createable": false,
"updateable": false,
"external_id": false,
"unique": true
}
},
"relationships": [],
"queryable": true,
"retrieveable": true,
"semantics": {
"fields": {},
"actions": {},
"lookups": {},
"joins": {},
"unsupported": []
}
}
},
"connector": "netsuite",
"output": {
"kind": "single",
"collection": "records"
},
"credential_kind": "netsuite",
"connection_fields": [
"baseUrl",
"accountId",
"incarnation"
],
"address": {
"kind": "setup",
"field": "baseUrl"
}
},
"connection_setup": {
"type": "object",
"value": {
"baseUrl": {
"fieldType": {
"type": "string"
},
"optional": false
},
"accountId": {
"fieldType": {
"type": "string"
},
"optional": false
},
"incarnation": {
"fieldType": {
"type": "string"
},
"optional": false
}
}
},
"execution": null
}
| Contract | Meaning |
|---|---|
| Initial | Enumeration of observed records |
| Changes | Repeated observations of current records |
| Deletions | Deletion detection unsupported |
| Resume | Opaque cursor |
| Gap | Explicit repair required after a gap |
| Retention | Unspecified |
Complete native profile
Complete native profile
{
"movement": {
"exchanges": {
"detail": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": true,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"403": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"404": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"503": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
},
"listing": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": true,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"503": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
}
},
"nativeInputLimitBytes": null,
"steps": [
{
"id": "acquire.1",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange detail",
"limitBytes": null
}
},
{
"id": "acquire.2",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange listing",
"limitBytes": null
}
},
{
"id": "retain.1",
"inputs": [
"acquire.1",
"acquire.2"
],
"action": {
"operation": "retain",
"subject": "acquisition evidence",
"reason": "recovery",
"release": "acquisition_custody"
}
},
{
"id": "interpret.1",
"inputs": [
"retain.1"
],
"action": {
"operation": "interpret",
"subject": "acquired input",
"produces": "records"
}
},
{
"id": "materialize.1",
"inputs": [
"interpret.1"
],
"action": {
"operation": "materialize",
"subject": "source rows",
"reason": "serving",
"release": "replacement"
}
},
{
"id": "publish.1",
"inputs": [
"materialize.1"
],
"action": {
"operation": "publish",
"subject": "source rows",
"visibility": "with_acquisition"
}
}
]
},
"initial": "enumeration",
"changes": "observations",
"deletions": "unsupported",
"resume": "opaque_cursor",
"retentionMs": null,
"gap": "explicit_repair",
"limits": {
"http_response_bytes": "524288"
},
"restrictions": [],
"commands": {}
}
Commands, occurrences and artifacts
Commands, occurrences and artifacts
{
"records": {
"records": {
"protocol": "record_observation",
"coverage": "records",
"consistency": "observations",
"atomicity": "record",
"history": "observations",
"recordRefresh": true,
"reconciliation": true,
"notifications": false,
"snapshotMaxRows": null,
"profile": {
"movement": {
"exchanges": {
"detail": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": true,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"403": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"404": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"503": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
},
"listing": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": true,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"503": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
}
},
"nativeInputLimitBytes": null,
"steps": [
{
"id": "acquire.1",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange detail",
"limitBytes": null
}
},
{
"id": "acquire.2",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange listing",
"limitBytes": null
}
},
{
"id": "retain.1",
"inputs": [
"acquire.1",
"acquire.2"
],
"action": {
"operation": "retain",
"subject": "acquisition evidence",
"reason": "recovery",
"release": "acquisition_custody"
}
},
{
"id": "interpret.1",
"inputs": [
"retain.1"
],
"action": {
"operation": "interpret",
"subject": "acquired input",
"produces": "records"
}
},
{
"id": "materialize.1",
"inputs": [
"interpret.1"
],
"action": {
"operation": "materialize",
"subject": "source rows",
"reason": "serving",
"release": "replacement"
}
},
{
"id": "publish.1",
"inputs": [
"materialize.1"
],
"action": {
"operation": "publish",
"subject": "source rows",
"visibility": "with_acquisition"
}
}
]
},
"initial": "enumeration",
"changes": "observations",
"deletions": "unsupported",
"resume": "opaque_cursor",
"retentionMs": null,
"gap": "explicit_repair",
"limits": {
"http_response_bytes": "524288"
},
"restrictions": [],
"commands": {}
}
}
},
"occurrences": null,
"artifacts": {
"raw_archive": false,
"native_file_transfer_limit_bytes": null,
"external_versions": false,
"files": {}
},
"commands": {}
}
| Requirement | Scope | Evidence | Result |
|---|---|---|---|
| page-publication-recovery | {“kind”:“collection”,“name”:“records”} | No retained check covers this scoped NetSuite requirement; no NetSuite account has been reached. | Execution result unavailable |
| identity-account | {“kind”:“connection”} | Fixture: ./src/connectors/netsuite/fixtures/captured-identity.json | passed (2026-10-24T21:36:12.100Z) |
Configuration: invoice
Case:netsuite/record/captured/invoice.
Connection and resource configuration are declared by this exact case.
Credential kind: netsuite. Keep credential material in the private credential inventory.
| Setting | Type | Required | Owner |
|---|---|---|---|
baseUrl | string | Yes | Shared connection |
accountId | string | Yes | Shared connection |
incarnation | string | Yes | Shared connection |
Complete configuration contract
Complete configuration contract
{
"setup": [],
"resource": {
"access": {
"records": {
"read": {
"query": "policies:read"
},
"reads": []
}
},
"defaults": {},
"metadata": {
"provider": {
"kind": "netsuite"
},
"object": "invoice",
"reference_targets": {},
"schema": {
"acquisition_profile": "netsuite_discovery_detail_v1",
"native_type": "invoice",
"keys": [
"id"
],
"fields": {
"id": {
"native_type": "string",
"encoding": "json_string",
"representation": "string",
"nullable": false,
"optional": false,
"length": null,
"length_facet": null,
"precision": null,
"scale": null,
"reference_to": [],
"picklist_values": [],
"readable": true,
"createable": false,
"updateable": false,
"external_id": false,
"unique": true
}
},
"relationships": [],
"queryable": true,
"retrieveable": true,
"semantics": {
"fields": {},
"actions": {},
"lookups": {},
"joins": {},
"unsupported": []
}
}
},
"connector": "netsuite",
"output": {
"kind": "single",
"collection": "records"
},
"credential_kind": "netsuite",
"connection_fields": [
"baseUrl",
"accountId",
"incarnation"
],
"address": {
"kind": "setup",
"field": "baseUrl"
}
},
"connection_setup": {
"type": "object",
"value": {
"baseUrl": {
"fieldType": {
"type": "string"
},
"optional": false
},
"accountId": {
"fieldType": {
"type": "string"
},
"optional": false
},
"incarnation": {
"fieldType": {
"type": "string"
},
"optional": false
}
}
},
"execution": null
}
| Contract | Meaning |
|---|---|
| Initial | Enumeration of observed records |
| Changes | Repeated observations of current records |
| Deletions | Deletion detection unsupported |
| Resume | Opaque cursor |
| Gap | Explicit repair required after a gap |
| Retention | Unspecified |
Complete native profile
Complete native profile
{
"movement": {
"exchanges": {
"detail": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": true,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"403": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"404": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"503": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
},
"listing": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": true,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"503": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
}
},
"nativeInputLimitBytes": null,
"steps": [
{
"id": "acquire.1",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange detail",
"limitBytes": null
}
},
{
"id": "acquire.2",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange listing",
"limitBytes": null
}
},
{
"id": "retain.1",
"inputs": [
"acquire.1",
"acquire.2"
],
"action": {
"operation": "retain",
"subject": "acquisition evidence",
"reason": "recovery",
"release": "acquisition_custody"
}
},
{
"id": "interpret.1",
"inputs": [
"retain.1"
],
"action": {
"operation": "interpret",
"subject": "acquired input",
"produces": "records"
}
},
{
"id": "materialize.1",
"inputs": [
"interpret.1"
],
"action": {
"operation": "materialize",
"subject": "source rows",
"reason": "serving",
"release": "replacement"
}
},
{
"id": "publish.1",
"inputs": [
"materialize.1"
],
"action": {
"operation": "publish",
"subject": "source rows",
"visibility": "with_acquisition"
}
}
]
},
"initial": "enumeration",
"changes": "observations",
"deletions": "unsupported",
"resume": "opaque_cursor",
"retentionMs": null,
"gap": "explicit_repair",
"limits": {
"http_response_bytes": "524288"
},
"restrictions": [],
"commands": {}
}
Commands, occurrences and artifacts
Commands, occurrences and artifacts
{
"records": {
"records": {
"protocol": "record_observation",
"coverage": "records",
"consistency": "observations",
"atomicity": "record",
"history": "observations",
"recordRefresh": true,
"reconciliation": true,
"notifications": false,
"snapshotMaxRows": null,
"profile": {
"movement": {
"exchanges": {
"detail": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": true,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"403": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"404": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"503": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
},
"listing": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": true,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"503": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
}
},
"nativeInputLimitBytes": null,
"steps": [
{
"id": "acquire.1",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange detail",
"limitBytes": null
}
},
{
"id": "acquire.2",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange listing",
"limitBytes": null
}
},
{
"id": "retain.1",
"inputs": [
"acquire.1",
"acquire.2"
],
"action": {
"operation": "retain",
"subject": "acquisition evidence",
"reason": "recovery",
"release": "acquisition_custody"
}
},
{
"id": "interpret.1",
"inputs": [
"retain.1"
],
"action": {
"operation": "interpret",
"subject": "acquired input",
"produces": "records"
}
},
{
"id": "materialize.1",
"inputs": [
"interpret.1"
],
"action": {
"operation": "materialize",
"subject": "source rows",
"reason": "serving",
"release": "replacement"
}
},
{
"id": "publish.1",
"inputs": [
"materialize.1"
],
"action": {
"operation": "publish",
"subject": "source rows",
"visibility": "with_acquisition"
}
}
]
},
"initial": "enumeration",
"changes": "observations",
"deletions": "unsupported",
"resume": "opaque_cursor",
"retentionMs": null,
"gap": "explicit_repair",
"limits": {
"http_response_bytes": "524288"
},
"restrictions": [],
"commands": {}
}
}
},
"occurrences": null,
"artifacts": {
"raw_archive": false,
"native_file_transfer_limit_bytes": null,
"external_versions": false,
"files": {}
},
"commands": {}
}
| Requirement | Scope | Evidence | Result |
|---|---|---|---|
| page-publication-recovery | {“kind”:“collection”,“name”:“records”} | No retained check covers this scoped NetSuite requirement; no NetSuite account has been reached. | Execution result unavailable |
| identity-account | {“kind”:“connection”} | Fixture: ./src/connectors/netsuite/fixtures/captured-identity.json | passed (2026-10-24T21:36:12.100Z) |
SuiteQL table
observed: Keyset walk by last modification with deleted records
The following example matches configurationstandard.
import { netsuite } from "@bijection/connectors/netsuite";
export const customers = netsuite.table.observed({
table: "customer",
columns: ["entityid", "companyname", "email"],
deletedRecordType: "customer",
});
Inferred record types
Inferred record types
{
}
Configuration: standard
Case:netsuite/table/observed/standard.
Connection and resource configuration are declared by this exact case.
Credential kind: netsuite. Keep credential material in the private credential inventory.
| Setting | Type | Required | Owner |
|---|---|---|---|
account | string | Yes | Shared connection |
Complete configuration contract
Complete configuration contract
{
"setup": [],
"resource": {
"access": {},
"defaults": {},
"connector": "netsuite",
"output": {
"kind": "single",
"collection": "records"
},
"credential_kind": "netsuite",
"connection_fields": [
"account"
],
"address": {
"kind": "setup",
"field": "account",
"prefix": "https://",
"suffix": ".suitetalk.api.netsuite.com"
}
},
"connection_setup": {
"type": "object",
"value": {
"account": {
"fieldType": {
"type": "string"
},
"optional": false
}
}
},
"execution": null
}
| Contract | Meaning |
|---|---|
| Initial | Enumeration of observed records |
| Changes | Repeated observations of current records |
| Deletions | Explicit deletion evidence |
| Resume | No continuation |
| Gap | Not applicable |
| Retention | Unspecified |
Complete native profile
Complete native profile
{
"movement": {
"exchanges": {
"deletions": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"400": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"401": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"403": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"503": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
},
"records": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"400": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"401": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"403": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"503": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
}
},
"nativeInputLimitBytes": null,
"steps": [
{
"id": "acquire.1",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange deletions",
"limitBytes": null
}
},
{
"id": "acquire.2",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange records",
"limitBytes": null
}
},
{
"id": "retain.1",
"inputs": [
"acquire.1",
"acquire.2"
],
"action": {
"operation": "retain",
"subject": "acquisition evidence",
"reason": "recovery",
"release": "acquisition_custody"
}
},
{
"id": "interpret.1",
"inputs": [
"retain.1"
],
"action": {
"operation": "interpret",
"subject": "acquired input",
"produces": "records"
}
},
{
"id": "materialize.1",
"inputs": [
"interpret.1"
],
"action": {
"operation": "materialize",
"subject": "source rows",
"reason": "serving",
"release": "replacement"
}
},
{
"id": "publish.1",
"inputs": [
"materialize.1"
],
"action": {
"operation": "publish",
"subject": "source rows",
"visibility": "with_acquisition"
}
}
]
},
"initial": "enumeration",
"changes": "observations",
"deletions": "explicit_events",
"resume": "none",
"retentionMs": null,
"gap": "not_applicable",
"limits": {
"http_response_bytes": "524288"
},
"restrictions": [],
"commands": {}
}
Commands, occurrences and artifacts
Commands, occurrences and artifacts
{
"records": {
"records": {
"protocol": "record_observation",
"coverage": "records",
"consistency": "observations",
"atomicity": "record",
"history": "observations",
"recordRefresh": false,
"reconciliation": false,
"notifications": false,
"snapshotMaxRows": null,
"profile": {
"movement": {
"exchanges": {
"deletions": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"400": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"401": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"403": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"503": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
},
"records": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"400": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"401": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"403": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"503": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
}
},
"nativeInputLimitBytes": null,
"steps": [
{
"id": "acquire.1",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange deletions",
"limitBytes": null
}
},
{
"id": "acquire.2",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange records",
"limitBytes": null
}
},
{
"id": "retain.1",
"inputs": [
"acquire.1",
"acquire.2"
],
"action": {
"operation": "retain",
"subject": "acquisition evidence",
"reason": "recovery",
"release": "acquisition_custody"
}
},
{
"id": "interpret.1",
"inputs": [
"retain.1"
],
"action": {
"operation": "interpret",
"subject": "acquired input",
"produces": "records"
}
},
{
"id": "materialize.1",
"inputs": [
"interpret.1"
],
"action": {
"operation": "materialize",
"subject": "source rows",
"reason": "serving",
"release": "replacement"
}
},
{
"id": "publish.1",
"inputs": [
"materialize.1"
],
"action": {
"operation": "publish",
"subject": "source rows",
"visibility": "with_acquisition"
}
}
]
},
"initial": "enumeration",
"changes": "observations",
"deletions": "explicit_events",
"resume": "none",
"retentionMs": null,
"gap": "not_applicable",
"limits": {
"http_response_bytes": "524288"
},
"restrictions": [],
"commands": {}
}
}
},
"occurrences": null,
"artifacts": {
"raw_archive": false,
"native_file_transfer_limit_bytes": null,
"external_versions": false,
"files": {}
},
"commands": {}
}
| Requirement | Scope | Evidence | Result |
|---|---|---|---|
| page-publication-recovery | {“kind”:“collection”,“name”:“records”} | Fixture: ./src/connectors/netsuite/fixtures/deletions-page-continues.json | passed (2026-10-24T21:36:12.101Z) |
| page-publication-recovery | {“kind”:“collection”,“name”:“records”} | Fixture: ./src/connectors/netsuite/fixtures/deletions-then-records.json | passed (2026-10-24T21:36:12.102Z) |
| page-publication-recovery | {“kind”:“collection”,“name”:“records”} | Fixture: ./src/connectors/netsuite/fixtures/records-final-page.json | passed (2026-10-24T21:36:12.102Z) |
| page-publication-recovery | {“kind”:“collection”,“name”:“records”} | Fixture: ./src/connectors/netsuite/fixtures/carried-pass-overlaps.json | passed (2026-10-24T21:36:12.103Z) |
| page-publication-recovery | {“kind”:“collection”,“name”:“records”} | Native test: integrations/acquisition/acquisition_windows_preserve_sequences_and_restart_fences_old_work (shared_engine) | Execution result unavailable |
| identity-account | {“kind”:“connection”} | Fixture: ./src/connectors/netsuite/fixtures/identity.json | passed (2026-10-24T21:36:12.103Z) |
Configuration: recordsOnly
Case:netsuite/table/observed/recordsOnly.
Connection and resource configuration are declared by this exact case.
Credential kind: netsuite. Keep credential material in the private credential inventory.
| Setting | Type | Required | Owner |
|---|---|---|---|
account | string | Yes | Shared connection |
Complete configuration contract
Complete configuration contract
{
"setup": [],
"resource": {
"access": {},
"defaults": {},
"connector": "netsuite",
"output": {
"kind": "single",
"collection": "records"
},
"credential_kind": "netsuite",
"connection_fields": [
"account"
],
"address": {
"kind": "setup",
"field": "account",
"prefix": "https://",
"suffix": ".suitetalk.api.netsuite.com"
}
},
"connection_setup": {
"type": "object",
"value": {
"account": {
"fieldType": {
"type": "string"
},
"optional": false
}
}
},
"execution": null
}
| Contract | Meaning |
|---|---|
| Initial | Enumeration of observed records |
| Changes | Repeated observations of current records |
| Deletions | Deletion detection unsupported |
| Resume | No continuation |
| Gap | Not applicable |
| Retention | Unspecified |
Complete native profile
Complete native profile
{
"movement": {
"exchanges": {
"records": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"400": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"401": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"403": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"503": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
}
},
"nativeInputLimitBytes": null,
"steps": [
{
"id": "acquire.1",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange records",
"limitBytes": null
}
},
{
"id": "retain.1",
"inputs": [
"acquire.1"
],
"action": {
"operation": "retain",
"subject": "acquisition evidence",
"reason": "recovery",
"release": "acquisition_custody"
}
},
{
"id": "interpret.1",
"inputs": [
"retain.1"
],
"action": {
"operation": "interpret",
"subject": "acquired input",
"produces": "records"
}
},
{
"id": "materialize.1",
"inputs": [
"interpret.1"
],
"action": {
"operation": "materialize",
"subject": "source rows",
"reason": "serving",
"release": "replacement"
}
},
{
"id": "publish.1",
"inputs": [
"materialize.1"
],
"action": {
"operation": "publish",
"subject": "source rows",
"visibility": "with_acquisition"
}
}
]
},
"initial": "enumeration",
"changes": "observations",
"deletions": "unsupported",
"resume": "none",
"retentionMs": null,
"gap": "not_applicable",
"limits": {
"http_response_bytes": "524288"
},
"restrictions": [],
"commands": {}
}
Commands, occurrences and artifacts
Commands, occurrences and artifacts
{
"records": {
"records": {
"protocol": "record_observation",
"coverage": "records",
"consistency": "observations",
"atomicity": "record",
"history": "observations",
"recordRefresh": false,
"reconciliation": false,
"notifications": false,
"snapshotMaxRows": null,
"profile": {
"movement": {
"exchanges": {
"records": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"400": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"401": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"403": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"503": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
}
},
"nativeInputLimitBytes": null,
"steps": [
{
"id": "acquire.1",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange records",
"limitBytes": null
}
},
{
"id": "retain.1",
"inputs": [
"acquire.1"
],
"action": {
"operation": "retain",
"subject": "acquisition evidence",
"reason": "recovery",
"release": "acquisition_custody"
}
},
{
"id": "interpret.1",
"inputs": [
"retain.1"
],
"action": {
"operation": "interpret",
"subject": "acquired input",
"produces": "records"
}
},
{
"id": "materialize.1",
"inputs": [
"interpret.1"
],
"action": {
"operation": "materialize",
"subject": "source rows",
"reason": "serving",
"release": "replacement"
}
},
{
"id": "publish.1",
"inputs": [
"materialize.1"
],
"action": {
"operation": "publish",
"subject": "source rows",
"visibility": "with_acquisition"
}
}
]
},
"initial": "enumeration",
"changes": "observations",
"deletions": "unsupported",
"resume": "none",
"retentionMs": null,
"gap": "not_applicable",
"limits": {
"http_response_bytes": "524288"
},
"restrictions": [],
"commands": {}
}
}
},
"occurrences": null,
"artifacts": {
"raw_archive": false,
"native_file_transfer_limit_bytes": null,
"external_versions": false,
"files": {}
},
"commands": {}
}
| Requirement | Scope | Evidence | Result |
|---|---|---|---|
| page-publication-recovery | {“kind”:“collection”,“name”:“records”} | Fixture: ./src/connectors/netsuite/fixtures/records-only-start.json | passed (2026-10-24T21:36:12.103Z) |
| page-publication-recovery | {“kind”:“collection”,“name”:“records”} | Native test: integrations/acquisition/acquisition_windows_preserve_sequences_and_restart_fences_old_work (shared_engine) | Execution result unavailable |
| identity-account | {“kind”:“connection”} | Fixture: ./src/connectors/netsuite/fixtures/identity.json | passed (2026-10-24T21:36:12.103Z) |
Provider guidance
Captured REST records
source metadata capture netsuite captures account-specific JSON Schema for
customer, vendor, salesOrder and invoice. Generated capturedObject factories
select typed custom fields and explicit customer create/updateContact commands.
netsuite.record.captured is the underlying recipe. It requires the exact captured
metadata, field validators and application policies. The registered cases are synthetic.
Native discovery pins the provider clock, traverses a modification window ordered
by (second, internal ID) and rereads five minutes of overlap on later windows.
Initial and daily repair scans read from the profile floor. Deletion is a separate
phase with its own continuation; a same-query live-record exclusion prevents an old
delete log overriding a visible recreated record. Every query uses bound parameters
and exact-text IDs. Native admission checks the query against retained progress, and
checkpoints commit with publication only after the window finishes without gaps.
Daily known-record verification uses refresh-only point reads; 403/404 stays
unresolved. A native 403 holds source disclosure until the role is checked and the
binding explicitly reconfigured. Configure the integration user in GMT. The 64-row query bound works with
the existing native fanout and byte limits. No pass claims coverage or a snapshot.
A captured resource selects at most sixteen fields including id.
REST detail projection retains original decimal tokens as text, distinct business
dates/timestamps, optional presence and scalar reference IDs. Metadata retains
reference targets and reviewed monetary currency dependencies; application
relationships are explicit. Read-side 429/503 is transient.
Creation sends POST with the occurrence ID as externalId and confirms only a GET
by that marker returning the same marker and native customer ID. Contact updates
send asynchronous PATCH, retain the same-origin job Location and sole task ID, then
read that task’s /result endpoint. Successful task result responses settle delivery;
job/task status alone does not. A documented 400 IDEMPOTENCY_ERROR with a confined
Location retains the original job as pending. Failed results, ambiguous work and lost
send replies remain unknown. Commands are unconditional and single-attempt, with no
automatic resend. Source observations establish resulting record state.
Binding setup requires baseUrl, accountId and an explicit incarnation. All
captured resources can use the same connection returned by metadata connect. Within a deployment, two
native in-flight slots are shared by account origin, with one available to commands
while acquisition occupies the other. Requests have a 30-second transport bound and
60-second capacity leases. This does not constrain other clients of the account.
Metadata responses assert neither account identity nor the certificate’s mapped role.
The incarnation is an operator attestation, not a fabricated provider assertion.
Sandbox credential replacement requires a new incarnation. Native admission refuses
changing it while old sources remain; explicitly withdraw them before binding the
replacement. These observed profiles cannot support complete-population rebaseline.
Use a private oauth_client_credentials envelope with
protocol: { authentication: "private_key_jwt", body: "form" },
client_assertion: { key_id, private_key, algorithm: "ps256" | "es256", claims: { scope: ["rest_webservices"] } },
the account-specific OAuth token endpoint and exact
allowed_resource_origins. Keys must be PKCS#8 PEM. Native custody signs and exchanges
the assertion and coordinates cached token renewal. Authorization-code refresh
credentials use the existing owner. Role visibility, deletion history, task-result retention and custom validation remain provider contracts; live qualification is separate.
SuiteQL tables
netsuite.table.observed({ table, columns, deletedRecordType? }) reads one
SuiteQL table through POST /services/rest/query/v1/suiteql on the account
named by the binding’s account setup, written as it appears in the REST host
(https://<account>.suitetalk.api.netsuite.com, such as 1234567 or
1234567-sb1). Every request sends Prefer: transient. SuiteQL returns values
as text and omits null columns, so each selected column is string | null.
Each acquisition pass is two keyset walks ordered by (second, internal id):
- With
deletedRecordType, thedeletedrecordrows whoserecordtypeequals it, bydeleteddate, published as explicit deletions ofrecordid. - The table’s rows by
lastmodifieddate.
(TO_CHAR(time), id) it read
and continues while NetSuite states hasMore; no offset is followed. The
rendered modification second (bijection_modified) is the row’s opaque version.
The first pass walks both tables from the floor. Each finished pass carries the
highest (second, id) each walk read (sync.carry), and the next pass walks
from five minutes before each of them, so a row committed late with an earlier
modification second is still read within that lag. Re-read rows deduplicate by
version; two changes inside one second are indistinguishable. A pass that fails
or leaves a gap hands nothing on. No pass claims coverage, and a row missing
from a listing is never a deletion.
Requirements and limits:
TO_CHARrenders in the integration user’s time zone. Give that user a zone without daylight saving (GMT): a repeated autumn hour renders out of order and a walk could step over rows inside it.- The
deletedrecordcolumn names andrecordtypevocabulary are taken from NetSuite’s records catalog and have not been probed against an account. - A 429 (account concurrency exhausted) or 503 is a transient failure. Requests of one acquisition are sequential; concurrency shared with other integrations of the account is not coordinated.
- This table mode declares no write.
netsuite credential whose allowed_resource_origins names the REST
host: an oauth_client_credentials envelope with a client_assertion and private_key_jwt protocol
(OAuth 2.0 machine-to-machine: a PS256 or ES256 key whose certificate is
registered on the integration, its certificate id as kid, and the
rest_webservices scope as a claim), or an oauth_refresh grant from the
authorization-code flow.
Provider references
Provider references and prerequisites are maintained in the connector guidance above. No separate provider-documentation review date is recorded.Source and evidence
Canonical connector source, native analysis and check receipts. Connector artifact:905888ea276a2a28e36981a79e8142b2547ea451c3e63162cb6915ad4a7d1305.
The resource declaration examples above are compiled and compared with exact catalog declarations. Recorded checks apply only to their source, declaration and runtime identities. Configure a connection and inspect its status to establish deployment-specific readiness.