> ## Documentation Index
> Fetch the complete documentation index at: https://nova.dweet.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Quick Start

> Generate criteria and score an application

<Tip>
  Using TypeScript? The [`@nova-sdk/api` package](/embed-api/sdks/typescript) handles auth, retries, and types for you. Install it with `npm install @nova-sdk/api`.
</Tip>

## Prerequisites

<Check>API key from the Embed Portal (`sk_test_*` for sandbox)</Check>
<Check>A stable tenant external ID for your customer</Check>

## Step 1: Generate clarification questions (optional)

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST 'https://embed.nova.dweet.com/v1/jobs/job-123/question-sets' \
    -H 'Authorization: Bearer sk_test_your_key' \
    -H 'X-Tenant-Id: acme-corp' \
    -H 'Content-Type: application/json' \
    -d '{
      "jobContext": {
        "jobTitle": "Senior Software Engineer",
        "companyName": "Acme Corp",
        "jobDescription": "We are looking for a Senior Software Engineer with 5+ years experience..."
      }
    }'
  ```

  ```typescript TypeScript theme={null}
  import { Nova } from '@nova-sdk/api';

  const nova = new Nova({
    apiKey: 'sk_test_your_key',
    tenantId: 'acme-corp',
  });

  const { questionSet } = await nova.jobs.questionSets.create({
    jobId: 'job-123',
    body: {
      jobContext: {
        jobTitle: 'Senior Software Engineer',
        companyName: 'Acme Corp',
        jobDescription: 'We are looking for a Senior Software Engineer with 5+ years experience...',
      },
    },
  });
  ```
</CodeGroup>

```json Response theme={null}
{
  "questionSet": {
    "id": "cmlz26ck2000awp61q9qcjcne",
    "jobId": "job-123",
    "questions": [
      {
        "id": "q1",
        "selectionType": "single",
        "question": "What level of seniority are you targeting?",
        "options": ["Junior", "Mid", "Senior"],
        "hint": null
      }
    ],
    "guidance": "Answer these questions to calibrate criteria generation.",
    "expiresAt": "2026-12-14T11:30:45Z"
  }
}
```

Store `questionSet.id` for the next step.

## Step 2: Generate criteria

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST 'https://embed.nova.dweet.com/v1/jobs/job-123/criteria/generate' \
    -H 'Authorization: Bearer sk_test_your_key' \
    -H 'X-Tenant-Id: acme-corp' \
    -H 'Content-Type: application/json' \
    -d '{
      "jobContext": {
        "jobTitle": "Senior Software Engineer",
        "companyName": "Acme Corp",
        "jobDescription": "We are looking for a Senior Software Engineer with 5+ years experience..."
      },
      "questionSetId": "cmlz26ck2000awp61q9qcjcne",
      "answers": [
        { "id": "q1", "value": "Senior" }
      ]
    }'
  ```

  ```typescript TypeScript theme={null}
  const generation = await nova.jobs.criteria.generate.create({
    jobId: 'job-123',
    body: {
      jobContext: {
        jobTitle: 'Senior Software Engineer',
        companyName: 'Acme Corp',
        jobDescription: 'We are looking for a Senior Software Engineer with 5+ years experience...',
      },
      questionSetId: 'cmlz26ck2000awp61q9qcjcne',
      answers: [
        { id: 'q1', value: 'Senior' },
      ],
    },
  });
  ```
</CodeGroup>

## Step 3: Submit a score request

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST 'https://embed.nova.dweet.com/v1/jobs/job-123/applications/app-456/scoring-jobs' \
    -H 'Authorization: Bearer sk_test_your_key' \
    -H 'X-Tenant-Id: acme-corp' \
    -H 'Content-Type: application/json' \
    -d '{
      "resume": { "type": "url", "url": "https://storage.example.com/resumes/abc123.pdf" },
      "jobDescription": "We are looking for a Senior Software Engineer with 5+ years experience..."
    }'
  ```

  ```typescript TypeScript theme={null}
  const { scoringJob } = await nova.jobs.applications.scoringJobs.submit({
    jobId: 'job-123',
    applicationId: 'app-456',
    body: {
      resume: { type: 'url', url: 'https://storage.example.com/resumes/abc123.pdf' },
      jobDescription: 'We are looking for a Senior Software Engineer with 5+ years experience...',
    },
  });

  console.log(scoringJob.id);     // 'scoring_job_id'
  console.log(scoringJob.status); // 'pending'
  ```
</CodeGroup>

```json Response theme={null}
{
  "scoringJob": {
    "id": "scoring_job_id",
    "status": "pending"
  }
}
```

## Step 4: Receive results

Use [webhooks](/embed-api/concepts/webhooks) for real-time delivery, or poll via [`GET /v1/jobs/{jobId}/applications/{applicationId}/scoring-jobs/{scoringJobId}`](/embed-api/endpoints/results-by-scoring-job) as a fallback.

<CodeGroup>
  ```bash cURL theme={null}
  curl 'https://embed.nova.dweet.com/v1/jobs/job-123/applications/app-456/scoring-jobs/scoring_job_id' \
    -H 'Authorization: Bearer sk_test_your_key' \
    -H 'X-Tenant-Id: acme-corp'
  ```

  ```typescript TypeScript theme={null}
  const result = await nova.jobs.applications.scoringJobs.get({
    jobId: 'job-123',
    applicationId: 'app-456',
    scoringJobId: 'scoring_job_id',
  });

  // Or get the latest score for an application directly
  const latest = await nova.jobs.applications.getLatestScore({
    jobId: 'job-123',
    applicationId: 'app-456',
  });
  ```
</CodeGroup>
