Training sessions and recordings
Summarize your provider-reported recording progress
/a/Training_progress
Summarize your provider-reported recording progress
When to use this endpoint
Populate Training → My Progress with aggregate completion, time watched and category totals. This is a derived read of currently published recording sessions and cached/refreshed provider statistics, not an endpoint for writing browser watch time or marking a video complete.
Authentication and permissions
Authenticate with signed API-key fields or a logged-in CRM session. Every Training handler requires login; there is no additional page, role, department, or tenant feature-flag check. CRM2 exposes Training to authenticated users.
Webinars and session IDs belong to a shared global catalogue. Interests and provider registrations are scoped to the authenticated tenant and user even though they are stored globally. Client-supplied tenant/user IDs do not select another person’s bookings or progress.
Parameters
This endpoint has no operation-specific parameters.
Example request
$result = FM_api('Training_progress');
Example response
{
"total": 2,
"completed": 1,
"percent": 50,
"watched_seconds": 4200,
"topics_over_75": 1,
"topics": [
{
"id": "jobs",
"name": "Jobs",
"total": 1,
"completed": 1,
"percent": 100
},
{
"id": "forms",
"name": "Forms",
"total": 1,
"completed": 0,
"percent": 0
}
],
"stale": false,
"unavailable": false
}
Returns total, completed, percent, watched_seconds, topics_over_75 and topics, plus refresh flags stale/unavailable. Each topic contains id, name, total, completed and rounded percent. Counts/time are integers; percentages are rounded JSON numbers, not ratios or numeric strings.
Empty catalogue returns total/completed/percent/watched_seconds/topics_over_75 all zero and topics=[]. This is not the same as the provider being unreachable; inspect stale/unavailable independently.
Errors and unusual responses
| Response | Condition |
|---|---|
{"error":"not logged in"} | No authenticated tenant context is available. Invalid signed credentials can be rejected by the dispatcher before the handler runs. |
Legacy application errors may be returned with HTTP 200. Check the decoded response for error, not only the HTTP status.
Behaviour and edge cases
- The denominator is every current published recording session: parent webinar published, session completed, session ended and recording published, with mapped recording ID or SQL https:// URL eligibility. There is no category, date, selected-ID or pagination parameter here.
- Completion requires a known positive recording_duration and watched_seconds ≥ 90% of that duration. Unknown/zero duration never completes, even with positive watched seconds. Where duration is known, watched time is capped at duration for aggregation; unknown-duration viewing seconds are still included.
- Overall percent is round(100×completed/total), not duration-weighted viewing coverage. Per-topic percent uses the same completed-session ratio. topics_over_75 counts topics whose rounded percentage is strictly greater than 75; a topic at exactly 75 is excluded.
- Provider on-demand evidence uses watch_duration; otherwise only replay watch_duration_replay contributes. Live attendance must not count as recorded viewing. Stored counters are monotonic, so decreased provider statistics do not erase already saved progress.
- Totals count published session rows, not distinct webinar titles or provider broadcasts. Retired/unpublished recordings disappear from the current denominator, so percentages can change without new viewing. No topic order is guaranteed by the SQL.
- Provider workflows require the global provider schema (migration 011) and server WebinarGeek credentials. This is deployment configuration, not the account’s HR setting or a request-supplied API key. Without the provider schema, legacy URL-based catalogue/interests still work; without credentials, provider actions fail while cached catalogue data remains readable.
- Refresh operates on all saved provider registrations for the authenticated user, not only the displayed category/page. Rows synced less than about five minutes ago are reused. Older rows are reconciled against provider subscriptions (up to 20 pages of 100); at most ten extra subscription-ID lookups recover entries omitted from provider lists. Cached statistics are retained when refresh fails.
stalereports incomplete refresh andunavailablereports missing provider schema/configuration; these are not booking states or proof of live provider health.
Side effects
- Can contact WebinarGeek and update global registration status, subscription IDs, safe personal URLs, watch/replay counters and sync/edit timestamps before deriving aggregates. It never accepts client-supplied completion or watch time. No mail, new subscription or interest is created.
See it in Fieldmotion
CRM1
No direct CRM1 caller for Training_progress was found. The implemented screen is CRM2 Training; no direct mobile-app or m-service caller was found for these CRM routes.
CRM2
Open Training → My Progress; filter for Training_progress. The page displays completed videos, topics over 75%, watched hours and topic completion bars, then refreshes on returning focus from a provider window. Opening Watch Video alone does not advance these figures.
Related endpoints
Training_watch: open personal recording access without asserting completion.Training_videosTable: view the current recording catalogue.Training_mySessions: booked sessions are distinct from recording completion.