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

# Send your own scores

> Write scores you computed yourself onto accounts. Each one becomes the account's ICP fit, so `get_context`, the accounts list, and tiers read it. It is checked against the deals you win and lose. The workspace must use its own scorer, see [Choose the scorer](/public-api/icp/scorer). Read-only keys cannot call this.

Writes scores you computed with your own system onto accounts. Each score becomes the account's ICP fit, so [`get_context`](/public-api/context), the accounts list, and tiers all read it. Every score is checked against the deals you win and lose, so you can see whether your model predicts revenue.

The workspace must use its own scorer first. See [Choose the scorer](/public-api/icp/scorer).

| Send | Writes |
| - | - |
| `identifier`, `score` | One account |
| `scores` | Up to 500 accounts |

`scorer` names your model, for example `acme-v3`. Change the name when you change the model, and the score history shows the switch.

Leave out `tier` and OpenNous derives it from the score and your [tier bands](/public-api/icp/tiers). Sending the same score again changes nothing. A new score keeps the old one in the account's history.

Accounts OpenNous has not seen come back as `unknown_identifier`. Record the account first, then send its score. The step-by-step guide is [Bring your own scorer](/getting-started/bring-your-own-scorer).


## OpenAPI

````yaml POST /v2/scores
openapi: 3.1.0
info:
  title: OpenNous REST API
  version: 2.0.0
  description: >-
    Read and write the OpenNous revenue context graph over HTTP. Authenticate
    with a workspace API key.
servers:
  - url: https://api.opennous.cloud
    description: OpenNous Cloud
security:
  - bearerAuth: []
  - apiKeyHeader: []
tags:
  - name: People
  - name: Accounts
  - name: Deals
  - name: Notes
  - name: Attention
  - name: Insights
  - name: Enrich & score
  - name: Organization
  - name: Workflows
  - name: Webhooks
    description: >-
      Subscribe to events and have them pushed to your own stack, with the
      account record attached.
  - name: Usage
