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

# List accounts that share a submitted identifier

> Lists the other accounts in the authenticated workspace and environment that submitted an email, phone or username that this account also submitted. The account itself is not listed.

Matching uses the identifier search rules. Each linked account has one entry for each shared kind, at the strictest rule that links the two accounts: `exact`, then `canonical`, then `mailbox`. Each entry names the original value, `assessment_id` and `submitted_at` of each account's most recent retained submission. Only submitted identifiers link accounts. Expired, deleted and erased assessments link nothing. A shared identifier does not prove that one person owns both accounts.

Pass `next_cursor` back unchanged as `cursor` to read the next page. A changed, foreign or expired cursor answers 400 `invalid_cursor`. Totals are exact below 10000 and capped at 10000.

Read-only and safe to retry. Requires the `history` scope, or `investigate` with `evidence`. While older assessments are being indexed it answers 503 with `Retry-After`.



## OpenAPI

````yaml /openapi.json get /v1/accounts/{account_id}/links
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/accounts/{account_id}/links:
    get:
      tags:
        - accounts
      summary: List accounts that share a submitted identifier
      description: >-
        Lists the other accounts in the authenticated workspace and environment
        that submitted an email, phone or username that this account also
        submitted. The account itself is not listed.


        Matching uses the identifier search rules. Each linked account has one
        entry for each shared kind, at the strictest rule that links the two
        accounts: `exact`, then `canonical`, then `mailbox`. Each entry names
        the original value, `assessment_id` and `submitted_at` of each account's
        most recent retained submission. Only submitted identifiers link
        accounts. Expired, deleted and erased assessments link nothing. A shared
        identifier does not prove that one person owns both accounts.


        Pass `next_cursor` back unchanged as `cursor` to read the next page. A
        changed, foreign or expired cursor answers 400 `invalid_cursor`. Totals
        are exact below 10000 and capped at 10000.


        Read-only and safe to retry. Requires the `history` scope, or
        `investigate` with `evidence`. While older assessments are being indexed
        it answers 503 with `Retry-After`.
      operationId: listLinkedAccounts
      parameters:
        - $ref: '#/components/parameters/AccountId'
        - name: limit
          in: query
          required: false
          description: Linked accounts per page.
          schema:
            type: integer
            minimum: 1
            maximum: 50
            default: 25
        - name: cursor
          in: query
          required: false
          description: next_cursor from the previous page, unchanged.
          schema:
            type: string
            minLength: 1
            maxLength: 1024
            pattern: ^[A-Za-z0-9_-]+$
            not:
              pattern: \n
      responses:
        '200':
          $ref: '#/components/responses/LinkedAccountList'
        '400':
          $ref: '#/components/responses/InvalidAccountRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/WorkspaceForbidden'
        '429':
          $ref: '#/components/responses/RateLimited'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
      security:
        - tenantBearer: []
      x-codeSamples:
        - lang: curl
          label: cURL
          source: |
            curl --request GET \
              --url 'https://api.noresponse.org/v1/accounts/acct_7f3a9c/links?limit=25' \
              --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.accounts.listLinked({
                accountId: "acct_7f3a9c",
              });

              for await (const page of result) {
                console.log(page);
              }
            }

            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.accounts.list_linked(account_id="acct_7f3a9c", limit=25)

                while res is not None:
                    # Handle items

                    res = res.next()
        - lang: go
          label: Go
          source: "package main\n\nimport(\n\t\"context\"\n\t\"os\"\n\tnoresponse \"github.com/noresponsehq/go/v12\"\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.Accounts.ListLinked(ctx, \"acct_7f3a9c\", noresponse.Pointer[int64](25), nil)\n    if err != nil {\n        log.Fatal(err)\n    }\n    if res != nil {\n        for {\n            // handle items\n\n            res, err = res.Next()\n\n            if err != nil {\n                // handle error\n            }\n\n            if res == nil {\n                break\n            }\n        }\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.ListLinkedAccountsResponse;

            public class Application {

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

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


                    sdk.accounts().listLinked()
                            .accountId("acct_7f3a9c")
                            .limit(25L)
                            .callAsStream()
                            .forEach((ListLinkedAccountsResponse item) -> {
                               // handle page
                            });


                }
            }
        - lang: csharp
          label: C#
          source: >
            using NoResponse;

            using NoResponse.Models.Operations;

            using NoResponse.Models.Shared;

            using System;


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


            ListLinkedAccountsResponse? res = await
            sdk.Accounts.ListLinkedAsync(
                accountId: "acct_7f3a9c",
                limit: 25
            );


            while(res != null)

            {
                // handle items

                res = await res.Next!();
            }
        - lang: php
          label: PHP
          source: |
            <?php

            declare(strict_types=1);

            require 'vendor/autoload.php';

            use NoResponse;

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



            $responses = $sdk->accounts->listLinked(
                accountId: 'acct_7f3a9c',
                limit: 25

            );


            foreach ($responses as $response) {
                $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.accounts.list_linked(account_id: 'acct_7f3a9c', limit: 25)

            unless res.nil?
              # handle response
            end
components:
  parameters:
    AccountId:
      name: account_id
      in: path
      required: true
      schema:
        type: string
        minLength: 1
        maxLength: 128
        pattern: ^[A-Za-z0-9][A-Za-z0-9._:|-]{0,127}$
        description: >-
          The provider's own opaque identifier for the account being checked,
          scoped to the calling workspace. It must be provider-opaque and must
          not contain a direct identifier (email, phone, name, national id):
          that is a provider obligation the schema can only partly check. '|' is
          accepted so an Auth0 user id such as 'auth0|64abc' passes unchanged;
          '@', '+', '$' and whitespace are refused by the pattern, as is an
          exact-shape JWT; a hex digest such as a SHA-256 is allowed, because
          hashing an internal id is a common pseudonymous scheme. A value such
          as '07700900123' or 'jane.doe.gmail.com' cannot be told apart from an
          opaque id. It travels in bodies, and in a URL only as the path segment
          of GET /v1/accounts/{account_id}, its /assessments and its /links. An
          assessment requested by a provider hook at pre_registration, which has
          no account yet, carries the server-issued account_id pre: followed by
          its assessment_id.
        not:
          description: refused_text plus secret_encoded, for account_id.
          anyOf:
            - description: >-
                A NUL or line feed anywhere, refused with not beside anchored
                patterns. The parser refuses NUL in every request string. This
                guard also closes engines where $ accepts a final line feed.
              pattern: '[\x00\n]'
            - description: >-
                Exact shapes only: a complete modular-crypt password hash
                (bcrypt $2a$/$2b$/$2x$/$2y$ with a two-digit cost and 53
                characters; $argon2i/d/id with its m, t, p parameters, salt and
                hash; md5-crypt $1$, sha256-crypt $5$ or sha512-crypt $6$ with a
                22, 43 or 86 character hash; passlib $scrypt$ with ln, r, p,
                salt and hash) or a three-segment JWT whose header is base64url
                JSON opening with an "alg", "typ", "kid" or "cty" member
                (eyJhbGciOi, eyJ0eXAiOi, eyJraWQiOi or eyJjdHkiOi). A value that
                merely starts with '$2' or 'eyJ', such as eyJohnathan.doe.x, is
                not refused. Best effort, not a guarantee; see the provider
                obligation in the README.
              anyOf:
                - pattern: ^\$2[abxy]?\$[0-9]{2}\$[./A-Za-z0-9]{53}$
                - pattern: >-
                    ^\$argon2(?:id|i|d)\$(?:v=[0-9]{1,4}\$)?m=[0-9]{1,10},t=[0-9]{1,10},p=[0-9]{1,3}\$[A-Za-z0-9+/]{8,}\$[A-Za-z0-9+/]{16,}$
                - pattern: >-
                    ^\$[156]\$(?:rounds=[0-9]{1,9}\$)?[./A-Za-z0-9]{1,16}\$(?:[./A-Za-z0-9]{22}|[./A-Za-z0-9]{43}|[./A-Za-z0-9]{86})$
                - pattern: >-
                    ^\$scrypt\$ln=[0-9]{1,2},r=[0-9]{1,3},p=[0-9]{1,3}\$[A-Za-z0-9+/.]{8,}\$[A-Za-z0-9+/.]{16,}$
                - pattern: >-
                    ^eyJ(?:hbGciOi|0eXAiOi|raWQiOi|jdHkiOi)[A-Za-z0-9_-]*\.[A-Za-z0-9_-]{2,}\.[A-Za-z0-9_-]*$
      description: >-
        The account_id the workspace sends with its assessments, as one path
        segment (percent-encode '|' and ':' if the client requires it). A value
        that does not match the account_id shape answers 400 invalid_request.
  responses:
    LinkedAccountList:
      description: Accounts that share a submitted identifier with the requested account
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/LinkedAccountPage'
      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
    InvalidAccountRequest:
      description: >-
        account_id does not match its shape, a query parameter is unknown,
        repeated or out of range, or the cursor fails its MAC, belongs to
        another workspace or account, or has expired. invalid_params names the
        offending parameters, never their values.
      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
                      - invalid_cursor
    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
    WorkspaceForbidden:
      description: >-
        The API key is valid but may not use this operation: it lacks the
        operation's scope, or its workspace is not entitled or is suspended.
      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
          examples:
            missingScope:
              value:
                type: https://docs.noresponse.org/problems/workspace-forbidden
                title: Forbidden
                status: 403
                detail: The API key does not carry a scope this operation accepts.
                code: workspace_forbidden
                request_id: 0123456789abcdef0123456789abcdef
    RateLimited:
      description: >-
        The workspace's rate or concurrency limit is exhausted. Retry-After says
        when to retry; the provider applies its own fallback meanwhile.
      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: 429
                  code:
                    enum:
                      - rate_limited
          examples:
            limited:
              value:
                type: https://docs.noresponse.org/problems/rate-limited
                title: Rate limited
                status: 429
                detail: >-
                  The tenant's assessment rate is exhausted; retry after the
                  Retry-After interval.
                code: rate_limited
                request_id: 0123456789abcdef0123456789abcdef
    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:
    LinkedAccountPage:
      title: Linked account page
      description: >-
        Other accounts in this workspace and environment whose retained
        assessments submitted an email, phone or customer-namespace username
        that one of account_id's retained assessments also submitted. Matching
        uses the identifier search rules: exact, canonical and, for email,
        mailbox. Only customer-submitted identifiers link accounts;
        source-discovered identifiers do not. Expired, retention-shortened,
        deleted and erased assessments link nothing. A shared identifier is not
        verified ownership. Accounts use stable opaque order, the page and total
        share one database snapshot, and later pages are live. Cursors bind the
        workspace, environment, operation and account_id, and expire.
      type: object
      additionalProperties: false
      required:
        - schema_version
        - account_id
        - items
        - total
        - total_capped
      properties:
        schema_version:
          const: '1'
          description: Version of the body shape.
        account_id:
          type: string
          minLength: 1
          maxLength: 128
          pattern: ^[A-Za-z0-9][A-Za-z0-9._:|-]{0,127}$
          description: >-
            The account whose submitted identifiers were compared. It is
            excluded from items.
          not:
            description: refused_text plus secret_encoded, for account_id.
            anyOf:
              - description: >-
                  A NUL or line feed anywhere, refused with not beside anchored
                  patterns. The parser refuses NUL in every request string. This
                  guard also closes engines where $ accepts a final line feed.
                pattern: '[\x00\n]'
              - description: >-
                  Exact shapes only: a complete modular-crypt password hash
                  (bcrypt $2a$/$2b$/$2x$/$2y$ with a two-digit cost and 53
                  characters; $argon2i/d/id with its m, t, p parameters, salt
                  and hash; md5-crypt $1$, sha256-crypt $5$ or sha512-crypt $6$
                  with a 22, 43 or 86 character hash; passlib $scrypt$ with ln,
                  r, p, salt and hash) or a three-segment JWT whose header is
                  base64url JSON opening with an "alg", "typ", "kid" or "cty"
                  member (eyJhbGciOi, eyJ0eXAiOi, eyJraWQiOi or eyJjdHkiOi). A
                  value that merely starts with '$2' or 'eyJ', such as
                  eyJohnathan.doe.x, is not refused. Best effort, not a
                  guarantee; see the provider obligation in the README.
                anyOf:
                  - pattern: ^\$2[abxy]?\$[0-9]{2}\$[./A-Za-z0-9]{53}$
                  - pattern: >-
                      ^\$argon2(?:id|i|d)\$(?:v=[0-9]{1,4}\$)?m=[0-9]{1,10},t=[0-9]{1,10},p=[0-9]{1,3}\$[A-Za-z0-9+/]{8,}\$[A-Za-z0-9+/]{16,}$
                  - pattern: >-
                      ^\$[156]\$(?:rounds=[0-9]{1,9}\$)?[./A-Za-z0-9]{1,16}\$(?:[./A-Za-z0-9]{22}|[./A-Za-z0-9]{43}|[./A-Za-z0-9]{86})$
                  - pattern: >-
                      ^\$scrypt\$ln=[0-9]{1,2},r=[0-9]{1,3},p=[0-9]{1,3}\$[A-Za-z0-9+/.]{8,}\$[A-Za-z0-9+/.]{16,}$
                  - pattern: >-
                      ^eyJ(?:hbGciOi|0eXAiOi|raWQiOi|jdHkiOi)[A-Za-z0-9_-]*\.[A-Za-z0-9_-]{2,}\.[A-Za-z0-9_-]*$
        items:
          type: array
          maxItems: 50
          items:
            type: object
            additionalProperties: false
            required:
              - account_id
              - shared_identifiers
            properties:
              account_id:
                type: string
                minLength: 1
                maxLength: 128
                pattern: ^[A-Za-z0-9][A-Za-z0-9._:|-]{0,127}$
                description: >-
                  The provider's own opaque identifier for the account being
                  checked, scoped to the calling workspace. It must be
                  provider-opaque and must not contain a direct identifier
                  (email, phone, name, national id): that is a provider
                  obligation the schema can only partly check. '|' is accepted
                  so an Auth0 user id such as 'auth0|64abc' passes unchanged;
                  '@', '+', '$' and whitespace are refused by the pattern, as is
                  an exact-shape JWT; a hex digest such as a SHA-256 is allowed,
                  because hashing an internal id is a common pseudonymous
                  scheme. A value such as '07700900123' or 'jane.doe.gmail.com'
                  cannot be told apart from an opaque id. It travels in bodies,
                  and in a URL only as the path segment of GET
                  /v1/accounts/{account_id}, its /assessments and its /links. An
                  assessment requested by a provider hook at pre_registration,
                  which has no account yet, carries the server-issued account_id
                  pre: followed by its assessment_id.
                not:
                  description: refused_text plus secret_encoded, for account_id.
                  anyOf:
                    - description: >-
                        A NUL or line feed anywhere, refused with not beside
                        anchored patterns. The parser refuses NUL in every
                        request string. This guard also closes engines where $
                        accepts a final line feed.
                      pattern: '[\x00\n]'
                    - description: >-
                        Exact shapes only: a complete modular-crypt password
                        hash (bcrypt $2a$/$2b$/$2x$/$2y$ with a two-digit cost
                        and 53 characters; $argon2i/d/id with its m, t, p
                        parameters, salt and hash; md5-crypt $1$, sha256-crypt
                        $5$ or sha512-crypt $6$ with a 22, 43 or 86 character
                        hash; passlib $scrypt$ with ln, r, p, salt and hash) or
                        a three-segment JWT whose header is base64url JSON
                        opening with an "alg", "typ", "kid" or "cty" member
                        (eyJhbGciOi, eyJ0eXAiOi, eyJraWQiOi or eyJjdHkiOi). A
                        value that merely starts with '$2' or 'eyJ', such as
                        eyJohnathan.doe.x, is not refused. Best effort, not a
                        guarantee; see the provider obligation in the README.
                      anyOf:
                        - pattern: ^\$2[abxy]?\$[0-9]{2}\$[./A-Za-z0-9]{53}$
                        - pattern: >-
                            ^\$argon2(?:id|i|d)\$(?:v=[0-9]{1,4}\$)?m=[0-9]{1,10},t=[0-9]{1,10},p=[0-9]{1,3}\$[A-Za-z0-9+/]{8,}\$[A-Za-z0-9+/]{16,}$
                        - pattern: >-
                            ^\$[156]\$(?:rounds=[0-9]{1,9}\$)?[./A-Za-z0-9]{1,16}\$(?:[./A-Za-z0-9]{22}|[./A-Za-z0-9]{43}|[./A-Za-z0-9]{86})$
                        - pattern: >-
                            ^\$scrypt\$ln=[0-9]{1,2},r=[0-9]{1,3},p=[0-9]{1,3}\$[A-Za-z0-9+/.]{8,}\$[A-Za-z0-9+/.]{16,}$
                        - pattern: >-
                            ^eyJ(?:hbGciOi|0eXAiOi|raWQiOi|jdHkiOi)[A-Za-z0-9_-]*\.[A-Za-z0-9_-]{2,}\.[A-Za-z0-9_-]*$
              shared_identifiers:
                type: array
                minItems: 1
                maxItems: 3
                items:
                  type: object
                  additionalProperties: false
                  required:
                    - kind
                    - match_basis
                    - provenance
                    - account
                    - linked_account
                  properties:
                    kind:
                      type: string
                      enum:
                        - email
                        - phone
                        - username
                    match_basis:
                      type: string
                      enum:
                        - exact
                        - canonical
                        - mailbox
                    provenance:
                      type: string
                      enum:
                        - submitted
                      description: >-
                        Both accounts' customers submitted the identifier. It
                        does not mean anyone verified ownership.
                    namespace:
                      type: string
                      enum:
                        - customer
                      description: Present only for username.
                    account:
                      type: object
                      additionalProperties: false
                      required:
                        - value
                        - assessment_id
                        - submitted_at
                      properties:
                        value:
                          type: string
                          minLength: 1
                          maxLength: 254
                          description: >-
                            The original value submitted in assessment_id. Under
                            canonical or mailbox matching the two accounts'
                            values can differ.
                        assessment_id:
                          type: string
                          pattern: ^asm_[0-9A-HJKMNP-TV-Z]{26}$
                          description: >-
                            Opaque, server-assigned assessment id: 'asm_' and a
                            26-character Crockford base32 ULID. Unique within
                            the workspace; another workspace's assessment id
                            answers 404.
                          not:
                            description: >-
                              A NUL or line feed anywhere, refused with not
                              beside anchored patterns. The parser refuses NUL
                              in every request string. This guard also closes
                              engines where $ accepts a final line feed.
                            pattern: '[\x00\n]'
                        submitted_at:
                          type: string
                          format: date-time
                          description: When assessment_id was created.
                      description: >-
                        The newest retained assessment of the requested account
                        that submitted this identifier.
                    linked_account:
                      type: object
                      additionalProperties: false
                      required:
                        - value
                        - assessment_id
                        - submitted_at
                      properties:
                        value:
                          type: string
                          minLength: 1
                          maxLength: 254
                          description: >-
                            The original value submitted in assessment_id. Under
                            canonical or mailbox matching the two accounts'
                            values can differ.
                        assessment_id:
                          type: string
                          pattern: ^asm_[0-9A-HJKMNP-TV-Z]{26}$
                          description: >-
                            Opaque, server-assigned assessment id: 'asm_' and a
                            26-character Crockford base32 ULID. Unique within
                            the workspace; another workspace's assessment id
                            answers 404.
                          not:
                            description: >-
                              A NUL or line feed anywhere, refused with not
                              beside anchored patterns. The parser refuses NUL
                              in every request string. This guard also closes
                              engines where $ accepts a final line feed.
                            pattern: '[\x00\n]'
                        submitted_at:
                          type: string
                          format: date-time
                          description: When assessment_id was created.
                      description: >-
                        The newest retained assessment of the linked account
                        that submitted this identifier.
                  allOf:
                    - if:
                        properties:
                          kind:
                            const: username
                        required:
                          - kind
                      then:
                        required:
                          - namespace
                      else:
                        not:
                          required:
                            - namespace
                    - if:
                        properties:
                          match_basis:
                            const: mailbox
                        required:
                          - match_basis
                      then:
                        properties:
                          kind:
                            const: email
                description: >-
                  One entry per shared kind, in the order email, phone,
                  username. Each entry uses the strictest basis that links the
                  two accounts: exact, then canonical, then mailbox.
        total:
          type: integer
          minimum: 0
          maximum: 10000
          description: Distinct linked accounts, exact below 10000 and capped at 10000.
        total_capped:
          type: boolean
          description: True when at least 10000 accounts are linked.
        next_cursor:
          type: string
          minLength: 1
          maxLength: 1024
          pattern: ^[A-Za-z0-9_-]+$
          not:
            pattern: \n
          description: >-
            Opaque, expiring cursor bound to this environment, operation and
            account_id. Absent on the last page.
      $defs:
        linked_account:
          type: object
          additionalProperties: false
          required:
            - account_id
            - shared_identifiers
          properties:
            account_id:
              type: string
              minLength: 1
              maxLength: 128
              pattern: ^[A-Za-z0-9][A-Za-z0-9._:|-]{0,127}$
              description: >-
                The provider's own opaque identifier for the account being
                checked, scoped to the calling workspace. It must be
                provider-opaque and must not contain a direct identifier (email,
                phone, name, national id): that is a provider obligation the
                schema can only partly check. '|' is accepted so an Auth0 user
                id such as 'auth0|64abc' passes unchanged; '@', '+', '$' and
                whitespace are refused by the pattern, as is an exact-shape JWT;
                a hex digest such as a SHA-256 is allowed, because hashing an
                internal id is a common pseudonymous scheme. A value such as
                '07700900123' or 'jane.doe.gmail.com' cannot be told apart from
                an opaque id. It travels in bodies, and in a URL only as the
                path segment of GET /v1/accounts/{account_id}, its /assessments
                and its /links. An assessment requested by a provider hook at
                pre_registration, which has no account yet, carries the
                server-issued account_id pre: followed by its assessment_id.
              not:
                description: refused_text plus secret_encoded, for account_id.
                anyOf:
                  - description: >-
                      A NUL or line feed anywhere, refused with not beside
                      anchored patterns. The parser refuses NUL in every request
                      string. This guard also closes engines where $ accepts a
                      final line feed.
                    pattern: '[\x00\n]'
                  - description: >-
                      Exact shapes only: a complete modular-crypt password hash
                      (bcrypt $2a$/$2b$/$2x$/$2y$ with a two-digit cost and 53
                      characters; $argon2i/d/id with its m, t, p parameters,
                      salt and hash; md5-crypt $1$, sha256-crypt $5$ or
                      sha512-crypt $6$ with a 22, 43 or 86 character hash;
                      passlib $scrypt$ with ln, r, p, salt and hash) or a
                      three-segment JWT whose header is base64url JSON opening
                      with an "alg", "typ", "kid" or "cty" member (eyJhbGciOi,
                      eyJ0eXAiOi, eyJraWQiOi or eyJjdHkiOi). A value that merely
                      starts with '$2' or 'eyJ', such as eyJohnathan.doe.x, is
                      not refused. Best effort, not a guarantee; see the
                      provider obligation in the README.
                    anyOf:
                      - pattern: ^\$2[abxy]?\$[0-9]{2}\$[./A-Za-z0-9]{53}$
                      - pattern: >-
                          ^\$argon2(?:id|i|d)\$(?:v=[0-9]{1,4}\$)?m=[0-9]{1,10},t=[0-9]{1,10},p=[0-9]{1,3}\$[A-Za-z0-9+/]{8,}\$[A-Za-z0-9+/]{16,}$
                      - pattern: >-
                          ^\$[156]\$(?:rounds=[0-9]{1,9}\$)?[./A-Za-z0-9]{1,16}\$(?:[./A-Za-z0-9]{22}|[./A-Za-z0-9]{43}|[./A-Za-z0-9]{86})$
                      - pattern: >-
                          ^\$scrypt\$ln=[0-9]{1,2},r=[0-9]{1,3},p=[0-9]{1,3}\$[A-Za-z0-9+/.]{8,}\$[A-Za-z0-9+/.]{16,}$
                      - pattern: >-
                          ^eyJ(?:hbGciOi|0eXAiOi|raWQiOi|jdHkiOi)[A-Za-z0-9_-]*\.[A-Za-z0-9_-]{2,}\.[A-Za-z0-9_-]*$
            shared_identifiers:
              type: array
              minItems: 1
              maxItems: 3
              items:
                type: object
                additionalProperties: false
                required:
                  - kind
                  - match_basis
                  - provenance
                  - account
                  - linked_account
                properties:
                  kind:
                    type: string
                    enum:
                      - email
                      - phone
                      - username
                  match_basis:
                    type: string
                    enum:
                      - exact
                      - canonical
                      - mailbox
                  provenance:
                    type: string
                    enum:
                      - submitted
                    description: >-
                      Both accounts' customers submitted the identifier. It does
                      not mean anyone verified ownership.
                  namespace:
                    type: string
                    enum:
                      - customer
                    description: Present only for username.
                  account:
                    type: object
                    additionalProperties: false
                    required:
                      - value
                      - assessment_id
                      - submitted_at
                    properties:
                      value:
                        type: string
                        minLength: 1
                        maxLength: 254
                        description: >-
                          The original value submitted in assessment_id. Under
                          canonical or mailbox matching the two accounts' values
                          can differ.
                      assessment_id:
                        type: string
                        pattern: ^asm_[0-9A-HJKMNP-TV-Z]{26}$
                        description: >-
                          Opaque, server-assigned assessment id: 'asm_' and a
                          26-character Crockford base32 ULID. Unique within the
                          workspace; another workspace's assessment id answers
                          404.
                        not:
                          description: >-
                            A NUL or line feed anywhere, refused with not beside
                            anchored patterns. The parser refuses NUL in every
                            request string. This guard also closes engines where
                            $ accepts a final line feed.
                          pattern: '[\x00\n]'
                      submitted_at:
                        type: string
                        format: date-time
                        description: When assessment_id was created.
                    description: >-
                      The newest retained assessment of the requested account
                      that submitted this identifier.
                  linked_account:
                    type: object
                    additionalProperties: false
                    required:
                      - value
                      - assessment_id
                      - submitted_at
                    properties:
                      value:
                        type: string
                        minLength: 1
                        maxLength: 254
                        description: >-
                          The original value submitted in assessment_id. Under
                          canonical or mailbox matching the two accounts' values
                          can differ.
                      assessment_id:
                        type: string
                        pattern: ^asm_[0-9A-HJKMNP-TV-Z]{26}$
                        description: >-
                          Opaque, server-assigned assessment id: 'asm_' and a
                          26-character Crockford base32 ULID. Unique within the
                          workspace; another workspace's assessment id answers
                          404.
                        not:
                          description: >-
                            A NUL or line feed anywhere, refused with not beside
                            anchored patterns. The parser refuses NUL in every
                            request string. This guard also closes engines where
                            $ accepts a final line feed.
                          pattern: '[\x00\n]'
                      submitted_at:
                        type: string
                        format: date-time
                        description: When assessment_id was created.
                    description: >-
                      The newest retained assessment of the linked account that
                      submitted this identifier.
                allOf:
                  - if:
                      properties:
                        kind:
                          const: username
                      required:
                        - kind
                    then:
                      required:
                        - namespace
                    else:
                      not:
                        required:
                          - namespace
                  - if:
                      properties:
                        match_basis:
                          const: mailbox
                      required:
                        - match_basis
                    then:
                      properties:
                        kind:
                          const: email
              description: >-
                One entry per shared kind, in the order email, phone, username.
                Each entry uses the strictest basis that links the two accounts:
                exact, then canonical, then mailbox.
        shared_identifier:
          type: object
          additionalProperties: false
          required:
            - kind
            - match_basis
            - provenance
            - account
            - linked_account
          properties:
            kind:
              type: string
              enum:
                - email
                - phone
                - username
            match_basis:
              type: string
              enum:
                - exact
                - canonical
                - mailbox
            provenance:
              type: string
              enum:
                - submitted
              description: >-
                Both accounts' customers submitted the identifier. It does not
                mean anyone verified ownership.
            namespace:
              type: string
              enum:
                - customer
              description: Present only for username.
            account:
              type: object
              additionalProperties: false
              required:
                - value
                - assessment_id
                - submitted_at
              properties:
                value:
                  type: string
                  minLength: 1
                  maxLength: 254
                  description: >-
                    The original value submitted in assessment_id. Under
                    canonical or mailbox matching the two accounts' values can
                    differ.
                assessment_id:
                  type: string
                  pattern: ^asm_[0-9A-HJKMNP-TV-Z]{26}$
                  description: >-
                    Opaque, server-assigned assessment id: 'asm_' and a
                    26-character Crockford base32 ULID. Unique within the
                    workspace; another workspace's assessment id answers 404.
                  not:
                    description: >-
                      A NUL or line feed anywhere, refused with not beside
                      anchored patterns. The parser refuses NUL in every request
                      string. This guard also closes engines where $ accepts a
                      final line feed.
                    pattern: '[\x00\n]'
                submitted_at:
                  type: string
                  format: date-time
                  description: When assessment_id was created.
              description: >-
                The newest retained assessment of the requested account that
                submitted this identifier.
            linked_account:
              type: object
              additionalProperties: false
              required:
                - value
                - assessment_id
                - submitted_at
              properties:
                value:
                  type: string
                  minLength: 1
                  maxLength: 254
                  description: >-
                    The original value submitted in assessment_id. Under
                    canonical or mailbox matching the two accounts' values can
                    differ.
                assessment_id:
                  type: string
                  pattern: ^asm_[0-9A-HJKMNP-TV-Z]{26}$
                  description: >-
                    Opaque, server-assigned assessment id: 'asm_' and a
                    26-character Crockford base32 ULID. Unique within the
                    workspace; another workspace's assessment id answers 404.
                  not:
                    description: >-
                      A NUL or line feed anywhere, refused with not beside
                      anchored patterns. The parser refuses NUL in every request
                      string. This guard also closes engines where $ accepts a
                      final line feed.
                    pattern: '[\x00\n]'
                submitted_at:
                  type: string
                  format: date-time
                  description: When assessment_id was created.
              description: >-
                The newest retained assessment of the linked account that
                submitted this identifier.
          allOf:
            - if:
                properties:
                  kind:
                    const: username
                required:
                  - kind
              then:
                required:
                  - namespace
              else:
                not:
                  required:
                    - namespace
            - if:
                properties:
                  match_basis:
                    const: mailbox
                required:
                  - match_basis
              then:
                properties:
                  kind:
                    const: email
        identifier_submission:
          type: object
          additionalProperties: false
          required:
            - value
            - assessment_id
            - submitted_at
          properties:
            value:
              type: string
              minLength: 1
              maxLength: 254
              description: >-
                The original value submitted in assessment_id. Under canonical
                or mailbox matching the two accounts' values can differ.
            assessment_id:
              type: string
              pattern: ^asm_[0-9A-HJKMNP-TV-Z]{26}$
              description: >-
                Opaque, server-assigned assessment id: 'asm_' and a 26-character
                Crockford base32 ULID. Unique within the workspace; another
                workspace's assessment id answers 404.
              not:
                description: >-
                  A NUL or line feed anywhere, refused with not beside anchored
                  patterns. The parser refuses NUL in every request string. This
                  guard also closes engines where $ accepts a final line feed.
                pattern: '[\x00\n]'
            submitted_at:
              type: string
              format: date-time
              description: When assessment_id was created.
      examples:
        - schema_version: '1'
          account_id: acct_7f3a9c
          items:
            - account_id: acct_91b2d4
              shared_identifiers:
                - kind: email
                  match_basis: mailbox
                  provenance: submitted
                  account:
                    value: jane.doe@gmail.com
                    assessment_id: asm_01JA2Z8K6Q4V7W9XBCDEFGHJKM
                    submitted_at: '2026-10-14T09:00:00.412Z'
                  linked_account:
                    value: janedoe+2@gmail.com
                    assessment_id: asm_01JA3B1C2D3E4F5G6H7J8K9M0N
                    submitted_at: '2026-10-20T17:42:10.006Z'
          total: 1
          total_capped: false
    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.