> ## 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.

# Get Scoring Latency

> Time-series of P50, P95, and P99 scoring duration percentiles

Returns percentile breakdowns of end-to-end scoring duration over time. Useful for tracking performance trends and identifying latency spikes.

This endpoint requires only a valid API key. `X-Tenant-Id` isn't required.

## Query parameters

| Parameter   | Required | Values                          | Description                  |
| ----------- | -------- | ------------------------------- | ---------------------------- |
| `timeRange` | Yes      | `1h`, `24h`, `7d`, `30d`, `90d` | Lookback window for the data |

## Example response

```json theme={null}
{
  "period": {
    "start": "2026-03-07T00:00:00.000Z",
    "end": "2026-03-08T00:00:00.000Z"
  },
  "granularity": "hour",
  "data": [
    {
      "timestamp": "2026-03-07T12:00:00.000Z",
      "p50Ms": 800,
      "p95Ms": 2000,
      "p99Ms": 3500
    },
    {
      "timestamp": "2026-03-07T13:00:00.000Z",
      "p50Ms": 750,
      "p95Ms": 1800,
      "p99Ms": 3200
    }
  ]
}
```

## Response fields

| Field              | Type           | Description                                      |
| ------------------ | -------------- | ------------------------------------------------ |
| `period.start`     | string         | ISO 8601 start of the period                     |
| `period.end`       | string         | ISO 8601 end of the period                       |
| `granularity`      | string         | Bucket size for each data point                  |
| `data[].timestamp` | string         | ISO 8601 timestamp for this bucket               |
| `data[].p50Ms`     | number \| null | Median scoring duration in milliseconds          |
| `data[].p95Ms`     | number \| null | 95th percentile scoring duration in milliseconds |
| `data[].p99Ms`     | number \| null | 99th percentile scoring duration in milliseconds |

<Tip>
  P50 reflects the typical scoring experience. P95 and P99 surface tail latency that affects a small fraction of requests but can indicate bottlenecks.
</Tip>

<Note>
  Responses are cached for 60 seconds (`Cache-Control: private, max-age=60`). This endpoint is rate-limited under the `analytics` bucket (20 req/s).
</Note>


## OpenAPI

````yaml GET /v1/analytics/scoring-latency
openapi: 3.1.0
info:
  title: Nova Embed API
  description: >-
    The Nova Embed API enables ATS platforms to generate job-scoped screening
    criteria and score applications asynchronously against those criteria.
  version: 1.0.0
  contact:
    name: Nova Support
    email: nova@dweet.com
servers:
  - url: https://embed.nova.dweet.com
    description: >-
      Environment is determined by API key prefix: sk_test_* for sandbox,
      sk_live_* for production.
security:
  - bearerAuth: []
tags:
  - name: Analytics
    description: View scoring performance, webhook health, and error breakdowns.
  - name: Criteria
    description: Generate and manage job-scoped screening criteria.
  - name: Scoring
    description: Submit applications for scoring and fetch scoring job results.
  - name: Deletion
    description: Request application or tenant deletion and poll for completion.
  - name: Criteria Library
    description: Manage tenant-scoped reusable criteria templates.
  - name: Rate Limits
    description: Check your current rate limit status.
  - name: Webhooks
    description: >-
      Events sent to your registered webhook endpoints. Verify signatures with
      HMAC-SHA256 using your webhook secret.
paths:
  /v1/analytics/scoring-latency:
    get:
      tags:
        - Analytics
      summary: Get scoring latency percentiles
      description: >-
        Returns time-series P50/P95/P99 scoring duration percentiles. Does not
        require X-Tenant-Id.
      operationId: getAnalyticsScoringLatency
      parameters:
        - name: timeRange
          in: query
          required: true
          schema:
            $ref: '#/components/schemas/TimeRange'
          description: Time range for the analytics query
      responses:
        '200':
          description: Scoring latency percentiles
          headers:
            X-RateLimit-Bucket:
              $ref: '#/components/headers/X-RateLimit-Bucket'
            X-RateLimit-Limit:
              $ref: '#/components/headers/X-RateLimit-Limit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/X-RateLimit-Remaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/X-RateLimit-Reset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AnalyticsScoringLatencyResponse'
        '400':
          $ref: '#/components/responses/ErrorResponse'
        '401':
          $ref: '#/components/responses/ErrorResponse'
        '429':
          $ref: '#/components/responses/RateLimitedResponse'
        '500':
          $ref: '#/components/responses/ErrorResponse'
      x-codeSamples:
        - lang: typescript
          label: '@nova-sdk/api'
          source: >-
            import { Nova } from "@nova-sdk/api";


            const nova = new Nova({
              apiKey: "sk_test_...",
              tenantId: "acme-corp",
            });


            const latency = await nova.analytics.scoringLatency({ timeRange:
            "24h" });
        - lang: bash
          label: cURL
          source: >-
            curl -X GET
            "https://embed.nova.dweet.com/v1/analytics/scoring-latency?timeRange=24h"
            \
              -H "Authorization: Bearer sk_test_..."
