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

# Read immutable configuration versions

> Read immutable configuration versions in one environment. Requires `settings` or `management`, within the key's own workspace and environment.



## OpenAPI

````yaml /openapi.json get /v1/workspaces/{workspace_id}/settings/{environment}/history
openapi: 3.1.0
info:
  title: NoResponse API
  version: '1'
  description: >-
    The NoResponse API assesses an account creation, login or purchase and
    answers with the account's one current risk: a 0 to 100 score, a decision
    for the flow (`allow`, `step_up`, `review` or `block`), the reasons behind
    it and the decision for each flow. The assessment's own facts, such as its
    status, confidence and incomplete sources, sit under `detail`.


    Authenticate every request with your API key as `Authorization: Bearer
    nrk_...`. Call the API only from your backend.


    Guides, SDKs and webhook verification are at
    [docs.noresponse.org](https://docs.noresponse.org/). Every error is an RFC
    9457 problem document; see
    [Errors](https://docs.noresponse.org/reference/errors).
servers:
  - url: https://api.noresponse.org
    description: Production
security:
  - tenantBearer: []
tags:
  - name: assess
    x-displayName: Assessments
    x-group: Assessments
    description: Create, read and list assessments, and report outcomes.
  - name: accounts
    x-displayName: Accounts
    x-group: Accounts
    description: >-
      Each of your accounts holds one current risk, and its assessments are its
      history.
  - name: usage
    x-displayName: Key usage
    x-group: Key usage
    description: >-
      Report usage of the API keys that your account creation gate issued, so a
      shared or stolen key raises its account's risk.
  - name: keys
    x-displayName: API keys
    x-group: API keys
    description: >-
      Rotate your own API key and, with the `management` scope, create, list and
      revoke the keys of its environment.
  - name: settings
    x-displayName: Settings
    x-group: Settings
    description: >-
      Read and preview environment settings, run evaluations, and publish
      reviewed policy with separate permissions.
  - name: lists
    x-displayName: Lists
    x-group: Lists
    description: >-
      Preview, allow or block accounts that use an email or email domain.
      Publishing changes requires policy authority.
  - name: integrations
    x-displayName: Integrations
    x-group: Integrations
    description: >-
      Hosted endpoints that answer your WorkOS, Auth0 or Supabase sign-up and
      sign-in hooks.
  - name: webhooks
    x-displayName: Webhooks
    x-group: Webhooks
    description: Your webhook endpoints, and the signed events NoResponse sends to them.
  - name: workspaces
    x-displayName: Workspaces
    x-group: Workspaces
    description: >-
      Manage non-owner team access, read usage and audit events, configure audit
      streams, and export retained account or audit data.
  - name: requests
    x-displayName: Request diagnostics
    x-group: Request diagnostics
    description: Search retained request attempts and summarize their status and latency.
  - name: groups
    x-displayName: Groups
    x-group: Groups
    description: >-
      Screen a group's people: create the group, upload its list of people,
      start screenings and record a decision on each person.
  - name: reviews
    x-displayName: Reviews
    x-group: Reviews
    description: >-
      Investigate accounts with assignments, comments, linked evidence, saved
      filters and recorded resolutions.
paths:
  /v1/workspaces/{workspace_id}/settings/{environment}/history:
    get:
      tags:
        - settings
      summary: Read immutable configuration versions
      description: >-
        Read immutable configuration versions in one environment. Requires
        `settings` or `management`, within the key's own workspace and
        environment.
      operationId: listPolicyHistory
      parameters:
        - $ref: '#/components/parameters/WorkspaceId'
        - $ref: '#/components/parameters/Environment'
        - name: before_version
          in: query
          schema:
            type: integer
            minimum: 0
            maximum: 2147483647
        - name: limit
          in: query
          schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 50
      responses:
        '200':
          $ref: '#/components/responses/ListPolicyHistoryResponse200'
        '400':
          $ref: '#/components/responses/InvalidControlRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/ControlForbidden'
        '404':
          $ref: '#/components/responses/WorkspaceNotFound'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
      security:
        - tenantBearer: []
      x-codeSamples:
        - lang: curl
          label: cURL
          source: |
            curl --request GET \
              --url 'https://api.noresponse.org/v1/workspaces/tnt_01JA2Z8K6Q4V7W9XBCDEFGHJKM/settings/test/history?limit=50' \
              --header "Authorization: Bearer $NORESPONSE_API_KEY"
        - lang: typescript
          label: TypeScript
          source: |
            import { NoResponse } from "@noresponse/node";

            const noResponse = new NoResponse({
              apiKey: process.env["NORESPONSE_API_KEY"] ?? "",
            });

            async function run() {
              const result = await noResponse.settings.listHistory({
                workspaceId: "tnt_01JA2Z8K6Q4V7W9XBCDEFGHJKM",
                environment: "test",
              });

              console.log(result);
            }

            run();
        - lang: python
          label: Python
          source: |
            from noresponse import NoResponse
            import os


            with NoResponse(
                api_key=os.getenv("NORESPONSE_API_KEY", ""),
            ) as no_response:

                res = no_response.settings.list_history(workspace_id="tnt_01JA2Z8K6Q4V7W9XBCDEFGHJKM", environment="test", limit=50)

                # Handle response
                print(res)
        - lang: go
          label: Go
          source: "package main\n\nimport(\n\t\"context\"\n\t\"os\"\n\tnoresponse \"github.com/noresponsehq/go/v12\"\n\t\"github.com/noresponsehq/go/v12/models/components\"\n\t\"log\"\n)\n\nfunc main() {\n    ctx := context.Background()\n\n    s := noresponse.New(\n        noresponse.WithSecurity(os.Getenv(\"NORESPONSE_API_KEY\")),\n    )\n\n    res, err := s.Settings.ListHistory(ctx, \"tnt_01JA2Z8K6Q4V7W9XBCDEFGHJKM\", components.KeyEnvironmentTest, nil, noresponse.Pointer[int64](50))\n    if err != nil {\n        log.Fatal(err)\n    }\n    if res != nil {\n        // handle response\n    }\n}\n"
        - lang: java
          label: Java
          source: |
            package hello.world;

            import java.lang.Exception;
            import org.noresponse.NoResponse;
            import org.noresponse.models.errors.AuthenticationException;
            import org.noresponse.models.errors.BadRequestException;
            import org.noresponse.models.errors.ConflictException;
            import org.noresponse.models.errors.NotFoundException;
            import org.noresponse.models.errors.PermissionDeniedException;
            import org.noresponse.models.errors.RateLimitException;
            import org.noresponse.models.operations.ListPolicyHistoryResponse;
            import org.noresponse.models.shared.KeyEnvironment;

            public class Application {

                public static void main(String[] args) throws Exception {

                    NoResponse sdk = NoResponse.builder()
                            .apiKey(System.getenv().getOrDefault("NORESPONSE_API_KEY", ""))
                        .build();

                    ListPolicyHistoryResponse res = sdk.settings().listHistory()
                            .workspaceId("tnt_01JA2Z8K6Q4V7W9XBCDEFGHJKM")
                            .environment(KeyEnvironment.TEST)
                            .limit(50L)
                            .call();

                    if (res.policyHistory().isPresent()) {
                        System.out.println(res.policyHistory().get());
                    }
                }
            }
        - lang: csharp
          label: C#
          source: >
            using NoResponse;

            using NoResponse.Models.Shared;

            using System;


            var sdk = new NoResponseClient(apiKey:
            Environment.GetEnvironmentVariable("NORESPONSE_API_KEY"));


            var res = await sdk.Settings.ListHistoryAsync(
                workspaceId: "tnt_01JA2Z8K6Q4V7W9XBCDEFGHJKM",
                environment: KeyEnvironment.Test,
                limit: 50
            );


            // handle response
        - lang: php
          label: PHP
          source: |
            <?php

            declare(strict_types=1);

            require 'vendor/autoload.php';

            use NoResponse;
            use NoResponse\Models\Shared;

            $sdk = NoResponse\NoResponseClient::builder()
                ->setSecurity(
                    getenv('NORESPONSE_API_KEY') ?: ''
                )
                ->build();



            $response = $sdk->settings->listHistory(
                workspaceId: 'tnt_01JA2Z8K6Q4V7W9XBCDEFGHJKM',
                environment: Shared\KeyEnvironment::Test,
                limit: 50

            );

            $result = $response->result;
            // handle response
        - lang: ruby
          label: Ruby
          source: >
            require 'noresponse'


            Models = ::NoResponse::Models

            s = ::NoResponse::NoResponseClient.new(
              api_key: ENV.fetch('NORESPONSE_API_KEY', '')
            )

            res = s.settings.list_history(workspace_id:
            'tnt_01JA2Z8K6Q4V7W9XBCDEFGHJKM', environment:
            Models::Shared::KeyEnvironment::TEST, limit: 50)


            unless res.nil?
              # handle response
            end
components:
  parameters:
    WorkspaceId:
      name: workspace_id
      in: path
      required: true
      schema:
        type: string
        pattern: ^[A-Za-z0-9][A-Za-z0-9_.-]{0,122}$
        description: >-
          The workspace id, which is also its live environment's workspace id;
          the test environment's is the same id with:test appended. A workspace
          created through the API is tnt_ and a 26-character ULID.
      description: >-
        The workspace id. A workspace the acting user is not an active member of
        answers 404, as do another workspace than an API key's own, a malformed
        id and a test environment's id.
    Environment:
      name: environment
      in: path
      required: true
      schema:
        enum:
          - live
          - test
        description: >-
          The environment the key belongs to. A live key assesses with live
          sources; a test key answers from the deterministic simulator.
      description: >-
        The environment: live or test. Each has its own settings. Any other
        value answers 400. An API key reads and changes only its own
        environment's; the other answers 404.
  responses:
    ListPolicyHistoryResponse200:
      description: Read immutable configuration versions.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/PolicyHistory'
      headers:
        Cache-Control:
          schema:
            type: string
            const: no-store
          required: true
        X-Request-ID:
          description: The request correlation id, 32 lowercase hexadecimal characters.
          schema:
            type: string
            pattern: ^[0-9a-f]{32}$
            not:
              pattern: \n
          required: true
    InvalidControlRequest:
      description: >-
        The body breaks its schema, or a console credential named no valid
        NR-Acting-User.
      headers:
        Cache-Control:
          schema:
            type: string
            const: no-store
          required: true
        X-Request-ID:
          description: The request correlation id, 32 lowercase hexadecimal characters.
          schema:
            type: string
            pattern: ^[0-9a-f]{32}$
            not:
              pattern: \n
          required: true
      content:
        application/problem+json:
          schema:
            allOf:
              - $ref: '#/components/schemas/Problem'
              - properties:
                  status:
                    const: 400
                  code:
                    enum:
                      - invalid_request
    Unauthorized:
      description: No API key, or one that is malformed, unknown, revoked or expired.
      headers:
        Cache-Control:
          schema:
            type: string
            const: no-store
          required: true
        WWW-Authenticate:
          schema:
            type: string
            const: Bearer realm="noresponse-assessments"
          required: true
        X-Request-ID:
          description: The request correlation id, 32 lowercase hexadecimal characters.
          schema:
            type: string
            pattern: ^[0-9a-f]{32}$
            not:
              pattern: \n
          required: true
      content:
        application/problem+json:
          schema:
            allOf:
              - $ref: '#/components/schemas/Problem'
              - properties:
                  status:
                    const: 401
                  code:
                    enum:
                      - unauthorized
    ControlForbidden:
      description: >-
        workspace_forbidden: an API key without the management scope, or any API
        key on a route other than the key, settings and list routes.
        role_forbidden: a console credential's acting user is an active member
        whose role does not grant the operation.
      headers:
        Cache-Control:
          schema:
            type: string
            const: no-store
          required: true
        X-Request-ID:
          description: The request correlation id, 32 lowercase hexadecimal characters.
          schema:
            type: string
            pattern: ^[0-9a-f]{32}$
            not:
              pattern: \n
          required: true
      content:
        application/problem+json:
          schema:
            allOf:
              - $ref: '#/components/schemas/Problem'
              - properties:
                  status:
                    const: 403
                  code:
                    enum:
                      - workspace_forbidden
                      - role_forbidden
    WorkspaceNotFound:
      description: >-
        No such workspace, member, invite, key or environment for the caller. A
        workspace the acting user is not an active member of answers this too,
        as do another workspace and the other environment to an API key, so no
        answer shows which workspaces exist.
      headers:
        Cache-Control:
          schema:
            type: string
            const: no-store
          required: true
        X-Request-ID:
          description: The request correlation id, 32 lowercase hexadecimal characters.
          schema:
            type: string
            pattern: ^[0-9a-f]{32}$
            not:
              pattern: \n
          required: true
      content:
        application/problem+json:
          schema:
            allOf:
              - $ref: '#/components/schemas/Problem'
              - properties:
                  status:
                    const: 404
                  code:
                    enum:
                      - not_found
    ServiceUnavailable:
      description: >-
        The assessment could not be admitted at all (overload, shutdown or a
        dependency down). An assessment that was admitted answers partial or
        pending instead of 503.
      headers:
        Cache-Control:
          schema:
            type: string
            const: no-store
          required: true
        Retry-After:
          description: >-
            Whole seconds to wait before polling or retrying. Required on 202,
            429 and 503.
          schema:
            type: string
            pattern: >-
              ^(?:[1-9]|[1-9][0-9]|[1-9][0-9]{2}|[12][0-9]{3}|3[0-5][0-9]{2}|3600)$
            description: Whole decimal seconds; wait at least this long.
          required: true
        X-Request-ID:
          description: The request correlation id, 32 lowercase hexadecimal characters.
          schema:
            type: string
            pattern: ^[0-9a-f]{32}$
            not:
              pattern: \n
          required: true
      content:
        application/problem+json:
          schema:
            allOf:
              - $ref: '#/components/schemas/Problem'
              - properties:
                  status:
                    const: 503
                  code:
                    enum:
                      - service_unavailable
  schemas:
    PolicyHistory:
      title: Environment configuration history
      description: >-
        Immutable settings snapshots, newest first. history_complete is false
        when earlier versions predate capture. A restored version is published
        with a fresh version number. History is removed with the tenant.
      type: object
      additionalProperties: false
      required:
        - items
        - has_more
        - history_complete
      properties:
        items:
          type: array
          maxItems: 100
          items:
            type: object
            additionalProperties: false
            required:
              - settings
            properties:
              settings:
                title: Environment settings
                description: >-
                  One environment's settings: how long its assessments are kept,
                  and for each flow the risk thresholds that decide it and the
                  depth a request that names none is served at, the sources it
                  refuses, and the daily cap on screening spend. Live and test
                  each have their own. A flow without thresholds of its own uses
                  account_creation's (inherits_account_creation). Every change
                  is recorded in the audit log as settings.updated, with who
                  made it.
                type: object
                additionalProperties: false
                required:
                  - workspace_id
                  - environment
                  - retention_days
                  - policy_version
                  - flows
                  - refused_sources
                  - screening_daily_cap
                properties:
                  workspace_id:
                    type: string
                    pattern: ^[A-Za-z0-9][A-Za-z0-9_.-]{0,122}$
                    description: >-
                      The workspace id, which is also its live environment's
                      workspace id; the test environment's is the same id
                      with:test appended. A workspace created through the API is
                      tnt_ and a 26-character ULID.
                  environment:
                    enum:
                      - live
                      - test
                    description: >-
                      The environment the key belongs to. A live key assesses
                      with live sources; a test key answers from the
                      deterministic simulator.
                  retention_days:
                    type: integer
                    minimum: 1
                    maximum: 365
                    description: >-
                      Days an assessment is kept after it is created, 1 to 365
                      (default 365). Shortening hides older assessments at once.
                  policy_version:
                    type: integer
                    minimum: 0
                    description: >-
                      The monotonic settings configuration epoch, including
                      retention changes. Zero while defaults apply. Historical
                      assessments keep their frozen policy version; the active
                      version reaches new assessments within a minute.
                  updated_by:
                    type: string
                    minLength: 1
                    maxLength: 256
                    pattern: ^[^\x00-\x1f\x7f]+$
                    description: Absent while the defaults apply.
                  updated_at:
                    type: string
                    format: date-time
                    description: >-
                      When the policy last changed. Absent while the defaults
                      apply.
                  flows:
                    type: object
                    additionalProperties: false
                    required:
                      - account_creation
                      - login
                      - purchase
                    properties:
                      account_creation:
                        type: object
                        additionalProperties: false
                        required:
                          - step_up
                          - review
                          - default_depth
                          - inherits_account_creation
                          - admission
                          - hold_seconds
                          - on_expiry
                        description: >-
                          One flow's policy in force. A score below step_up is
                          allow, below review step_up, and from review review;
                          from block, when present, the decision is block.
                          admission says when the flow's decision is final.
                        properties:
                          step_up:
                            type: integer
                            minimum: 1
                            maximum: 99
                          review:
                            type: integer
                            minimum: 2
                            maximum: 100
                          block:
                            type: integer
                            minimum: 1
                            maximum: 100
                            description: >-
                              The score from which the decision is block. Absent
                              while blocking is off, the default.
                          default_depth:
                            enum:
                              - quick
                              - full
                            description: >-
                              The depth a request for this flow that names none
                              is served at. Defaults: full for account_creation
                              and purchase, quick for login.
                          inherits_account_creation:
                            type: boolean
                            description: >-
                              true while this flow has no thresholds of its own
                              and uses account_creation's, the default for login
                              and purchase. Always false for signup.
                          admission:
                            enum:
                              - immediate
                              - held
                            description: >-
                              immediate (the default): an assessment of this
                              flow is decided from the evidence its answer has,
                              and later evidence may change the decision. held:
                              while the account's current assessment of this
                              flow has not completed, the account's decision for
                              the flow is held, and the final decision arrives
                              as account.risk_changed when the investigation
                              completes or hold_seconds pass, whichever is
                              first. Each flow has its own admission.
                          hold_seconds:
                            type: integer
                            minimum: 30
                            maximum: 86400
                            description: >-
                              How long a held flow's assessment is held after it
                              was created, 30 to 86400 seconds (default 300).
                              Kept while the flow is immediate.
                          on_expiry:
                            enum:
                              - allow
                              - review
                              - block
                            description: >-
                              The decision a held assessment takes when
                              hold_seconds pass before its investigation
                              completes, unless the evidence so far gives a
                              stricter one (default review). It is announced as
                              account.risk_changed like any other change, so an
                              expired hold is always announced. A hosted
                              provider hook, which cannot wait, answers a held
                              account by it at once: deny for block, allow
                              otherwise. Kept while the flow is immediate.
                      login:
                        type: object
                        additionalProperties: false
                        required:
                          - step_up
                          - review
                          - default_depth
                          - inherits_account_creation
                          - admission
                          - hold_seconds
                          - on_expiry
                        description: >-
                          One flow's policy in force. A score below step_up is
                          allow, below review step_up, and from review review;
                          from block, when present, the decision is block.
                          admission says when the flow's decision is final.
                        properties:
                          step_up:
                            type: integer
                            minimum: 1
                            maximum: 99
                          review:
                            type: integer
                            minimum: 2
                            maximum: 100
                          block:
                            type: integer
                            minimum: 1
                            maximum: 100
                            description: >-
                              The score from which the decision is block. Absent
                              while blocking is off, the default.
                          default_depth:
                            enum:
                              - quick
                              - full
                            description: >-
                              The depth a request for this flow that names none
                              is served at. Defaults: full for account_creation
                              and purchase, quick for login.
                          inherits_account_creation:
                            type: boolean
                            description: >-
                              true while this flow has no thresholds of its own
                              and uses account_creation's, the default for login
                              and purchase. Always false for signup.
                          admission:
                            enum:
                              - immediate
                              - held
                            description: >-
                              immediate (the default): an assessment of this
                              flow is decided from the evidence its answer has,
                              and later evidence may change the decision. held:
                              while the account's current assessment of this
                              flow has not completed, the account's decision for
                              the flow is held, and the final decision arrives
                              as account.risk_changed when the investigation
                              completes or hold_seconds pass, whichever is
                              first. Each flow has its own admission.
                          hold_seconds:
                            type: integer
                            minimum: 30
                            maximum: 86400
                            description: >-
                              How long a held flow's assessment is held after it
                              was created, 30 to 86400 seconds (default 300).
                              Kept while the flow is immediate.
                          on_expiry:
                            enum:
                              - allow
                              - review
                              - block
                            description: >-
                              The decision a held assessment takes when
                              hold_seconds pass before its investigation
                              completes, unless the evidence so far gives a
                              stricter one (default review). It is announced as
                              account.risk_changed like any other change, so an
                              expired hold is always announced. A hosted
                              provider hook, which cannot wait, answers a held
                              account by it at once: deny for block, allow
                              otherwise. Kept while the flow is immediate.
                      purchase:
                        type: object
                        additionalProperties: false
                        required:
                          - step_up
                          - review
                          - default_depth
                          - inherits_account_creation
                          - admission
                          - hold_seconds
                          - on_expiry
                        description: >-
                          One flow's policy in force. A score below step_up is
                          allow, below review step_up, and from review review;
                          from block, when present, the decision is block.
                          admission says when the flow's decision is final.
                        properties:
                          step_up:
                            type: integer
                            minimum: 1
                            maximum: 99
                          review:
                            type: integer
                            minimum: 2
                            maximum: 100
                          block:
                            type: integer
                            minimum: 1
                            maximum: 100
                            description: >-
                              The score from which the decision is block. Absent
                              while blocking is off, the default.
                          default_depth:
                            enum:
                              - quick
                              - full
                            description: >-
                              The depth a request for this flow that names none
                              is served at. Defaults: full for account_creation
                              and purchase, quick for login.
                          inherits_account_creation:
                            type: boolean
                            description: >-
                              true while this flow has no thresholds of its own
                              and uses account_creation's, the default for login
                              and purchase. Always false for signup.
                          admission:
                            enum:
                              - immediate
                              - held
                            description: >-
                              immediate (the default): an assessment of this
                              flow is decided from the evidence its answer has,
                              and later evidence may change the decision. held:
                              while the account's current assessment of this
                              flow has not completed, the account's decision for
                              the flow is held, and the final decision arrives
                              as account.risk_changed when the investigation
                              completes or hold_seconds pass, whichever is
                              first. Each flow has its own admission.
                          hold_seconds:
                            type: integer
                            minimum: 30
                            maximum: 86400
                            description: >-
                              How long a held flow's assessment is held after it
                              was created, 30 to 86400 seconds (default 300).
                              Kept while the flow is immediate.
                          on_expiry:
                            enum:
                              - allow
                              - review
                              - block
                            description: >-
                              The decision a held assessment takes when
                              hold_seconds pass before its investigation
                              completes, unless the evidence so far gives a
                              stricter one (default review). It is announced as
                              account.risk_changed like any other change, so an
                              expired hold is always announced. A hosted
                              provider hook, which cannot wait, answers a held
                              account by it at once: deny for block, allow
                              otherwise. Kept while the flow is immediate.
                  refused_sources:
                    type: array
                    uniqueItems: true
                    maxItems: 25
                    items:
                      enum:
                        - github
                        - phone
                        - breach
                        - rdap
                        - mx
                        - ipintel
                        - adobe
                        - nvidia
                        - wix
                        - life360
                        - zapier
                        - google
                        - scratch
                        - dailymotion
                        - substack
                        - duolingo
                        - dockerhub
                        - wikipedia
                        - internetarchive
                        - telegram
                        - spotify
                        - patreon
                        - wordpress
                        - okru
                        - flickr
                        - whatsapp
                      description: >-
                        A NoResponse source: github (GitHub accounts), phone
                        (the phone lookup), breach (breach exposure), rdap (the
                        email domain's registration), mx (the email domain's
                        mail servers), ipintel (IP intelligence) or an email
                        account source that searches one platform for an account
                        by email address (adobe, nvidia, wix, life360, zapier,
                        google). google runs only for Gmail addresses. scratch,
                        dailymotion, substack, duolingo, dockerhub, wikipedia,
                        internetarchive, telegram, spotify, patreon, wordpress,
                        okru and flickr each search that platform for an account
                        by username; telegram also searches by phone number,
                        through a logged-in Telegram lookup account. whatsapp
                        searches WhatsApp for an account by phone number.
                    description: >-
                      The sources this environment refuses, sorted; empty, the
                      default, refuses none. An assessment never contacts a
                      refused source: its coverage is missing (an identifier
                      with no other source lists coverage-unavailable as
                      unavailable), never not_found, and a stored result of a
                      refused source is not reused.
                  screening_daily_cap:
                    type:
                      - integer
                      - 'null'
                    minimum: 0
                    maximum: 100000000
                    description: >-
                      The most the environment's screenings may spend in one UTC
                      day, in minor units of USD (cents), 0 to 100000000; null
                      is no cap. Default 50000. A screening whose
                      estimated_spend exceeds the cap less the day's recorded
                      spend and what open screenings may still spend answers 409
                      screening_cap_exceeded.
                $defs:
                  flow_settings:
                    type: object
                    additionalProperties: false
                    required:
                      - step_up
                      - review
                      - default_depth
                      - inherits_account_creation
                      - admission
                      - hold_seconds
                      - on_expiry
                    description: >-
                      One flow's policy in force. A score below step_up is
                      allow, below review step_up, and from review review; from
                      block, when present, the decision is block. admission says
                      when the flow's decision is final.
                    properties:
                      step_up:
                        type: integer
                        minimum: 1
                        maximum: 99
                      review:
                        type: integer
                        minimum: 2
                        maximum: 100
                      block:
                        type: integer
                        minimum: 1
                        maximum: 100
                        description: >-
                          The score from which the decision is block. Absent
                          while blocking is off, the default.
                      default_depth:
                        enum:
                          - quick
                          - full
                        description: >-
                          The depth a request for this flow that names none is
                          served at. Defaults: full for account_creation and
                          purchase, quick for login.
                      inherits_account_creation:
                        type: boolean
                        description: >-
                          true while this flow has no thresholds of its own and
                          uses account_creation's, the default for login and
                          purchase. Always false for signup.
                      admission:
                        enum:
                          - immediate
                          - held
                        description: >-
                          immediate (the default): an assessment of this flow is
                          decided from the evidence its answer has, and later
                          evidence may change the decision. held: while the
                          account's current assessment of this flow has not
                          completed, the account's decision for the flow is
                          held, and the final decision arrives as
                          account.risk_changed when the investigation completes
                          or hold_seconds pass, whichever is first. Each flow
                          has its own admission.
                      hold_seconds:
                        type: integer
                        minimum: 30
                        maximum: 86400
                        description: >-
                          How long a held flow's assessment is held after it was
                          created, 30 to 86400 seconds (default 300). Kept while
                          the flow is immediate.
                      on_expiry:
                        enum:
                          - allow
                          - review
                          - block
                        description: >-
                          The decision a held assessment takes when hold_seconds
                          pass before its investigation completes, unless the
                          evidence so far gives a stricter one (default review).
                          It is announced as account.risk_changed like any other
                          change, so an expired hold is always announced. A
                          hosted provider hook, which cannot wait, answers a
                          held account by it at once: deny for block, allow
                          otherwise. Kept while the flow is immediate.
                  admission:
                    enum:
                      - immediate
                      - held
                    description: >-
                      immediate (the default): an assessment of this flow is
                      decided from the evidence its answer has, and later
                      evidence may change the decision. held: while the
                      account's current assessment of this flow has not
                      completed, the account's decision for the flow is held,
                      and the final decision arrives as account.risk_changed
                      when the investigation completes or hold_seconds pass,
                      whichever is first. Each flow has its own admission.
                  hold_seconds:
                    type: integer
                    minimum: 30
                    maximum: 86400
                    description: >-
                      How long a held flow's assessment is held after it was
                      created, 30 to 86400 seconds (default 300). Kept while the
                      flow is immediate.
                  on_expiry:
                    enum:
                      - allow
                      - review
                      - block
                    description: >-
                      The decision a held assessment takes when hold_seconds
                      pass before its investigation completes, unless the
                      evidence so far gives a stricter one (default review). It
                      is announced as account.risk_changed like any other
                      change, so an expired hold is always announced. A hosted
                      provider hook, which cannot wait, answers a held account
                      by it at once: deny for block, allow otherwise. Kept while
                      the flow is immediate.
                  flow_change:
                    type: object
                    additionalProperties: false
                    minProperties: 1
                    description: >-
                      A change to one flow. A field left out keeps the value in
                      force. Thresholds set on login or purchase start from the
                      values in force, account_creation's while it inherits
                      them. After the change, 0 < step_up < review <= 100 and
                      block is off or review <= block <= 100.
                    properties:
                      step_up:
                        type: integer
                        minimum: 1
                        maximum: 100
                      review:
                        type: integer
                        minimum: 1
                        maximum: 100
                      block:
                        type:
                          - integer
                          - 'null'
                        minimum: 1
                        maximum: 100
                        description: >-
                          The score from which the decision is block; null turns
                          blocking off.
                      default_depth:
                        enum:
                          - quick
                          - full
                      inherits_account_creation:
                        const: true
                        description: >-
                          Login or purchase only: drop the flow's own thresholds
                          so it uses account_creation's again. Not combined with
                          step_up, review or block.
                      inherits_signup:
                        const: true
                        deprecated: true
                        description: Alias of inherits_account_creation, still accepted.
                      admission:
                        enum:
                          - immediate
                          - held
                        description: >-
                          immediate (the default): an assessment of this flow is
                          decided from the evidence its answer has, and later
                          evidence may change the decision. held: while the
                          account's current assessment of this flow has not
                          completed, the account's decision for the flow is
                          held, and the final decision arrives as
                          account.risk_changed when the investigation completes
                          or hold_seconds pass, whichever is first. Each flow
                          has its own admission.
                      hold_seconds:
                        type: integer
                        minimum: 30
                        maximum: 86400
                        description: >-
                          How long a held flow's assessment is held after it was
                          created, 30 to 86400 seconds (default 300). Kept while
                          the flow is immediate.
                      on_expiry:
                        enum:
                          - allow
                          - review
                          - block
                        description: >-
                          The decision a held assessment takes when hold_seconds
                          pass before its investigation completes, unless the
                          evidence so far gives a stricter one (default review).
                          It is announced as account.risk_changed like any other
                          change, so an expired hold is always announced. A
                          hosted provider hook, which cannot wait, answers a
                          held account by it at once: deny for block, allow
                          otherwise. Kept while the flow is immediate.
                    if:
                      anyOf:
                        - required:
                            - inherits_account_creation
                        - required:
                            - inherits_signup
                    then:
                      not:
                        anyOf:
                          - required:
                              - step_up
                          - required:
                              - review
                          - required:
                              - block
                  updated_by:
                    type: string
                    minLength: 1
                    maxLength: 256
                    pattern: ^[^\x00-\x1f\x7f]+$
                  source_id:
                    enum:
                      - github
                      - phone
                      - breach
                      - rdap
                      - mx
                      - ipintel
                      - adobe
                      - nvidia
                      - wix
                      - life360
                      - zapier
                      - google
                      - scratch
                      - dailymotion
                      - substack
                      - duolingo
                      - dockerhub
                      - wikipedia
                      - internetarchive
                      - telegram
                      - spotify
                      - patreon
                      - wordpress
                      - okru
                      - flickr
                      - whatsapp
                    description: >-
                      A NoResponse source: github (GitHub accounts), phone (the
                      phone lookup), breach (breach exposure), rdap (the email
                      domain's registration), mx (the email domain's mail
                      servers), ipintel (IP intelligence) or an email account
                      source that searches one platform for an account by email
                      address (adobe, nvidia, wix, life360, zapier, google).
                      google runs only for Gmail addresses. scratch,
                      dailymotion, substack, duolingo, dockerhub, wikipedia,
                      internetarchive, telegram, spotify, patreon, wordpress,
                      okru and flickr each search that platform for an account
                      by username; telegram also searches by phone number,
                      through a logged-in Telegram lookup account. whatsapp
                      searches WhatsApp for an account by phone number.
                  refused_sources:
                    type: array
                    uniqueItems: true
                    maxItems: 25
                    items:
                      enum:
                        - github
                        - phone
                        - breach
                        - rdap
                        - mx
                        - ipintel
                        - adobe
                        - nvidia
                        - wix
                        - life360
                        - zapier
                        - google
                        - scratch
                        - dailymotion
                        - substack
                        - duolingo
                        - dockerhub
                        - wikipedia
                        - internetarchive
                        - telegram
                        - spotify
                        - patreon
                        - wordpress
                        - okru
                        - flickr
                        - whatsapp
                      description: >-
                        A NoResponse source: github (GitHub accounts), phone
                        (the phone lookup), breach (breach exposure), rdap (the
                        email domain's registration), mx (the email domain's
                        mail servers), ipintel (IP intelligence) or an email
                        account source that searches one platform for an account
                        by email address (adobe, nvidia, wix, life360, zapier,
                        google). google runs only for Gmail addresses. scratch,
                        dailymotion, substack, duolingo, dockerhub, wikipedia,
                        internetarchive, telegram, spotify, patreon, wordpress,
                        okru and flickr each search that platform for an account
                        by username; telegram also searches by phone number,
                        through a logged-in Telegram lookup account. whatsapp
                        searches WhatsApp for an account by phone number.
                    description: >-
                      The sources this environment refuses, sorted; empty, the
                      default, refuses none. An assessment never contacts a
                      refused source: its coverage is missing (an identifier
                      with no other source lists coverage-unavailable as
                      unavailable), never not_found, and a stored result of a
                      refused source is not reused.
              recorded_at:
                type: string
                format: date-time
                description: >-
                  Capture time, not a backfilled activation time. Absent only
                  for the current configuration before its first capture.
              change_reason:
                type: string
                maxLength: 500
                pattern: ^[^\x00-\x1f\x7f]*$
              restored_from:
                type: integer
                minimum: 0
                maximum: 2147483647
              evaluation:
                type: object
                additionalProperties: false
                required:
                  - manifest_sha256
                  - input_sha256
                  - cohort_sha256
                  - result_sha256
                  - evaluator_sha256
                  - evaluation_id
                  - evaluator_version
                  - build_version
                  - captured_at
                  - published_at
                properties:
                  manifest_sha256:
                    type: string
                    pattern: ^[0-9a-f]{64}$
                  input_sha256:
                    type: string
                    pattern: ^[0-9a-f]{64}$
                  cohort_sha256:
                    type: string
                    pattern: ^[0-9a-f]{64}$
                  result_sha256:
                    type: string
                    pattern: ^[0-9a-f]{64}$
                  evaluator_sha256:
                    type: string
                    pattern: ^[0-9a-f]{64}$
                  evaluation_id:
                    type: string
                    pattern: ^pev_[0-7][0-9A-HJKMNP-TV-Z]{25}$
                  evaluator_version:
                    type: string
                    const: identity-threshold-evaluator-v2
                  build_version:
                    type: string
                    pattern: ^[0-9a-f]{40}$
                  captured_at:
                    type: string
                    format: date-time
                  published_at:
                    type: string
                    format: date-time
                description: >-
                  Immutable publication provenance remains in policy history
                  after evaluation evidence expires. SHA-256 values identify the
                  frozen manifest, evaluator semantic input, cohort, and
                  canonical result separately.
        has_more:
          type: boolean
        next_before_version:
          type: integer
          minimum: 0
          maximum: 2147483647
        history_complete:
          type: boolean
    Problem:
      title: Problem details error
      description: >-
        RFC 9457 problem-details error body returned by every non-2xx API
        response, extended with a stable machine code and request id.
      type: object
      additionalProperties: false
      required:
        - type
        - title
        - status
        - detail
        - code
        - request_id
      properties:
        type:
          type: string
          format: uri-reference
        title:
          type: string
        status:
          type: integer
          minimum: 400
          maximum: 599
        detail:
          type: string
        instance:
          type: string
          format: uri-reference
        code:
          type: string
        request_id:
          type: string
          minLength: 1
        invalid_params:
          type: array
          items:
            type: object
            additionalProperties: false
            required:
              - field
              - reason
            properties:
              field:
                type: string
                minLength: 1
              reason:
                type: string
                minLength: 1
              example:
                type: string
                minLength: 1
  securitySchemes:
    tenantBearer:
      type: http
      scheme: bearer
      description: >-
        Your API key, sent as `Authorization: Bearer <key>`. A key is
        `nrk_live_` or `nrk_test_`, a 26-character key id, `_` and a
        43-character secret. Account, audit and usage data stay within the key's
        environment. Dedicated team scopes apply across the workspace.


        `assess` creates and reads assessments, records outcomes and reports key
        usage. `investigate` reads accounts, assessment history and request
        diagnostics without export or enforcement access. The legacy `history`
        scope also permits account exports, submitted identifiers and
        enforcement reports. `delete` permits account and assessment deletion.


        `evidence` or `detailed` adds detailed merged evidence and submitted
        identifiers where the operation permits them. Neither grants access to
        the underlying resource alone. `exports` permits exports with the
        underlying account or audit scope. `audit` reads audit events and
        `usage` reads usage. `audit_manage` manages audit streams and retention,
        and includes audit-read and export authority.


        `webhooks` manages webhook endpoints. `integrations` manages hosted
        auth-provider integrations. `management` manages keys, settings, lists,
        reviews and policy evaluations in the key's environment. New keys cannot
        exceed the issuer's effective permissions.


        `settings` reads configuration, previews policy and list changes, runs
        evaluations and changes retention. Publishing decision policy or
        changing lists requires `settings` and `policy_publish` together, or the
        legacy `management` scope.


        `groups` creates and reads groups, adds people, starts and cancels
        screenings and records decisions on people, in the key's environment.


        `members` reads the workspace directory. `members_manage` also
        administers non-owner members and invitations. These scopes require a
        live key issued by a current owner with access to both environments.
        They grant access across the workspace. `management` does not grant team
        access. API keys cannot change owners or accept invitations.


        A missing, unknown, revoked or expired key answers 401. A valid key
        without a required scope answers 403.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.