# Get It Done — Product & Developer Guides

> Every guide under https://nowgetitdone.com/docs, concatenated as Markdown. Each page is also available on its own at <page-url>.md. The per-endpoint API reference is generated from the OpenAPI document and lives in https://nowgetitdone.com/llms-full.txt; the document itself is https://nowgetitdone.com/docs/api/openapi.json.


---

# AI Assistant

The in-app AI agent, AI task suggestions, and how AI actions are metered.

Source: https://nowgetitdone.com/docs/ai-assistant

## AI as a first-class user

GetItDone's differentiator is that AI is a first-class user of the product. The in-app AI assistant works with the same rich task context a human sees — task details, images, and frames extracted from video attachments — rather than a stripped-down text summary.

## The in-app chat agent

Open the AI view in the app to chat with the agent. It can:

- List your workspaces and tasks
- Read full task details, including visual context from attachments
- Create, update, and archive tasks
- Answer questions grounded in your actual work

The same agent capability also powers the Slack bot (mention the GetItDone app in a connected Slack workspace) and the external [MCP server](/docs/connecting-ai-assistants) — one tool registry serves all three surfaces.

## AI actions and plan limits

AI usage is metered as **AI actions** per billing month:

| Plan | AI actions            |
| ---- | --------------------- |
| Free | 50 per workspace / mo |
| Pro  | 300 per user / mo     |
| Team | 1,000 per user / mo   |

When a workspace hits its limit, AI features pause until the monthly reset (or an upgrade) — nothing else in the product stops working.

<Callout>
    Video attachments are processed as extracted frames, not full video — a
    deliberate cost and latency tradeoff that still gives the AI real visual
    context.
</Callout>


---

# GetItDone for AI agents

How AI assistants and agents read and build against GetItDone: llms.txt, Markdown twins of every docs page, the MCP server, and agent guidelines.

Source: https://nowgetitdone.com/docs/ai

Everything an AI assistant or agent needs to read our docs and build against
the API — in machine-friendly formats.

## Machine-readable indexes

