GoliathDevelopersGet an API key
Reference/Workflowsgenerated from the gateway manifest

applyTaskTemplate

Run a TASK template against a contact.

POST/api/v1/callWRITEidempotent · 24 hruns as the key's owner
View as Markdown

Run a TASK template against a contact: creates one task, assigned to the acting user, linked to the contact (and any dealIds). Title/description render the template's merge fields + spintax against that contact, and the RELATIVE dueOffset resolves from now, snapped to its preferred time-of-day. Rejects a template not of type TASK. overrides { title?, description?, endDate?, timezone?, taskType?, autoCompleteOnNoteAdded?, autoCompleteOnReassignment? } replace what the template would produce for this one apply: an endDate override skips the relative due date, and what is not overridable (origin, supporting-file links, the contact/deal links) still applies. Send timezone with any endDate override: the task is stored and read back in it, and without it keeps the TEMPLATE's zone, so an instant chosen in one zone can render as a different day. Template ids: listContentTemplates(type: TASK). A whole saved SOP is applyTaskSet, not this per step.

curl https://server.goliathdata.com/api/v1/call \
  -H "Authorization: Bearer $GOLIATH_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "operationId": "applyTaskTemplate",
    "variables": {
      "templateId": "<templateId>",
      "contactId": "<contactId>"
    }
  }'
import { GoliathClient } from '@goliath-data/sdk'

const goliath = new GoliathClient({
  apiKey: process.env.GOLIATH_API_KEY!,
  baseUrl: 'https://server.goliathdata.com',
})

const result = await goliath.workflows.applyTaskTemplate(
  {
    templateId: '<templateId>',
    contactId: '<contactId>'
  },
  { idempotencyKey: crypto.randomUUID() },
)
const res = await fetch('https://server.goliathdata.com/api/v1/call', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.GOLIATH_API_KEY}`,
    'Content-Type': 'application/json',
    'Idempotency-Key': crypto.randomUUID(),
  },
  body: JSON.stringify({
    operationId: 'applyTaskTemplate',
    variables: {
      templateId: '<templateId>',
      contactId: '<contactId>'
    }
  }),
})
const { data, errors } = await res.json()

Variables

The example sends only what the schema requires. Some operations also need one of several optional variables (one filter or another, say); the description above says which.

templateIdID!required
contactIdID!required
dealIds[ID!]
overridesApplyTaskTemplateOverridesInput

Per-apply overrides for `applyTaskTemplate`. Each field REPLACES the value the template would have produced; omitted fields keep the template's. `endDate` skips the relative due-date resolution entirely. Everything the template carries that is not overridable (origin, supporting-file links, the contact link) still applies, which is why an edited prefill submits through this rather than through a plain createTask.

titleString
descriptionString
endDateDateTime
timezoneTimezone

The timezone the created task is stored in, and the zone `endDate` is read back against by the task editor. Send it alongside any `endDate` override: without it the task keeps the TEMPLATE's `preferredTimeOfDay.timezone`, so an instant chosen in US Eastern can render as the next day under a template authored in UTC+9. When present it always wins over the template's zone; when omitted the template's is kept. AZ: Arizona: MST all year, no DST.

IDLWSSTHSTAKSTPSTMSTAZCSTESTASTBRTFNTAZOTUTCCETEETMSKGSTPKTBSTICTJSTAESTNCTNZST
taskTypeString
autoCompleteOnNoteAddedBoolean
autoCompleteOnReassignmentBoolean

Response

What comes back under data: a list shows as one entry, and a value as its type.

response shape
{
  "data": {
    "workflowAutomationsMutation": {
      "applyTaskTemplate": {
        "id": "<ID>",
        "title": "…",
        "description": "…",
        "endDate": "2026-01-01T00:00:00.000Z",
        "completedAt": "2026-01-01T00:00:00.000Z"
      }
    }
  }
}

Errors

Idempotency

Send an Idempotency-Key of 1 to 255 characters. A finished request retried with the same key replays its stored response, marked Idempotency-Replayed: true; one still in flight returns 409 idempotency_conflict. Keys expire after 24 hours. Write without fear →