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

# Create a share link

> Snapshots a shortlist into a passwordless link anyone can open — no Revcenter account needed. The snapshot is frozen at creation: later changes to the search do not alter what a recipient sees, and contact details are stripped from the public payload.

Only completed candidate searches can be shared. Scores below 80 are never shareable, whatever selection mode you use.



## OpenAPI

````yaml /openapi.json post /api/scans/{id}/share
openapi: 3.1.0
info:
  title: Revcenter API
  description: >-
    Search, enrich, and activate people and companies. Two authentication
    surfaces share one host: the bearer-token API under `/v1` for
    server-to-server and agent use, and the workspace-session API under `/api`
    that the Revcenter app itself runs on.
  version: '2026-08-12'
servers:
  - url: https://api.revcenter.ai
    description: Production
security:
  - bearerAuth: []
tags:
  - name: Search
    description: Web search, search runs, results, exports, and shareable shortlists.
  - name: People
    description: Person search, profile enrichment, and the workspace contact pool.
  - name: Companies
    description: Company search, company enrichment, and org-chart people.
  - name: Campaigns
    description: Plan, publish, and launch outbound sequences on Smartlead and HeyReach.
  - name: Account
    description: Health, usage totals, and cost events.
paths:
  /api/scans/{id}/share:
    post:
      tags:
        - Search
      summary: Create a share link
      description: >-
        Snapshots a shortlist into a passwordless link anyone can open — no
        Revcenter account needed. The snapshot is frozen at creation: later
        changes to the search do not alter what a recipient sees, and contact
        details are stripped from the public payload.


        Only completed candidate searches can be shared. Scores below 80 are
        never shareable, whatever selection mode you use.
      operationId: createScanShare
      parameters:
        - $ref: '#/components/parameters/ScanId'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                selectionMode:
                  type: string
                  enum:
                    - top_n
                    - all_qualified
                    - manual
                  default: top_n
                  description: >-
                    `top_n` takes the highest-ranked `limit` leads,
                    `all_qualified` takes every lead at or above `minScore`, and
                    `manual` takes exactly the `candidateIds` you name.
                limit:
                  type: integer
                  minimum: 1
                  maximum: 500
                  default: 20
                  description: >-
                    Used by `top_n` only. Clamped to 1–500, so lists well past
                    80 leads are fine.
                minScore:
                  type: integer
                  minimum: 80
                  maximum: 100
                  default: 80
                  description: Score floor. Values below 80 are raised to 80.
                candidateIds:
                  type: array
                  items:
                    type: string
                  description: Required when `selectionMode` is `manual`. Capped at 500.
            examples:
              topTwenty:
                summary: Top 20 by rank
                value:
                  selectionMode: top_n
                  limit: 20
              everyQualified:
                summary: Every qualified lead
                value:
                  selectionMode: all_qualified
                  minScore: 85
              handPicked:
                summary: A hand-picked shortlist
                value:
                  selectionMode: manual
                  candidateIds:
                    - cand_a1b2
                    - cand_c3d4
      responses:
        '201':
          description: The share link was created.
          content:
            application/json:
              schema:
                type: object
                properties:
                  share:
                    type: object
                    properties:
                      id:
                        type:
                          - string
                          - 'null'
                        format: uuid
                      url:
                        type: string
                        format: uri
                        description: The passwordless URL to send.
                      createdAt:
                        type:
                          - string
                          - 'null'
                        format: date-time
                      shared:
                        type: integer
                        description: How many leads the snapshot contains.
        '400':
          $ref: '#/components/responses/AppBadRequest'
        '401':
          $ref: '#/components/responses/AppUnauthorized'
        '404':
          $ref: '#/components/responses/AppNotFound'
        '409':
          $ref: '#/components/responses/AppConflict'
        '502':
          $ref: '#/components/responses/AppUpstreamError'
      security:
        - sessionCookie: []
components:
  parameters:
    ScanId:
      name: id
      in: path
      required: true
      description: The search ID.
      schema:
        type: string
        format: uuid
  responses:
    AppBadRequest:
      description: Missing or invalid input.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/AppError'
          examples:
            missing:
              value:
                error: criteria (CriteriaV2) is required
    AppUnauthorized:
      description: >-
        Not signed in, no active workspace, or the account lacks the role this
        action needs. A frozen account gets `403` with code `frozen`.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/AppError'
          examples:
            signIn:
              value:
                error: Sign in required
    AppNotFound:
      description: >-
        The record does not exist, or belongs to another workspace. The two are
        deliberately indistinguishable.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/AppError'
          examples:
            notFound:
              value:
                error: Scan not found
    AppConflict:
      description: The record is in a state that does not allow this action.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/AppError'
          examples:
            running:
              value:
                error: Scan is already running
            notAwaiting:
              value:
                error: Campaign is not awaiting launch
    AppUpstreamError:
      description: A downstream service or the database failed.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/AppError'
          examples:
            upstream:
              value:
                error: Spec extraction failed
  schemas:
    AppError:
      type: object
      description: >-
        The error shape used by every `/api` endpoint. Flatter than the `/v1`
        shape, and `code` appears only where the UI branches on it.
      properties:
        error:
          type: string
        code:
          type: string
          examples:
            - search_unavailable
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        A Revcenter API key: `Authorization: Bearer rvc_live_...`. Keys are
        scoped, rate limited per key, and metered per workspace.
    sessionCookie:
      type: apiKey
      in: cookie
      name: session
      description: >-
        A signed-in workspace session, sent as a browser cookie. Requests must
        include credentials, and act on the session's active workspace.

````