components:
  schemas:
    TimeRange:
      type: string
      enum:
        - 1h
        - 24h
        - 7d
        - 30d
        - 90d
      description: Time range for analytics queries.
    AnalyticsScoringLatencyResponse:
      type: object
      required:
        - period
        - granularity
        - data
      properties:
        period:
          $ref: '#/components/schemas/AnalyticsPeriod'
        granularity:
          type: string
          enum:
            - minute
            - hour
            - day
          description: Time bucket granularity
        data:
          type: array
          items:
            $ref: '#/components/schemas/ScoringLatencyDataPoint'
    AnalyticsPeriod:
      type: object
      required:
        - start
        - end
      properties:
        start:
          type: string
          format: date-time
          description: Period start (ISO 8601)
        end:
          type: string
          format: date-time
          description: Period end (ISO 8601)
    ScoringLatencyDataPoint:
      type: object
      required:
        - timestamp
        - p50Ms
        - p95Ms
        - p99Ms
      properties:
        timestamp:
          type: string
          format: date-time
          description: Bucket timestamp (ISO 8601)
        p50Ms:
          type:
            - number
            - 'null'
          description: 50th percentile scoring duration in ms
        p95Ms:
          type:
            - number
            - 'null'
          description: 95th percentile scoring duration in ms
        p99Ms:
          type:
            - number
            - 'null'
          description: 99th percentile scoring duration in ms
    HttpError:
      type: object
      required:
        - type
        - code
        - status
        - message
        - retryable
        - traceId
      properties:
        type:
          type: string
          description: URI reference that identifies the error type
        code:
          $ref: '#/components/schemas/ErrorCode'
        status:
          type: integer
          description: HTTP status code
        message:
          type: string
          description: Error message
        retryable:
          type: boolean
          description: When true, retrying the request may succeed
        traceId:
          type: string
          description: Trace ID for debugging
        details:
          type:
            - array
            - 'null'
          description: Field-level validation details
          items:
            type: object
            required:
              - field
              - code
              - message
            properties:
              field:
                type: string
              code:
                type: string
              message:
                type: string
    ErrorCode:
      type: string
      description: >-
        Machine-readable error code. Generated from the canonical error
        registry.
      enum:
        - UNAUTHORIZED
        - FORBIDDEN
        - VALIDATION_ERROR
        - ANSWER_MISMATCH
        - CRITERIA_INVALID
        - CRITERIA_REVISION_CONFLICT
        - NOT_FOUND
        - TENANT_NOT_FOUND
        - JOB_NOT_FOUND
        - APPLICATION_NOT_FOUND
        - QUESTION_SET_NOT_FOUND
        - CRITERIA_NOT_FOUND
        - CRITERION_NOT_FOUND
        - CRITERIA_VERSION_NOT_FOUND
        - SCORING_JOB_NOT_FOUND
        - BATCH_NOT_FOUND
        - LIBRARY_CRITERION_NOT_FOUND
        - RATE_LIMITED
        - MONTHLY_TRIAL_QUOTA_EXCEEDED
        - IDEMPOTENCY_KEY_ALREADY_USED
        - IDEMPOTENCY_REQUEST_IN_PROGRESS
        - RESUME_FETCH_FAILED
        - RESUME_CONVERSION_FAILED
        - RESUME_ENCRYPTED
        - RESUME_CORRUPTED
        - RESUME_PARSE_FAILED
        - RESUME_TOO_LARGE
        - RESUME_EMPTY
        - RESUME_URL_BLOCKED
        - AI_PROCESSING_FAILED
        - AI_GENERATION_FAILED
        - AI_SCORING_FAILED
        - MISSING_JOB_DESCRIPTION
        - TIMEOUT
        - MAX_RETRIES_EXCEEDED
        - TASK_STUCK
        - DELETION_REQUEST_NOT_FOUND
        - DELETION_REQUEST_FAILED
        - INTERNAL_ERROR
        - SERVICE_UNAVAILABLE
        - UNKNOWN
  headers:
    X-RateLimit-Bucket:
      description: Which rate limit bucket the request was classified into
      schema:
        type: string
        enum:
          - criteria_ai
          - criteria_current_reads
          - scoring_intake_batch
          - scoring_intake_single
          - read_and_ops
          - rate_limit_status
          - analytics
    X-RateLimit-Limit:
      description: Maximum requests per second for this bucket
      schema:
        type: integer
    X-RateLimit-Remaining:
      description: Requests remaining in the current 1-second window
      schema:
        type: integer
    X-RateLimit-Reset:
      description: Unix timestamp when the current window resets
      schema:
        type: integer
    Retry-After:
      description: >-
        Seconds to wait before retrying a short-window RATE_LIMITED or
        service-unavailable response whose body has retryable: true.
      schema:
        type: integer
    X-RateLimit-Degraded:
      description: >-
        Present and set to "true" when rate limiting is operating in degraded
        mode (Redis unavailable). Values in other rate limit headers are
        best-effort estimates.
      schema:
        type: string
        enum:
          - 'true'
  responses:
    ErrorResponse:
      description: Error response
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/HttpError'
    RateLimitedResponse:
      description: >-
        Too many requests. Short-window RATE_LIMITED responses include retry
        timing and rate limit headers. Monthly trial quota responses use
        MONTHLY_TRIAL_QUOTA_EXCEEDED with retryable: false.
      headers:
        Retry-After:
          $ref: '#/components/headers/Retry-After'
        X-RateLimit-Bucket:
          $ref: '#/components/headers/X-RateLimit-Bucket'
        X-RateLimit-Limit:
          $ref: '#/components/headers/X-RateLimit-Limit'
        X-RateLimit-Remaining:
          $ref: '#/components/headers/X-RateLimit-Remaining'
        X-RateLimit-Reset:
          $ref: '#/components/headers/X-RateLimit-Reset'
        X-RateLimit-Degraded:
          $ref: '#/components/headers/X-RateLimit-Degraded'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/HttpError'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: API key
      description: 'Use Authorization: Bearer sk_test_* or Authorization: Bearer sk_live_*.'

````