# Account endpoints

> Check which member and key a request runs as, see today's quota usage, and fetch the OpenAPI document.

Source: https://docs.urnextdoor.com/reference/account/

All paths are relative to `https://urnextdoor.com/api/v1`. See [API reference](https://docs.urnextdoor.com/reference.md) for the envelope and headers every endpoint shares.

| Endpoint | What it does | Scope | Daily quota |
| --- | --- | --- | --- |
| [`GET /me`](https://docs.urnextdoor.com/reference/account/#getMe) | Who am I | any key | not counted |
| [`GET /usage`](https://docs.urnextdoor.com/reference/account/#getUsage) | Today's quota usage | any key | not counted |
| [`GET /openapi.json`](https://docs.urnextdoor.com/reference/account/#getOpenapi) | OpenAPI document | public, no key | not counted |

## Who am I {#getMe}

`GET https://urnextdoor.com/api/v1/me`

Returns the member this key acts as and details of the key itself (name, prefix, scopes, expiry). Works with any valid key. Use it to test a key.

- **Auth:** your API key (Bearer or X-API-Key)
- **Scope:** any valid key
- **Daily quota:** not counted
- **operationId:** `getMe`

### Example

**cURL**

```bash
curl "https://urnextdoor.com/api/v1/me" \
  -H "Authorization: Bearer $UND_API_KEY"
```

**JavaScript**

```js
const res = await fetch("https://urnextdoor.com/api/v1/me", {
  headers: {
    Authorization: `Bearer ${process.env.UND_API_KEY}`,
  },
});
console.log(res.status, await res.json());
```

**Python**

```python
import os

import requests

api_key = os.environ["UND_API_KEY"]

response = requests.get(
    "https://urnextdoor.com/api/v1/me",
    headers={
        "Authorization": f"Bearer {api_key}",
    },
    timeout=30,
)
print(response.status_code, response.json())
```

**PHP**

```php
<?php
$apiKey = getenv('UND_API_KEY');

$ch = curl_init('https://urnextdoor.com/api/v1/me');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer ' . $apiKey,
    ],
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);

echo $status, PHP_EOL, $body, PHP_EOL;
```

Sample response: `200 OK`

```json
{
  "ok": true,
  "user": {
    "id": 7,
    "username": "aarav",
    "display_name": "Aarav",
    "plan": "free",
    "profile_url": "https://urnextdoor.com/users/aarav"
  },
  "key": {
    "id": 3,
    "name": "Claude Code",
    "prefix": "und_sk_7Hq2x",
    "scopes": [
      "content",
      "media",
      "schedule",
      "read"
    ],
    "created_at": "2026-10-15T09:00:00Z",
    "expires_at": "2027-01-13T09:00:00Z"
  },
  "request_id": "9f8e7d6c5b4a3921"
}
```

### Responses

| Status | Meaning | Codes |
| --- | --- | --- |
| `200 OK` | The member and the key. |   |
| `401 Unauthorized` | No key, or the key is unknown, malformed, revoked or expired, or the member is not active. | `missing_api_key`, `invalid_api_key` |
| `421 Misdirected Request` | Called on a community subdomain. Use https://urnextdoor.com. | `wrong_host` |
| `429 Too Many Requests` | Over 60 requests a minute from this member (or too many failed key checks from one address), or today's quota for this action is used up. | `rate_limited`, `quota_exceeded` |
| `500 Internal Server Error` | Our fault. Safe to retry with the same Idempotency-Key. | `server_error` |
| `503 Service Unavailable` | The API is switched off. | `api_disabled` |

## Today's quota usage {#getUsage}

`GET https://urnextdoor.com/api/v1/usage`

Returns your plan, the current UTC day, when counters reset, and used and remaining counts for each action. Works with any valid key and is not quota-counted.

- **Auth:** your API key (Bearer or X-API-Key)
- **Scope:** any valid key
- **Daily quota:** not counted
- **operationId:** `getUsage`

### Example

**cURL**

```bash
curl "https://urnextdoor.com/api/v1/usage" \
  -H "Authorization: Bearer $UND_API_KEY"
```

**JavaScript**

```js
const res = await fetch("https://urnextdoor.com/api/v1/usage", {
  headers: {
    Authorization: `Bearer ${process.env.UND_API_KEY}`,
  },
});
console.log(res.status, await res.json());
```

**Python**

```python
import os

import requests

api_key = os.environ["UND_API_KEY"]

response = requests.get(
    "https://urnextdoor.com/api/v1/usage",
    headers={
        "Authorization": f"Bearer {api_key}",
    },
    timeout=30,
)
print(response.status_code, response.json())
```

**PHP**

```php
<?php
$apiKey = getenv('UND_API_KEY');

$ch = curl_init('https://urnextdoor.com/api/v1/usage');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer ' . $apiKey,
    ],
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);

echo $status, PHP_EOL, $body, PHP_EOL;
```

Sample response: `200 OK`

```json
{
  "ok": true,
  "plan": "free",
  "day": "2026-10-15",
  "resets_at": "2026-10-16T00:00:00Z",
  "quotas": [
    {
      "action": "post",
      "limit": 20,
      "used": 3,
      "remaining": 17
    },
    {
      "action": "question",
      "limit": 20,
      "used": 0,
      "remaining": 20
    },
    {
      "action": "media",
      "limit": 50,
      "used": 2,
      "remaining": 48
    }
  ],
  "request_id": "9f8e7d6c5b4a3921"
}
```

### Responses

| Status | Meaning | Codes |
| --- | --- | --- |
| `200 OK` | Usage for the current UTC day. |   |
| `401 Unauthorized` | No key, or the key is unknown, malformed, revoked or expired, or the member is not active. | `missing_api_key`, `invalid_api_key` |
| `421 Misdirected Request` | Called on a community subdomain. Use https://urnextdoor.com. | `wrong_host` |
| `429 Too Many Requests` | Over 60 requests a minute from this member (or too many failed key checks from one address), or today's quota for this action is used up. | `rate_limited`, `quota_exceeded` |
| `500 Internal Server Error` | Our fault. Safe to retry with the same Idempotency-Key. | `server_error` |
| `503 Service Unavailable` | The API is switched off. | `api_disabled` |

## OpenAPI document {#getOpenapi}

`GET https://urnextdoor.com/api/v1/openapi.json`

Returns this OpenAPI 3.1 document. Public: no key needed. Import it into ChatGPT Actions, Postman or a code generator.

- **Auth:** public, no key needed
- **Scope:** none
- **Daily quota:** not counted
- **operationId:** `getOpenapi`

### Example

**cURL**

```bash
curl "https://urnextdoor.com/api/v1/openapi.json"
```

**JavaScript**

```js
const res = await fetch("https://urnextdoor.com/api/v1/openapi.json");
console.log(res.status, await res.json());
```

**Python**

```python
import requests

response = requests.get(
    "https://urnextdoor.com/api/v1/openapi.json",
    timeout=30,
)
print(response.status_code, response.json())
```

**PHP**

```php
<?php
$ch = curl_init('https://urnextdoor.com/api/v1/openapi.json');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);

echo $status, PHP_EOL, $body, PHP_EOL;
```

Sample response: `200 OK`

```json
{
  "openapi": "3.1.0",
  "info": {
    "title": "Ur Next Door API",
    "version": "1.0.0"
  }
}
```

### Responses

| Status | Meaning | Codes |
| --- | --- | --- |
| `200 OK` | The OpenAPI document. |   |
| `404 Not Found` | The document is not available on this server. |   |
