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

ParameterTypeRequiredDescription
session_idIntegerYesInteger-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

ResponseCondition
{"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