Training sessions and recordings
Read one published Training session and its actions
/a/Training_get
Read one published Training session and its actions
When to use this endpoint
Load a session chosen from Training_list, My Booked Webinars, or a reminder link before showing Register, Join, Watch, Cancel or Withdraw actions. Do not construct join URLs from catalogue IDs.
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
| Parameter | Type | Required | Description |
|---|---|---|---|
session_id | Integer | Yes | Integer-converted positive shared session ID. Missing, blank and nonpositive values fail before login; a webinar_id is not a session ID. |
Example request
$result = FM_api('Training_get', [
'session_id' => '1042',
]);
Example response
{
"session": {
"id": 1042,
"webinar_id": 91,
"title": "Jobs from start to finish",
"description": "Create and schedule jobs with Fieldmotion.",
"category": "jobs",
"category_name": "Jobs",
"image_url": "https://example.test/training.webp",
"image_alt": "Fieldmotion Training",
"presenter": "Fieldmotion trainer",
"starts_at": 1794477600,
"ends_at": 1794481200,
"timezone": "Europe/Dublin",
"status": "scheduled",
"capacity": null,
"registration_closes_at": 0,
"registration_open": true,
"registration_url": "https://example.test/register",
"interested": false,
"registration_opened_at": 0,
"join_available": false,
"join_url": "",
"registration_state": "none",
"provider_mapped": false,
"provider_available": false,
"recording_provider_mapped": false,
"recording_registration_state": "none",
"recording_duration": 0,
"watched_seconds": 0,
"recording_available": false,
"recording_url": "",
"recording_published_at": 0
}
}
Each session object includes integer id/webinar_id, Unix-second starts_at/ends_at, stored timezone, title/description/category/category_name, image_url/image_alt/presenter, session status, nullable capacity and integer registration_closes_at. Unknown category values normalize to general. Descriptions are returned as text values without HTML sanitization; render them as text, as CRM2 does.
Action/state fields are registration_open, registration_url, interested, registration_opened_at, join_available, join_url, registration_state, provider_mapped, provider_available, recording_provider_mapped, recording_registration_state, recording_duration, watched_seconds, recording_available, recording_url and recording_published_at. Flags are booleans, durations/times/counts are integers, and URL/state fields are strings. Unavailable URLs are empty strings, not omitted.
A provider-mapped live session requires cached registration_state=confirmed for joining; a legacy unmapped session requires local interested=true. The session must be scheduled, current time must be at least starts_at−900 and no later than ends_at, and the chosen personal/legacy join URL must be valid HTTPS without embedded credentials. Joining is not exposed earlier by get/list.
Recordings require completed session status, published recording status, and ends_at no later than now. Mapped recordings expose no shared recording_url: use Training_watch for personal access. Unmapped recordings expose a valid HTTPS URL. A recording can be available without live interest or a live booking. Images also require valid HTTPS without embedded credentials.
Returns a session envelope, not a bare row or an array. A missing session or unpublished parent webinar produces a not-found error. Public catalogue metadata and cached user action flags are normalized together.
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. |
{"error":"missing or invalid parameter: session_id"} | Integer-converted session ID is below one; this guard precedes the login check. |
{"error":"Training session not found"} | No such session has a published parent webinar. |
Legacy application errors may be returned with HTTP 200. Check the decoded response for error, not only the HTTP status.
Behaviour and edge cases
- This lookup does not restrict session status to scheduled/completed or impose a date window. A cancelled session under a published webinar remains readable, but its registration/join/recording flags follow their status rules.
- The live join end boundary is inclusive (now ≤ ends_at), whereas upcoming list membership requires ends_at > now. An exact-end instant can therefore differ between get and the upcoming list.
- Reads cached registration state without refreshing WebinarGeek. A newly verified booking can remain pending here until an appropriate refresh/register reconciliation occurs; local interested=true never implies confirmed provider registration.
- Stored session timezone is returned for presentation; all boundary comparisons use Unix timestamps. The API does not convert the requested ID or timestamps using the caller’s browser timezone.
- 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.
Side effects
- No interest, subscription, statistics, history, notifications or booking state is written by this endpoint.
See it in Fieldmotion
CRM1
No direct CRM1 caller for Training_get was found. The current catalogue/booking screen is CRM2 Training; tests are not production UI callers. No direct mobile-app or m-service caller for these CRM routes was found.
CRM2
Open View details or click a live calendar event. Training_get supplies the details dialog. Reminder navigation #pageTraining/session=1042 also opens it. Join Webinar uses only the returned join_url when join_available is true.
Related endpoints
Training_list: discover valid session IDs.Training_register: preflight and submit a live provider booking.Training_watch: obtain personal mapped-recording access.Training_interestUpdate: record or withdraw legacy interest.