Skip to main content
POST
Ingest typed JSON into a source

Before you begin

You need the customer-facing source ID and a tenant-level Application bearer token with the write:sources scope. The Application must be granted access to the target source or to all sources. See Application access tokens to request a token for the tenant audience.
A token created by the legacy data-provider credential exchange has the import-datasource permission. This endpoint requires write:sources, so use a tenant-level Application token.

Typed ingest behavior

Each entry is an upsert unless it sets delete: true. A deleted entry must omit properties or send an empty array; a delete that also sends properties is rejected with 400. Upserts and deletes can be mixed in one request, but each entry id may appear only once. Values keep their native JSON types at the API boundary and are serialized before they enter the asynchronous ingest pipeline. Localized properties require language. Non-localized properties reject it. A null value clears a configured property by storing an empty value.
A timestamp string is treated as a timestamp only when the source property is already configured as Timestamp. An unconfigured string is inferred as Text or LocalizedText.

Type inference for new properties

When a property has no configured type, Occtoo infers it from all values for that property in the request. Strings become Text or LocalizedText; string arrays become List or LocalizedList; booleans become Boolean; whole numbers become Integer; and fractional numbers become Decimal. Integer and decimal values in one request are promoted to Decimal. Other incompatible shapes reject the complete request. Occtoo cannot infer a property from only null values. New list properties use , as their delimiter. Existing list properties keep their configured delimiter, and list elements cannot contain it. Property IDs are matched case-insensitively and stored in lowercase. newPropertiesFound reports inferred properties, but the ingestion worker registers them asynchronously, so they may not appear in Configuration immediately.

Processing and errors

Validation is all-or-nothing. A 400 response returns validation messages keyed by request path. A 202 response means the complete batch passed validation and was queued; downstream entry processing and property registration may still be running. Keep correlationId for diagnostics, and do not retry a successful request because data is not visible immediately. Retry 429 and transient 5xx responses with bounded exponential backoff, respecting Retry-After when present.

Authorizations

Authorization
string
header
required

Sign in with the existing Occtoo Studio identity and selected organization.

Path Parameters

sourceId
string
required

Stable customer-facing source id within the authenticated tenant.

Minimum string length: 1
Example:

"products"

Body

application/json
entries
object[]
required

Non-empty collection of source entries.

Minimum array length: 1

Response

The typed entries were validated, serialized, and queued for asynchronous processing.

correlationId
string<uuid>
required

Correlation id assigned to this asynchronous ingest batch. This is distinct from the HTTP trace id.

Example:

"83b538a7-df7c-4cf4-b988-cd3b71c4cd90"

sourceId
string
required

Customer-facing id of the source that accepted the entries.

Example:

"products"

acceptedAt
string<date-time>
required

UTC time at which the ingest batch was accepted and queued.

Example:

"2026-08-13T10:15:30Z"

acceptedEntryCount
integer<int32>
required

Number of entries accepted in this all-or-nothing request.

Required range: x >= 1
Example:

1

newPropertiesFound
object[]
required

Properties absent from the loaded source configuration and inferred by this request. The ingestion worker registers them asynchronously; they may not be visible in Configuration immediately. Empty when no new properties were found.