
## Cowork subscription summary

`GET /v1/cowork/me`

Returns a brief snapshot of the Cowork subscription: the tier, the subscription state, and the usage of the three quota windows in percent. A lightweight version of the [full state](/docs/cowork/state) — without recommendations or the tier catalog.

## Examples

### curl — personal key

```bash
curl https://vibecode.bitrix24.com/v1/cowork/me \
  -H "X-Api-Key: YOUR_API_KEY"
```

### curl — OAuth application

```bash
curl https://vibecode.bitrix24.com/v1/cowork/me \
  -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN"
```

### JavaScript — personal key

```javascript
const res = await fetch('https://vibecode.bitrix24.com/v1/cowork/me', {
  headers: { 'X-Api-Key': 'YOUR_API_KEY' },
})

if (!res.ok) {
  const { error } = await res.json()
  console.error(error.code, error.message)
} else {
  const { tier, quotaPct } = await res.json()
  console.log(`Tier ${tier}: month ${quotaPct.month}%, week ${quotaPct.week}%, 5h ${quotaPct.fiveHour}%`)
}
```

### JavaScript — OAuth application

```javascript
const res = await fetch('https://vibecode.bitrix24.com/v1/cowork/me', {
  headers: {
    'X-Api-Key': 'YOUR_APP_KEY',
    'Authorization': 'Bearer USER_SESSION_TOKEN',
  },
})

const me = await res.json()
```

## Response fields

