When to use this endpoint

Replace the tenant-local calendar date of selected jobs while retaining each job’s time of day.

Read the target jobs first with Jobs_getSome to obtain the current values and confirm the IDs belong to the intended account.

Authentication and permissions

Authenticate with signed API-key fields or a logged-in CRM session. Requests address physical job IDs in the authenticated account.

The legacy job-edit restriction bit 128 blocks the request before reads or writes unless the user is a client administrator, matching Job_setMeetingTime. No additional assignee or department scope is applied.

Parameters

ParameterTypeRequiredDescription
idsNative arrayYesNative list of positive decimal job IDs; JSON strings and nonscalar/nonpositive members are rejected. Duplicates are removed. Empty lists are a successful no-op; missing/deleted jobs are omitted by the active-job query.
dateYYYY-MM-DD stringYesStrict real YYYY-MM-DD calendar date with year at least 2013, without surrounding whitespace or a time suffix. Replaces each selected job’s tenant-local calendar date while preserving its local time of day.

Example request

$result = FM_api('Jobs_setMeetingDate', ['ids'=>['1042','1088'], 'date'=>'2026-11-20']);

Example response

{"ok":"1"}

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: ids"}IDs are absent, not a native array, or contain nonpositive/nonscalar/nondecimal members.
{"error":"missing or invalid parameter: date"}Date is absent, not a strict valid calendar date, or before year 2013.
{"error":"No permission to edit"}The job-edit restriction applies and the user is not a client administrator.
{"error":"Could not read jobs. Please retry."}The active-job query failed.
{"error":"Unable to save meeting time","failedId":1088,"updatedIds":[1042]}A nested save failed. Other nested messages can appear in error; successfully written earlier IDs remain committed.
{"error":"Could not read job. Please retry.","failedId":1088,"updatedIds":[1042]}A selected job could not be read before its nested edit.
{"error":"Unable to complete meeting time update; inspect the job before retrying","failedId":1088,"updatedIds":[1042]}The nested setter threw; the failed job may already have been written before the exception.

Legacy application errors can use HTTP 200. Inspect error, failedId and updatedIds before retrying; ok does not confirm mail delivery or every unchecked follow-up.

Behaviour and edge cases

  • Converts each stored start epoch to tenant-local time, replaces only its calendar-date part and skips a matching date. This is not an N-day offset or UTC-midnight operation.
  • Active jobs are fetched with IN, without pagination, in ascending physical job-ID order. Duplicate IDs collapse through that query.
  • Calls Job_setMeetingTime with norecur=1, suppressing recurrence bumping. The nested edit permission guard still applies (with its client-admin exception). The wrapper stops and reports the nested error with failedId and updatedIds.
  • Successful batches return string ok='1'. There is no schedule-conflict check or all-batch rollback. The preloaded nested-job context is restored/cleared even on failure; exceptions are reported as uncertain completion requiring read-back.

Side effects

  • Successful nested time changes update scheduled time/epoch, original-time metadata and edit markers, and for incomplete jobs recompute estimated completion using work-day-start/end and week-days-off.
  • The nested time setter records history, mirrors outsourced schedule/completion metadata, refreshes customer details, updates configured before-start/before-finish notifications and can send a date-change email. The nested setter does not surface every mail/mirror failure, so successful primary scheduling does not prove notification delivery or remote persistence.
  • If sync-due-date-to-job-time=1, the nested time setter also invokes the single-job due-date path, with its reminder/mirror effects. Re-read dates and due dates before retrying.

See it in Fieldmotion

CRM1

In CRM1 Jobs list select several rows, open the bulk-edit menu and choose Change Job date. jobsMultiEdit.js calls Jobs_setMeetingDate; filter Network for that route.

CRM2

In CRM2 Jobs list select several rows, open the bulk-edit menu and choose Change Job date. lib/jobsMultiEdit.js calls Jobs_setMeetingDate; filter Network for that route.

Related endpoints

  • Job_isScheduleOverlap checks a user’s schedule before a rescheduling decision.
  • Jobs_setDueDate changes due dates without rescheduling the job.
  • Jobs_getSome reads selected job records before editing and verifies the stored result afterward.