What the SDK Sends
The exact fields the SDK transmits, what it never captures, and how to inspect every payload before you enable it.
This page is for engineers and security reviewers who need to know what leaves your servers. It describes SDK version 1.1.
The payload
Each request to POST /ingest carries one JSON object with an environment,
an array of events and a small meta object:
{
"environment": "PRODUCTION",
"events": [
{
"method": "POST",
"path": "/api/orders/:id/refund",
"statusCode": 500,
"responseTime": 412,
"payloadSize": 0,
"ip": "203.0.113.47",
"userAgent": "okhttp/4.12.0",
"timestamp": "2026-10-12T09:14:03.218Z",
"consumer": "acct_4412",
"errorType": "TimeoutError",
"traceId": "4bf92f3577b34da6a3ce929d0e0e4736"
}
],
"meta": {
"release": "2026.10.2",
"service": "orders-api",
"sdk": { "version": "1.1.0", "dropped": 0, "queued": 0, "sendFailures": 0 }
}
}
The example is illustrative. The SDK uses the route template your framework
reports (/api/orders/:id/refund) when it has one, so identifiers in URLs
usually do not appear.
Field reference
| Field | Meaning | Always sent |
| --- | --- | --- |
| method | HTTP method | Yes |
| path | Route template, or the request path without its query string. At most 256 characters | Yes |
| statusCode | Response status. The Node.js SDK reports 499 when the client disconnects before the response finishes | Yes |
| responseTime | Milliseconds from request start to response end | Yes |
| payloadSize | The response Content-Length, or 0 when the response has none | Yes |
| timestamp | When the response finished, as a UTC ISO 8601 string. Nolax shows it in West Africa Time (WAT) by default | Yes |
| ip | Client IP address | Unless captureIp is false |
| userAgent | The User-Agent header, at most 255 characters | Unless captureUserAgent is false |
| consumer | The value your consumer callback returns, at most 64 characters | Only if you set the callback |
| errorType | The class name of an exception the SDK caught, never its message | Only after a caught exception |
| traceId | The 32-character trace id from a valid W3C traceparent header | Only if the request has one |
| meta.release, meta.service | Values you configure, at most 64 characters each | Only if you set them |
| meta.sdk | SDK version and counts of dropped events, queued events and failed sends since the previous batch | Yes |
What the SDK never captures
- Request or response bodies
- Query strings (everything after
?is removed) - Cookies, authorization headers and any other header except those listed below
- Exception messages or stack traces
The SDK reads three request headers: User-Agent, traceparent (only the
trace id is kept) and, if you configure ipHeader, that one header to find the
client address.
Limiting what is sent
| Goal | Option |
| --- | --- |
| Do not send IP addresses | captureIp: false |
| Do not send the User-Agent | captureUserAgent: false |
| Skip health checks and similar routes | ignorePaths |
| Skip methods such as OPTIONS | ignoreMethods |
| Change or remove any field of any event | beforeSend |
beforeSend runs on each event before it is queued. Return the changed event,
or nothing to drop it. If your callback throws, the event is dropped.
Inspect every payload first
Set dryRun and the SDK prints each batch, with the API key masked, and sends
nothing. A reviewer can run the application, make requests and read exactly
what would be transmitted.
Setting the environment variable NOLAX_DRY_RUN=1 does the same without a code change.
Where the data goes
Events go over HTTPS to the endpoint option, which defaults to
https://server.nolax.net/ingest. The SDK does not follow redirects. See
Batching and Retries for delivery behaviour.

