- Scoring submissions are idempotent by default.
- Criteria and library mutations support an optional
Idempotency-Keyheader.
Scoring submissions (default)
ForPOST /v1/jobs/{jobId}/applications/{applicationId}/scoring-jobs, Nova deduplicates requests using:
- Your tenant (from
X-Tenant-Idand your API key) jobIdapplicationId
jobId and applicationId again, Nova returns the existing scoring job.
This behavior exists even if you do not send an Idempotency-Key.
Scoring submission routes do not use the generic HTTP
Idempotency-Key replay layer. If you send the header there, Nova ignores it and uses scoring’s built-in identity rules instead.POST /v1/jobs/{jobId}/scoring-batches ignores Idempotency-Key and deduplicates by the batch’s scoring identity.
Re-scoring
To create a new scoring job for an application, passrescore: { enabled: true }.
Re-scoring is idempotent per criteria version. Submitting rescore.enabled: true multiple times without changing criteria returns the same re-score job.
To pin a specific criteria version:
What creates a new scoring job
| Change | New job? |
|---|---|
jobId changes | Yes |
applicationId changes | Yes |
rescore.enabled set to true | Yes |
rescore.criteriaVersionId changes while rescoring | Yes |
resume changes | No |
applicationData changes | No |
Retry strategy
- Retry network failures and
5xxerrors with exponential backoff. - For
429, wait forRetry-Afterbefore retrying. - For scoring retries, re-submit the same
jobIdandapplicationId. Userescoreonly when you intentionally want a new scoring job.
Idempotency-Key header (criteria and library mutations)
For criteria and library write requests, you can send anIdempotency-Key header to safely retry without duplicating side effects.
Supported methods: POST, PUT, PATCH, DELETE.
How it works
When you sendIdempotency-Key: <key>:
- The first request runs normally.
- A retry with the same key and the same request parameters returns the original response and includes
Idempotent-Replayed: true. - Reusing the same key with different request parameters returns
422 IDEMPOTENCY_KEY_ALREADY_USED. - If another request with the same key is still running, the API returns
409 IDEMPOTENCY_REQUEST_IN_PROGRESS.
Idempotency keys stay valid for 24 hours. After that, you can reuse the same key and Nova treats it as a new request.
Idempotency-Key replay and mismatch behavior does not apply to scoring submissions or scoring batches. Those endpoints already deduplicate by scoring identity.Idempotency keys are scoped to your partner account and environment. All active API keys under the same partner share the same idempotency namespace for that environment. Reusing the same key across different
X-Tenant-Id values is treated as a parameter mismatch and returns 422 IDEMPOTENCY_KEY_ALREADY_USED.Which responses are replayed
- Successful
2xxresponses are replayed with the same key. - Endpoint-generated
4xxresponses are replayed with the same key, including business-rule failures and handler-thrown validation errors. 409 IDEMPOTENCY_REQUEST_IN_PROGRESSand429 RATE_LIMITEDare not cached. Retry the same request with the same key after the condition clears.- Request-shape failures are not cached. That includes missing required headers, invalid
Content-Type, malformed JSON, and schema or path validation errors. After you fix the request, you can retry with the same key.
Rate limiting and retries
Rate limiting (including in-flight concurrency limits) runs before the HTTP idempotency replay layer.This means a retry can return
429 RATE_LIMITED before the API has a chance to replay a cached response. If you get a 429, wait for Retry-After and retry again using the same Idempotency-Key.Example
SDK