Skip to content

Changelog

Versions of the API and the SDKs, newest first. The API version is the version of the published contract, which the interactive reference renders; an assessment states the version of its body shape in schema_version.

Version What it is
1 The current contract. Five routes: POST /v1/assessments, GET /v1/assessments/{assessment_id}, POST /v1/assessments/{assessment_id}/outcomes, POST /v1/assessments/query and POST /v1/keys/rotate. Two webhook events: assessment.updated and endpoint.verification. Assessments, assessment pages and webhook payloads carry schema_version: "1".

The reason code list, the enums and the field limits are part of the contract and change only with a new version of it. The policy that weighs the reasons is versioned separately in policy_version and can change between contract versions; branch on codes, not weights.

Every SDK is generated from the API contract, so a contract change reaches all of them in the same release. All are at 2.x.

Language Package Install
Node @noresponse/node npm install @noresponse/node
Python noresponse pip install noresponse, source at github.com/noresponsehq/python
Go github.com/noresponsehq/go/v2 go get github.com/noresponsehq/go/v2, source at github.com/noresponsehq/go
Java com.github.noresponsehq:java Gradle or Maven through JitPack, see Java
C# NoResponse From github.com/noresponsehq/dotnet, see C#
PHP noresponse/noresponse-php Composer with a VCS repository, see PHP
Ruby noresponse From github.com/noresponsehq/ruby, see Ruby

The SDKs share one shape. This release breaks every 1.x integration; the changes are the same in each language.

  • Methods moved onto resources. assess became assessments.create, getAssessment became assessments.get, queryAssessments became assessments.query and recordOutcome became assessments.recordOutcome, in each language’s casing. Node, Python and Go also have a wait helper for a pending assessment.
  • Requests nest their fields as the API does: identifiers holds the email, username, phone, name and IP, and policy_context holds the flow and region.
  • The client has defaults. The base URL is https://api.noresponse.org and the key is read from NORESPONSE_API_KEY when you do not pass one; NORESPONSE_BASE_URL overrides the host. The per-request timeout default rose from 5 to 10 seconds.
  • The idempotency key is generated when you omit it and is reused across retries of that call.
  • One error hierarchy with a class per status (BadRequestError, AuthenticationError, PermissionDeniedError, NotFoundError, ConflictError, RateLimitError) and a general class for every other status. Every error carries the problem title, detail, code, request id and, on a 400, the invalid parameters.
  • Retries cover connection errors, timeouts and 408, 429 and 5xx answers, with backoff from 500 milliseconds to 8 seconds for at most 30 seconds in all. Retry-After is honoured.
  • assessments.query returns a page with items, a next-page cursor and a way to iterate every item across pages.
  • keys.rotate added for POST /v1/keys/rotate.
  • Response headers are exposed beside the returned model: the request id, Retry-After, Location and whether an idempotent request was replayed.
  • Webhook helpers verify the raw body and return a typed event. The expiry event is a distinct type rather than an error, and endpoint.verification has a response helper.
  • Auth adapters turn verified WorkOS, Clerk, Auth0, Supabase, Firebase or generic OIDC claims into auth_context.
  • Python: the import name is now noresponse, matching the package name. Async code uses the same client with _async methods.
  • Go: the module is public at github.com/noresponsehq/go/v2 and every call takes a context.Context first.
  • Node: the package ships ESM and CommonJS builds and runs on Node 20 or later.

The last release with the flat method surface, a single error class and a required base URL. Node and Python only.