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

ResponseCondition
{"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. stale reports incomplete refresh and unavailable reports 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