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

# Rate Limit

> Inspect client IP rate limit status, daily quota balance, and reset timers.

The `/rate-limit` endpoint returns the calling client's current IP rate limit status, short-burst minute allowance, and daily query quota balances.

### Rate Limiting Architecture

Hexagraph Core protects service capacity using a dual-tiered rate limiter:

* **Short-Burst Minute Limit**: **30 requests / min** per IP address across all REST & GraphQL routes.
* **Daily List/Filter Quota**: **500 requests / day** per IP address for list and filter endpoints across all entities.
* **Daily Search Quota**: **50 requests / day** per IP address for `/autocomplete` routes.
* **System Daily Pool Cap**: **10,000 List / 1,000 Search** total system capacity.

### Response Headers

Every API response from Hexagraph includes real-time rate limit headers for client monitoring:

```http theme={null}
X-RateLimit-IP-Limit: 30
X-RateLimit-IP-Remaining: 28
X-RateLimit-IP-Reset-Seconds: 42
X-RateLimit-Daily-Limit: 500
X-RateLimit-Daily-Remaining: 455
```

### Response Fields

<ResponseField name="ip" type="string" required>
  Client IP address detected by the gateway.
</ResponseField>

<ResponseField name="minute_rate_limit" type="object" required>
  Short-burst 1-minute rate limit window.

  <Expandable title="minute_rate_limit attributes">
    <ResponseField name="limit" type="integer">Maximum requests allowed per minute (default `30`).</ResponseField>
    <ResponseField name="remaining" type="integer">Remaining requests available in current minute window.</ResponseField>
    <ResponseField name="reset_seconds" type="integer">Seconds remaining until current minute window resets.</ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="daily_quota" type="object" required>
  24-hour rolling daily quotas.

  <Expandable title="daily_quota attributes">
    <ResponseField name="list_filter" type="object">
      <Expandable title="list_filter attributes">
        <ResponseField name="limit" type="integer">Daily list/filter query limit (default `500`).</ResponseField>
        <ResponseField name="remaining" type="integer">Remaining daily list/filter queries.</ResponseField>
        <ResponseField name="reset_seconds" type="integer">Seconds remaining until daily reset at 00:00:00 UTC.</ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="search" type="object">
      <Expandable title="search attributes">
        <ResponseField name="limit" type="integer">Daily autocomplete search limit (default `50`).</ResponseField>
        <ResponseField name="remaining" type="integer">Remaining daily search queries.</ResponseField>
        <ResponseField name="reset_seconds" type="integer">Seconds remaining until daily reset.</ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

<RequestExample>
  ```bash cURL theme={null}
  curl -X GET "https://api.hexagraph.in/rate-limit"
  ```

  ```javascript JavaScript theme={null}
  fetch("https://api.hexagraph.in/rate-limit")
    .then(response => response.json())
    .then(data => console.log(data));
  ```

  ```python Python theme={null}
  import requests

  response = requests.get("https://api.hexagraph.in/rate-limit")
  print(response.json())
  ```

  ```go Go theme={null}
  package main

  import (
  	"fmt"
  	"io"
  	"net/http"
  )

  func main() {
  	resp, err := http.Get("https://api.hexagraph.in/rate-limit")
  	if err != nil {
  		fmt.Println("Error:", err)
  		return
  	}
  	defer resp.Body.Close()
  	body, _ := io.ReadAll(resp.Body)
  	fmt.Println(string(body))
  }
  ```
</RequestExample>

<ResponseExample>
  ```json 200 OK theme={null}
  {
    "ip": "203.0.113.195",
    "minute_rate_limit": {
      "limit": 30,
      "remaining": 28,
      "reset_seconds": 42
    },
    "daily_quota": {
      "list_filter": {
        "limit": 500,
        "remaining": 455,
        "reset_seconds": 43200
      },
      "search": {
        "limit": 50,
        "remaining": 46,
        "reset_seconds": 43200
      }
    }
  }
  ```

  ```json 429 Too Many Requests (Minute Burst Exceeded) theme={null}
  {
    "statusCode": 429,
    "error": "Too Many Requests",
    "message": "IP rate limit exceeded (max 30 requests per minute). Please try again in 42 seconds (at 11:40:32 UTC).",
    "reset_in_seconds": 42,
    "reset_at_utc": "2026-08-05T11:40:32.000Z"
  }
  ```

  ```json 429 Too Many Requests (Daily Quota Exceeded) theme={null}
  {
    "statusCode": 429,
    "error": "Too Many Requests",
    "message": "Your daily quota for List/Filter requests has been exceeded. Please try again in 3 hours, 14 minutes, and 22 seconds (at 00:00:00 UTC).",
    "reset_in_seconds": 11662,
    "reset_at_utc": "2026-08-06T00:00:00.000Z"
  }
  ```
</ResponseExample>
