API Endpoints

April 7, 2026 · View on GitHub

All endpoints are served on port 8080 and require a JWT Authorization: Bearer <token> header unless noted.

Base URL (local): http://localhost:8080

Endpoint Summary

Health

MethodPathAuthDescription
GET/livezNoneLiveness probe — returns OK
GET/readyzNoneReadiness probe — returns OK or 503

GroupsIO Services

MethodPathAuthDescription
GET/groupsio/servicesJWTList services, optionally filtered by ?project_uid=<uuid>
POST/groupsio/servicesJWTCreate a service
GET/groupsio/services/{service_id}JWTGet a service by ID
PUT/groupsio/services/{service_id}JWTUpdate a service
DELETE/groupsio/services/{service_id}JWTDelete a service
GET/groupsio/services/_projectsJWTList projects that have GroupsIO services
GET/groupsio/services/find_parent?project_uid=<uuid>JWTFind the parent service for a project

GroupsIO Mailing Lists

MethodPathAuthDescription
GET/groupsio/mailing-listsJWTList mailing lists, filtered by ?project_uid=<uuid> and/or ?committee_uid=<uuid>
POST/groupsio/mailing-listsJWTCreate a mailing list
GET/groupsio/mailing-lists/{subgroup_id}JWTGet a mailing list by ID
PUT/groupsio/mailing-lists/{subgroup_id}JWTUpdate a mailing list
DELETE/groupsio/mailing-lists/{subgroup_id}JWTDelete a mailing list
GET/groupsio/mailing-lists/count?project_uid=<uuid>JWTGet mailing list count for a project
GET/groupsio/mailing-lists/{subgroup_id}/member_countJWTGet member count for a mailing list

GroupsIO Members

MethodPathAuthDescription
GET/groupsio/mailing-lists/{subgroup_id}/membersJWTList members of a mailing list
POST/groupsio/mailing-lists/{subgroup_id}/membersJWTAdd a member to a mailing list
GET/groupsio/mailing-lists/{subgroup_id}/members/{member_id}JWTGet a member by ID
PUT/groupsio/mailing-lists/{subgroup_id}/members/{member_id}JWTUpdate a member
DELETE/groupsio/mailing-lists/{subgroup_id}/members/{member_id}JWTRemove a member
POST/groupsio/mailing-lists/{subgroup_id}/invitemembersJWTInvite members by email

GroupsIO Artifacts

MethodPathAuthDescription
GET/groupsio/mailing-lists/{subgroup_id}/artifacts/{artifact_id}JWTGet artifact metadata
GET/groupsio/mailing-lists/{subgroup_id}/artifacts/{artifact_id}/downloadJWTGet a presigned S3 download URL (expires in 15 min)

Utilities

MethodPathAuthDescription
POST/groupsio/checksubscriberJWTCheck if an email is subscribed to a mailing list

OpenAPI Specs

MethodPathAuthDescription
GET/_groupsio/openapi.jsonNoneOpenAPI 2.0 (JSON)
GET/_groupsio/openapi3.jsonNoneOpenAPI 3.0 (JSON)
GET/_groupsio/openapi.yamlNoneOpenAPI 2.0 (YAML)
GET/_groupsio/openapi3.yamlNoneOpenAPI 3.0 (YAML)

Examples

All examples use mock auth. Any non-empty Bearer token is accepted when AUTH_SOURCE=mock.

TOKEN="test-token"
BASE="http://localhost:8080"

Health Checks

curl $BASE/livez
# OK

curl $BASE/readyz
# OK

GroupsIO Services

List services for a project:

curl -H "Authorization: Bearer $TOKEN" \
  "$BASE/groupsio/services?project_uid=<project-uuid>"

Get a service:

curl -H "Authorization: Bearer $TOKEN" \
  "$BASE/groupsio/services/<service-id>"

Find parent service for a project:

curl -H "Authorization: Bearer $TOKEN" \
  "$BASE/groupsio/services/find_parent?project_uid=<project-uuid>"

Create a service:

curl -X POST -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"project_uid":"<uuid>","type":"v2_primary","domain":"groups.io","prefix":"myorg","status":"active"}' \
  "$BASE/groupsio/services"

Update a service:

curl -X PUT -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"status":"inactive"}' \
  "$BASE/groupsio/services/<service-id>"

Delete a service:

curl -X DELETE -H "Authorization: Bearer $TOKEN" \
  "$BASE/groupsio/services/<service-id>"
# 204 No Content

GroupsIO Mailing Lists

List mailing lists for a project:

curl -H "Authorization: Bearer $TOKEN" \
  "$BASE/groupsio/mailing-lists?project_uid=<project-uuid>"

List mailing lists for a committee:

curl -H "Authorization: Bearer $TOKEN" \
  "$BASE/groupsio/mailing-lists?committee_uid=<committee-uuid>"

Get a mailing list:

curl -H "Authorization: Bearer $TOKEN" \
  "$BASE/groupsio/mailing-lists/<subgroup-id>"

Get mailing list count for a project:

curl -H "Authorization: Bearer $TOKEN" \
  "$BASE/groupsio/mailing-lists/count?project_uid=<project-uuid>"

Get member count for a mailing list:

curl -H "Authorization: Bearer $TOKEN" \
  "$BASE/groupsio/mailing-lists/<subgroup-id>/member_count"

Create a mailing list:

curl -X POST -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"project_uid":"<uuid>","group_name":"my-list","description":"My list","type":"private","audience_access":"member"}' \
  "$BASE/groupsio/mailing-lists"

Update a mailing list:

curl -X PUT -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"description":"Updated description"}' \
  "$BASE/groupsio/mailing-lists/<subgroup-id>"

Delete a mailing list:

curl -X DELETE -H "Authorization: Bearer $TOKEN" \
  "$BASE/groupsio/mailing-lists/<subgroup-id>"
# 204 No Content

GroupsIO Members

List members:

curl -H "Authorization: Bearer $TOKEN" \
  "$BASE/groupsio/mailing-lists/<subgroup-id>/members"

Get a member:

curl -H "Authorization: Bearer $TOKEN" \
  "$BASE/groupsio/mailing-lists/<subgroup-id>/members/<member-id>"

Add a member:

curl -X POST -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"email":"alice@example.com","member_type":"committee"}' \
  "$BASE/groupsio/mailing-lists/<subgroup-id>/members"

Update a member:

curl -X PUT -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"delivery_mode":"digest"}' \
  "$BASE/groupsio/mailing-lists/<subgroup-id>/members/<member-id>"

Remove a member:

curl -X DELETE -H "Authorization: Bearer $TOKEN" \
  "$BASE/groupsio/mailing-lists/<subgroup-id>/members/<member-id>"
# 204 No Content

Invite members by email:

curl -X POST -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"emails":["alice@example.com","bob@example.com"]}' \
  "$BASE/groupsio/mailing-lists/<subgroup-id>/invitemembers"
# 204 No Content

GroupsIO Artifacts

Get artifact metadata:

curl -H "Authorization: Bearer $TOKEN" \
  "$BASE/groupsio/mailing-lists/<subgroup-id>/artifacts/<artifact-uuid>"

Get presigned download URL:

curl -H "Authorization: Bearer $TOKEN" \
  "$BASE/groupsio/mailing-lists/<subgroup-id>/artifacts/<artifact-uuid>/download"
# {"url":"https://s3.amazonaws.com/...?X-Amz-Expires=900&..."}

Check Subscriber

curl -X POST -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"email":"alice@example.com","subgroup_id":"<subgroup-id>"}' \
  "$BASE/groupsio/checksubscriber"