---
title: "Get Public Bench"
method: GET
path: "/api/public/bench"
tags: ["public-bench"]
---

# Get Public Bench

`GET /api/public/bench`

## Request

- Base URL: `https://api.ruzora.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.ruzora.com/api/public/bench`
- Auth: none declared

The live bench payload.

Rate limit is generous because the expected caller is one Next.js ISR
revalidation every few minutes, not a browser — but the route is on the
open internet, so it is not unlimited.

A DB failure returns the self-hiding state rather than a 500: a marketing
page that renders its "tell us the role" fallback during an incident is
strictly better than one that renders an error to paid traffic.

## Response `200`

Successful Response

- PublicBenchOut: ``sufficient=false`` is the self-hiding state: no cards, no chips. The consumer renders a role-request page instead of a bench. NO ENGINEER NUMBERS (Roberto, 2026-10-10, funnel wave E6): this route is public, so it publishes no bench size, no per-stack counts and no floor. ``sufficient`` is the only availability signal. The service still computes the numbers internally (the floor, the self-hiding rule); they stop here. Back-compat for readers built on the old shape: * ``available_now`` and ``minimum_required`` stay as keys and are always ``null`` (every reader already handles null as "not published"); * ``stacks`` is always ``[]`` (readers that printed per-stack counts print nothing instead of "undefined"); * the chips moved to ``stack_filters`` (slug + label, no count).
  - `sufficient` boolean, required
  - `available_now` unknown
  - `minimum_required` unknown
  - `cards` BenchCardOut[]
    - `display_name` string, required
    - `seniority_label` string, required
    - `years_experience_range` string, required
    - `availability_window` string, required
    - `bio` string, required
    - `skills_display` string[], required
    - `timezone_overlap_hours` integer, required
    - `stacks_verified` string[]
    - `stack_slugs` string[]
    - `ref` string, nullable
    - `intent` BenchIntentOut: Sol feature #7: what the engineer wants. Closed-vocabulary codes only (``ruzora_db.engineer_intent``); the Literal types make this response model a third gate after the DB CHECK and ``blind_intent``.
      - `work_types` string[]
      - `team_size` 'solo' | 'small' | 'mid' | 'large' | 'any', nullable
      - `engagement` 'short' | 'medium' | 'long' | 'any', nullable
  - `stacks` BenchStackOut[]
    - `slug` string, required
    - `label` string, required
  - `stack_filters` BenchStackOut[]
    - `slug` string, required
    - `label` string, required

---

[API](https://skmtc.dev/ruzora/apis/ruzora-candidate-crm-api.md) · [All operations](https://skmtc.dev/ruzora/apis/ruzora-candidate-crm-api/llms.txt) · [OpenAPI document](https://skmtc.dev/ruzora/apis/ruzora-candidate-crm-api/revisions/f9b8223f3ac4?raw)
