Skip to content
Developers

Quest workflows

Enroll accounts in quests, collect objective evidence and review submissions with the API.

Use these endpoints to build quest enrollment, evidence submission and review flows: participants enroll and submit evidence for each objective, and quest managers approve or decline enrollments and evidence. The access decision, manager, declined-participant and attachment rules are on Participation workflows and apply here unchanged.

Requests use https://app.hive3.tech/api/v1 and an API key from Authentication. API access needs Honey Bee or above (see the developer overview). Field names such as personId and participantId identify accounts. Endpoints without a body show only curl; for JavaScript and Python use the pattern of the event participants example.

#Enrollments

POST/api/v1/workflows/quests/{questId}/enrollmentScoperesources:write

Enrolls or unenrolls the key owner. Repeating the request returns the existing enrollment. Quests that have ended are closed to new enrollments.

NameInTypeRequiredNotes
questIdpathstringYesQuest ID.
enrollbodybooleanNotrue (default) enrolls, false unenrolls.
bash
curl -X POST https://app.hive3.tech/api/v1/workflows/quests/quest_123/enrollment \
  -H "Authorization: Bearer $HIVE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"enroll": true}'

Returns 201 for a new enrollment and 200 otherwise. accepted is null while the organizer must still decide. Unenrolling returns the same object with isEnrolled: false, accepted: null and progressPercent: 0.

json
{
  "data": {
    "id": "enrollment_456",
    "questId": "quest_123",
    "personId": "account_456",
    "isEnrolled": true,
    "isActive": true,
    "accepted": true,
    "enrolledAt": "2026-10-20T09:30:00.000Z",
    "acceptedAt": "2026-10-20T09:30:00.000Z",
    "progressPercent": 0
  }
}
StatuscodeWhen
403forbiddenYou cannot enroll in this quest.
404not_foundThe quest does not exist or is archived.
409conflictThe quest has ended (Ended quests are closed) or the organizer declined this participant.
GET/api/v1/workflows/quests/{questId}/enrollmentsScoperesources:read