| Field | Type | Description |
|------|-----|----------|
| `portal` | object | The Bitrix24 account that the tier and quota in the response belong to. A key is bound to one Bitrix24 account for good, and a person who belongs to several Bitrix24 accounts has a separate subscription in each. Present in every successful response |
| `portal.id` | string | ID of the Bitrix24 account on the Vibecode platform. Matches `portalId` in the [key self-description](/docs/keys-auth/me) |
| `portal.domain` | string or null | Domain of the Bitrix24 account. `null` only when the platform no longer has a record of that account |
| `portal.isPartner` | boolean | Partner (NFR) Bitrix24 account. Always present for free and paid seats. `false` if the account is missing or deleted. |
| `b24Credentials` | object | Whether the key has access to data in the Bitrix24 account. The answer is in `ready`. With `ready: false`, the block also carries `reason`, and for plan-related reasons it may add `paywallCode` and `upgradeUrl`. The `hint` field arrives when the access state is worth re-reading. The block is absent for an app key and for a key with no Bitrix24 scopes — the flag does not apply there. The `reason` values and the action for each — [Error codes](/docs/errors/auth#token_missing-401) |
| `b24Credentials.ready` | boolean | `true` — the key can call Bitrix24 methods, `false` — it cannot, and any request for data in the Bitrix24 account returns `401 TOKEN_MISSING` |
| `tier` | string | Current tier: `FREE`, `PRO`, `MAX`, `ULTRA` |
| `state` | string | Subscription state: `ACTIVE`, `PAUSED`, `CANCELLED`, `PARKED`. Only `ACTIVE` grants access to Cowork, so an unknown value also means no access |
| `quotaPct.fiveHour` | number | 5-hour window, usage in percent (integer 0–100) |
| `quotaPct.week` | number | Weekly window, usage in percent (integer 0–100) |
| `quotaPct.month` | number | Monthly window, usage in percent (integer 0–100) |
| `resetAt.fiveHour` | string | Reset time of the 5-hour window (ISO 8601) |
| `resetAt.week` | string | Reset time of the weekly window (ISO 8601) |
| `resetAt.month` | string | Reset time of the monthly window — the end of the billing period (ISO 8601) |
| `completion.phase` | string | Five-hour window phase: `normal`, `landing` (the server asks an ongoing turn to finish), or `exhausted`. New tasks are admitted normally during `landing`. This is subscription state, not a marker for a particular model response |
| `completion.resetAt` | string | Five-hour window reset time (ISO 8601) |
| `nextChargeAt` | string or null | Date of the next charge, `null` for the `FREE` tier. For a seat in the `PARKED` state it is the date the paid term ends, and nothing is charged on that date |
| `offPeak` | object | Off-peak hours: whether the discount applies now and when the next one starts. The contents of the block — [Off-peak hours in the Cowork subscription](/docs/cowork/off-peak) |
| `relief` | object | Quota relief: when platform support last reset the usage counters and when it last granted a temporary limit increase. Both fields inside the block are always present |
| `relief.resetGrantedAt` | string or null | When the usage counters were reset, to the hour (ISO 8601). `null` when no reset was granted, and also when the stamp is more than 7 days old |
| `relief.boostGrantedAt` | string or null | When a temporary limit increase was granted, to the hour (ISO 8601). `null` when none was granted, when the stamp is more than 7 days old, or when the increase has already ended. An empty value does not mean there is no increase — read `boostPct` |
| `demo` | object or null | Demo access of the seat: an object while it is in effect, otherwise `null`. The tier in `tier` stays `FREE`, and the shares in `quotaPct` are already computed against the demo limits. Show the plan as "Demo" with the end date and a link to the terms of use |
| `demoOffer` | object or null | Available offer before activation; `null` when unavailable. Reading grants nothing |
| `demoOffer.tier` | string | Offered tier: `PRO`, `MAX`, `ULTRA`; send it on acceptance |
| `demoOffer.durationDays` | integer | Offered duration in days; send it on acceptance |
| `demoOffer.rulesUrl` | string | Offer rules; show before consent |
| `demoOffer.shouldPrompt` | boolean | `true` allows the prompt; `false` after decline, while manual acceptance of an available offer is permitted |
| `demo.until` | string | When the demo access ends (ISO 8601) |
| `demo.rulesUrl` | string | Link to the Cowork terms of use page |
| `boostPct` | integer | Temporary limit increase granted by platform support, in percent (100 = double limits). 0 when none is active. All `quotaPct` values already account for it |
| `boostExpiresAt` | string or null | When the temporary increase ends. `null` when none is active |
| `limitReset` | object | Rights to reset limits under a platform promotion. The key may be absent — see below |
| `limitReset.rights` | array | The user's live rights. Rights that can be spent on the current seat come first, each group ordered by expiry — the one expiring soonest first, then by `id`. An empty array means no rights |
| `limitReset.rights[].id` | string | Right ID — the `rightId` for resetting limits in the Cowork app |
| `limitReset.rights[].expiresAt` | string | When the right expires — the end of its promotion (ISO 8601). Show the local date and time |
| `limitReset.rights[].seatAlreadyReset` | boolean | `true` — the current seat was already reset under this right's promotion; for example, a colleague reset the limits before handing the seat over. The right is alive but cannot be spent on this seat |
| `limitReset.lastUsedAt` | string or null | When the user last reset limits with a right that still counts: its promotion is running, or under the no-stacking rule it stood in for the right of a running promotion. Otherwise `null` |
| `limitReset.accountFrozen` | boolean | `true` — the billing account is frozen for debt, and a reset request would now return `402 ACCOUNT_FROZEN` |

The `offPeak` key arrives in every successful response.

The `relief`, `demo`, `boostPct` and `boostExpiresAt` keys arrive in every successful response. `null` inside the `relief` block carries a meaning of its own — it is not an absence of data.

The `limitReset` key may be absent entirely — check for its presence: the block arrives when limit reset with a promotion right is enabled for the account. No key means no capability.

## Response example

```json
{
  "portal": {
    "id": "d41f0b93-6c85-42e7-9a13-58bd0e7c2f46",
    "domain": "mycompany.bitrix24.com",
    "isPartner": false
  },
  "b24Credentials": {
    "ready": true
  },
  "tier": "FREE",
  "state": "ACTIVE",
  "quotaPct": { "fiveHour": 40, "week": 24, "month": 20 },
  "resetAt": {
    "fiveHour": "2026-06-09T17:30:00.000Z",
    "week": "2026-06-12T09:00:00.000Z",
    "month": "2026-07-01T00:00:00.000Z"
  },
  "completion": { "phase": "normal", "resetAt": "2026-06-09T17:30:00.000Z" },
  "nextChargeAt": null,
  "offPeak": {
    "enabled": true,
    "visible": "now",
    "timezone": "UTC",
    "currentMultiplier": 0.5,
    "currentWindowEndsInHours": 6,
    "nextAtOrBelow": { "inHours": 1, "multiplier": 0.5 },
    "perModel": false,
    "modelName": null,
    "nowCell": { "dow": 1, "hour": 3 }
  },
  "relief": {
    "resetGrantedAt": "2026-06-09T12:00:00.000Z",
    "boostGrantedAt": null
  },
  "demo": null,
  "demoOffer": null,
  "boostPct": 100,
  "boostExpiresAt": "2026-06-28T00:00:00.000Z"
}
```

## Error response example

404 — subscription not activated:

```json
{
  "success": false,
  "error": {
    "code": "COWORK_NOT_ACTIVATED",
    "message": "No active Cowork/Code subscription for this user+portal"
  }
}
```

## Errors

| HTTP | Code | Description |
|------|-----|----------|
| 401 | `MISSING_API_KEY` | The `X-Api-Key` header was not passed |
| 401 | `INVALID_API_KEY` | The key is not recognized — no such key exists on the platform |
| 403 | `INSUFFICIENT_SCOPE` | The key lacks the `vibe:cowork` scope |
| 404 | `COWORK_NOT_ACTIVATED` | No Cowork subscription found for the user and portal |
| 500 | `INVALID_TIER_CONFIGURATION` | The tier configuration on the platform is invalid |
| 503 | `COWORK_FEATURE_DISABLED` | Cowork is disabled at the platform level |

The full list of common API errors — [Errors](/docs/errors).

## Known specifics

**A successful response (200) is the object itself, without a `success` wrapper.** Errors arrive in the envelope `{ success: false, error: { code, message } }`. Determine success by the HTTP status (`res.ok`).

**The endpoint returns percentages only.** There is no exhaustion flag (`exhausted`), server time, or recommendations here — for those, use the [full state](/docs/cowork/state).

**`PARKED` means the seat has no active owner.** A paid seat moves to this state when its owner is no longer an active member of the Bitrix24 account while the paid term is still running. Nothing is charged for such a seat, and it keeps its tier and paid term. A Bitrix24 account administrator can hand it over to another employee. Within a day after the paid term ends, the seat moves to `PAUSED`.

**The off-peak block arrives without the grid.** The grid of multipliers by hour of the week and the share saved over the period are returned in the full state only — this endpoint returns only whether the discount applies now and when the next one starts.

**An empty `relief.boostGrantedAt` does not mean there is no limit increase.** The stamp is there for a one-off notification and stays visible for 7 days, while an increase is granted for up to 30 days. An increase granted more than seven days ago reports an empty stamp and is still in effect. Only `boostPct` tells you whether an increase is in effect.

**The value of the `relief` block matches what the [full state](/docs/cowork/state) returns.** Keep the stamp you have already reported to the user in one place per application, not separately for each endpoint, or the same relief will be shown twice. Notify only when a **non-empty** value differs from the one you stored: the server deliberately turns a stamp into `null` (the visibility window closed, the increase expired or was revoked, the seat was handed over), so a plain "it changed — show it" rule would fire a false notice on every such transition.

**The `limitReset` block is the data for the reset button.** The Cowork app spends the right: the desktop key picks the first usable right (`seatAlreadyReset: false`); when there is none, do not show the button. The block value matches what the [full state](/docs/cowork/state) returns.

## See also

- [Cowork subscription state](/docs/cowork/state)
- [Off-peak hours in the Cowork subscription](/docs/cowork/off-peak)
- [Cowork](/docs/cowork)
- [Limits and optimization](/docs/optimization)
- [Errors](/docs/errors)

## Choose Demo before activation

When an offer is available, the Cowork app shows its `demoOffer` terms and sends the user's choice with the desktop key.
