---
title: "Pattern search across screeners"
method: POST
path: "/patterns"
tags: ["Patterns"]
---

# Pattern search across screeners

`POST /patterns`

## Request

- Base URL: `https://stockmarketscan.com/api/v1`
- URL: `https://stockmarketscan.com/api/v1/patterns`
- Auth: one of:
  - API key in header `X-API-Key`
  - HTTP bearer
  - API key in header `X-RapidAPI-Key`

For each requested screener, takes the stocks on its latest snapshot
and returns those with a recent pattern (computed within 3 days for
`1d`, 14 days for `1wk`). Unknown slugs are 400 `SCREENER_NOT_FOUND`,
screeners above your plan are 403 `SCREENER_NOT_ACCESSIBLE`, unknown
pattern ids are 400 `INVALID_PARAMETER`. Grouped per screener and
capped by `limit` per group; not cursor-paginated. Not cached.

## Request body

- object
  - `screeners` ScreenerSlug[], required
  - `patterns` PatternId[]: Pattern ids to keep. Empty or omitted means any pattern.
  - `interval` '1d' | '1wk'
  - `limit` integer: Max stocks per screener group.

## Response `200`

Pattern search results

- object
  - `data` PatternSearchGroup[], required
    - `screener_slug` 'strong-volume-gains' | 'top-tech-stocks' | 'income-and-growth' | 'golden-cross' | 'hot-prospects' | 'rsi-oversold' | 'rsi-overbought' | 'fundamentally-fine' | 'dividend-prospects' | 'defensive-stocks' | 'best-reits' | 'top-penny-pops' | 'trend-seeker' | 'long-term-100-buy-signals' | 'unusual-options' | 'week-52-high-top-picks' | 'j-pattern' | 'upwards-base-consolidation' | 'nearing-6-month-highs' | 'day-3-bounce' | 'death-cross' | 'long-term-100-sell-signals' | 'lateral-price-range' | 'market-momentum', required
    - `screener_name` string, required
    - `count` integer, required: Matches before truncation to `limit`.
    - `truncated` boolean, required: True when stocks were cut to `limit`.
    - `stocks` PatternSearchStock[], required
      - `symbol` string, required
      - `symbol_name` string, nullable, required
      - `exchange` string, nullable, required
      - `industry` string, nullable, required
      - `last_price` number, nullable, required
      - `volume` number, nullable, required
      - `data_date` string, date, nullable, required
      - `matched_patterns` PatternHit[], required
        - `id` 'double_top' | 'double_bottom' | 'triple_top' | 'triple_bottom' | 'head_shoulders' | 'inv_head_shoulders' | 'round_bottom' | 'cup_handle' | 'asc_triangle' | 'desc_triangle' | 'sym_triangle' | 'channel_up' | 'channel_down' | 'rectangle' | 'flag' | 'wedge_rising' | 'wedge_falling' | 'abcd' | 'gartley' | 'bat' | 'butterfly' | 'crab' | 'impulse_wave' | 'corrective_wave', required
        - `label` string, required
        - `direction` 'bullish' | 'bearish' | 'neutral', required
        - `strength` number, nullable, required: Pattern confidence 0 to 100.
        - `forming_status` 'forming' | 'near-breakout', required
  - `meta` object, required: Response metadata. Endpoint-specific keys are documented per operation.
    - `as_of` string, date, nullable, required: Trading date of the underlying data. Null when there is no data.
    - `generated_at` string, date-time, required: When this response was produced (RFC 3339 UTC).
    - `pagination` Pagination: Present on list endpoints. Follow `next_cursor` until it is null.
      - `limit` integer, required: Page size that was applied.
      - `next_cursor` string, nullable, required: Cursor for the next page; null on the last page.
      - `total` integer: Rows across all pages. Only where it is cheap and exact.
    - `parameters` object, required: Parameters applied after defaults.
      - `screeners` string[], required
      - `patterns` string[], required
      - `interval` '1d' | '1wk', required
      - `limit` integer, required
    - `total_unique_stocks` integer, required: Unique symbols matched across all groups, before truncation.

## Other responses

- `400`: Invalid parameter, cursor or body. Not counted against your quota.
- `401`: Missing or invalid credentials.
- `403`: Your plan does not include this endpoint or screener. Not counted against your quota.
- `429`: Rate limit or quota exceeded. `Retry-After` says when to retry.
- `500`: Unexpected server error. Quote `request_id` when reporting it.
- `503`: A dependency (database or key store) is unavailable.

---

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