Lists enrollments with objective progress for quest managers (owner, admin or moderator of the quest's account), up to 200 rows and no page object.

bash
curl https://app.hive3.tech/api/v1/workflows/quests/quest_123/enrollments \
  -H "Authorization: Bearer $HIVE_API_KEY"

Returns 200. Use enrollmentId to approve or decline.

json
{
  "data": [
    {
      "personId": "account_456",
      "name": "Ada Lovelace",
      "email": "ada@example.com",
      "enrollmentId": "enrollment_456",
      "enrolledAt": "2026-10-20T09:30:00.000Z",
      "accepted": true,
      "questId": "quest_123",
      "participantId": "account_456",
      "progressPercent": 0,
      "isComplete": false,
      "objectives": [
        {
          "objectiveId": "quest_123:objective:1",
          "type": "custom",
          "scope": "none",
          "targetCount": 1,
          "currentCount": 0,
          "progressPercent": 0,
          "isComplete": false
        }
      ]
    }
  ]
}

Errors: 403 forbidden when the key owner cannot manage the quest, 403 insufficient_scope for another account's quest without communities:read.

PATCH/api/v1/workflows/quests/{questId}/enrollments/{enrollmentId}Scoperesources:write

Approves or declines a quest enrollment. Approving re-checks the participant's current access (matching plan or purchased ticket); on failure the enrollment is unchanged.

NameInTypeRequiredNotes
questIdpathstringYesQuest ID.
enrollmentIdpathstringYesenrollmentId from the list.
acceptedbodybooleanOne of the twotrue approves, false declines.
decisionbodystringOne of the twoapprove or accepted, deny or rejected.
bash
curl -X PATCH https://app.hive3.tech/api/v1/workflows/quests/quest_123/enrollments/enrollment_456 \
  -H "Authorization: Bearer $HIVE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"decision": "approve"}'

Returns 200 with the enrollment object shown for the enrollment endpoint above (id, questId, personId, isEnrolled, isActive, accepted, enrolledAt, acceptedAt, progressPercent).

StatuscodeWhen
400invalid_requestaccepted or decision is required.
403forbiddenThe key owner cannot manage the quest, or Participant does not have access to this quest.
404not_foundThe enrollment does not belong to the quest.

#Evidence

Evidence proves that a participant completed an objective. A new submission is pending until a manager approves or denies it. Approving marks the objective complete for the participant; denying previously approved evidence removes that completion unless other approved evidence covers the objective.

POST/api/v1/workflows/quests/{questId}/evidenceScoperesources:write

Submits evidence for one objective as the key owner, who needs an approved enrollment and current quest access. If a pending submission for the same objective already exists, it is returned unchanged and nothing new is stored.

NameInTypeRequiredNotes
questIdpathstringYesQuest ID.
objectiveIdbodystringYesobjectiveId from the enrollment progress (for example quest_123:objective:1).
contentbodystringOne of content or attachmentsText, at most 16,000 characters. When the objective's evidenceType is link, it must be an http or https URL.
attachmentsbodyarray or objectOne of content or attachmentsOne to five attachment objects, a single attachment object, or { "images": [url], "links": [url] } with at most five URLs in total. Other fields are rejected.
bash
curl -X POST https://app.hive3.tech/api/v1/workflows/quests/quest_123/evidence \
  -H "Authorization: Bearer $HIVE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"objectiveId": "quest_123:objective:1", "content": "Demo is live", "attachments": {"links": ["https://example.com/demo"]}}'

Returns 201 for a new submission and 200 when a pending one already exists. Each account can submit 15 pieces of evidence per minute and 50 per day; a platform-wide cap also applies. Over the limit returns 429 rate_limited with Retry-After.

json
{
  "data": {
    "evidenceId": "evidence_123",
    "objectiveId": "quest_123:objective:1",
    "status": "pending"
  }
}
StatuscodeWhen
400invalid_requestobjectiveId is required, no content or attachments, too long, an unsupported attachment field, type or size, or an invalid URL.
403forbiddenQuest enrollment required, Quest enrollment is not approved or Quest access required.
404not_foundUnknown or archived quest, unknown objective, or an attachment storageId that is unknown or belongs to another account.
429rate_limitedToo many quest evidence submissions. Try again later.
GET/api/v1/workflows/quests/{questId}/evidenceScoperesources:read

Lists evidence. Quest managers see every submission (up to 200); any other account sees only its own. Optional status filters to pending, approved or denied. There is no page object.

NameInTypeRequiredNotes
questIdpathstringYesQuest ID.
statusquerystringNopending, approved or denied.
bash
curl "https://app.hive3.tech/api/v1/workflows/quests/quest_123/evidence?status=pending" \
  -H "Authorization: Bearer $HIVE_API_KEY"

Returns 200. attachments echoes what was submitted, as an array of attachment objects or as { "images", "links" }.

json
{
  "data": [
    {
      "personId": "account_456",
      "name": "Ada Lovelace",
      "email": "ada@example.com",
      "evidenceId": "evidence_123",
      "objectiveId": "quest_123:objective:1",
      "content": "Demo is live",
      "attachments": { "links": ["https://example.com/demo"] },
      "status": "pending",
      "submittedAt": "2026-10-26T12:00:00.000Z"
    }
  ]
}

A manager of another account's quest also needs communities:read (403 insufficient_scope otherwise).

PATCH/api/v1/workflows/quests/{questId}/evidence/{evidenceId}Scoperesources:write

Approves or denies a submission. Only quest managers can call it.

NameInTypeRequiredNotes
questIdpathstringYesQuest ID.
evidenceIdpathstringYesevidenceId from the list.
statusbodystringYesapproved or denied.
bash
curl -X PATCH https://app.hive3.tech/api/v1/workflows/quests/quest_123/evidence/evidence_123 \
  -H "Authorization: Bearer $HIVE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"status": "approved"}'

Returns 200.

json
{ "data": { "evidenceId": "evidence_123", "status": "approved" } }
StatuscodeWhen
400invalid_requeststatus must be approved or denied.
403forbiddenYou cannot review this evidence.
404not_foundThe evidence does not belong to the quest.