Skip to content

Organization Admin​

The org-scoped admin panel at /org-admin/{slug}/*. Every operation needs a bearer session, resolves {slug} to an organization (an unknown or malformed slug answers 404 Organization not found, never 403), and then checks an org-scoped permission held through the caller's org_owner, org_admin or org_viewer role on that organization. A caller without the permission gets 403 with message: "Requires permission: <name>".

Role → permission map: org_viewer holds org.read, org.read_donations, org.read_payouts and org.read_donors. org_admin adds org.update_settings, org.manage_members, org.manage_dbas, org.manage_locations and org.upload_documents. org_owner adds org.manage_children and org.manage_payouts.


Get organization dashboard totals​

GET
/org-admin/{slug}/overview

Headline numbers for the org-admin dashboard. For a conglomerate the figures roll up the organization and all of its child organizations; for a company they cover the organization alone. totalRaisedCents sums every paid donation on those organizations' fundraisers, in integer cents. uniqueDonors counts distinct signed-in donors only — guest donations do not add to it.

Requires permission: org.read

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Path Parameters

slug*

The organization's slug (not its UUID).

Type
string
Required
Example"local-food-bank-a1b2c3"
Pattern
"^[a-z0-9][a-z0-9-]{0,254}$"

Responses​

Dashboard totals

application/json
JSON
{
"data": {
"activeFundraisers": 0,
"totalFundraisers": 0,
"totalRaisedCents": 4560000,
"uniqueDonors": 0,
"kind": "string",
"childrenCount": 0
}
}

Playground​

Server
Authorization
Variables
Key
Value

Samples​


List the organization's fundraisers​

GET
/org-admin/{slug}/fundraisers

Non-deleted fundraisers owned by this organization (not its children), newest first, with offset pagination. Every status is included — drafts, pending review, ended — unless status narrows it. Private contact fields are never returned.

Requires permission: org.read

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Path Parameters

slug*

The organization's slug (not its UUID).

Type
string
Required
Example"local-food-bank-a1b2c3"
Pattern
"^[a-z0-9][a-z0-9-]{0,254}$"

Query Parameters

status

Only fundraisers with this status. Send one of the listed values.

Type
string
Valid values
"draft""pending""rejected""active""paused""ended"
limit

Clamped to 1..100. Defaults to 20.

Type
integer
Minimum
1
Maximum
100
Default
20
offset
Type
integer
Minimum
0
Default
0

Responses​

Paginated fundraisers

application/json
JSON
{
"data": [
],
"pagination": "string"
}

Playground​

Server
Authorization
Variables
Key
Value

Samples​


List donations to the organization's fundraisers​

GET
/org-admin/{slug}/donations

Donations to this organization's non-deleted fundraisers, newest first, with offset pagination. Every payment status is returned unless status narrows it.

Donor privacy: donor_display_name is Anonymous donor when the gift was marked anonymous, the donor's profile name for a signed-in donor, and the checkout name for a guest. Donor email addresses are never returned.

Requires permission: org.read_donations

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Path Parameters

slug*

The organization's slug (not its UUID).

Type
string
Required
Example"local-food-bank-a1b2c3"
Pattern
"^[a-z0-9][a-z0-9-]{0,254}$"

Query Parameters

status

Only donations with this payment status. Send one of the listed values.

Type
string
Valid values
"paid""pending""failed""refunded"
fundraiser_id

Only donations to this fundraiser. Must be a UUID.

Type
string
Format
"uuid"
limit

Clamped to 1..100. Defaults to 20.

Type
integer
Minimum
1
Maximum
100
Default
20
offset
Type
integer
Minimum
0
Default
0

Responses​

Paginated donations

application/json
JSON
{
"data": [
],
"pagination": "string"
}

Playground​

Server
Authorization
Variables
Key
Value

Samples​


List the organization's donors​

GET
/org-admin/{slug}/donors

Distinct donors who made a paid donation to any of this organization's non-deleted fundraisers, with their lifetime totals here, largest first, with offset pagination. All anonymous gifts are collapsed into a single Anonymous donor row (donor_key: anonymous) so they cannot be told apart by amount. Signed-in donors are keyed user:<profile id>; guest donors are keyed guest:<24 hex characters>. Treat donor_key as an opaque identifier: it is stable across pages and requests, but carries no contact details and cannot be turned back into one.

Requires permission: org.read_donors

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Path Parameters

slug*

The organization's slug (not its UUID).

Type
string
Required
Example"local-food-bank-a1b2c3"
Pattern
"^[a-z0-9][a-z0-9-]{0,254}$"

Query Parameters

limit

Clamped to 1..100. Defaults to 20.

Type
integer
Minimum
1
Maximum
100
Default
20
offset
Type
integer
Minimum
0
Default
0

Responses​

Paginated donor roll-up

application/json
JSON
{
"data": [
],
"pagination": "string"
}

Playground​

Server
Authorization
Variables
Key
Value

Samples​


Look up an account by email before adding it as a member​

GET
/org-admin/{slug}/users/search

Confirms which FundlyHub account uses an email address, for the Members page's "Add member" form. q must be a complete email address; it is matched case-insensitively against account login emails only, and at most one result comes back, with the address masked. Anything that is not a complete email address (a name, a fragment, a phone number) answers 200 with an empty list. This is not a directory search.

Available only to organizations that are approved or verified; any other organization gets 403 with code: ORG_NOT_APPROVED.

Rate limited to 30 requests per minute per user, in one bucket shared with POST /org-admin/{slug}/members.

Note the bare { "results": [ … ] } envelope rather than data.

Requires permission: org.manage_members

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Path Parameters

slug*

The organization's slug (not its UUID).

Type
string
Required
Example"local-food-bank-a1b2c3"
Pattern
"^[a-z0-9][a-z0-9-]{0,254}$"

Query Parameters

q*

A complete email address (surrounding whitespace is trimmed). Matched case-insensitively against account login emails.

Type
string
Required
Example"sam@example.org"
Format
"email"
Max Length
254

Responses​

The matching account, or an empty list when no account uses that email or q is not a complete email address.

application/json
JSON
{
"results": [
]
}

Playground​

Server
Authorization
Variables
Key
Value

Samples​


List organization members​

GET
/org-admin/{slug}/members

Everyone holding an active, unexpired org-scoped role on this organization, highest role first, then by name. Includes each member's email address, which is why this sits behind the management permission rather than org.read.

Requires permission: org.manage_members

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Path Parameters

slug*

The organization's slug (not its UUID).

Type
string
Required
Example"local-food-bank-a1b2c3"
Pattern
"^[a-z0-9][a-z0-9-]{0,254}$"

Responses​

Members

application/json
JSON
{
"data": [
]
}

Playground​

Server
Authorization
Variables
Key
Value

Samples​


Add a member​

POST
/org-admin/{slug}/members

Adds an existing FundlyHub user, found by email (case-insensitive), to the organization with the given role. The membership is active immediately; no invitation is sent and the user does not have to accept. org_owner cannot be granted here — add the user first, then promote them with PATCH /org-admin/{slug}/members/{userId}.

An optional display title can be set with either org_role_title_id (an id from GET /org-role-titles) or custom_role_title, not both.

Available only to organizations that are approved or verified; any other organization gets 403 with code: ORG_NOT_APPROVED.

Rate limited to 30 requests per minute per user, in one bucket shared with GET /org-admin/{slug}/users/search.

Requires permission: org.manage_members

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Path Parameters

slug*

The organization's slug (not its UUID).

Type
string
Required
Example"local-food-bank-a1b2c3"
Pattern
"^[a-z0-9][a-z0-9-]{0,254}$"

Request Body​

application/json
JSON
{
"email": "string",
"role": "string",
"org_role_title_id": "executive_director",
"custom_role_title": "string"
}

Responses​

Member added

application/json
JSON
{
"data": {
"user_id": "string",
"user_name": "string",
"role_name": "string"
}
}

Playground​

Server
Authorization
Variables
Key
Value
Body

Samples​


Remove a member​

DELETE
/org-admin/{slug}/members/{userId}

Deactivates every org-scoped role the user holds on this organization. Only an org_owner may remove an owner, and nobody may remove a member whose role is equal to or above their own (403). Removing yourself (leaving) is always allowed. The organization's last remaining owner cannot be removed (400) — promote another member to owner first.

Requires permission: org.manage_members

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Path Parameters

slug*

The organization's slug (not its UUID).

Type
string
Required
Example"local-food-bank-a1b2c3"
Pattern
"^[a-z0-9][a-z0-9-]{0,254}$"
userId*

The member's profile id. A non-UUID answers 404 Member not found.

Type
string
Required
Format
"uuid"

Responses​

Member removed

Playground​

Server
Authorization
Variables
Key
Value

Samples​


Change a member's role​

PATCH
/org-admin/{slug}/members/{userId}

Moves a member to a different org role. Setting the role they already hold is an idempotent no-op that still answers 200.

Roles rank org_owner > org_admin > org_viewer. Rules enforced, each a 403 when broken:

  • only an org_owner may promote anyone to org_owner, or change the role of another owner;
  • nobody may change the role of a member whose role is equal to or above their own (an
    org_admin manages org_viewers, not other admins);
  • nobody may grant a role above their own.

Lowering your own role (stepping down) is always allowed. The organization's last remaining owner cannot be demoted (400) — promote another member to owner first.

Requires permission: org.manage_members

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Path Parameters

slug*

The organization's slug (not its UUID).

Type
string
Required
Example"local-food-bank-a1b2c3"
Pattern
"^[a-z0-9][a-z0-9-]{0,254}$"
userId*

The member's profile id. A non-UUID answers 404 Member not found.

Type
string
Required
Format
"uuid"

Request Body​

application/json
JSON
{
"role": "string"
}

Responses​

Role updated (or already held)

application/json
JSON
{
"data": {
"user_id": "string",
"role_name": "string"
}
}

Playground​

Server
Authorization
Variables
Key
Value
Body

Samples​


Update organization settings​

PATCH
/org-admin/{slug}/settings

Partial update of the organization's profile. Only the fields below are writable; others are ignored. String fields accept a string or null and are trimmed. At least one writable field must be present.

logo and banner_image take a URL as-is; to upload an image use POST /org-admin/{slug}/avatar or /banner instead.

Requires permission: org.update_settings

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Path Parameters

slug*

The organization's slug (not its UUID).

Type
string
Required
Example"local-food-bank-a1b2c3"
Pattern
"^[a-z0-9][a-z0-9-]{0,254}$"

Request Body​

application/json
JSON
{
"legal_name": "string",
"website": "string",
"description": "string",
"country": "string",
"logo": "string",
"banner_image": "string",
"mission": "string",
"contact_email": "string",
"contact_email_public": true,
"founded_year": 0,
"social_links": {
"twitter": "string",
"linkedin": "string",
"facebook": "string",
"instagram": "string",
"youtube": "string",
"tiktok": "string"
}
}

Responses​

Updated settings

application/json
JSON
{
"data": "string"
}

Playground​

Server
Authorization
Variables
Key
Value
Body

Samples​


Upload organization logo​

POST
/org-admin/{slug}/avatar

Uploads a new logo as base64 JSON. The image is centre-cropped to 256×256, re-encoded as WebP, stored, and written to the organization's logo straight away — no separate settings save is needed. Any previous logo file is deleted. Maximum 5 MB decoded.

Note the bare response body (no data envelope).

Requires permission: org.update_settings

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Path Parameters

slug*

The organization's slug (not its UUID).

Type
string
Required
Example"local-food-bank-a1b2c3"
Pattern
"^[a-z0-9][a-z0-9-]{0,254}$"

Request Body​

application/json
JSON
"string"

Responses​

Logo uploaded

application/json
JSON
{
"success": true,
"avatar_url": "string"
}

Playground​

Server
Authorization
Variables
Key
Value
Body

Samples​


Remove organization logo​

DELETE
/org-admin/{slug}/avatar

Deletes the stored logo files and clears the organization's logo.

Requires permission: org.update_settings

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Path Parameters

slug*

The organization's slug (not its UUID).

Type
string
Required
Example"local-food-bank-a1b2c3"
Pattern
"^[a-z0-9][a-z0-9-]{0,254}$"

Responses​

Logo removed

Playground​

Server
Authorization
Variables
Key
Value

Samples​


Post an organization update​

POST
/org-admin/{slug}/updates

Publishes a post to the organization's public updates feed (GET /organizations/{id}/updates). The caller is recorded as the author.

Requires permission: org.update_settings

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Path Parameters

slug*

The organization's slug (not its UUID).

Type
string
Required
Example"local-food-bank-a1b2c3"
Pattern
"^[a-z0-9][a-z0-9-]{0,254}$"

Request Body​

application/json
JSON
{
"title": "string",
"body": "string",
"cover_image": "string"
}

Responses​

Update posted

application/json
JSON
{
"data": "string"
}

Playground​

Server
Authorization
Variables
Key
Value
Body

Samples​


Delete an organization update​

DELETE
/org-admin/{slug}/updates/{updateId}

Permanently deletes one of this organization's updates. A malformed updateId answers 500 rather than 404.

Requires permission: org.update_settings

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Path Parameters

slug*

The organization's slug (not its UUID).

Type
string
Required
Example"local-food-bank-a1b2c3"
Pattern
"^[a-z0-9][a-z0-9-]{0,254}$"
updateId*
Type
string
Required
Format
"uuid"

Responses​

Update deleted

Playground​

Server
Authorization
Variables
Key
Value

Samples​


Edit an organization update​

PATCH
/org-admin/{slug}/updates/{updateId}

Partial edit of one of this organization's updates. Send at least one of title, body, cover_image.

Requires permission: org.update_settings

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Path Parameters

slug*

The organization's slug (not its UUID).

Type
string
Required
Example"local-food-bank-a1b2c3"
Pattern
"^[a-z0-9][a-z0-9-]{0,254}$"
updateId*
Type
string
Required
Format
"uuid"

Request Body​

application/json
JSON
{
"title": "string",
"body": "string",
"cover_image": "string"
}

Responses​

Update edited

application/json
JSON
{
"data": "string"
}

Playground​

Server
Authorization
Variables
Key
Value
Body

Samples​


Upload organization banner​

POST
/org-admin/{slug}/banner

Uploads the public-profile banner as base64 JSON. The image is centre-cropped to 1500×500 (3:1), re-encoded as WebP, stored, and written to the organization's banner_image straight away. Any previous banner file is deleted. Maximum 8 MB decoded.

Note the bare response body (no data envelope).

Requires permission: org.update_settings

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Path Parameters

slug*

The organization's slug (not its UUID).

Type
string
Required
Example"local-food-bank-a1b2c3"
Pattern
"^[a-z0-9][a-z0-9-]{0,254}$"

Request Body​

application/json
JSON
"string"

Responses​

Banner uploaded

application/json
JSON
{
"success": true,
"banner_url": "string"
}

Playground​

Server
Authorization
Variables
Key
Value
Body

Samples​


Remove organization banner​

DELETE
/org-admin/{slug}/banner

Deletes the stored banner files and clears the organization's banner_image.

Requires permission: org.update_settings

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Path Parameters

slug*

The organization's slug (not its UUID).

Type
string
Required
Example"local-food-bank-a1b2c3"
Pattern
"^[a-z0-9][a-z0-9-]{0,254}$"

Responses​

Banner removed

Playground​

Server
Authorization
Variables
Key
Value

Samples​


List DBAs​

GET
/org-admin/{slug}/dbas

The organization's "doing business as" names, default first, then alphabetical.

Requires permission: org.read

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Path Parameters

slug*

The organization's slug (not its UUID).

Type
string
Required
Example"local-food-bank-a1b2c3"
Pattern
"^[a-z0-9][a-z0-9-]{0,254}$"

Responses​

DBAs

application/json
JSON
{
"data": [
]
}

Playground​

Server
Authorization
Variables
Key
Value

Samples​


Add a DBA​

POST
/org-admin/{slug}/dbas

Adds a DBA name. With is_default: true it becomes the default and the previous default is cleared in the same transaction.

Requires permission: org.manage_dbas

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Path Parameters

slug*

The organization's slug (not its UUID).

Type
string
Required
Example"local-food-bank-a1b2c3"
Pattern
"^[a-z0-9][a-z0-9-]{0,254}$"

Request Body​

application/json
JSON
{
"dba_name": "string",
"is_default": false
}

Responses​

DBA added

application/json
JSON
{
"data": "string"
}

Playground​

Server
Authorization
Variables
Key
Value
Body

Samples​


Delete a DBA​

DELETE
/org-admin/{slug}/dbas/{dbaId}

Permanently deletes a DBA. Deleting the default leaves the organization with no default DBA.

Requires permission: org.manage_dbas

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Path Parameters

slug*

The organization's slug (not its UUID).

Type
string
Required
Example"local-food-bank-a1b2c3"
Pattern
"^[a-z0-9][a-z0-9-]{0,254}$"
dbaId*

A non-UUID answers 404 DBA not found.

Type
string
Required
Format
"uuid"

Responses​

DBA deleted

Playground​

Server
Authorization
Variables
Key
Value

Samples​


Update a DBA​

PATCH
/org-admin/{slug}/dbas/{dbaId}

Renames a DBA and/or changes whether it is the default. Setting is_default: true clears the previous default in the same transaction.

Requires permission: org.manage_dbas

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Path Parameters

slug*

The organization's slug (not its UUID).

Type
string
Required
Example"local-food-bank-a1b2c3"
Pattern
"^[a-z0-9][a-z0-9-]{0,254}$"
dbaId*

A non-UUID answers 404 DBA not found.

Type
string
Required
Format
"uuid"

Request Body​

application/json
JSON
{
"dba_name": "string",
"is_default": true
}

Responses​

DBA updated

application/json
JSON
{
"data": "string"
}

Playground​

Server
Authorization
Variables
Key
Value
Body

Samples​


List office locations​

GET
/org-admin/{slug}/locations

The organization's physical locations, primary first, then oldest first. Includes locations not shown publicly.

Requires permission: org.read

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Path Parameters

slug*

The organization's slug (not its UUID).

Type
string
Required
Example"local-food-bank-a1b2c3"
Pattern
"^[a-z0-9][a-z0-9-]{0,254}$"

Responses​

Locations

application/json
JSON
{
"data": [
]
}

Playground​

Server
Authorization
Variables
Key
Value

Samples​


Add an office location​

POST
/org-admin/{slug}/locations

Adds a location. With is_primary: true it becomes the primary location and the previous primary is cleared in the same transaction. Locations are hidden from the public profile unless is_publicly_visible is true.

Requires permission: org.manage_locations

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Path Parameters

slug*

The organization's slug (not its UUID).

Type
string
Required
Example"local-food-bank-a1b2c3"
Pattern
"^[a-z0-9][a-z0-9-]{0,254}$"

Request Body​

application/json
JSON
{
"label": "Headquarters",
"address": "string",
"is_primary": false,
"is_publicly_visible": false
}

Responses​

Location added

application/json
JSON
{
"data": "string"
}

Playground​

Server
Authorization
Variables
Key
Value
Body

Samples​


Delete an office location​

DELETE
/org-admin/{slug}/locations/{locationId}

Permanently deletes a location. Deleting the primary leaves the organization with no primary location.

Requires permission: org.manage_locations

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Path Parameters

slug*

The organization's slug (not its UUID).

Type
string
Required
Example"local-food-bank-a1b2c3"
Pattern
"^[a-z0-9][a-z0-9-]{0,254}$"
locationId*

A non-UUID answers 404 Location not found.

Type
string
Required
Format
"uuid"

Responses​

Location deleted

Playground​

Server
Authorization
Variables
Key
Value

Samples​


Update an office location​

PATCH
/org-admin/{slug}/locations/{locationId}

Partial update of a location. address, when sent, replaces the whole address object. Setting is_primary: true clears the previous primary in the same transaction.

Requires permission: org.manage_locations

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Path Parameters

slug*

The organization's slug (not its UUID).

Type
string
Required
Example"local-food-bank-a1b2c3"
Pattern
"^[a-z0-9][a-z0-9-]{0,254}$"
locationId*

A non-UUID answers 404 Location not found.

Type
string
Required
Format
"uuid"

Request Body​

application/json
JSON
{
"label": "string",
"address": "string",
"is_primary": true,
"is_publicly_visible": true
}

Responses​

Location updated

application/json
JSON
{
"data": "string"
}

Playground​

Server
Authorization
Variables
Key
Value
Body

Samples​


Start or resume Stripe Connect onboarding​

POST
/org-admin/{slug}/payouts/connect

Creates the organization's Stripe Express account (business type company) if it has none, or reuses the existing one, and returns a fresh single-use onboarding link. Safe to call repeatedly — each call returns a new link. If the stored account no longer exists on Stripe a new one is created in its place.

The organization must have verification_status: verified, and the features.org_level_stripe_connect flag must be on (503 otherwise).

Requires permission: org.manage_payouts (organization owners only)

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Path Parameters

slug*

The organization's slug (not its UUID).

Type
string
Required
Example"local-food-bank-a1b2c3"
Pattern
"^[a-z0-9][a-z0-9-]{0,254}$"

Responses​

Onboarding link created

application/json
JSON
{
"data": {
"accountId": "acct_1Nv0FGQ9RKHgCVdK",
"onboardingUrl": "string",
"status": "string"
}
}

Playground​

Server
Authorization
Variables
Key
Value

Samples​


Get Stripe Connect status​

GET
/org-admin/{slug}/payouts/status

Whether the organization can take charges and receive payouts. Reads the account live from Stripe and refreshes the stored flags. If Stripe cannot be reached, the last stored flags are returned instead and the Stripe-only fields (defaultCurrency, country, businessType, requirementsCurrentlyDue) are absent. With no account yet the body is { "data": { "connected": false } }.

Requires permission: org.read_payouts

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Path Parameters

slug*

The organization's slug (not its UUID).

Type
string
Required
Example"local-food-bank-a1b2c3"
Pattern
"^[a-z0-9][a-z0-9-]{0,254}$"

Responses​

Connect status

application/json
JSON
{
"data": "string"
}

Playground​

Server
Authorization
Variables
Key
Value

Samples​


List child organizations​

GET
/org-admin/{slug}/children

Organizations whose parent is this one, newest first. Always empty for a company; only a conglomerate has children.

Requires permission: org.read

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Path Parameters

slug*

The organization's slug (not its UUID).

Type
string
Required
Example"local-food-bank-a1b2c3"
Pattern
"^[a-z0-9][a-z0-9-]{0,254}$"

Responses​

Child organizations

application/json
JSON
{
"data": [
]
}

Playground​

Server
Authorization
Variables
Key
Value

Samples​


Create a child organization​

POST
/org-admin/{slug}/children

Creates a new company under this conglomerate. Validation is the same as POST /organizations, except that the new organization is always a company (kind is ignored once it passes validation) and sending parent_organization_id in the body is rejected — the parent is always the {slug} organization. The caller becomes org_owner of the child. The child starts with verification_status: pending; the first DBA becomes its default and the first location its primary.

Requires a verified email address.

Requires permission: org.manage_children (organization owners only)

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Path Parameters

slug*

The organization's slug (not its UUID).

Type
string
Required
Example"local-food-bank-a1b2c3"
Pattern
"^[a-z0-9][a-z0-9-]{0,254}$"

Request Body​

application/json
JSON
{
"legal_name": "string",
"ein": "12-3456789",
"country": "string",
"website": "string",
"description": "string",
"categories": [
"string"
],
"dbas": [
{
"dba_name": "string"
}
],
"locations": [
{
"label": "string",
"address": "string"
}
]
}

Responses​

Child organization created

application/json
JSON
{
"data": "string"
}

Playground​

Server
Authorization
Variables
Key
Value
Body

Samples​


List verification documents​

GET
/org-admin/{slug}/documents

The organization's verification documents in every state except superseded, newest first, including review outcome and whether each is shown on the public profile.

Financial documents — w9, voided_check and other — are listed only when the caller also holds org.upload_documents; otherwise they are left out of the list. ein_letter and 501c3_determination are listed with org.read alone.

Requires permission: org.read

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Path Parameters

slug*

The organization's slug (not its UUID).

Type
string
Required
Example"local-food-bank-a1b2c3"
Pattern
"^[a-z0-9][a-z0-9-]{0,254}$"

Responses​

Documents

application/json
JSON
{
"data": [
]
}

Playground​

Server
Authorization
Variables
Key
Value

Samples​


Upload a verification document​

POST
/org-admin/{slug}/documents

Uploads a document for platform review as base64 JSON. It is stored privately and enters the review queue as pending. Uploading a doc_type the organization already has pending or approved marks the older one superseded. Approval of both ein_letter and 501c3_determination is what verifies the organization.

Size limit: 10 MB decoded by default, but the JSON body itself is capped at 10 MB, so in practice a file must stay under about 7.5 MB to fit once base64-encoded — larger bodies get 413 before the handler runs.

Requires permission: org.upload_documents

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Path Parameters

slug*

The organization's slug (not its UUID).

Type
string
Required
Example"local-food-bank-a1b2c3"
Pattern
"^[a-z0-9][a-z0-9-]{0,254}$"

Request Body​

application/json
JSON
{
"doc_type": "string",
"content_type": "string",
"original_filename": "string",
"file_base64": "string"
}

Responses​

Document uploaded

application/json
JSON
{
"data": {
"id": "string",
"org_id": "string",
"doc_type": "string",
"original_filename": "string",
"content_type": "string",
"size_bytes": 0,
"verification_status": "pending",
"uploaded_by_user_id": "string",
"created_at": "string",
"updated_at": "string"
}
}

Playground​

Server
Authorization
Variables
Key
Value
Body

Samples​


Download a verification document​

GET
/org-admin/{slug}/documents/{docId}/download

Streams the stored file with its original Content-Type and, when a filename was recorded, Content-Disposition: attachment. A document belonging to a different organization answers 404.

A w9, voided_check or other document can be downloaded only by a caller who also holds org.upload_documents; anyone else gets 404, as if it did not exist.

Requires permission: org.read

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Path Parameters

slug*

The organization's slug (not its UUID).

Type
string
Required
Example"local-food-bank-a1b2c3"
Pattern
"^[a-z0-9][a-z0-9-]{0,254}$"
docId*

A non-UUID answers 404 Document not found.

Type
string
Required
Format
"uuid"

Responses​

The file

Playground​

Server
Authorization
Variables
Key
Value

Samples​


Delete a pending verification document​

DELETE
/org-admin/{slug}/documents/{docId}

Withdraws a document that is still pending. Approved and rejected documents are kept for the audit trail and cannot be deleted — they answer 404 like a missing document.

Requires permission: org.upload_documents

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Path Parameters

slug*

The organization's slug (not its UUID).

Type
string
Required
Example"local-food-bank-a1b2c3"
Pattern
"^[a-z0-9][a-z0-9-]{0,254}$"
docId*

A non-UUID answers 404 Document not found.

Type
string
Required
Format
"uuid"

Responses​

Document deleted

Playground​

Server
Authorization
Variables
Key
Value

Samples​


Show or hide a document on the public profile​

PATCH
/org-admin/{slug}/documents/{docId}/public-visibility

Sets the document's public-visibility flag. The public profile (GET /organizations/{id}/documents/public) lists a document only when it is both flagged public and approved, so the flag can be set ahead of review.

Requires permission: org.upload_documents

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Path Parameters

slug*

The organization's slug (not its UUID).

Type
string
Required
Example"local-food-bank-a1b2c3"
Pattern
"^[a-z0-9][a-z0-9-]{0,254}$"
docId*

A non-UUID answers 404 Document not found.

Type
string
Required
Format
"uuid"

Request Body​

application/json
JSON
{
"is_publicly_visible": true
}

Responses​

Visibility updated

application/json
JSON
{
"data": {
"id": "string",
"is_publicly_visible": true
}
}

Playground​

Server
Authorization
Variables
Key
Value
Body

Samples​


Powered by VitePress OpenAPI

Built with VitePress