paths:
  /v2/scores:
    post:
      tags:
        - Enrich & score
      summary: Send your own scores
      description: >-
        Write scores you computed yourself onto accounts. Each one becomes the
        account's ICP fit, so `get_context`, the accounts list, and tiers read
        it. It is checked against the deals you win and lose. The workspace must
        use its own scorer, see [Choose the scorer](/public-api/icp/scorer).
        Read-only keys cannot call this.
      operationId: postScores
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - scorer
              properties:
                scorer:
                  type: string
                  pattern: ^[A-Za-z0-9][A-Za-z0-9._\-/]{0,63}$
                  description: >-
                    A name for your model, such as `acme-v3`. Stored on each
                    score as `ext:acme-v3`, so a new version shows in the score
                    history.
                identifier:
                  type: string
                  description: Email, domain, LinkedIn URL, or entity UUID.
                score:
                  type: number
                  minimum: 0
                  maximum: 100
                  description: Your score. Rounded to a whole number.
                tier:
                  type: string
                  enum:
                    - tier_1
                    - tier_2
                    - tier_3
                    - not_icp
                  description: >-
                    Optional. Derived from the score and the workspace tier
                    bands when left out.
                reason:
                  type: string
                  maxLength: 500
                  description: >-
                    Optional. Why it scored this way. Shown on the record and to
                    agents.
                scores:
                  type: array
                  maxItems: 500
                  items:
                    type: object
                    required:
                      - identifier
                      - score
                    properties:
                      identifier:
                        type: string
                        description: Email, domain, LinkedIn URL, or entity UUID.
                      score:
                        type: number
                        minimum: 0
                        maximum: 100
                        description: Your score. Rounded to a whole number.
                      tier:
                        type: string
                        enum:
                          - tier_1
                          - tier_2
                          - tier_3
                          - not_icp
                        description: >-
                          Optional. Derived from the score and the workspace
                          tier bands when left out.
                      reason:
                        type: string
                        maxLength: 500
                        description: >-
                          Optional. Why it scored this way. Shown on the record
                          and to agents.
                  description: Up to 500 scores in one call. Use this or the single fields.
            examples:
              one:
                summary: One account
                value:
                  scorer: acme-v3
                  identifier: sarah@acme.com
                  score: 82
                  reason: Fintech, 40 staff, hiring SDRs
              batch:
                summary: A batch
                value:
                  scorer: acme-v3
                  scores:
                    - identifier: acme.com
                      score: 91
                      tier: tier_1
                    - identifier: tom@globex.io
                      score: 34
      responses:
        '200':
          description: >-
            A single result, or `{ scorer, results }` for a batch. Each row
            reports its own outcome, so one bad row does not fail the batch.
          content:
            application/json:
              schema:
                oneOf:
                  - type: object
                    properties:
                      identifier:
                        type: string
                      resolved:
                        type: boolean
                      entity_id:
                        type: string
                      status:
                        type: string
                        enum:
                          - staked
                          - updated
                          - unchanged
                        description: >-
                          `staked` is a first score. `updated` moved an open
                          score and kept the old one in the history. `unchanged`
                          sent the same score again.
                      prediction_id:
                        type: string
                      score:
                        type: integer
                      tier:
                        type: string
                        enum:
                          - tier_1
                          - tier_2
                          - tier_3
                          - not_icp
                      from:
                        type:
                          - integer
                          - 'null'
                        description: The previous score, on `updated` and `unchanged`.
                      reason:
                        type: string
                        enum:
                          - unknown_identifier
                          - ambiguous
                        description: >-
                          Why a row did not resolve. Record an unknown account
                          first, then score it.
                      candidates:
                        type: array
                        items:
                          type: object
                        description: On `ambiguous`. Send one of their entity ids.
                      error:
                        type: string
                        enum:
                          - identifier_required
                          - invalid_score
                          - invalid_tier
                          - invalid_reason
                  - type: object
                    properties:
                      scorer:
                        type: string
                      results:
                        type: array
                        items:
                          type: object
                          properties:
                            identifier:
                              type: string
                            resolved:
                              type: boolean
                            entity_id:
                              type: string
                            status:
                              type: string
                              enum:
                                - staked
                                - updated
                                - unchanged
                              description: >-
                                `staked` is a first score. `updated` moved an
                                open score and kept the old one in the history.
                                `unchanged` sent the same score again.
                            prediction_id:
                              type: string
                            score:
                              type: integer
                            tier:
                              type: string
                              enum:
                                - tier_1
                                - tier_2
                                - tier_3
                                - not_icp
                            from:
                              type:
                                - integer
                                - 'null'
                              description: >-
                                The previous score, on `updated` and
                                `unchanged`.
                            reason:
                              type: string
                              enum:
                                - unknown_identifier
                                - ambiguous
                              description: >-
                                Why a row did not resolve. Record an unknown
                                account first, then score it.
                            candidates:
                              type: array
                              items:
                                type: object
                              description: On `ambiguous`. Send one of their entity ids.
                            error:
                              type: string
                              enum:
                                - identifier_required
                                - invalid_score
                                - invalid_tier
                                - invalid_reason
              example:
                scorer: acme-v3
                results:
                  - identifier: acme.com
                    resolved: true
                    entity_id: 6f1c...
                    status: updated
                    prediction_id: a2b9...
                    score: 91
                    tier: tier_1
                    from: 78
                  - identifier: tom@globex.io
                    resolved: false
                    reason: unknown_identifier
        '400':
          description: The request or a single row is invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                scorer:
                  summary: scorer_required
                  value:
                    error: scorer_required
                empty:
                  summary: scores_empty
                  value:
                    error: scores_empty
                big:
                  summary: batch_too_large
                  value:
                    error: batch_too_large
                    max: 500
                score:
                  summary: invalid_score
                  value:
                    identifier: sarah@acme.com
                    error: invalid_score
                    hint: a number from 0 to 100
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          $ref: '#/components/responses/UpgradeRequired'
        '403':
          $ref: '#/components/responses/ReadOnlyKey'
        '409':
          description: The workspace is scored by Nous. Switch it to `external` first.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error: scorer_not_external
                hint: >-
                  this workspace is scored by Nous; PUT /v2/icp/scorer { scorer:
                  'external' } first
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
components:
  schemas:
    Error:
      type: object
      description: >-
        Every error response. `error` is a stable machine code. Some errors add
        fields such as `detail`, `supported`, `max`, or `reason`.
      required:
        - error
      properties:
        error:
          type: string
          description: Machine-readable error code.
        detail:
          type: string
          description: Human-readable explanation, when there is one.
      additionalProperties: true
  responses:
    Unauthorized:
      description: Missing, unknown, or expired API key.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            missing:
              summary: api_key_required
              value:
                error: api_key_required
            invalid:
              summary: invalid_api_key
              value:
                error: invalid_api_key
            expired:
              summary: api_key_expired
              value:
                error: api_key_expired
                detail: >-
                  This API key has expired. Create or rotate a key to get a
                  fresh one.
    UpgradeRequired:
      description: The workspace is past its monthly operations limit and grace window.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: upgrade_required
            reason: ops_limit_reached
            current_plan: starter
            upgrade_url: /settings?section=billing
    ReadOnlyKey:
      description: A read-only key called a write endpoint.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: read_only_key
            detail: >-
              This API key is read-only — it can read context but cannot record,
              modify, connect, or send. Use a read/write key for write
              operations.
    RateLimited:
      description: More than 600 requests in a minute on this key.
      headers:
        RateLimit-Limit:
          schema:
            type: integer
          description: Requests allowed per window.
        RateLimit-Remaining:
          schema:
            type: integer
          description: Requests left in the window.
        RateLimit-Reset:
          schema:
            type: integer
          description: Seconds until the window resets.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: rate_limited
    InternalError:
      description: Unexpected server error.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: internal_error
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: Workspace API key. Create one in **Settings → API keys**.
    apiKeyHeader:
      type: apiKey
      in: header
      name: X-API-Key
      description: The same key, sent as a header.

````

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