Skip to content
Developers

Course and job workflows

Enroll accounts in courses, track lesson progress, accept job applications and manage applicants with the API.

Use these endpoints to build course enrollment and progress tracking, and to let accounts apply for jobs while hiring managers review applicants. The access decision, manager, declined-participant, capacity and attachment rules are on Participation workflows; they apply here unchanged. Events are on the same page, quests on Quest workflows.

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 identify accounts. Endpoints without a body show only curl; for JavaScript and Python use the pattern of the event participants example.

#Courses

An enrollment links an account to a course. Learners complete lessons one by one, and organizers can approve or decline enrollments.

POST/api/v1/workflows/courses/{courseId}/enrollmentScoperesources:write

Enrolls or unenrolls the key owner. Repeating the request keeps the existing enrollment.

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

Returns 201 for a new enrollment, 200 otherwise. Unenrolling returns { "courseId": "course_123", "enrolled": false }. The enrollment needs approval before lessons can be completed when the course turns off automatic enrollment.

json
{ "data": { "courseId": "course_123", "enrollmentId": "enrollment_456", "enrolled": true } }
StatuscodeWhen
400invalid_requestThe course is at full capacity.
403forbiddenYou cannot enroll in this course.
404not_foundThe course does not exist or is archived.
409conflictThe organizer declined this participant.
GET/api/v1/workflows/courses/{courseId}/enrollmentsScoperesources:read

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

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

Returns 200. accepted is true, false or null; completedAt appears once the course is finished.

json
{
  "data": [
    {
      "personId": "account_789",
      "name": "Grace Hopper",
      "email": "grace@example.com",
      "username": "grace",
      "accepted": true,
      "enrollmentId": "enrollment_456",
      "enrolledAt": "2026-10-20T09:30:00.000Z",
      "completed": false,
      "completedLessonIds": ["lesson_1"],
      "completedLessons": 1,
      "totalLessons": 4,
      "progressPercent": 25
    }
  ]
}

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

PATCH/api/v1/workflows/courses/{courseId}/enrollments/{personId}Scoperesources:write

Approves or declines a course enrollment. personId is the student's account ID. Approving re-checks the student's current course access.

NameInTypeRequiredNotes
courseIdpathstringYesCourse ID.
personIdpathstringYesStudent account ID 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/courses/course_123/enrollments/account_789 \
  -H "Authorization: Bearer $HIVE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"accepted": true}'

Returns 200.

json
{ "data": { "enrollmentId": "enrollment_456", "accepted": true } }
StatuscodeWhen
400invalid_requestNeither accepted nor decision is valid.
403forbiddenThe key owner cannot manage the course, or Participant does not have access to this course.
404not_foundThe student has no enrollment.
POST/api/v1/workflows/courses/{courseId}/lessons/{lessonId}/completeScoperesources:write

Marks a lesson complete for the key owner, who needs an approved enrollment. Completing the same lesson twice changes nothing. The course finishes when every lesson is complete.

bash
curl -X POST https://app.hive3.tech/api/v1/workflows/courses/course_123/lessons/lesson_2/complete \
  -H "Authorization: Bearer $HIVE_API_KEY"

Returns 200 with the learner's progress.

json
{
  "data": {
    "courseId": "course_123",
    "lessonId": "lesson_2",
    "completed": false,
    "completedLessonIds": ["lesson_1", "lesson_2"],
    "completedLessons": 2,
    "totalLessons": 4,
    "progressPercent": 50
  }
}

Errors: 403 forbidden (Course enrollment required or Course enrollment approval required), 404 not_found (Lesson not found).

#Jobs

A job application carries a resume, an optional cover letter and a status that hiring managers update. An account can apply again only after its previous application was rejected.

POST/api/v1/workflows/jobs/{jobId}/applicationsScoperesources:write

Applies to a job as the key owner. Both files use the attachment object shape.

NameInTypeRequiredNotes
jobIdpathstringYesJob ID.
resumebodyobjectYesAttachment object.
coverLetterbodyobjectNoAttachment object.
bash
curl -X POST https://app.hive3.tech/api/v1/workflows/jobs/job_123/applications \
  -H "Authorization: Bearer $HIVE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"resume": {"storageId": "upload_abc123", "fileName": "resume.pdf", "contentType": "application/pdf", "byteSize": 182044}}'

Returns 201.

json
{ "data": { "applicationId": "application_123", "status": "pending" } }
StatuscodeWhen
400invalid_requestresume is required, or an attachment is missing a field, has a disallowed type, is too large, or has a url that is not http or https.
403forbiddenYou cannot apply for this job.
404not_foundThe job is missing or archived, or a storageId is unknown or belongs to another account.
409conflictYou have already applied for this job and the earlier application was not rejected.
GET/api/v1/workflows/jobs/{jobId}/applicationsScoperesources:read

Lists applications for a job. Only owners, admins and moderators of the job's account can call it. Returns up to 200 rows and no page object. Resume and cover letter appear as upload IDs.

bash
curl https://app.hive3.tech/api/v1/workflows/jobs/job_123/applications \
  -H "Authorization: Bearer $HIVE_API_KEY"

Returns 200. coverLetterStorageId is omitted when none was uploaded.

json
{
  "data": [
    {
      "personId": "account_456",
      "name": "Ada Lovelace",
      "email": "ada@example.com",
      "applicationId": "application_123",
      "jobId": "job_123",
      "appliedAt": "2026-10-26T12:00:00.000Z",
      "resumeStorageId": "upload_abc123",
      "status": "pending"
    }
  ]
}

Errors: 403 forbidden (You cannot manage this job), 403 insufficient_scope for another account's job without communities:read.

GET/api/v1/workflows/jobs/applicationsScoperesources:read

Lists the key owner's own applications, up to 100. A key limited to selected accounts only sees applications to jobs owned by the key owner or by those accounts.

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

Returns 200.

json
{ "data": [{ "applicationId": "application_123", "jobId": "job_123", "status": "reviewed" }] }
PATCH/api/v1/workflows/job-applications/{applicationId}Scoperesources:write

Sets the status of an application. Only owners, admins and moderators of the job's account can call it.

NameInTypeRequiredNotes
applicationIdpathstringYesapplicationId from the list.
statusbodystringYespending, reviewed, accepted or rejected.
bash
curl -X PATCH https://app.hive3.tech/api/v1/workflows/job-applications/application_123 \
  -H "Authorization: Bearer $HIVE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"status": "reviewed"}'

Returns 200.

json
{ "data": { "applicationId": "application_123", "status": "reviewed" } }
StatuscodeWhen
400invalid_requeststatus is not one of the four values.
403forbiddenThe key owner cannot manage the job.
404not_foundThe application does not exist.