# Get Current Key

> Describe the calling API key, its workspace, plan, per-class rate limits and credit balances.

<Note>
  **Beta.** This endpoint is not in production yet and may change before it ships.
</Note>

Requires an API key with the `read` scope. Use it to check which workspace a key belongs to and what it may do. The key secret and its hash are never returned.

## Response

<ResponseField name="data" type="object">
  Result.

  <Expandable title="data">
    <ResponseField name="key" type="object">
      The calling key.

      <Expandable title="key">
        <ResponseField name="id" type="string">Key identifier.</ResponseField>
        <ResponseField name="name" type="string">Key name.</ResponseField>
        <ResponseField name="prefix" type="string">First characters of the key, for identification.</ResponseField>
        <ResponseField name="scopes" type="array">`read`, `write`, or both.</ResponseField>
        <ResponseField name="createdAt" type="string">ISO 8601 timestamp.</ResponseField>
        <ResponseField name="lastUsedAt" type="string">ISO 8601 timestamp of this request: a key is stamped on every authenticated call.</ResponseField>
      </Expandable>
    </ResponseField>
    <ResponseField name="workspace" type="object">
      The workspace the key is confined to.

      <Expandable title="workspace">
        <ResponseField name="id" type="string">Workspace identifier.</ResponseField>
        <ResponseField name="name" type="string">Workspace name.</ResponseField>
      </Expandable>
    </ResponseField>
    <ResponseField name="plan" type="object">
      The workspace's effective plan.

      <Expandable title="plan">
        <ResponseField name="name" type="string">Plan name, for example `free`, `starter` or `pro`. A lapsed subscription reports `free`.</ResponseField>
        <ResponseField name="limits" type="object">`monthlyEmailLimit`, `dailySafetyCap`, `maxContacts`, `maxTeamMembers`, `maxWarmupAccounts`, `aiCredits`, `monthlyLeadFinderCredits`, `monthlyVerificationCredits`. `-1` means no cap.</ResponseField>
      </Expandable>
    </ResponseField>
    <ResponseField name="rateLimit" type="object">
      Request limits for the workspace. Each class has its own bucket, shared by every key and request in the workspace.

      <Expandable title="rateLimit">
        <ResponseField name="scope" type="string">Always `workspace`.</ResponseField>
        <ResponseField name="buckets" type="object">One entry per class: `poll`, `read`, `write`, `bulk`, `expensive`. Each is `{ "limitPerMinute": integer }` and already includes your plan's multiplier where one applies.</ResponseField>
      </Expandable>
    </ResponseField>
    <ResponseField name="credits" type="object">
      <Expandable title="credits">
        <ResponseField name="verification" type="object">`balance` (integer) and `expiresAt` (nearest expiry, or `null`).</ResponseField>
        <ResponseField name="leadFinder" type="object">`balance` (integer) and `expiresAt` (nearest expiry, or `null`).</ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

<RequestExample>
```bash cURL
curl -X GET "https://api.foxreach.io/api/v1/me" \
  -H "X-API-Key: otr_your_key"
```

```python Python SDK (beta)
from foxreach import FoxReach

client = FoxReach(api_key="otr_your_key")
me = client.me()
```

```typescript TypeScript SDK (beta)
import { FoxReach } from "foxreach";

const client = new FoxReach({ apiKey: "otr_your_key" });
const me = await client.me();
```
</RequestExample>

<ResponseExample>
```json
{
  "data": {
    "key": {
      "id": "cmkey123",
      "name": "CRM sync",
      "prefix": "otr_ab12",
      "scopes": ["read"],
      "createdAt": "2026-10-01T08:30:00",
      "lastUsedAt": "2026-11-04T09:00:00+00:00"
    },
    "workspace": { "id": "cmws123", "name": "Acme Outreach" },
    "plan": {
      "name": "starter",
      "limits": {
        "monthlyEmailLimit": 10000,
        "dailySafetyCap": 500,
        "maxContacts": 3000,
        "maxTeamMembers": 1,
        "maxWarmupAccounts": 5,
        "aiCredits": 1000,
        "monthlyLeadFinderCredits": 50,
        "monthlyVerificationCredits": 0
      }
    },
    "rateLimit": {
      "scope": "workspace",
      "buckets": {
        "poll": { "limitPerMinute": 600 },
        "read": { "limitPerMinute": 300 },
        "write": { "limitPerMinute": 120 },
        "bulk": { "limitPerMinute": 100 },
        "expensive": { "limitPerMinute": 100 }
      }
    },
    "credits": {
      "verification": { "balance": 0, "expiresAt": null },
      "leadFinder": { "balance": 120, "expiresAt": "2027-01-15T00:00:00+00:00" }
    }
  }
}
```
</ResponseExample>

## Errors

| Status | Description |
|--------|-------------|
| `401` | Missing, invalid, revoked or expired API key |
| `403` | API key does not have the required scope: `read` |

## Rate Limit

- **600 requests per minute, shared by every `poll` call in your workspace.** Fixed 60-second window.
- Every response includes `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset` (unix epoch seconds) and `X-RateLimit-Bucket` (`poll`).
- A `429` response includes a `Retry-After` header (seconds until the bucket resets).

For client-side patterns (`Retry-After`, exponential backoff, monitoring `X-RateLimit-Remaining`), see [Rate Limiting](/rate-limiting).
