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

# Get Mark Price History

> Get mark price history for an instrument, bucketed by interval.
If no end time is provided, the current time will be used.
Maximum of 1000 entries returned per request.
Only buckets with at least one mark update are included.
For intervals of a minute or coarser, a bucket cut mid-way by `end_timestamp`
may be omitted, or may reflect the window's last mark at one-minute fidelity.


<Badge color="gray" size="md">Request Weight: **5**</Badge>

<br />

<Badge color="gray" size="md">Cached for 2s. A request served from cache costs **1**</Badge>


## OpenAPI

````yaml /api-spec/perps-openapi.json get /v1/info/mark-history
openapi: 3.0.3
info:
  title: Polymarket Perps HTTP API
  version: 1.0.0
  description: HTTP API for Polymarket perpetual trading system.
  license:
    name: Apache 2.0
    url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
  - url: https://api.perpetuals.polymarket.com
    description: Production Perps HTTP API
security: []
paths:
  /v1/info/mark-history:
    get:
      summary: Get Mark Price History
      description: >
        Get mark price history for an instrument, bucketed by interval.

        If no end time is provided, the current time will be used.

        Maximum of 1000 entries returned per request.

        Only buckets with at least one mark update are included.

        For intervals of a minute or coarser, a bucket cut mid-way by
        `end_timestamp`

        may be omitted, or may reflect the window's last mark at one-minute
        fidelity.
      operationId: getMarkHistory
      parameters:
        - name: instrument_id
          in: query
          required: true
          schema:
            type: integer
            format: int64
            minimum: 0
            maximum: 4294967295
            description: Instrument ID
        - name: interval
          in: query
          required: true
          schema:
            $ref: '#/components/schemas/interval'
        - name: start_timestamp
          in: query
          required: true
          schema:
            $ref: '#/components/schemas/start_timestamp'
        - name: end_timestamp
          in: query
          required: false
          schema:
            $ref: '#/components/schemas/end_timestamp'
      responses:
        '200':
          description: Mark price history response.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MarkHistoryResponse'
        '400':
          $ref: '#/components/responses/Error400Response'
        '429':
          $ref: '#/components/responses/Error429Response'
        '500':
          $ref: '#/components/responses/Error500Response'
      security: []
components:
  schemas:
    interval:
      type: string
      description: Kline interval
      enum:
        - 1s
        - 1m
        - 5m
        - 15m
        - 30m
        - 1h
        - 4h
        - 6h
        - 12h
        - 1d
        - 1w
    start_timestamp:
      type: integer
      description: Start timestamp in milliseconds
      example: 1767225600000
    end_timestamp:
      type: integer
      description: End timestamp in milliseconds
      example: 1767229200000
    MarkHistoryResponse:
      type: object
      required:
        - data
        - more
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/mark_point'
          maxItems: 1000
        more:
          $ref: '#/components/schemas/more'
    mark_point:
      type: array
      description: |
        - `1767225600000` - Bucket open time (ms)
        - `"160.00"` - Last mark price in bucket
      example:
        - 1767225600000
        - '160.00'
    more:
      type: boolean
      description: More data available
    Error400:
      title: Error400
      type: object
      required:
        - status
        - error
      properties:
        status:
          type: string
          enum:
            - err
        error:
          $ref: '#/components/schemas/error'
    Error429:
      title: Error429
      type: object
      required:
        - status
        - error
      properties:
        status:
          type: string
          enum:
            - err
        error:
          $ref: '#/components/schemas/error'
    Error500:
      title: Error500
      type: object
      required:
        - status
        - error
      properties:
        status:
          type: string
          enum:
            - err
        error:
          $ref: '#/components/schemas/error'
    error:
      type: string
      description: >-
        Error identifier. For domain rejections and transport errors
        (`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
        identifier that is part of the API contract and safe to branch on, e.g.
        `insufficient_margin`, `insufficient_balance`, `order_not_found`,
        `reduce_only_invalid`, `price_outside_bounds`, `position_not_found`,
        `invalid_margin_mode`, `invalid_margin_amount`,
        `margin_below_required_initial`, `account_liquidating`, `unauthorized`,
        `not_found`. For `400` it is a human-readable validation detail whose
        wording may change. See the Error handling guide for the domain
        identifiers. (Post-only / Fill-or-Kill outcomes are order statuses such
        as `post_only_rejected`, not rejections.)
      example: insufficient_margin
  responses:
    Error400Response:
      description: |
        Bad request — the request was malformed or failed validation (bad query
        parameters, unparseable body, invalid signature, or a domain pre-check).
        The `error` field is a human-readable validation detail.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error400'
    Error429Response:
      description: >
        Too Many Requests. `error` distinguishes the limit that was hit:

        `ip_rate_limited` (per-IP token bucket), `action_rate_limited`
        (per-account

        action rate), or `open_orders_limit` (resting open-order cap).
      headers:
        Retry-After:
          description: >
            Whole seconds to wait before retrying. Present only on token-bucket

            rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
            a

            conservative estimate of when enough capacity will have refilled to

            admit the request. Absent on `open_orders_limit`, which is a
            capacity

            limit, not a rate limit — waiting does not free order slots; cancel

            resting orders or wait for fills instead.
          schema:
            type: integer
            example: 2
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error429'
    Error500Response:
      description: |
        Internal server error. `error` is `internal_error`.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error500'

````