Skip to content

Updates​

Project updates, milestones, and funding stats


Get the project updates feed​

GET
/projects/{fundraiserId}/updates

Returns a unified feed of the fundraiser's updates and its withdrawals, newest first — a bare array. A withdrawal row is this campaign's share of a payout that carried its donations (never the payout's whole amount); paid, in-transit and pending payouts are listed. Withdrawn updates are left out. An unreadable feed answers 200 with an empty array rather than an error.
Readable exactly when GET /fundraisers/{id} is: a campaign that is not active, paused or ended, is private, or has been deleted answers 404 to everyone but its owner.
Authentication is optional. Every update item carries like_count; for a signed-in caller liked_by_me says whether they like it, and for a guest it is always false. Withdrawal items carry neither.

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)
or

Parameters​

Path Parameters

fundraiserId*
Type
string
Required

Query Parameters

lang

Overlay update translations into this language, when they exist.

Type
string
Valid values
"en""ru""uk""es"

Responses​

Update feed (items are type "update" or "withdrawal")

application/json
JSON
[
{
"type": "string",
"id": "string",
"created_at": "string",
"title": "string",
"body": "string",
"author": {
"id": "string",
"name": "string",
"avatar": "string"
},
"amount_cents": 0,
"currency": "string",
"status": "string",
"arrival_date": "string",
"like_count": 0,
"liked_by_me": true
}
]

Playground​

Server
Authorization
Variables
Key
Value

Samples​


Post a project update​

POST
/projects/{fundraiserId}/updates

Creates a project update on a fundraiser. Only the fundraiser owner may post, the caller's email must be verified, and the endpoint is gated by the features.project_updates flag. The body field is required (at most 20,000 characters; title at most 200). The update's language is detected and machine translations are queued.

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

fundraiserId*
Type
string
Required

Request Body​

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

Responses​

Update created — a bare object, not wrapped in data.

application/json
JSON
{
"id": "string",
"fundraiser_id": "string",
"author_id": "string",
"title": "string",
"body": "string",
"source_language": "string",
"created_at": "string",
"updated_at": "string",
"type": "string",
"author": {
"id": "string",
"name": "string",
"avatar": "string"
}
}

Playground​

Server
Authorization
Variables
Key
Value
Body

Samples​


Delete a project update​

DELETE
/projects/{fundraiserId}/updates/{updateId}

Soft-deletes a project update. Only the fundraiser owner may delete it.

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

fundraiserId*
Type
string
Required
updateId*
Type
string
Required

Responses​

Update deleted

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

Playground​

Server
Authorization
Variables
Key
Value

Samples​


Edit a project update​

PATCH
/projects/{fundraiserId}/updates/{updateId}

Changes an update's title and/or body. Campaign owner only; the caller's email must be verified, and the endpoint is gated by the features.project_updates flag. Send at least one of title and body; title: null (or blank) removes the title.
When the words change, the update's language is detected again, its machine translations are dropped and re-queued, and hand-made translations are flagged as outdated. A withdrawn update answers 404. Audit-logged.

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

fundraiserId*
Type
string
Required
Format
"uuid"
updateId*
Type
string
Required
Format
"uuid"

Request Body​

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

Responses​

The edited update (bare object)

application/json
JSON
{
"id": "string",
"fundraiser_id": "string",
"author_id": "string",
"title": "string",
"body": "string",
"source_language": "string",
"created_at": "string",
"updated_at": "string",
"type": "string"
}

Playground​

Server
Authorization
Variables
Key
Value
Body

Samples​


Like a project update​

PUT
/projects/{fundraiserId}/updates/{updateId}/like

Likes a campaign update as the authenticated user. Idempotent: liking an update you already like changes nothing and answers the same state. No verified email is required; the per-account rate limit applies.

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

fundraiserId*
Type
string
Required
Format
"uuid"
updateId*
Type
string
Required
Format
"uuid"

Responses​

Liked; the update's count after the write

application/json
JSON
"string"

Playground​

Server
Authorization
Variables
Key
Value

Samples​


Unlike a project update​

DELETE
/projects/{fundraiserId}/updates/{updateId}/like

Removes the authenticated user's like from a campaign update. Idempotent: unliking an update you do not like changes nothing.

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

fundraiserId*
Type
string
Required
Format
"uuid"
updateId*
Type
string
Required
Format
"uuid"

