Jobs: lookups and details
Retrieve annotated job/form history
/a/Job_formLogGet
Read object history with user names, display timestamps and old/new summaries for the CRM2 form-history widget.
When to use this endpoint
Read object history with user names, display timestamps and old/new summaries for the CRM2 form-history widget.
Authentication and permissions
Authenticate with signed API-key fields or a logged-in CRM session. These calls use the authenticated account’s data; the handler has no additional job-page, department, assignee or client-admin permission check unless stated below.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
objID | String/integer string | Yes | Required by presence only; compared as supplied to log.obj_id. This is not named id and is not validated as positive. |
typeName | String | Yes | Trimmed, nonblank exact history type. The endpoint accepts types other than job; callers must choose the intended object family. |
typeName2 | String | No | Exact subtype. Omitted means all subtypes; blank explicitly selects the blank subtype. |
description | String | No | Substring LIKE filter; % and _ retain SQL wildcard meaning. |
Example request
$history = FM_api('Job_formLogGet', ['objID' => '1042', 'typeName' => 'job', 'typeName2' => 'field_27']);
Example response
[]
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: Object ID"} | objID is absent; message casing differs from the parameter name. |
{"error":"missing or invalid parameter: typeName"} | typeName is missing or whitespace-only. |
false | The query fails; empty matching history normally returns []. |
Legacy application errors may be returned with HTTP 200. Check the decoded response for error, not only the HTTP status.
Behaviour and edge cases
- Returns id, cdate, type_name, type_name2, description, user_id, meta, obj_id and joined user name, plus newDate, newTime, userIP and formDescription. meta remains encoded JSON.
- newDate is uppercase PHP-server-time MMM DD, YYYY; newTime is h:mm AM/PM. These strings do not use the account timezone/time-format preference. cdate remains the original Unix seconds value.
- userIP uses decoded meta.user_ip or N/A. A nonempty metadata array produces an old/new summary: arrays are comma-joined, booleans become true/false, and absent values become blank. Truthiness checks mean numeric zero is not rendered consistently as a nonempty change.
- Empty/invalid metadata yields N/A presentation fields. Deeply nested old/new arrays are not recursively formatted.
- No job existence/deletion check, date window, ORDER BY or pagination is applied. The shared widget’s date filtering/sorting is client-side, not server paging. No mutation occurs.
See it in Fieldmotion
CRM1
No direct CRM1 caller was found. CRM1’s field-history dialog uses Job_logGet with id/type instead.
CRM2
Open a job Form field’s History of Changes button. pageJobForm.js opens widgetHistoryForm, which sends objID, typeName=job and typeName2=field_
Related endpoints
Job_logGetis the narrower raw job-only history lookup.Job_getTableValuesreads current saved table data rather than change history.