- [`llms.txt`](https://nowgetitdone.com/llms.txt) — a compact index of the site and developer surface.
- [`llms-full.txt`](https://nowgetitdone.com/llms-full.txt) — the entire developer docs set as one Markdown document.
- [`openapi.json`](/docs/api/openapi.json) — the OpenAPI 3.1 document for the whole `/v1` surface.

## Markdown twins

Append `.md` to any developer docs URL to get its Markdown source — ideal for
feeding a page straight into a model.

```text
https://nowgetitdone.com/docs/api.md
https://nowgetitdone.com/docs/ai.md
https://nowgetitdone.com/docs/api/webhooks.md
https://nowgetitdone.com/docs/api/problems/rate-limited.md
```

## Connect over MCP

The GetItDone MCP server lets an assistant work with tasks directly —
including image and video-frame context. Endpoint:

```text
https://app.nowgetitdone.com/api/mcp
```

[MCP server setup →](/docs/connecting-ai-assistants)

## One platform: REST + SDK + MCP

The REST API, the TypeScript SDK, and the MCP server are three doors into the
SAME platform — one credential, one set of scopes, one docs surface. The SDK
is a typed client over the REST API, so its capabilities track REST exactly.
The MCP server (10 tools) is a focused, agent-facing subset plus one capability
REST deliberately does not expose.

| Capability                                                             | REST /v1 | SDK | MCP |
| ---------------------------------------------------------------------- | -------- | --- | --- |
| Tasks — list, create, update, archive                                  | Yes      | Yes | Yes |
| Task full content + attachment URLs (read)                             | Yes      | Yes | Yes |
| Workspaces / organizations (read)                                      | Yes      | Yes | Yes |
| Task history / versions                                                | Yes      | Yes | No  |
| Daily plan                                                             | Yes      | Yes | No  |
| Projects                                                               | Yes      | Yes | No  |
| Members                                                                | Yes      | Yes | No  |
| Attachments — upload / download                                        | Yes      | Yes | No  |
| Outbound webhooks                                                      | Yes      | Yes | No  |
| Usage & quota                                                          | Yes      | Yes | No  |
| Video-frame task context <br /> _MCP-only by design (see divergences)_ | No       | No  | Yes |
| Docs search <br /> _Agent convenience over the public docs pages_      | No       | No  | Yes |

### Documented divergences

- `get_task_video_context` is intentionally MCP-only. Extracting frames from a
  task's videos so an agent can see them is an MCP-native rich-context
  capability; exposing raw extracted frames over REST is deliberately out of
  scope for v1. This is a documented divergence, not a missing feature.
- The GitHub integration tools are copilot-only. They power the in-app AI
  copilot and have no public REST surface; adding GitHub actions to `/v1` is a
  deliberate, owner-gated scope expansion — not a gap v1 intends to fill.

## REST quickstart

Authenticate with a `gid_` key over Bearer auth:

```bash
curl https://app.nowgetitdone.com/v1/organizations \
  -H "Authorization: Bearer gid_YOUR_API_KEY"
```

[Full API docs →](/docs/api)

## TypeScript SDK

A typed client is available — `npm install @nowgetitdone/sdk`
([source on GitHub](https://github.com/DevinoSolutions/getitdone-sdk)).

## Agent behavior guidelines

- Respect the scopes on the credential — request only what you need, and
  expect `403 insufficient_scope` otherwise.
- Send an `Idempotency-Key` on consequential POSTs so retries are safe.
- Back off on `429` responses, honoring the `Retry-After` header.
- Switch on the stable `code` in problem responses, never the human title.


---

# API documentation

The GetItDone public REST API — authentication, quickstart, errors, rate limits, pagination, idempotency, and webhooks.

Source: https://nowgetitdone.com/docs/api

The GetItDone REST API is AI-native task management for people and agents.
One `gid_` key, Bearer auth, RFC 9457 errors. Every operation is listed in the
[API reference](/docs/api-reference), generated from the OpenAPI document.

## Base URL

```text
https://app.nowgetitdone.com/v1
```

## Quickstart — first 200

1. Create an API key in the app: [Profile → API Keys](https://app.nowgetitdone.com/settings/api-keys).
   It is shown once — store it as a server-side secret.
2. Call the API with your key:

```bash
curl https://app.nowgetitdone.com/v1/organizations \
  -H "Authorization: Bearer gid_YOUR_API_KEY"
```

A successful list returns a cursor envelope:

```json
{
    "data": [{ "id": "org_a1b2c3", "name": "Acme Inc", "role": "owner" }],
    "has_more": false,
    "next_cursor": null
}
```

## Authentication

Send your key on every request. The bearer header is the only form `/v1`
accepts — any other header answers `401 missing_credentials`:

```text
Authorization: Bearer gid_YOUR_API_KEY
```

Keys are minted in-app (Profile → API Keys) and shown once. Test keys are
prefixed `gid_test_` — use them against test data, live keys against
production.

## Errors

Errors are RFC 9457 `application/problem+json` documents with a stable
machine-readable `code`. Switch on `code`, never on the human-readable
`title`. Every response carries an `x-request-id` — quote it in support
requests.

```json
{
    "type": "https://nowgetitdone.com/docs/api/problems/validation-failed",
    "title": "Request validation failed",
    "status": 400,
    "code": "validation_failed",
    "request_id": "req_a1b2c3d4",
    "errors": [
        {
            "pointer": "/title",
            "code": "too_small",
            "message": "String must contain at least 1 character(s)"
        }
    ]
}
```

[Browse every error code →](/docs/api/problems)

## Rate limits & quotas

Two independent systems, two codes. A per-credential **burst window** answers
`429 rate_limited` (retry after `Retry-After`); the billing-period
**allowance** answers `429 quota_exhausted`. Every response carries IETF
draft-11 `RateLimit` / `RateLimit-Policy` headers plus the
`X-RateLimit-Limit` / `-Remaining` / `-Reset` trio.

| Plan | API calls / period | Burst / minute |
| ---- | ------------------ | -------------- |
| Free | 50                 | 10             |
| Pro  | 50,000             | 120            |
| Team | 500,000            | 300            |

One API call = one request against your workspace quota; it resets each
billing period. Outbound webhooks require a Pro or Team plan.

## Pagination

List endpoints return a cursor envelope. Pass `next_cursor` back as the
`after` query parameter for the next page. Filters are baked into the cursor —
reusing one with different filters answers `400 validation_failed`.

```json
{
    "data": [
        /* … */
    ],
    "has_more": true,
    "next_cursor": "eyJ…"
}
```

## Idempotency

Consequential POSTs accept an optional `Idempotency-Key` header (1–255
characters; a UUID works). Retrying with the same key and byte-identical body
within 24h replays the stored response — never re-executed, never re-charged.
A different body answers `422 idempotency_key_reused`; a retry racing the
first answers `409 idempotency_in_progress`.

## Webhooks

Receive signed events when tasks change. Full details — event catalog,
signature verification, retries, and secret rotation — on the
[webhooks page](/docs/api/webhooks).

## Keep exploring

- [API reference](/docs/api-reference) — every operation, generated from the OpenAPI document.
- [Error codes](/docs/api/problems) — every problem code, what it means, how to fix it.
- [OpenAPI document](/docs/api/openapi.json) — the OpenAPI 3.1 spec for the whole `/v1` surface.
- [For AI agents](/docs/ai) — machine-readable indexes, Markdown twins, and agent guidelines.
- [TypeScript SDK](https://github.com/DevinoSolutions/getitdone-sdk) — typed client, published on npm: `npm install @nowgetitdone/sdk`.

Prefer AI tooling? Connect the [MCP server](/docs/connecting-ai-assistants) at
`https://app.nowgetitdone.com/api/mcp`.


---

# A delivery for this event is already queued (delivery_already_pending)

What the GetItDone API problem code delivery_already_pending (HTTP 409) means, what causes it, and how to fix it.

Source: https://nowgetitdone.com/docs/api/problems/delivery-already-pending

- **HTTP status:** 409
- **Problem type URI:** https://nowgetitdone.com/docs/api/problems/delivery-already-pending

## What it means

A delivery for this webhook event is already queued or in flight, so a replay was not created.

## Likely causes

- A replay was requested for an event whose delivery is still pending.
- A duplicate replay request raced the first.

## How to fix

- Wait for the pending delivery to finish, then check the delivery log before replaying.
- Only replay deliveries that have reached a terminal (failed) state.

## Example problem+json

```json
{
    "type": "https://nowgetitdone.com/docs/api/problems/delivery-already-pending",
    "title": "A delivery for this event is already queued",
    "status": 409,
    "code": "delivery_already_pending",
    "request_id": "req_a1b2c3d4"
}
```

## Related

- [Webhooks](/docs/api/webhooks)


---

# Dependency link would create a loop (dependency_cycle)

What the GetItDone API problem code dependency_cycle (HTTP 409) means, what causes it, and how to fix it.

Source: https://nowgetitdone.com/docs/api/problems/dependency-cycle

- **HTTP status:** 409
- **Problem type URI:** https://nowgetitdone.com/docs/api/problems/dependency-cycle

## What it means

The blocker you tried to record would close a loop: the task you named as the
blocker already waits on the task you were linking it to, directly or through
other tasks. Every task in such a ring would wait on itself forever, so the
link is refused before it is written. The dependency graph a client reads is
therefore always acyclic — you can follow `blocked_by` links without a visited
set.

## Likely causes

- Recording `A is blocked by B` when B is already blocked by A.
- A longer chain closing on itself: A → B → C, then linking C as a blocker of A.
- A bulk import replaying links in an order the source system never validated.

## How to fix

- Read `GET /v1/tasks/{task_id}/dependencies` on both tasks and follow the
  chain — the `detail` names the two tasks whose existing path the link would
  close.
- Remove the existing link that points the other way
  (`DELETE /v1/tasks/{task_id}/dependencies/{blocker_task_id}`), then record
  the new one.
- If both directions genuinely matter, the work is not finish-to-start: split
  one of the tasks so each half has a single direction of dependency.

## Example problem+json

```json
{
    "type": "https://nowgetitdone.com/docs/api/problems/dependency-cycle",
    "title": "Dependency link would create a loop",
    "status": 409,
    "code": "dependency_cycle",
    "detail": "T-42 already blocks T-17 (directly or through other tasks), so T-17 cannot also block it.",
    "request_id": "req_a1b2c3d4"
}
```

## Related

- [API reference](/docs/api-reference/task-dependencies/addTaskDependency)


---

# Feature not enabled on this plan (feature_not_enabled)

What the GetItDone API problem code feature_not_enabled (HTTP 403) means, what causes it, and how to fix it.

Source: https://nowgetitdone.com/docs/api/problems/feature-not-enabled

- **HTTP status:** 403
- **Problem type URI:** https://nowgetitdone.com/docs/api/problems/feature-not-enabled

## What it means

The operation belongs to a capability the current plan does not include — a PLAN gate, distinct from a used-up allowance.

## Likely causes

- Outbound webhooks were called on a Free workspace (they are Pro+).

## How to fix

- Upgrade the workspace to a plan that includes the capability.
- Check the operation’s entitlement note on its reference page.

## Example problem+json

```json
{
    "type": "https://nowgetitdone.com/docs/api/problems/feature-not-enabled",
    "title": "Feature not enabled on this plan",
    "status": 403,
    "code": "feature_not_enabled",
    "request_id": "req_a1b2c3d4"
}
```

## Related

- [Webhooks](/docs/api/webhooks)
- [Rate limits & quotas](/docs/api#rate-limits)


---

# A request with this Idempotency-Key is still in progress (idempotency_in_progress)

What the GetItDone API problem code idempotency_in_progress (HTTP 409) means, what causes it, and how to fix it.

Source: https://nowgetitdone.com/docs/api/problems/idempotency-in-progress

- **HTTP status:** 409
- **Problem type URI:** https://nowgetitdone.com/docs/api/problems/idempotency-in-progress

## What it means

A request with this Idempotency-Key is still executing — the retry raced the original.

## Likely causes

- A retry fired before the first request finished.

## How to fix

- Wait briefly and retry with the same key — the stored result replays once the first call completes.
- Use a short exponential backoff on retries.

## Example problem+json

```json
{
    "type": "https://nowgetitdone.com/docs/api/problems/idempotency-in-progress",
    "title": "A request with this Idempotency-Key is still in progress",
    "status": 409,
    "code": "idempotency_in_progress",
    "request_id": "req_a1b2c3d4"
}
```

## Related

- [Idempotency](/docs/api#idempotency)


---

# Idempotency-Key header required (idempotency_key_missing)

What the GetItDone API problem code idempotency_key_missing (HTTP 400) means, what causes it, and how to fix it.

Source: https://nowgetitdone.com/docs/api/problems/idempotency-key-missing

- **HTTP status:** 400
- **Problem type URI:** https://nowgetitdone.com/docs/api/problems/idempotency-key-missing

## What it means

An Idempotency-Key was required for this call but none was supplied or it was malformed.

## Likely causes

- The header was omitted where the client library expected one.
- The header value was empty or longer than 255 characters.

## How to fix

- Send an `Idempotency-Key` header (1–255 visible ASCII characters; a UUID works well).
- Reuse the SAME key when retrying the SAME request to replay the first result.

## Example problem+json

```json
{
    "type": "https://nowgetitdone.com/docs/api/problems/idempotency-key-missing",
    "title": "Idempotency-Key header required",
    "status": 400,
    "code": "idempotency_key_missing",
    "request_id": "req_a1b2c3d4"
}
```

## Related

- [Idempotency](/docs/api#idempotency)


---

# Idempotency-Key reused with a different request (idempotency_key_reused)

What the GetItDone API problem code idempotency_key_reused (HTTP 422) means, what causes it, and how to fix it.

Source: https://nowgetitdone.com/docs/api/problems/idempotency-key-reused

- **HTTP status:** 422
- **Problem type URI:** https://nowgetitdone.com/docs/api/problems/idempotency-key-reused

## What it means

An Idempotency-Key was reused with a DIFFERENT request body than the one it first recorded.

## Likely causes

- A key was recycled across two genuinely different requests.
- The request body changed between the first attempt and the retry.

## How to fix

- Generate a fresh key for every distinct request.
- Send the byte-identical body when retrying with the same key.

## Example problem+json

```json
{
    "type": "https://nowgetitdone.com/docs/api/problems/idempotency-key-reused",
    "title": "Idempotency-Key reused with a different request",
    "status": 422,
    "code": "idempotency_key_reused",
    "request_id": "req_a1b2c3d4"
}
```

## Related

- [Idempotency](/docs/api#idempotency)


---

# API error codes

Every RFC 9457 problem code the GetItDone public API can return — the stable machine-readable code your integration switches on, with what each means and how to fix it.

Source: https://nowgetitdone.com/docs/api/problems

The GetItDone API returns RFC 9457 `application/problem+json` error documents.
Switch on the stable `code` — never on the human-readable title.

Each row's URL is the problem `type` URI the API publishes in the document
itself, so a client can follow `type` straight to the page that explains it.

| Status | Code                                                                 | Title                                                    |
| ------ | -------------------------------------------------------------------- | -------------------------------------------------------- |
| 401    | [`missing_credentials`](/docs/api/problems/missing-credentials)           | Missing credentials                                      |
| 401    | [`invalid_api_key`](/docs/api/problems/invalid-api-key)                   | Invalid API key                                          |
| 401    | [`invalid_token`](/docs/api/problems/invalid-token)                       | Invalid access token                                     |
| 403    | [`insufficient_scope`](/docs/api/problems/insufficient-scope)             | Insufficient scope                                       |
| 403    | [`feature_not_enabled`](/docs/api/problems/feature-not-enabled)           | Feature not enabled on this plan                         |
| 400    | [`validation_failed`](/docs/api/problems/validation-failed)               | Request validation failed                                |
| 404    | [`resource_not_found`](/docs/api/problems/resource-not-found)             | Resource not found                                       |
| 429    | [`rate_limited`](/docs/api/problems/rate-limited)                         | Rate limit exceeded                                      |
| 429    | [`quota_exhausted`](/docs/api/problems/quota-exhausted)                   | Plan quota exhausted                                     |
| 400    | [`idempotency_key_missing`](/docs/api/problems/idempotency-key-missing)   | Idempotency-Key header required                          |
| 422    | [`idempotency_key_reused`](/docs/api/problems/idempotency-key-reused)     | Idempotency-Key reused with a different request          |
| 409    | [`idempotency_in_progress`](/docs/api/problems/idempotency-in-progress)   | A request with this Idempotency-Key is still in progress |
| 422    | [`webhook_url_rejected`](/docs/api/problems/webhook-url-rejected)         | Webhook endpoint URL rejected                            |
| 409    | [`delivery_already_pending`](/docs/api/problems/delivery-already-pending) | A delivery for this event is already queued              |
| 409    | [`dependency_cycle`](/docs/api/problems/dependency-cycle)                 | Dependency link would create a loop                      |
| 500    | [`internal_error`](/docs/api/problems/internal-error)                     | Internal server error                                    |


---

# Insufficient scope (insufficient_scope)

What the GetItDone API problem code insufficient_scope (HTTP 403) means, what causes it, and how to fix it.

Source: https://nowgetitdone.com/docs/api/problems/insufficient-scope

- **HTTP status:** 403
- **Problem type URI:** https://nowgetitdone.com/docs/api/problems/insufficient-scope

## What it means

The credential is valid but was not granted a scope this operation requires.

## Likely causes

- The API key was minted without the needed scope (e.g. `tasks:write`).
- An OAuth grant requested read scopes only, then attempted a write.

## How to fix

- Re-mint the API key with the scopes the operation lists under “Required scopes”.
- For OAuth, request the missing scope during authorization.

## Example problem+json

```json
{
    "type": "https://nowgetitdone.com/docs/api/problems/insufficient-scope",
    "title": "Insufficient scope",
    "status": 403,
    "code": "insufficient_scope",
    "request_id": "req_a1b2c3d4"
}
```

## Related

- [Authentication](/docs/api#authentication)


---

# Internal server error (internal_error)

What the GetItDone API problem code internal_error (HTTP 500) means, what causes it, and how to fix it.

Source: https://nowgetitdone.com/docs/api/problems/internal-error

- **HTTP status:** 500
- **Problem type URI:** https://nowgetitdone.com/docs/api/problems/internal-error

## What it means

Something failed on our side. The response carries a `request_id` for support.

## Likely causes

- An unexpected server-side error.

## How to fix

- Retry after a short delay — transient errors usually clear.
- If it persists, contact support and quote the `request_id` from the response.

## Example problem+json

```json
{
    "type": "https://nowgetitdone.com/docs/api/problems/internal-error",
    "title": "Internal server error",
    "status": 500,
    "code": "internal_error",
    "request_id": "req_a1b2c3d4"
}
```

## Related

- [Errors](/docs/api#errors)


---

# Invalid API key (invalid_api_key)

What the GetItDone API problem code invalid_api_key (HTTP 401) means, what causes it, and how to fix it.

Source: https://nowgetitdone.com/docs/api/problems/invalid-api-key

- **HTTP status:** 401
- **Problem type URI:** https://nowgetitdone.com/docs/api/problems/invalid-api-key

## What it means

A `gid_` API key was supplied but does not match any active credential.

## Likely causes

- The key was revoked, rotated, or belongs to a different environment.
- The key value was truncated or has a stray whitespace/newline.

## How to fix

- Confirm the key is active in Profile → API Keys and copy it again (keys are shown once at creation).
- Check you are using a live key against production and a `gid_test_` key against test data.

## Example problem+json

```json
{
    "type": "https://nowgetitdone.com/docs/api/problems/invalid-api-key",
    "title": "Invalid API key",
    "status": 401,
    "code": "invalid_api_key",
    "request_id": "req_a1b2c3d4"
}
```

## Related

- [Authentication](/docs/api#authentication)


---

# Invalid access token (invalid_token)

What the GetItDone API problem code invalid_token (HTTP 401) means, what causes it, and how to fix it.

Source: https://nowgetitdone.com/docs/api/problems/invalid-token

- **HTTP status:** 401
- **Problem type URI:** https://nowgetitdone.com/docs/api/problems/invalid-token

## What it means

An OAuth 2.1 access token was supplied but is expired, malformed, or revoked.

## Likely causes

- The access token has passed its expiry.
- The token was issued by a different authorization server or for a different resource.

## How to fix

- Refresh the access token using your refresh token (request the `offline_access` scope to receive one).
- Re-run the OAuth authorization flow if the grant was revoked.

## Example problem+json

```json
{
    "type": "https://nowgetitdone.com/docs/api/problems/invalid-token",
    "title": "Invalid access token",
    "status": 401,
    "code": "invalid_token",
    "request_id": "req_a1b2c3d4"
}
```

## Related

- [Authentication](/docs/api#authentication)


---

# Missing credentials (missing_credentials)

What the GetItDone API problem code missing_credentials (HTTP 401) means, what causes it, and how to fix it.

Source: https://nowgetitdone.com/docs/api/problems/missing-credentials

- **HTTP status:** 401
- **Problem type URI:** https://nowgetitdone.com/docs/api/problems/missing-credentials

## What it means

The request arrived with no usable credential — the Authorization bearer header is the only form `/v1` accepts.

## Likely causes

- The Authorization header was never set on the request.
- A proxy or client library stripped the header before it reached the API.

## How to fix

- Send `Authorization: Bearer gid_…` on every request.
- Mint a key in the app under Profile → API Keys, then store it as a server-side secret.

## Example problem+json

```json
{
    "type": "https://nowgetitdone.com/docs/api/problems/missing-credentials",
    "title": "Missing credentials",
    "status": 401,
    "code": "missing_credentials",
    "request_id": "req_a1b2c3d4"
}
```

## Related

- [Authentication](/docs/api#authentication)


---

# Plan quota exhausted (quota_exhausted)

What the GetItDone API problem code quota_exhausted (HTTP 429) means, what causes it, and how to fix it.

Source: https://nowgetitdone.com/docs/api/problems/quota-exhausted

- **HTTP status:** 429
- **Problem type URI:** https://nowgetitdone.com/docs/api/problems/quota-exhausted

## What it means

The workspace has used its entire API-call allowance for the current billing period — an ALLOWANCE gate, distinct from the short-term burst throttle.

## Likely causes

- The plan’s calls-per-period quota is fully consumed.

## How to fix

- Wait for the billing period to reset, or upgrade to a plan with a larger allowance.
- Reduce call volume — batch reads and cache where you can.

## Example problem+json

```json
{
    "type": "https://nowgetitdone.com/docs/api/problems/quota-exhausted",
    "title": "Plan quota exhausted",
    "status": 429,
    "code": "quota_exhausted",
    "request_id": "req_a1b2c3d4"
}
```

## Related

- [Rate limits & quotas](/docs/api#rate-limits)


---

# Rate limit exceeded (rate_limited)

What the GetItDone API problem code rate_limited (HTTP 429) means, what causes it, and how to fix it.

Source: https://nowgetitdone.com/docs/api/problems/rate-limited

- **HTTP status:** 429
- **Problem type URI:** https://nowgetitdone.com/docs/api/problems/rate-limited

## What it means

The per-credential burst window was exceeded. This is a short-term throttle, not your billing-period allowance.

## Likely causes

- Requests arrived faster than the plan’s per-minute burst allowance.

## How to fix

- Back off and retry after the `Retry-After` header’s number of seconds.
- Read the `RateLimit` / `X-RateLimit-*` headers to pace requests before you hit the wall.
- Spread bulk work over time, or upgrade for a higher burst allowance.

## Example problem+json

```json
{
    "type": "https://nowgetitdone.com/docs/api/problems/rate-limited",
    "title": "Rate limit exceeded",
    "status": 429,
    "code": "rate_limited",
    "request_id": "req_a1b2c3d4"
}
```

## Related

- [Rate limits & quotas](/docs/api#rate-limits)


---

# Resource not found (resource_not_found)

What the GetItDone API problem code resource_not_found (HTTP 404) means, what causes it, and how to fix it.

Source: https://nowgetitdone.com/docs/api/problems/resource-not-found

- **HTTP status:** 404
- **Problem type URI:** https://nowgetitdone.com/docs/api/problems/resource-not-found

## What it means

No resource with that id exists inside the credential’s organization.

## Likely causes

- The id belongs to another organization (there is no cross-org existence oracle — you get 404, not 403).
- The id is mistyped, or the resource was deleted.

## How to fix

- Confirm the id was returned by a list/get call on the SAME credential.
- Use the public short id (e.g. `T-123`) for tasks — internal UUIDs are never accepted.

## Example problem+json

```json
{
    "type": "https://nowgetitdone.com/docs/api/problems/resource-not-found",
    "title": "Resource not found",
    "status": 404,
    "code": "resource_not_found",
    "request_id": "req_a1b2c3d4"
}
```

## Related

- [Errors](/docs/api#errors)


---

# Request validation failed (validation_failed)

What the GetItDone API problem code validation_failed (HTTP 400) means, what causes it, and how to fix it.

Source: https://nowgetitdone.com/docs/api/problems/validation-failed

- **HTTP status:** 400
- **Problem type URI:** https://nowgetitdone.com/docs/api/problems/validation-failed

## What it means

The request body or query failed schema validation. The `errors` array names each offending field by JSON Pointer.

## Likely causes

- A required field was missing or had the wrong type.
- A value fell outside its allowed range or enum.
- A cursor was reused with different filters than the page it came from.

## How to fix

- Read the `errors` array — each entry has a `pointer`, a `code`, and a `message`.
- Fix the named field and retry. The request was never applied, so retrying is safe.

## Example problem+json

```json
{
    "type": "https://nowgetitdone.com/docs/api/problems/validation-failed",
    "title": "Request validation failed",
    "status": 400,
    "code": "validation_failed",
    "request_id": "req_a1b2c3d4"
}
```

## Related

- [Errors](/docs/api#errors)


---

# Webhook endpoint URL rejected (webhook_url_rejected)

What the GetItDone API problem code webhook_url_rejected (HTTP 422) means, what causes it, and how to fix it.

Source: https://nowgetitdone.com/docs/api/problems/webhook-url-rejected

- **HTTP status:** 422
- **Problem type URI:** https://nowgetitdone.com/docs/api/problems/webhook-url-rejected

## What it means

A webhook endpoint URL failed the safety checks: it must be https on port 443 and must not resolve to a private or internal address.

## Likely causes

- The URL used http, a non-443 port, or a private/loopback host.
- The host resolved to a blocked (SSRF-risk) address.

## How to fix

- Use a public https URL on port 443.
- Point the endpoint at an internet-reachable host, not an internal one.

## Example problem+json

```json
{
    "type": "https://nowgetitdone.com/docs/api/problems/webhook-url-rejected",
    "title": "Webhook endpoint URL rejected",
    "status": 422,
    "code": "webhook_url_rejected",
    "request_id": "req_a1b2c3d4"
}
```

## Related

- [Webhooks](/docs/api/webhooks)


---

# Webhooks

GetItDone outbound webhooks (Pro+): the task event catalog, Standard Webhooks signature verification, delivery retries, and secret rotation.

Source: https://nowgetitdone.com/docs/api/webhooks

Register an HTTPS endpoint and receive signed events when tasks change.
Available on **Pro and Team** plans.

## Event types

These event types are exactly what the delivery worker emits:

- `task.created`
- `task.updated`
- `task.archived`

## Example signed delivery

```http
POST https://your-app.example.com/webhooks/getitdone
webhook-id: msg_2abc...
webhook-timestamp: 1753305600
webhook-signature: v1,g0hM9SsE9...base64signature...

{
  "type": "task.created",
  "data": {
    "id": "T-123",
    "title": "Ship the public API",
    "status": "TODO"
  }
}
```

## Verify the signature

Payloads are signed with the [Standard Webhooks](https://www.standardwebhooks.com/)
scheme. Each request carries `webhook-id`, `webhook-timestamp` and
`webhook-signature` headers. Always verify the **raw request bytes** — parsing
and re-serializing the body first breaks the signature.

```ts title="With the TypeScript SDK"
import { verifyWebhook } from '@nowgetitdone/sdk/webhooks'

// In your route handler — pass the RAW request body bytes, never a re-parsed
// object (re-serializing breaks the signature).
const result = verifyWebhook({
    headers: request.headers,
    rawBody: await request.text(),
    secret: process.env.GETITDONE_WEBHOOK_SECRET, // whsec_… (pass both during rotation)
})

if (!result.valid) {
    return new Response('invalid signature', { status: 400 })
}
```

The SDK ships a `verifyWebhook` helper (published on npm —
[source](https://github.com/DevinoSolutions/getitdone-sdk)).

```js title="Runtime-agnostic (HMAC-SHA256)"
import { createHmac, timingSafeEqual } from 'node:crypto'

// Runtime-agnostic Standard Webhooks verification (no SDK required).
function verify(headers, rawBody, whsec) {
    const id = headers['webhook-id']
    const timestamp = headers['webhook-timestamp']
    const signatureHeader = headers['webhook-signature'] // "v1,<base64> v1,<base64> …"

    const secretBytes = Buffer.from(whsec.split('_')[1], 'base64')
    const signed = `${id}.${timestamp}.${rawBody}`
    const expected = createHmac('sha256', secretBytes)
        .update(signed)
        .digest('base64')

    return signatureHeader.split(' ').some(part => {
        const sig = part.split(',')[1]
        return (
            sig !== undefined &&
            sig.length === expected.length &&
            timingSafeEqual(Buffer.from(sig), Buffer.from(expected))
        )
    })
}
```

## Retries & auto-disable

Deliveries that fail (non-2xx, timeout, connection error) are retried with
backoff. An endpoint that keeps failing is automatically disabled to protect
your receiver and our delivery pipeline; re-enable it once your endpoint is
healthy again. Read the delivery log per endpoint to see attempts and their
outcomes.

## Secret rotation

Each endpoint has a signing secret prefixed `whsec_`. Rotating it keeps the
previous secret valid for a **24-hour grace window** so in-flight deliveries
still verify. Accept both secrets during rotation, then drop the old one after
the window.

## URL rules

Endpoint URLs must be **https on port 443** and must not resolve to a private
or internal address. A rejected URL answers
[422 `webhook_url_rejected`](/docs/api/problems/webhook-url-rejected).


---

# API reference

Every operation in the GetItDone public REST API, grouped by resource — organizations, tasks, projects, the daily plan, attachments, members, usage, API keys, and webhooks.

Source: https://nowgetitdone.com/docs/api-reference

Every operation in the GetItDone public `/v1` REST API, generated from the
[OpenAPI 3.1 document](/docs/api/openapi.json) — the same document the `/v1`
handlers and the published TypeScript SDK are generated from, so the reference
cannot drift from the API.

Pick a resource in the sidebar, or start with the concepts:

- [Authentication](/docs/api#authentication) — `gid_` keys, Bearer auth, test keys.
- [Errors](/docs/api#errors) — RFC 9457 problem documents and the stable `code`.
- [Rate limits & quotas](/docs/api#rate-limits) — burst window vs billing-period allowance.
- [Pagination](/docs/api#pagination) — the cursor envelope.
- [Idempotency](/docs/api#idempotency) — safe retries on consequential POSTs.
- [Webhooks](/docs/api/webhooks) — signed outbound task events.

Every operation page shows the request shape, the response shape, a runnable
example, and the problem codes it can answer with.


---

# Browser extension

Save any page, selection or screenshot as a GetItDone task from Chrome or Edge.

Source: https://nowgetitdone.com/docs/browser-extension

The GetItDone browser extension turns whatever is in front of you — the page, a
paragraph you selected, a screenshot of what is on screen — into a task in your
workspace, with the source URL attached.

It supports **Chrome and Edge** today. Firefox is planned; see
[What is not in this version](#what-is-not-in-this-version).

## What it does

**Save the current page.** Click the toolbar icon, or press `Alt+Shift+G`. The
page title arrives pre-filled as the task title and the URL lands in the task
notes. Edit anything, optionally pick a project and a due date, then press
**Add task**.

**Save a selection.** Highlight text on any page, right-click, and choose **Add
selection to GetItDone**. The first line of the selection becomes the task
title; if the selection is longer, the whole of it is kept in the description so
nothing is lost.

**Attach a screenshot.** Press **Attach screenshot of this page** to capture the
visible part of the tab. You see the image before anything is sent, and can
remove it. On submit it is uploaded as a normal task attachment.

Nothing leaves your browser until you press **Add task**.

## Signing in

Choosing **Sign in to GetItDone** opens GetItDone's own sign-in and consent
pages in a browser-controlled window. Your password never reaches the extension:
it receives a scoped access token, and only these four permissions are
requested — read and create tasks, read projects, read your workspace.

You can revoke the connection at any time from **Profile → Connected Apps** in
the web app. Signing out from the extension's options page clears the tokens
stored in that browser; removing the connection in Connected Apps revokes it
everywhere.

The free plan works. Creating a task costs one API call against your plan's
allowance; adding a screenshot costs two more.

## Privacy

The extension asks for four permissions and one host:

- `storage` — the sign-in tokens, your default project and a short cache of your
  project names.
- `identity` — used only to open the sign-in window.
- `activeTab` — the title and URL of the tab you are on **at the moment you open
  the extension**, and the screenshot when you press the button. It does not run
  on pages in the background.
- `contextMenus` — the one right-click item.
- `https://app.nowgetitdone.com/*` — the only server the extension contacts.

There is no analytics and no error reporting of any kind in this version.

Some pages cannot be read by any extension — `chrome://` pages, the extension
gallery, and PDF viewers. On those the popup says so and you can type the task
yourself.

## What is not in this version

Being explicit, so nothing here reads as a promise:

- **No AI extraction.** The extension attaches a screenshot; it does not turn it
  into several proposed tasks. That capability exists in the web app (Capture)
  and is planned for the extension.
- **No voice capture.**
- **No offline queue** — a task is created when you press the button, or you see
  the error.
- **No task browsing** from the extension, and no in-page sidebar.
- **Firefox is not published yet.** The build supports it; the Add-ons store
  requires a reproducible source-code submission that has not been completed.

## Related

The extension is built on the same [public API](/docs/api) anyone can use —
`POST /v1/tasks` plus the two-phase attachment upload — with OAuth 2.1 and PKCE.
If you want the same capability somewhere else, that API is the way in.


---

# Connecting AI Assistants (MCP)

Connect Claude, Cursor, or any MCP client to your tasks — the remote GetItDone MCP server's endpoint, auth, and full tool list.

Source: https://nowgetitdone.com/docs/connecting-ai-assistants

GetItDone runs a remote **Model Context Protocol (MCP)** server, so AI assistants like Claude can list, create, update, and archive your tasks — with the same rich context the product itself has, including task images and extracted video frames.

Any MCP client that speaks remote servers can connect: no local install, no sidecar process.

## Endpoint

|               |                                        |
| ------------- | -------------------------------------- |
| **URL**       | `https://app.nowgetitdone.com/api/mcp` |
| **Transport** | Streamable HTTP                        |
| **Auth**      | `Authorization: Bearer <gid_ API key>` |

## Get an API key

1. Sign in at [app.nowgetitdone.com](https://app.nowgetitdone.com).
2. Go to **Settings → API Keys** (`app.nowgetitdone.com/settings/api-keys`).
3. Create a key — keys start with `gid_` and are shown once, so store them safely.

The same key authenticates the [public /v1 REST API](/docs/api); test keys are prefixed `gid_test_`.

## Connect your client

Claude Code:

```bash
claude mcp add --transport http getitdone https://app.nowgetitdone.com/api/mcp \
  --header "Authorization: Bearer gid_YOUR_API_KEY"
```

Claude Desktop, Cursor, or any remote-MCP client that takes JSON config:

```json
{
    "mcpServers": {
        "getitdone": {
            "url": "https://app.nowgetitdone.com/api/mcp",
            "headers": {
                "Authorization": "Bearer gid_YOUR_API_KEY"
            }
        }
    }
}
```

## Tools

Everything an assistant needs to run a real task workflow — discovery, deep reads, and writes. Each tool names the API scope a key must hold: without it the tool never appears in `tools/list` and a call is refused.

- **`list_workspaces`** — read · `workspaces:read` — List the workspaces (organizations) the current user belongs to, with their ids. Pass a returned id as `workspaceId` on the other tools to target a specific workspace when the user has more than one.
- **`list_projects`** — read · `projects:read` — List the projects in the workspace with their ids — the same grouping the board shows down the side of the task list. Call this BEFORE filing work under a project: pass a returned id as `projectId` on create_task or update_task, or as a filter on list_tasks. If the project the user named is not in this list it does not exist, so say so rather than inventing it or writing its name into a task.
- **`list_tasks`** — read · `tasks:read` — List tasks for the current user in their organization. Can filter by status, priority and project. Returns the latest version of each task — including the projects it is filed under, whether it is currently BLOCKED and how many tasks it blocks — so you can tell what is actually actionable right now and where it belongs.
- **`get_task_details`** — read · `tasks:read` — Get the FULL content of a single task: its rich-text notes, every attachment (image, video, document) with short-lived URLs the AI can fetch to read the actual content, and its dependency chain — which tasks are blocking it and which tasks it blocks. Use this after list_tasks when you need to see what is inside a task or why it cannot be started. Identify the task by short ID (e.g. 123 for T-123) or task version ID.
- **`get_task_video_context`** — read · `tasks:read` — Pull visual context from a task's videos: extracts a few evenly-spaced frames from any uploaded video (screen recording etc.) in the task's notes or attachments so you can understand what it shows, and surfaces any YouTube/Vimeo links found in the notes. Use when a task references a video/screen recording. Identify the task by short ID (e.g. 123 for T-123) or task version ID.
- **`create_task`** — write · `tasks:write` — Create a new task for the current user in their organization. Set a start date when the task cannot be worked on until a given day (defer-until). File it under a project by passing a project id from list_projects. Set a recurrence to make it a repeating habit or routine ("every weekday", "every other Monday", "the 1st of each month", "every 3 days after I finish it") — each day is completed independently.
- **`update_task`** — write · `tasks:write` — Update an existing task. You can update the name, status, priority, start date, due date, notes, story points, its project (pass a project id from list_projects to move it, or null to remove it from every project), or its repeat schedule (pass a recurrence to start/replace it, or null to stop it repeating). Identify the task by its short ID (e.g. T-123) or task version ID.
- **`complete_task_occurrence`** — write · `tasks:write` — Mark one DAY of a repeating task done. This is per-day: completing Monday leaves Tuesday untouched. The day can be in the PAST ("I brushed my teeth yesterday") or a scheduled FUTURE day finished early — neither breaks the chain, and neither is something a task-manager MCP normally lets you say. Identify the task by short ID (e.g. 123 for T-123) and the day as YYYY-MM-DD; omit the day for today.
- **`link_task_dependency`** — write · `tasks:write` — Record that one task is BLOCKED BY another (finish-to-start), or remove that link. Use it whenever the user says one piece of work is waiting on, depends on, or is held up by another. The blocked task is then reported as blocked until every blocker is completed, so you can answer "what is blocking this?" with the real chain instead of a flat list. Identify both tasks by short ID (e.g. 123 for T-123); pass action "remove" to unlink. Links that would create a loop are rejected.
- **`archive_task`** — write · `tasks:write` — Archive or unarchive a task. Archived tasks are hidden from the main task list. Identify the task by its short ID (e.g. T-123).
- **`search_docs`** — read · `workspaces:read` — Search the GetItDone developer documentation — REST API operations, error/problem codes, and guide pages — and return ranked results with their public URLs. Guide and error pages also return a Markdown-twin URL (the page URL plus '.md') the agent can fetch to read the full page as plain text. Use when you need to know how a /v1 endpoint works, what an error code means, or where a capability is documented.

## Context other task tools don't give an AI

Most task-management MCP integrations stop at text and metadata. GetItDone treats the AI as a first-class user and hands it the same rich context a teammate would get:

- **Full task contents, attachments included.** `get_task_details` returns a task's rich-text notes plus every attachment — images, videos, documents — each with a short-lived URL the assistant can fetch to read the actual content, not just a filename.
- **Blocked-by chains the assistant can read and write.** `list_tasks` reports whether each task is currently blocked and how many tasks it blocks, `get_task_details` returns the chain in both directions, and `link_task_dependency` records or removes a blocker — so "what can I actually start today?" is answered from the real graph, and a link that would create a loop is refused rather than stored.
- **Video-frame extraction, server-side.** `get_task_video_context` samples evenly-spaced frames from screen recordings and other videos attached to a task and returns them as images the AI can see — so "watch the bug repro and fix it" actually works. YouTube and Vimeo links in the notes are surfaced too.

## Quotas

The MCP server works on every plan, including Free. MCP calls are metered against the same workspace API-call quota as the REST API — the per-plan numbers are in [Rate limits & quotas](/docs/api#rate-limits), and checkout is on the [pricing page](https://nowgetitdone.com/pricing).


---

# Daily Planning

Plan your day with the Daily view and run stand-ups with the team daily view.

Source: https://nowgetitdone.com/docs/daily-planning

## Your daily plan

The Daily view is where you decide what you are working on today. Add tasks to your daily plan, reorder them, and check them off as the day goes on. The daily plan is a first-class object: it is also readable and editable through the [public API](/docs/api) (`/v1/daily-plan`), so automations and AI agents can plan alongside you.

## Team daily and stand-ups

The team daily view shows what everyone in the workspace is working on today — a live, always-current stand-up board. Instead of a status meeting, your team's updates and today's plans are visible in one place, and updates can be turned into tasks.

## Reminders

GetItDone can send reminder emails for upcoming work, and in-app plus push notifications keep you up to date as tasks change.

<Callout>
    The daily plan is realtime: when a teammate adds or completes a task, every
    open session updates immediately.
</Callout>


---

# Getting Started

Create your GetItDone account, set up a workspace, and plan your first day.

Source: https://nowgetitdone.com/docs/getting-started

## Create an account

Go to [app.nowgetitdone.com/signup](https://app.nowgetitdone.com/signup) and sign up with any of:

- **Email and password**
- **Google**
- **Apple**
- **GitHub**

The Free plan requires no credit card.

## Workspaces and teams

Work in GetItDone happens inside an organization (your workspace). Each workspace has:

- **Roles** — owner, admin, and member.
- **Invitations** — invite teammates by email from the organization settings; they receive an invite email and join with their own account.
- **Plan limits** — the Free plan allows up to 4 people per workspace; paid plans have no member cap.

## First steps

1. **Create tasks** — open the Tasks view and add tasks with a title, description, priority, and status. Attach images or videos if the work needs visual context.
2. **Plan your day** — open the Daily view and add the tasks you intend to work on today.
3. **Try the AI assistant** — open the AI chat and ask it about your tasks, or let it create and update tasks for you. Every plan includes a monthly AI-action allowance (50 per workspace per month on Free).
4. **Connect an integration** — link GitHub, Slack, ClickUp, or Monday.com from the Integrations page (2 active integrations on Free, all 4 on paid plans).

## Realtime by default

GetItDone syncs in realtime: task changes, daily-plan updates, and team activity appear live in every open session without refreshing.

<Callout>
    Building an automation or connecting an AI assistant instead? See the
    [Public API](/docs/developer-api) and [Connecting AI
    assistants](/docs/connecting-ai-assistants) pages.
</Callout>


---

# GetItDone Overview

AI-native task management for teams — daily planning, stand-ups, integrations, and AI agents that see the same task context you do.

Source: https://nowgetitdone.com/docs

GetItDone is an AI-native task-management app for teams. You plan your day, run stand-ups, and manage tasks in one place — and AI is a first-class user of the product, not a bolted-on chatbot. The in-app AI assistant, the external MCP server, and the public REST API all work against the same rich task context a human sees, including task images and extracted video frames.

The app lives at [app.nowgetitdone.com](https://app.nowgetitdone.com); the marketing site and developer docs are at [nowgetitdone.com](https://nowgetitdone.com).

## What you can do

<Cards>
    <Card
        title="Getting started"
        href="/getting-started"
        description="Sign up, create a workspace, and add your first tasks."
    />
    <Card
        title="Tasks and projects"
        href="/tasks-and-projects"
        description="Statuses, priorities, attachments, history, and projects."
    />
    <Card
        title="Daily planning"
        href="/daily-planning"
        description="Your daily plan and the team daily view."
    />
    <Card
        title="AI assistant"
        href="/ai-assistant"
        description="The in-app AI agent and how AI actions are metered."
    />
    <Card
        title="Integrations"
        href="/integrations"
        description="GitHub, Slack, ClickUp, and Monday.com."
    />
    <Card
        title="Connecting AI assistants (MCP)"
        href="/connecting-ai-assistants"
        description="Use GetItDone from Claude and other MCP clients."
    />
    <Card
        title="Public API"
        href="/developer-api"
        description="The /v1 REST API, API keys, webhooks, and the TypeScript SDK."
    />
    <Card
        title="Pricing"
        href="/pricing"
        description="Free, Pro, and Team plans."
    />
</Cards>

## Key capabilities

- **Team workspaces** — organizations with owner, admin, and member roles, plus email invitations.
- **Daily planning and stand-ups** — a personal daily plan and a team daily view.
- **Tasks with rich context** — descriptions, priorities, statuses, image and video attachments, and per-task history.
- **Realtime sync** — changes propagate live to every open session via Socket.IO.
- **AI everywhere** — an in-app chat agent, AI task suggestions, a remote MCP server for external AI assistants, and a public REST API with an open-source SDK.
- **Integrations** — GitHub, Slack (including an AI bot you can @mention), ClickUp, and Monday.com.
- **Notifications** — an in-app notification inbox plus push notifications.


---

# Integrations

Connect GetItDone to GitHub, Slack, ClickUp, and Monday.com.

Source: https://nowgetitdone.com/docs/integrations

GetItDone ships four integrations, managed from the Integrations page in the app. The Free plan allows 2 active integrations; Pro and Team include all 4.

## GitHub

Connect your GitHub account to link development work with your tasks. The AI toolset includes GitHub-aware tools, so the assistant can bring repository context into task conversations.

## Slack

Connect Slack to bring GetItDone into your team chat:

- **AI bot** — mention the GetItDone app in Slack and the task agent responds, with the same task tools the in-app assistant has (create, update, and query tasks from Slack).
- **Events and actions** — the integration processes Slack events and interactive actions through GetItDone's background worker.

## ClickUp

Connect ClickUp to bridge existing work:

- **Project bindings** — bind a GetItDone project to a ClickUp container so the two stay associated.
- **Import** — run import jobs to bring ClickUp tasks into GetItDone.

## Monday.com

Connect Monday.com to link boards with your GetItDone workspace, managed alongside the other integrations.

<Callout>
    Integration connections are per-workspace and count against your plan's
    active-integration limit only while connected.
</Callout>


---

# Pricing

Where to find GetItDone's plans, prices and per-plan limits, and what happens when a workspace reaches one of them.

Source: https://nowgetitdone.com/docs/pricing

GetItDone has three plans — Free, Pro and Team. **The prices, what each plan
includes and checkout all live on
[nowgetitdone.com/pricing](https://nowgetitdone.com/pricing)**, and this page
canonicalises there: one pricing answer, at one URL.

The numbers are deliberately not restated here. They come from one place in the
codebase (`@getitdone/pricing`), the pricing page renders them from it, and an
MDX file cannot import it — so a copy on this page could only ever be typed by
hand, and a hand-typed price goes stale silently. What this page does instead is
point you at whichever answer you came for.

| You want                                                    | Where it lives                                                |
| ----------------------------------------------------------- | ------------------------------------------------------------- |
| Plans, prices, what each plan includes, checkout            | [Pricing](https://nowgetitdone.com/pricing)                   |
| API calls per billing period and per-minute burst, per plan | [Rate limits & quotas](/docs/api#rate-limits)                      |
| How AI actions are metered and what happens at the cap      | [AI assistant](/docs/ai-assistant)                                 |
| Attachment storage and per-file size limits                 | [Tasks and projects](/docs/tasks-and-projects)                     |
| Your workspace's current usage                              | Settings → Billing in [the app](https://app.nowgetitdone.com) |

## How limits behave

- **AI at the limit** — when a workspace uses its monthly AI actions, AI features
  pause until the monthly reset or an upgrade. Nothing else stops working.
- **API quotas** — burst limits answer `429 rate_limited`; period exhaustion
  answers `429 quota_exhausted`. Two independent systems, two codes.
- **Outbound webhooks** — a paid-plan feature; on Free the endpoints answer
  `403 feature_not_enabled` rather than silently dropping events.
- **Free forever** — the Free plan requires no credit card.


---

# Tasks and Projects

Task statuses, priorities, attachments, history, and how projects organize work.

Source: https://nowgetitdone.com/docs/tasks-and-projects

## Tasks

Tasks are the core unit of work in GetItDone. Every task has:

- **Status** — `TODO`, `IN_PROGRESS`, `IN_REVIEW`, `COMPLETED`, or `BLOCKED`.
- **Priority** — `LOW`, `MEDIUM`, `HIGH`, or `URGENT`.
- **Description** — free-form details.
- **Attachments** — images and videos. Video attachments get frames extracted so AI features can reason about their content without processing full video.
- **History** — a per-task change history you (and the API) can read back.

Tasks are archived rather than hard-deleted, and can be unarchived later.

## Ordering and drag-and-drop

Task lists support manual reordering; the ordering logic is shared across the app, the realtime layer, and the public API, so every surface sees the same order.

## Projects

Projects group related tasks inside a workspace. You can create projects in the app, browse tasks by project, and bind projects to external tools (for example, a ClickUp list or space) via integrations.

## Collaboration

Tasks support collaboration flows between teammates — review, assist, and transfer — so work can be handed over or double-checked without losing its history.

## Attachments and storage

Per-plan storage applies to attachments:

| Plan | Storage | Max file size |
| ---- | ------- | ------------- |
| Free | 1 GB    | 25 MB         |
| Pro  | 20 GB   | 250 MB        |
| Team | 100 GB  | 1 GB          |

<Callout>
    Task images and extracted video frames are also part of the context the AI
    assistant and the MCP server can see — visual context makes AI answers about
    a task materially better.
</Callout>
