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

# not_found

> Resource doesn't exist or is out of scope. We 404 instead of 403 to avoid leaking existence.

The id you referenced doesn't exist, was deleted, or belongs to an organization or profile your key can't see.

This is also the response for **scope mismatches**: a profile-scoped key requesting a post on a different profile gets `404`, not `403`. We do that on purpose — `403` would leak the fact that the resource exists somewhere.

## What triggers it

* `POST /v1/posts` with a `targets[].accountId` that doesn't belong to your org.
* `GET /v1/posts/:id` with an id that's been deleted or belongs to another org.
* `GET /v1/accounts/:id` against a profile-scoped key with a `profileId` mismatch.
* A typo in any UUID parameter.

## Response shape

```json not_found.json theme={"system"}
{
  "error": {
    "code": "not_found",
    "message": "Platform account not found.",
    "remediation": "Verify the account id and that it belongs to your organization.",
    "docUrl": "https://docs.letmepost.dev/errors/not_found",
    "requestId": "req_..."
  }
}
```

## Why we 404 instead of 403

Imagine a profile-scoped key that probes account ids across the org until one of them returns `403` instead of `404`. That `403` would leak which ids exist. So every cross-profile, cross-org, or scope-mismatch path returns the same `404` response — no observable difference between "doesn't exist" and "exists but you can't see it."

## Related

* [Authentication](/authentication) — profile-scoping rules.
* [`unauthorized`](/errors/unauthorized) — when role-level permission is the issue, not scope.
