POST /v1/post-activity — Post a New Activity to the Bloomy Earth Community

Creates a new activity for an organization.
Accepts plain text or HTML. Heading normalization is enforced: <h1>/<h2><h3>, <h3><h4>, <h4><h6><h4>.
Only safe HTML is allowed; unsafe tags or attributes are automatically stripped.

Limits:

  • title ≤ 120 characters
  • content ≤ 3000 plain-text characters (after normalization)

Rate limits (both apply):

  • 1 post per minute
  • 20 posts per rolling 24 hours per organization

If exceeded, the API returns HTTP 429 with a retryAfter value.

Base URL

https://api.bloomy.earth

Endpoint

/v1/post-activity

Authentication & Headers

Authentication uses HTTP Basic Auth with your Bloomy Earth API credentials. You must use your Bloomy Earth platform username and application password.

You can find and manage these credentials in your Bloomy Earth dashboard, in the Integration API section:
👉 https://www.bloomy.earth/dashboard/#bloomy-integration-api

Headers

Header Value Required Description
Authorization Basic BASE64(username:pwd) Yes Basic Auth using your Bloomy Earth username and application password.
Accept application/json Optional Specifies that the response should be in JSON format.
Content-Type application/json Yes Specifies that the request body is sent in JSON format.

Request Body Parameters (JSON)

Field Type Required Description
title string Yes Post title. Rendered as an <h2> above the content body. Maximum 120 characters.
content string (HTML or text) Yes Main body of the post. Accepts plain text or HTML. Allowed tags after normalization and sanitization: <p>, <h3>, <h4>, <img>. Headings are automatically normalized (<h1>/<h2><h3>, <h3><h4>, <h4><h6><h4>). Maximum 3000 characters (plain-text length after normalization).

Example Request

curl -X POST "https://api.bloomy.earth/v1/post-activity" \
  -u YOUR_BLOOMY_USERNAME:YOUR_APPLICATION_PASSWORD \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "GreenSeed Co. — Monthly Impact Update",
    "content": "<p>GreenSeed Co. is proud to announce another month of progress: 120 trees planted and 3 community nurseries supported.</p><h2>Field Work Highlights</h2><p>Our local partners in Kenya completed the first planting phase for the wet season, focusing on native species to boost biodiversity.</p><h3>Volunteer Program</h3><p>Over 30 volunteers were trained on seedling care and monitoring protocols.</p><h4>Gallery</h4><p><img src=\"https://example.com/images/greenseed-monthly-2025.jpg\" alt=\"Volunteers planting trees\" loading=\"lazy\" style=\"max-width:100%;border-radius:8px;\"></p><p>Visit our project page to learn more and join the next planting day.</p>"
  }'

JSON Response (200)

{
  "success": true,
  "activityId": 874,
  "title": "GreenSeed Co. — Monthly Impact Update",
  "createdAt": "2025-11-05 15:22:18",
  "author": "GreenSeed Co.",
  "profileLink": "https://www.bloomy.earth/members/greenseed-co/",
  "message": "Activity posted successfully."
}

Response fields

Field Type Description
success boolean True on success.
activityId integer Unique ID of the created activity.
title string Title saved as metadata and rendered as <h2> by the site.
createdAt string (UTC "YYYY-MM-DD HH:mm:ss") Creation timestamp.
author string Display name of the posting organization.
profileLink string (URL) Public profile URL of the posting organization.
message string Short confirmation message.

Note:
The direct URL to view this activity can be reconstructed as:
https://www.bloomy.earth/members/{username}/activity/{activityId}/
(using the profileLink and activityId from the response)

Errors

If the request is missing required data or contains invalid parameters, the API returns a JSON object with an error code and message.

HTTP Code Error Message When
400 invalid_request Bad request. Malformed JSON or missing required parameters (title or content).
401 unauthorized Authentication required. The Authorization header was missing or invalid.
403 forbidden Authentication failed. The provided credentials are invalid or lack permissions.
413 payload_too_large Payload too large. The title or content exceeds the allowed size (120 / 3000 chars).
429 rate_limited Rate limit exceeded. More than 1 post per minute or 20 posts within 24 hours.
500 server_error Internal server error. Unexpected server-side issue.

Error format:

{
  "error": "forbidden",
  "message": "Authentication failed."
}