---
title: "List the projects the authenticated user belongs to"
method: GET
path: "/api/users/me/projects"
tags: ["Projects"]
---

# List the projects the authenticated user belongs to

`GET /api/users/me/projects`

## Request

- Base URL: `https://api.sendly.now`
- URL: `https://api.sendly.now/api/users/me/projects`
- Auth: one of:
  - API key in cookie `better-auth.session_token`
  - OAuth 2 (authorization code, authorization URL `https://app.sendly.now/api/auth/oauth2/authorize`, token URL `https://app.sendly.now/api/auth/oauth2/token`, scopes: `projects:read`)

Every project the caller is a member of, in any role. Answers a bare JSON array — no `{ success, data }` envelope — of raw project rows, each carrying the derived `sandboxAddress` alongside its columns.

This is the project picker for a connected app. It is user-scoped rather than project-scoped, so it is the one operation that takes no `x-project-id` header; the `id` of the project the user chooses here is what every subsequent call sends in that header.

**The body depends on the credential.** A delegated (OAuth) token receives `ProjectPickerEntry` — the project, and nothing about the account behind it. A browser session receives `ProjectListEntry`, the raw row including the account's Stripe identifiers and billing ceilings, because that is the account holder reading their own account. Build against `ProjectPickerEntry`.

Requires the `projects:read` scope — View your projects and their settings.

## Response `200`

The caller's projects — `ProjectPickerEntry` for a delegated token, the full row for a session

- union
  - ProjectPickerEntry[]
    - `createdAt` string, date-time, required: ISO 8601 datetime string
    - `disabled` boolean, required: A disabled project sends nothing; every send is refused.
    - `id` string, uuid, required
    - `language` string, required: ISO 639-1 code for customer-facing content.
    - `name` string, required
    - `sandboxAddress` string, nullable, required: This project's quick-start sender, usable with no domain setup — but only to the project owner's own verified address, and under a daily cap. Null when none can be derived.
    - `sesRegion` string, nullable, required: Locked once the first domain is added.
    - `tracking` 'ENABLED' | 'DISABLED' | 'MARKETING_ONLY', required
  - ProjectListEntry[]
    - `billingLimitCampaigns` integer, nullable, required
    - `billingLimitInbound` integer, nullable, required
    - `billingLimitTransactional` integer, nullable, required
    - `billingLimitWorkflows` integer, nullable, required
    - `createdAt` string, date-time, required: ISO 8601 datetime string
    - `disabled` boolean, required
    - `disabledReason` string, nullable, required
    - `id` string, uuid, required
    - `language` string, required: ISO 639-1 code for customer-facing content.
    - `name` string, required
    - `organizationId` string, nullable, required
    - `poweredByBadge` boolean, required: Operator-set. False when an operator has waived the small “Sent with Sendly” footer for this project (comped accounts, and Sendly's own platform project), whatever its plan. A project with a subscription never carries the footer regardless.
    - `sandboxAddress` string, nullable, required: This project's quick-start sender (`<handle>@<sandbox domain>`), derived on read rather than stored. It sends with no domain setup, but only to the project owner's own verified address and under a daily cap. Null when no handle can be derived.
    - `sandboxHandle` string, nullable, required: Local-part of the sandbox quick-start sender; null until first derived.
    - `sesRegion` string, nullable, required
    - `stripeCustomerId` string, nullable, required
    - `stripeSubscriptionId` string, nullable, required
    - `tracking` 'ENABLED' | 'DISABLED' | 'MARKETING_ONLY', required
    - `updatedAt` string, date-time, required: ISO 8601 datetime string

## Other responses

- `400`: Validation error
- `401`: Unauthorized — missing or invalid auth
- `403`: Forbidden — insufficient permissions or project disabled
- `429`: Rate limit or billing limit exceeded
- `500`: Internal server error

---

[API](https://skmtc.dev/sendly/apis/sendly-api.md) · [All operations](https://skmtc.dev/sendly/apis/sendly-api/llms.txt) · [OpenAPI document](https://skmtc.dev/sendly/apis/sendly-api/revisions/ce7cfb7f7c7e?raw)
