---
title: "Short-locate costs: what it costs to locate (borrow for shorting) shares of every"
method: GET
path: "/v1/short-locates"
---

# Short-locate costs: what it costs to locate (borrow for shorting) shares of every

`GET /v1/short-locates`

## Request

- Base URL: `https://api.alphanume.com`
- URL: `https://api.alphanume.com/v1/short-locates`
- Auth: one of:
  - API key in header `X-API-Key`
  - HTTP bearer

Short-locate costs: what it costs to locate (borrow for shorting) shares of every
hard-to-borrow US stock, observed twice a day -- point-in-time, never revised.

One row per (date, slot, ticker). Each sweep prices every listed US stock the broker
marks NOT easy-to-borrow (~7,500 names). Served per row: date (US/Eastern trading
date of the sweep), slot (am / pm), snapshot_time_utc (when the sweep ran, UTC to
the minute, e.g. '2026-10-15 11:45' -- every row of a sweep shares it), ticker, status, price_per_share (USD per share),
cost_per_100 (USD to locate 100 shares) and available_qty (shares that can be
located right now). price_per_share and cost_per_100 are NULL unless status is
'offered'; available_qty is NULL unless a quote came back (0 for 'no_shares').

Typical uses: the borrow cost of a short idea on a given morning, names whose
locate cost spiked or whose availability dried up, threshold-list membership over
time, and the cost side of a short-selling backtest from 2026-10-08 onward.

Requires an Alphanume Pro API key. There is no date clamp on this route.

Honest limits, stated plainly. These are one broker's (Alpaca's) locate quotes for
its own inventory, not a market-wide borrow rate -- another broker can quote the same
name 2x higher or lower. Names the broker lends freely (easy-to-borrow) are not in
the dataset. History starts 2026-10-08 and there is no backfill: locate quotes only
exist live. Two sweeps a day, so intraday moves between sweeps are not captured.

Default order: newest date first, pm before am, then ticker, so the first page is the
latest sweep. One sweep is ~7,500 rows: filter by ticker, date, slot or status to keep
results small.

Pagination: results are capped at 50,000 rows per request; when the response has
has_more=true, pass next_cursor's cursor_date, cursor_slot and cursor_ticker back to
fetch the next page.

## Query parameters

- `ticker` string
- `date` string
- `date_gte` string
- `date_lte` string
- `date_gt` string
- `date_lt` string
- `slot` 'am' | 'pm'
- `status` 'offered' | 'no_shares' | 'threshold' | 'unavailable' | 'corporate_action' | 'error'
- `min_cost_per_100` number
- `cursor_date` string
- `cursor_slot` 'am' | 'pm'
- `cursor_ticker` string

## Response `200`

Matching rows.

- PaginatedEnvelope
  - `count` integer, required
  - `data` object[], required
  - `has_more` boolean, required
  - `next_cursor` object, nullable, required: Keyset cursor: pass its fields back as the cursor_* query parameters to fetch the next page.

## Other responses

- `400`: Invalid or conflicting query parameters.
- `401`: Missing or unrecognized API key.
- `403`: PRO_SUBSCRIPTION_REQUIRED: the key's plan does not include API access (every endpoint requires an active Pro subscription), or this Pro-only dataset is not covered by the key. No choice of dates makes the request succeed. The data is not missing.
- `429`: Rate limit exceeded (600/min); the body carries retry_after_seconds.

---

[API](https://skmtc.dev/alphanume/apis/alphanume-api.md) · [All operations](https://skmtc.dev/alphanume/apis/alphanume-api/llms.txt) · [OpenAPI document](https://skmtc.dev/alphanume/apis/alphanume-api/revisions/2cb83f10bba4?raw)
