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

# Publish the shortlist to the client

> Publish the live shortlist as a new version the client's portal shows. It reaches the client, so it runs only from a proposal: preview_action, show the person, then apply_proposal once they agree. Calling this route directly is refused with proposal_required, and nothing is published. The version freezes who is on the shortlist when the proposal is applied, best first, with each person's name, title, company, place, LinkedIn address and why they are on it (a qualified match, or selected by the recruiter); never notes, scores' workings or removal reasons. Publishing a shortlist that hasn't changed returns the version already published. Send expected_members (how many people the person was shown, get_project's shortlisted) and a shortlist that has moved since is refused with shortlist_changed. Does not use credits. It reaches the client, so the MCP server asks the person first, showing who gets what.

Needs scope `shortlists:write`.



## OpenAPI

````yaml /openapi.json post /projects/{projectId}/shortlist/publish
openapi: 3.1.0
info:
  title: Revcenter API
  version: v1
  description: >-
    Projects, searches, scored candidates and shortlists. Generated from the
    agent API's registry.
servers:
  - url: https://api.revcenter.ai/v1
security:
  - bearer: []
tags:
  - name: Login
  - name: Account
  - name: Actions
  - name: Reference
  - name: Projects
  - name: Searches
  - name: Scoring
  - name: Shortlists
  - name: Candidates
  - name: Webhooks
  - name: Health
paths:
  /projects/{projectId}/shortlist/publish:
    post:
      tags:
        - Shortlists
      summary: Publish the shortlist to the client
      description: >-
        Publish the live shortlist as a new version the client's portal shows.
        It reaches the client, so it runs only from a proposal: preview_action,
        show the person, then apply_proposal once they agree. Calling this route
        directly is refused with proposal_required, and nothing is published.
        The version freezes who is on the shortlist when the proposal is
        applied, best first, with each person's name, title, company, place,
        LinkedIn address and why they are on it (a qualified match, or selected
        by the recruiter); never notes, scores' workings or removal reasons.
        Publishing a shortlist that hasn't changed returns the version already
        published. Send expected_members (how many people the person was shown,
        get_project's shortlisted) and a shortlist that has moved since is
        refused with shortlist_changed. Does not use credits. It reaches the
        client, so the MCP server asks the person first, showing who gets what.


        Needs scope `shortlists:write`.
      operationId: publish_shortlist
      parameters:
        - name: projectId
          in: path
          required: true
          description: A project id
          schema:
            type: string
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                expected_members:
                  type: integer
                  minimum: 0
                  description: >-
                    How many people the person was shown; refused if the
                    shortlist holds a different number now.
            example:
              expected_members: 14
      responses:
        '201':
          description: Created
          headers:
            X-RateLimit-Limit:
              description: >-
                Requests allowed this minute (the tighter of the key's and the
                workspace's).
              schema:
                type: integer
            X-RateLimit-Remaining:
              description: Requests left this minute.
              schema:
                type: integer
            X-RateLimit-Reset:
              description: When the minute resets, in Unix seconds.
              schema:
                type: integer
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      project_id:
                        type: string
                      version_id:
                        type: string
                      version:
                        type: integer
                      members:
                        type: integer
                  meta:
                    $ref: '#/components/schemas/Meta'
              example:
                data:
                  project_id: 6f1c2a0e-3b7d-4c1e-9a52-0d4e8b7c1a11
                  version_id: 9a7c5e3b-1d2f-4a6b-8c0d-2e4f6a8b0c13
                  version: 2
                  members: 14
                meta:
                  request_id: req_01JABCDEF
        '400':
          $ref: '#/components/responses/Error'
        '401':
          $ref: '#/components/responses/Error'
        '402':
          $ref: '#/components/responses/Error'
        '403':
          $ref: '#/components/responses/Error'
        '404':
          $ref: '#/components/responses/Error'
        '409':
          $ref: '#/components/responses/Error'
        '429':
          $ref: '#/components/responses/Error'
        '500':
          $ref: '#/components/responses/Error'
        '503':
          $ref: '#/components/responses/Error'
components:
  schemas:
    Meta:
      type: object
      properties:
        request_id:
          type: string
        total:
          type: integer
          description: On lists that count everything that matched.
    Error:
      type: object
      required:
        - error
      properties:
        error:
          type: object
          required:
            - code
            - message
            - request_id
          properties:
            code:
              type: string
              description: 'Stable: every code is on the Errors page.'
            message:
              type: string
            details:
              type:
                - object
                - 'null'
              description: >-
                Structured specifics, when there are any (for example
                retry_after_seconds).
            request_id:
              type: string
        meta:
          $ref: '#/components/schemas/Meta'
      example:
        error:
          code: search_not_found
          message: No search with that id in this workspace.
          details: null
          request_id: req_01JABCDEF
        meta:
          request_id: req_01JABCDEF
  responses:
    Error:
      description: 'An error: one envelope everywhere. A 429 carries Retry-After.'
      headers:
        X-RateLimit-Limit:
          description: >-
            Requests allowed this minute (the tighter of the key's and the
            workspace's).
          schema:
            type: integer
        X-RateLimit-Remaining:
          description: Requests left this minute.
          schema:
            type: integer
        X-RateLimit-Reset:
          description: When the minute resets, in Unix seconds.
          schema:
            type: integer
        Retry-After:
          description: Seconds to wait (on 429 and 503).
          schema:
            type: integer
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  securitySchemes:
    bearer:
      type: http
      scheme: bearer
      description: An API key from Settings → Usage → API (rvc_live_…).

````

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