Responses​

Not liked; the update's count after the write

application/json
JSON
"string"

Playground​

Server
Authorization
Variables
Key
Value

Samples​


List project milestones​

GET
/projects/{fundraiserId}/milestones

Returns all milestones for a fundraiser, ordered by due date then creation date — a bare array, unlike GET /fundraisers/{fundraiserId}/milestones, which wraps the same rows in milestones. Readable exactly when GET /fundraisers/{id} is: a campaign that is not active, paused or ended, is private, or has been deleted answers 404 to everyone but its owner. Authentication is optional.

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)
or

Parameters​

Path Parameters

fundraiserId*
Type
string
Required

Query Parameters

lang

Overlay the stored translation of title and description for this language, when one exists.

Type
string
Valid values
"en""ru""uk""es"

Responses​

Milestone list

application/json
JSON
[
]

Playground​

Server
Authorization
Variables
Key
Value

Samples​


Get project funding stats​

GET
/projects/{fundraiserId}/stats

Returns allocation, disbursement, and milestone-count stats for a project-type fundraiser. Non-project fundraisers return zeroed stats. Not available yet for project fundraisers: the endpoint currently answers 500 for them. Readable exactly when GET /fundraisers/{id} is: a campaign that is not active, paused or ended, is private, or has been deleted answers 404 to everyone but its owner. Authentication is optional.

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)
or

Parameters​

Path Parameters

fundraiserId*
Type
string
Required

Responses​

Project stats

application/json
JSON
{
"totalAllocated": 0,
"totalDisbursed": 0,
"unallocated": 0,
"milestones": {
"total": 0,
"additionalProperties": 0
}
}

Playground​

Server
Authorization
Variables
Key
Value

Samples​


List translations of a campaign's updates​

GET
/fundraisers/{id}/updates/translations

Every live (not withdrawn) update of the campaign, newest first, with its original text and language and one row per other supported locale. Campaign owner 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

id*

The campaign's UUID.

Type
string
Required
Format
"uuid"

Responses​

Updates with their translations

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

Playground​

Server
Authorization
Variables
Key
Value

Samples​


Get one update's translations​

GET
/fundraisers/{id}/updates/{updateId}/translations

One update of the campaign: its original and its rows in the other three locales. Campaign owner only. A withdrawn update, or one belonging to another campaign, answers 404.

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

id*

The campaign's UUID.

Type
string
Required
Format
"uuid"
updateId*
Type
string
Required
Format
"uuid"

Responses​

The update and its translations

application/json
JSON
{
"data": {
"fundraiser_id": "string",
"update_id": "string",
"id": "string",
"created_at": "string",
"source": {
"language": "string",
"title": "string",
"content": "string",
"edited_at": "string"
},
"translations": [
]
}
}

Playground​

Server
Authorization
Variables
Key
Value

Samples​


Save a hand-edited update translation​

PUT
/fundraisers/{id}/updates/{updateId}/translations/{lang}

Creates or overwrites an update's translation in lang as source: "human", so no automatic pass overwrites it. Campaign owner only. Audit-logged. Refused in the update's own language. When the update has a title, the translation must carry one too.

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

id*

The campaign's UUID.

Type
string
Required
Format
"uuid"
updateId*
Type
string
Required
Format
"uuid"
lang*
Type
string
Required
Valid values
"en""ru""uk""es"

Request Body​

application/json
JSON
{
"title": "string",
"content": "string"
}

Responses​

The saved row

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

Playground​

Server
Authorization
Variables
Key
Value
Body

Samples​


Regenerate an update translation​

POST
/fundraisers/{id}/updates/{updateId}/translations/{lang}/regenerate

Re-runs machine translation of one update into lang and stores it as source: "machine". A hand-edited row is only replaced with force=1. Campaign owner only. Audit-logged.

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

id*

The campaign's UUID.

Type
string
Required
Format
"uuid"
updateId*
Type
string
Required
Format
"uuid"
lang*
Type
string
Required
Valid values
"en""ru""uk""es"

Query Parameters

force

1 or true overwrites a hand-edited row.

Type
string
Valid values
"1""true"

Responses​

The regenerated row

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

Playground​

Server
Authorization
Variables
Key
Value

Samples​


Powered by VitePress OpenAPI

Built with VitePress