Amba

Achievements

Achievement definitions with XP rewards, unlock criteria, and optional hidden state.

Achievements unlock automatically based on the evaluation of their criteria JSONB. Read the shared CreateAchievementInput type for the full schema.

Source: apps/api/src/routes/admin/achievements.ts.

Endpoints

MethodPathDescription
POST/admin/projects/:projectId/achievementsCreate an achievement.
GET/admin/projects/:projectId/achievementsList achievements, ordered by sort_order.
GET/admin/projects/:projectId/achievements/:achievementIdFetch a single achievement.
PATCH/admin/projects/:projectId/achievements/:achievementIdPartial update.
DELETE/admin/projects/:projectId/achievements/:achievementIdDelete.

POST /admin/projects/:projectId/achievements

Request

FieldTypeRequiredDefault
keystringyes
namestringyes
descriptionstringnonull
icon_urlstringnonull
xp_rewardnumberno0
criteriaobjectyes
is_hiddenbooleannofalse
sort_ordernumberno0

criteria is a JSONB rule tree — see CreateAchievementInput in @amba/shared for the current shape (event-count thresholds, property filters, composite all/any combinators).

Response 201

{
  "data": {
    "id": "…",
    "key": "first_workout",
    "name": "First Workout",
    "xp_reward": 10,
    "criteria": {},
    "is_hidden": false,
    "sort_order": 0
  }
}

Errors

  • 500 CREATE_FAILED.

Try it:

POST/admin/projects/%7B%7BprojectId%7D%7D/achievements
developer auth
curl -X POST 'https://api.amba.dev/admin/projects/%7B%7BprojectId%7D%7D/achievements'
Loading auth… Configure auth in the settings drawer (top-right) to run this request.

Curl:

curl -X POST '${BASE_URL}/admin/projects/{projectId}/achievements' \
  -H 'Authorization: Bearer ${DEV_TOKEN}' \
  -H 'Content-Type: application/json' \
  -d '{}'

GET /admin/projects/:projectId/achievements

Ordered by sort_order.

{ "data": [{ "id": "…", "key": "first_workout", "name": "…", "xp_reward": 10 }] }

Try it:

GET/admin/projects/%7B%7BprojectId%7D%7D/achievements
developer auth
curl -X GET 'https://api.amba.dev/admin/projects/%7B%7BprojectId%7D%7D/achievements'
Loading auth… Configure auth in the settings drawer (top-right) to run this request.

Curl:

curl -X GET '${BASE_URL}/admin/projects/{projectId}/achievements' \
  -H 'Authorization: Bearer ${DEV_TOKEN}'

GET /admin/projects/:projectId/achievements/:achievementId

Errors

  • 404 NOT_FOUND.

Try it:

GET/admin/projects/%7B%7BprojectId%7D%7D/achievements/%7B%7BachievementId%7D%7D
developer auth
curl -X GET 'https://api.amba.dev/admin/projects/%7B%7BprojectId%7D%7D/achievements/%7B%7BachievementId%7D%7D'
Loading auth… Configure auth in the settings drawer (top-right) to run this request.

Curl:

curl -X GET '${BASE_URL}/admin/projects/{projectId}/achievements/{achievementId}' \
  -H 'Authorization: Bearer ${DEV_TOKEN}'

PATCH /admin/projects/:projectId/achievements/:achievementId

Allowed fields: name, description, icon_url, xp_reward, criteria, is_hidden, sort_order, is_active.

Errors

  • 404 NOT_FOUND.
  • 500 UPDATE_FAILED.

Try it:

PATCH/admin/projects/%7B%7BprojectId%7D%7D/achievements/%7B%7BachievementId%7D%7D
developer auth
curl -X PATCH 'https://api.amba.dev/admin/projects/%7B%7BprojectId%7D%7D/achievements/%7B%7BachievementId%7D%7D'
Loading auth… Configure auth in the settings drawer (top-right) to run this request.

Curl:

curl -X PATCH '${BASE_URL}/admin/projects/{projectId}/achievements/{achievementId}' \
  -H 'Authorization: Bearer ${DEV_TOKEN}' \
  -H 'Content-Type: application/json' \
  -d '{}'

DELETE /admin/projects/:projectId/achievements/:achievementId

{ "data": { "deleted": true } }

Try it:

DELETE/admin/projects/%7B%7BprojectId%7D%7D/achievements/%7B%7BachievementId%7D%7D
developer auth
curl -X DELETE 'https://api.amba.dev/admin/projects/%7B%7BprojectId%7D%7D/achievements/%7B%7BachievementId%7D%7D'
Loading auth… Configure auth in the settings drawer (top-right) to run this request.

Curl:

curl -X DELETE '${BASE_URL}/admin/projects/{projectId}/achievements/{achievementId}' \
  -H 'Authorization: Bearer ${DEV_TOKEN}'