Appearance
Training
A course is a training offering and the credits it is worth. A class is a scheduled run of a course, with its sessions and instructors. People register for classes, and Engagifii grants them training credits for attending a class or records credits transferred in from elsewhere.
Classes
A class is one scheduled run of a course: its dates, capacity, sessions and instructors. A class can be offered by one or more events, or by none (a standalone class).
| Endpoint | Meaning |
|---|---|
GET /classes | List classes. |
GET /classes/ids | The id of every live class. See Keeping a copy in sync. |
GET /classes/{id} | One class. |
Filters, besides those in Paging:
| Parameter | Type | Meaning |
|---|---|---|
event_id | UUID | Only classes this event offers. An event that is deleted or not in this workspace returns an empty list. |
course_id | UUID | Only classes of this course. |
json
{
"id": "3f0c…",
"name": "Ethics for Public Officials - Spring",
"code": "ETH-101-S",
"course": { "id": "7a2d…", "name": "Ethics for Public Officials" },
"description": "Two half-day sessions on ethics rules for elected officials.",
"starts_at": "2026-04-14T13:00:00Z",
"ends_at": "2026-04-15T17:00:00Z",
"time_zone": "Eastern Standard Time",
"capacity": 40,
"online_capacity": 20,
"registration_state": "Open",
"state": "Scheduled",
"is_active": true,
"type": { "id": "4b8e…", "name": "In-Person" },
"session_type": "multi_session",
"format": "in_person",
"location": {
"venue": {
"id": "c4d8…",
"name": "Capitol Conference Center",
"address_line_1": "500 State Street",
"address_line_2": null,
"city": "Springfield",
"state": "IL",
"postal_code": "62701",
"country": "United States"
},
"room": { "id": "a8b1…", "name": "Room 210", "building": "East Wing", "capacity": 50, "venue_id": "c4d8…" },
"online_url": null
},
"contact_person_ids": ["51ad…"],
"registration": {
"is_on": true,
"opens_at": "2026-02-01T14:00:00Z",
"allows_non_members": true,
"windows": [
{
"tier": "early",
"ends_at": "2026-03-15T03:59:00Z",
"member_fee": { "amount": "150.00", "currency": "USD" },
"non_member_fee": { "amount": "225.00", "currency": "USD" },
"max_members": 30,
"max_non_members": 10
},
{
"tier": "regular",
"ends_at": "2026-04-10T03:59:00Z",
"member_fee": { "amount": "175.00", "currency": "USD" },
"non_member_fee": { "amount": "250.00", "currency": "USD" },
"max_members": null,
"max_non_members": null
}
]
},
"lms_course_id": null,
"lms_course_name": null,
"event_ids": ["9b41…"],
"sessions": [
{
"id": "c5e8…",
"sequence": 1,
"starts_at": "2026-04-14T13:00:00Z",
"ends_at": "2026-04-14T17:00:00Z",
"time_zone": "Eastern Standard Time",
"description": "Day 1",
"cancelled": false,
"format": "in_person",
"location": {
"venue": null,
"room": { "id": "a8b1…", "name": "Room 210", "building": "East Wing", "capacity": 50, "venue_id": "c4d8…" },
"online_url": null
},
"instructors": [
{ "person_id": "51ad…", "is_lead": true, "is_guest": false }
],
"contact_person_ids": [],
"credits": [
{ "credit_type": { "id": "e017…", "name": "CLE" }, "credits": 4 }
]
}
],
"instructors": [
{ "person_id": "51ad…", "is_lead": true, "is_guest": false }
],
"created_at": "2026-01-20T15:42:10Z",
"updated_at": "2026-03-02T09:14:55Z"
}| Field | Type | Meaning |
|---|---|---|
id | UUID | The class id. |
name | string or null | The name Engagifii shows for the class: its section name, else its class name, else its course's name. |
code | string or null | The class code. |
course | object or null | The course this class runs. null if the class has no course. |
course.id | UUID | The course id, as in /courses. |
course.name | string or null | The course's name. |
description | string or null | The class description. |
starts_at | date-time or null | When the class starts. |
ends_at | date-time or null | When the class ends. |
time_zone | string or null | The class's time zone as entered in Engagifii. |
capacity | integer or null | The number of registrants the class allows. |
online_capacity | integer or null | The number of online registrants the class allows. |
registration_state | string or null | The class's registration state as shown in Engagifii. |
state | string or null | The class's state as shown in Engagifii. |
is_active | boolean | Whether the class is active. |
type | object or null | The class type, from the workspace's own list, for example In-Person or Virtual. null if none is set. |
type.id | UUID | The class type's id. |
type.name | string or null | The class type's name. |
session_type | string or null | single (one session), multi_session or on_demand. null if not set. |
format | string or null | How the class is delivered: in_person, online, in_person_and_online or unspecified. null if not set. |
location | object or null | Where the class takes place. null if no venue, room or online link is recorded. See Class locations. |
contact_person_ids | array of UUID | The class's contact people, as in /people. |
registration | object or null | The class's registration settings and price list. null if the class has none. |
registration.is_on | boolean | Whether registration is switched on. |
registration.opens_at | date-time or null | When registration opens. null if no date is set. |
registration.allows_non_members | boolean | Whether non-members may register. |
registration.windows | array of object | The registration windows switched on, in the order early, regular, late. A registration's price_tier on /class-registrations names one of these. |
registration.windows.tier | string | early, regular or late. |
registration.windows.ends_at | date-time or null | When the window closes. null if no date is set. |
registration.windows.member_fee | object or null | The per-seat fee for members in this window, as amount (string) and currency (USD). |
registration.windows.non_member_fee | object or null | The per-seat fee for non-members in this window. |
registration.windows.max_members | integer or null | The most members who can register in this window. |
registration.windows.max_non_members | integer or null | The most non-members who can register in this window. |
lms_course_id | string or null | For a class taken in the workspace's learning management system (LMS), the course's id there. Progress is on /class-registrations (lms). null otherwise. |
lms_course_name | string or null | For a class linked to an LMS course, the LMS course's name. null otherwise. |
event_ids | array of UUID | The live events that offer this class, as in /events. Empty for a standalone class. |
sessions | array of object | The class's sessions, in sequence order and then by start time. |
sessions.id | UUID | The session id. |
sessions.sequence | integer or null | The session's position in the class. |
sessions.starts_at | date-time or null | When the session starts. |
sessions.ends_at | date-time or null | When the session ends. |
sessions.time_zone | string or null | The session's time zone as entered in Engagifii. |
sessions.description | string or null | The session description. |
sessions.cancelled | boolean | Whether the session is cancelled. |
sessions.format | string or null | How the session is delivered: in_person, online, in_person_and_online or unspecified. null if not set. |
sessions.location | object or null | Where the session takes place, in the same shape as the class's location. null if none is recorded. |
sessions.instructors | array of object | The session's own instructors, lead instructors first, in the same shape as the class's instructors. |
sessions.contact_person_ids | array of UUID | The session's contact people, as in /people. |
sessions.credits | array of object | The credits the session is worth, one entry per credit type. |
sessions.credits.credit_type.id | UUID | The credit type id. |
sessions.credits.credit_type.name | string or null | The credit type's name, for example CLE. |
sessions.credits.credits | number | The credits of that type the session is worth. |
instructors | array of object | The class's instructors, lead instructors first. |
instructors.person_id | UUID | The instructor, as in /people. |
instructors.is_lead | boolean | Whether this is a lead instructor. |
instructors.is_guest | boolean | Whether this is a guest instructor. |
created_at | date-time or null | When the class was created. |
updated_at | date-time | When the class last changed. |
Class locations
location on a class and on each session gives the venue and room inline. There is no venues endpoint. The shapes match days[].venue on /events and rooms[] on /event-sessions.
| Field | Type | Meaning |
|---|---|---|
location.venue | object or null | The venue. null if none is set. |
location.venue.id | UUID | The venue's id. |
location.venue.name | string or null | The venue's name. |
location.venue.address_line_1 | string or null | First address line. |
location.venue.address_line_2 | string or null | Second address line. |
location.venue.city | string or null | City. |
location.venue.state | string or null | State. |
location.venue.postal_code | string or null | Postal code. |
location.venue.country | string or null | Country. |
location.room | object or null | The room. null if none is set. |
location.room.id | UUID | The room's id. |
location.room.name | string or null | The room's name. |
location.room.building | string or null | The building the room is in. |
location.room.capacity | integer or null | How many people the room holds. |
location.room.venue_id | UUID or null | The room's venue. |
location.online_url | string or null | The online meeting link. See below. |
online_url is the meeting link reduced to its scheme, host and path. The query string and anything after # are removed, because meeting links often carry the meeting passcode in them. A value that is not a plain http or https link is left out, and the access details text (dial-in numbers, passcodes, sign-in details) is never returned. For a class taken in an LMS, online_url is always null; see lms_course_name.
Keeping classes in sync
updated_at changes only when the class itself changes. Changes to its sessions, session credits, session locations, instructors, contact people, registration settings or the events that offer it do not move it. Reload classes in full from time to time to pick these up.
Courses
A course is a training offering and the credits it is worth for each credit type. Its scheduled runs are classes, linked by course.id.
| Endpoint | Meaning |
|---|---|
GET /courses | List courses. |
GET /courses/ids | The id of every live course. See Keeping a copy in sync. |
GET /courses/{id} | One course. |
/courses has no filters besides those in Paging.
json
{
"id": "7a2d…",
"name": "Ethics for Public Officials",
"description": "Ethics rules and disclosure duties for elected officials.",
"type": { "id": "9e12…", "name": "Board Development" },
"format": "in_person_and_online",
"is_offered": true,
"time_zone": "Eastern Standard Time",
"status": "active",
"credits": [
{ "credit_type": { "id": "e017…", "name": "CLE" }, "credits": 8 }
],
"created_at": "2025-11-03T16:20:00Z",
"updated_at": "2025-11-03T16:20:00Z"
}| Field | Type | Meaning |
|---|---|---|
id | UUID | The course id. |
name | string or null | The course name. |
description | string or null | The course description. |
type | object or null | The course type, from the workspace's own list, for example Board Development. null if none is set. |
type.id | UUID | The course type's id. |
type.name | string or null | The course type's name. |
format | string or null | How the course is delivered: in_person, online, in_person_and_online or unspecified. |
is_offered | boolean | Whether the course is marked as offered. |
time_zone | string or null | The course's time zone as entered in Engagifii. |
status | string | active or inactive. |
credits | array of object | The credits the course is worth, one entry per credit type. |
credits.credit_type.id | UUID | The credit type id. |
credits.credit_type.name | string or null | The credit type's name. |
credits.credits | number | The credits of that type the course is worth. |
created_at | date-time or null | When the course was created. |
updated_at | date-time | For courses, the time the course was created. |
Engagifii records no change time for courses or their credits, so updated_at is the creation time and never moves. updated_since finds new courses only. Reload courses in full on each sync and compare with /courses/ids to find deleted ones.
Class registrations
A class registration records that a person registered for a class, with its status, format, fee and attendance. Registrations of deleted classes are left out. Cancelled registrations are included with status: cancelled.
| Endpoint | Meaning |
|---|---|
GET /class-registrations | List class registrations. |
GET /class-registrations/ids | The id of every live class registration. See Keeping a copy in sync. |
GET /class-registrations/{id} | One class registration. |
Filters, besides those in Paging:
| Parameter | Type | Meaning |
|---|---|---|
class_id | UUID | Only registrations for this class. |
person_id | UUID | Only registrations of this person. |
status | string | Only registrations with these statuses, comma-separated, for example complete,submitted. Any of the status values below except other. |
json
{
"id": "d29f…",
"class_id": "3f0c…",
"person_id": "84c7…",
"status": "complete",
"registration_number": "CR-10482",
"format": "in_person",
"price_tier": "early",
"enrollment": "self",
"enrolled_by_person_id": null,
"is_member": true,
"fee": { "amount": "150.00", "currency": "USD" },
"attendance": { "status": "finalized", "value": 100, "overridden": false },
"credits_earned": null,
"credits_granted_at": null,
"invoice_id": "1e6b…",
"payment_id": "f3a0…",
"event_id": null,
"cancelled_at": null,
"cancellation": null,
"lms": null,
"is_imported": false,
"is_active": true,
"registered_at": "2026-02-11T18:05:32Z",
"created_at": "2026-02-11T18:05:32Z",
"updated_at": "2026-02-11T18:05:32Z"
}| Field | Type | Meaning |
|---|---|---|
id | UUID | The class registration id. |
class_id | UUID | The class, as in /classes. |
person_id | UUID | The person registered, as in /people. |
status | string or null | The registration status. See below. null if the registration has no status. |
registration_number | string or null | The registration number. |
format | string or null | How the person attends: in_person or online. |
price_tier | string or null | The price window the person registered in: early, regular or late. |
enrollment | string or null | How the registration was made: self, enrolled_by_staff or registered_on_behalf. |
enrolled_by_person_id | UUID or null | The person who made the registration for someone else, as in /people. |
is_member | boolean | Whether the person registered as a member. |
fee | object or null | The registration fee. |
fee.amount | string | The amount, as a decimal string with two places, for example "150.00". |
fee.currency | string | Always USD. |
attendance | object | The attendance recorded on the registration. |
attendance.status | string or null | did_not_attend, marked, finalized or unknown. null if none is recorded. |
attendance.value | number or null | The attendance value. Given only when attendance.status is finalized; if attendance was overridden, this is the override value. |
attendance.overridden | boolean | Whether the attendance value was overridden. |
credits_earned | number or null | Credits recorded on the registration. |
credits_granted_at | date-time or null | When those credits were granted. |
invoice_id | UUID or null | The invoice for the registration, as in /invoices. |
payment_id | UUID or null | The payment for the registration, as in /payments. |
event_id | UUID or null | The event the registration was made through, for a class offered at an event, as in /events. null for a standalone class registration. |
cancelled_at | date-time or null | When the cancellation was entered. null if the registration is not cancelled, or was cancelled without a cancellation record. |
cancellation | object or null | Details of the cancellation. Present only when status is cancelled, otherwise null. |
cancellation.reason | string or null | The cancellation reason picked, from the workspace's own list. null if none was recorded. |
cancellation.comment | string or null | The comment entered with the cancellation, as typed. |
cancellation.cancelled_by_person_id | UUID or null | The person who entered the cancellation, as in /people. |
lms | object or null | Progress reported by the workspace's LMS, for classes taken there. null if the LMS has reported nothing. |
lms.status | string or null | The completion status as the LMS reports it. |
lms.completion_percentage | number or null | How much of the course is complete, as a percentage. |
lms.total_time | string or null | Time spent, as the LMS reports it, for example 12m 7s. |
is_imported | boolean | Whether the registration was imported rather than made in Engagifii. |
is_active | boolean | Whether the registration is active. |
registered_at | date-time or null | When the person registered. |
created_at | date-time or null | When the registration was created. Where Engagifii has no creation time, this is the registration time. |
updated_at | date-time | When the registration last changed, as far as Engagifii records it. See below. |
status values
| Value | Meaning |
|---|---|
seat_full | The class was full. |
started | The registration was started but not finished. |
pending_approval | The registration is waiting for approval. |
pending_approval_eligible | The registration is waiting for approval and the person is eligible. |
rejected | The registration was rejected. |
complete | The registration is complete. Engagifii's class roster shows a complete registration as submitted while its event invoice is unpaid; use invoice_id to apply the same rule. |
cancelled | The registration was cancelled. |
submitted | A registration made through an event without payment. Engagifii shows it as completed unless the event counts only paid registrations. |
other | A status not in this list. |
Notes:
- Attendance and credits are usually recorded per credit grant in
/training-credits, not on the registration. Credits per credit type are there, linked byclass_registration_id. - The same person can appear twice on one class, for example after an import. Both registrations are returned, as Engagifii's class roster shows them.
Engagifii rarely records a change time on class registrations, so updated_since mostly finds new registrations, not status changes such as approvals or cancellations. updated_at does not include cancelled_at, and LMS progress does not move it either. Reload class registrations in full, or per class with class_id, to pick up these changes. When a class is deleted, its registrations leave the list and /class-registrations/ids without a deleted record.
Training credits
A training credit is one grant of credits to a person: credits for attending a class (source: class) or credits transferred in (source: transfer). Credits of deleted courses are left out.
| Endpoint | Meaning |
|---|---|
GET /training-credits | List credit grants. |
GET /training-credits/ids | The id of every credit grant. See Keeping a copy in sync. |
GET /training-credits/{id} | One credit grant. |
Filters, besides those in Paging:
| Parameter | Type | Meaning |
|---|---|---|
person_id | UUID | Only grants to this person. |
class_id | UUID | Only grants for this class. |
course_id | UUID | Only grants for this course. |
json
{
"id": "a8b3…",
"person_id": "84c7…",
"course_id": "7a2d…",
"class_id": "3f0c…",
"class_registration_id": "d29f…",
"source": "class",
"credit_type": { "id": "e017…", "name": "CLE" },
"credits": 8,
"counts_in_total": false,
"attendance": { "attended": true, "value": null, "percentage": 100 },
"granted_by_person_id": "51ad…",
"granted_at": "2026-04-16T14:00:00Z",
"updated_at": "2026-04-16T14:00:03Z"
}| Field | Type | Meaning |
|---|---|---|
id | UUID | The credit grant id. |
person_id | UUID | The person who received the credits, as in /people. |
course_id | UUID | The course the credits are for, as in /courses. |
class_id | UUID or null | The class the credits are for, as in /classes. |
class_registration_id | UUID or null | The class registration the credits were granted on, as in /class-registrations. null for transfers. |
source | string | class for credits granted for attending a class, transfer for credits transferred in. |
credit_type | object or null | The type of credit. |
credit_type.id | UUID | The credit type id. |
credit_type.name | string or null | The credit type's name. |
credits | number or null | The credits granted. |
counts_in_total | boolean | Whether this grant counts in the person's total under the workspace's credit rule. See How credits are totalled. |
attendance | object or null | The attendance the credits were granted for. null for transfers. |
attendance.attended | boolean or null | Whether the person attended. |
attendance.value | number or null | The attendance value. |
attendance.percentage | number or null | The attendance as a percentage. |
granted_by_person_id | UUID or null | The person who granted the credits, as in /people. |
granted_at | date-time or null | When the credits were granted. |
updated_at | date-time | When Engagifii recorded the grant. |
Engagifii can change or remove a credit grant without recording a time. Removed grants never come back in the deleted short form, and changed grants keep their updated_at. Reload training credits in full from time to time and compare with /training-credits/ids. When a course is deleted, its credit grants leave the list and /ids without a deleted record.
Course credits
A course credit is a person's credit for one course and one credit type, transfers included. It holds the first, highest and latest credit Engagifii recorded, and the one the workspace's credit rule counts.
| Endpoint | Meaning |
|---|---|
GET /course-credits | List course credits. |
GET /course-credits/ids | The id of every course credit. See Keeping a copy in sync. |
GET /course-credits/{id} | One course credit. |
Filters, besides those in Paging:
| Parameter | Type | Meaning |
|---|---|---|
person_id | UUID | Only course credits of this person. |
course_id | UUID | Only course credits for this course. |
json
{
"id": "6c19…",
"person_id": "84c7…",
"course_id": "7a2d…",
"credit_type": { "id": "e017…", "name": "CLE" },
"credits": 8,
"credited_at": "2026-04-16T14:00:00Z",
"counting_rule": "highest",
"counts_in_total": true,
"first": { "credits": 6, "granted_at": "2025-10-08T15:30:00Z" },
"highest": { "credits": 8, "granted_at": "2026-04-16T14:00:00Z" },
"latest": { "credits": 8, "granted_at": "2026-04-16T14:00:00Z" },
"includes_transfer": false,
"created_at": "2025-10-08T15:30:02Z",
"updated_at": "2026-04-16T14:00:03Z"
}| Field | Type | Meaning |
|---|---|---|
id | UUID | The course credit id. |
person_id | UUID | The person, as in /people. |
course_id | UUID | The course, as in /courses. |
credit_type | object or null | The type of credit. |
credit_type.id | UUID | The credit type id. |
credit_type.name | string or null | The credit type's name. |
credits | number or null | The credits the workspace's rule counts: the first, highest or latest value. Under every_credit, the first value. |
credited_at | date-time or null | When the counted credits were granted. |
counting_rule | string | The workspace's credit rule: first, highest, latest or every_credit. Same as training_credit_rule from /workspace. |
counts_in_total | boolean | Whether credits counts in the person's total. true unless the rule is every_credit. See How credits are totalled. |
first | object | The first credit recorded. |
first.credits | number or null | The credits. |
first.granted_at | date-time or null | When they were granted. |
highest | object | The highest credit recorded. |
highest.credits | number or null | The credits. |
highest.granted_at | date-time or null | When they were granted. |
latest | object | The most recent credit recorded. |
latest.credits | number or null | The credits. |
latest.granted_at | date-time or null | When they were granted. |
includes_transfer | boolean | Whether the credit comes from a transfer. |
created_at | date-time or null | When the course credit was created. |
updated_at | date-time | When the course credit last changed. |
Engagifii removes course credits without recording a time, so removals never come back in the deleted short form. Compare with /course-credits/ids to find them. When a course is deleted, its course credits leave the list and /ids without a deleted record.
How credits are totalled
The workspace's training_credit_rule, from GET /workspace, decides which records make up a person's total for a credit type:
| Rule | Sum this | Records with counts_in_total: true |
|---|---|---|
first, highest or latest | credits from /course-credits, one record per person, course and credit type | /course-credits |
every_credit | credits from /training-credits, one record per grant | /training-credits |
So, to total a person's credits, sum credits over the records with counts_in_total: true from both endpoints, grouped by credit_type.id.
counts_in_total, counting_rule, and credits and credited_at on course credits follow the workspace's current rule. If the rule changes, these fields change on every record but updated_at does not. Reload both endpoints in full after a rule change.
