Projects & organizations
The bootstrap surface. These are the only endpoints that take an
organization key (pha_…) and no project — everything else in the
reference is project-scoped.
See API conventions for the base URL, error shape and status codes.
GET /api/v1/organizations
The organization behind the presented key.
Scope: projects:read · Credential: organization key
curl https://pharosbase.com/api/v1/organizations \
-H "Authorization: Bearer $PHAROS_ORG_KEY"
{
"organizations": [
{ "id": "org_…", "slug": "acme", "name": "Acme" }
]
}
The array always holds exactly one entry — a key belongs to one organization. It is an array so that a future credential spanning several does not change the shape.
GET /api/v1/projects
Every project the key can reach. This is how an agent discovers what slugs exist before doing anything else.
Scope: projects:read · Credential: organization key
{
"projects": [
{ "id": "prj_…", "slug": "acme-app", "name": "Acme App" }
]
}
POST /api/v1/projects
Create a project. The org-key bootstrap path: a project key is pinned to a project that already exists, so it cannot create one.
Scope: projects:write · Credential: organization key
| Field | Type | Notes |
|---|---|---|
name |
string | Required. |
slug |
string | Derived from name when omitted. Globally unique. |
sesFromEmail |
string | Verified sender address for this project's mail. |
sesFromName |
string | Display name on outgoing mail. |
sesRegion |
string | Sending region. |
colorPrimary |
string | Brand colour, baked into seeded templates. |
colorSecondary |
string | Brand colour, baked into seeded templates. |
mailingAddress |
string | Physical address in the email footer. Required by bulk-mail rules in most jurisdictions — set it before you send. |
curl -X POST https://pharosbase.com/api/v1/projects \
-H "Authorization: Bearer $PHAROS_ORG_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Acme App",
"sesFromEmail": "hi@acme.dev",
"sesFromName": "Acme",
"mailingAddress": "1 Example St, Lisbon, Portugal"
}'
201:
{
"project": {
"id": "prj_…",
"slug": "acme-app",
"name": "Acme App",
"sesFromEmail": "hi@acme.dev",
"sesFromName": "Acme",
"sesRegion": null,
"mailingAddress": "1 Example St, Lisbon, Portugal",
"createdAt": "2026-08-01T14:03:00.000Z"
},
"defaultList": { "slug": "newsletter", "name": "Newsletter" }
}
A newsletter list is seeded so the project can accept subscribers
immediately. That slug is what recipientMode: "list:newsletter" refers to
when you send.
409 means the slug is taken. Slugs are globally unique, not unique per
organization — pass an explicit slug to pick another.
The
ses*field names predate multi-provider sending and are kept for compatibility. They configure the project's sender identity whichever provider ends up delivering the mail.