Skip to main content
POST
/
v1
/
jobs
/
{jobId}
/
applications
/
{applicationId}
/
scoring-jobs
Submit scoring job
curl --request POST \
  --url https://embed.nova.dweet.com/v1/jobs/{jobId}/applications/{applicationId}/scoring-jobs \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --header 'X-Tenant-Id: <x-tenant-id>' \
  --data '
{
  "resumeUrl": "<string>"
}
'
{
  "scoringJob": {
    "id": "<string>",
    "jobId": "<string>",
    "applicationId": "<string>",
    "status": "PENDING",
    "isRescore": true,
    "score": 123,
    "assessment": {
      "verdict": "<string>",
      "strengths": [
        "<string>"
      ],
      "concerns": [
        "<string>"
      ],
      "interviewFocus": [
        "<string>"
      ]
    },
    "errorCode": "UNAUTHORIZED",
    "errorMessage": "<string>",
    "queuedAt": "2023-11-07T05:31:56Z",
    "startedAt": "2023-11-07T05:31:56Z",
    "completedAt": "2023-11-07T05:31:56Z",
    "failedAt": "2023-11-07T05:31:56Z"
  }
}
Submit an application for scoring. This is an asynchronous operation. Nova loads the job’s active criteria automatically.

Request

{
  "resumeUrl": "https://storage.example.com/resumes/abc123.pdf",
  "jobDescription": "We are looking for a Senior Backend Engineer with 5+ years of experience in Node.js and TypeScript...",
  "candidateData": {
    "applicationAnswers": [
      { "question": "Are you eligible to work in the UK?", "answer": "Yes" }
    ]
  },
  "rescore": false
}
This endpoint is scoped by:
  • jobId (path)
  • applicationId (path)
FieldRequiredDescription
resumeUrlYesA public HTTPS URL to the resume file
jobDescriptionYesThe job posting description. Provides context for AI scoring alongside criteria
candidateDataNoOptional application context
rescoreNoWhen true, create a new scoring job for this application
criteriaVersionIdNoOnly supported when rescore: true. When set, re-score against a specific criteria version
See Supported Formats for supported resume formats and URL requirements.
The job description should match what was used for criteria generation. It is stored per-request and automatically cleaned up after 90 days. See Data Retention.

Response

The API returns 202 Accepted with a scoring job.
{
  "scoringJob": {
    "id": "scoring_job_id",
    "jobId": "job-123",
    "applicationId": "app-456",
    "status": "PENDING",
    "isRescore": false,
    "score": null,
    "assessment": null,
    "errorCode": null,
    "errorMessage": null,
    "queuedAt": "2025-12-14T10:30:45Z",
    "startedAt": null,
    "completedAt": null,
    "failedAt": null
  }
}

Status values

StatusDescription
PENDINGWaiting to be processed
PROCESSINGBeing scored
COMPLETEDFinished successfully
FAILEDFinished with an error

Result delivery

Results are delivered via webhook. Use polling as a fallback.

Idempotency

Requests are idempotent by default. Re-submitting the same jobId and applicationId returns the existing job. See Idempotency for details on rescore and criteriaVersionId.

Batch scoring

To score multiple applications at once, use POST /v1/jobs/{jobId}/scoring-batches.

Authorizations

Authorization
string
header
required

Use Authorization: Bearer sk_test_* or Authorization: Bearer sk_live_*.

Headers

X-Tenant-Id
string
required

Your customer identifier. Tenants are auto-provisioned on first request.

Path Parameters

jobId
string
required

Your job identifier (external ID).

applicationId
string
required

Your application identifier (external ID).

Body

application/json
resumeUrl
string<uri>
required
candidateData
object
rescore
boolean
default:false
criteriaVersionId
string

Response

Accepted

scoringJob
object
required