GoliathDevelopersGet an API key
Reference/Dealsgenerated from the gateway manifest

updateDealCustomField

Edit an existing deal custom-field DEFINITION in place (by id from listDealCustomFields).

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

Edit an existing deal custom-field DEFINITION in place (by id from listDealCustomFields). THIS IS THE CORRECT WAY TO ADD A DROPDOWN OPTION or fix a wrong name or default: do not create a second field. Owner-only: the field's pipeline must be OWNED by your organization; a field on a pipeline merely shared with you cannot be edited. Omitted fields are untouched. The field's TYPE cannot be changed. options applies to DROPDOWN fields and REPLACES the whole option list rather than appending: send every option you want to keep, each existing one as { id, label } with its id from listDealCustomFields, and each new one as { label } with no id. To RENAME an option, send its existing id with the new label: every value already recorded on deals, the field's default, and the saved filters and queued bulk tasks naming the old label all move to the new one. Sending a new label WITHOUT the id instead removes the old option and creates a different one. Any existing option you leave out is REMOVED; if deals or filters still reference a removed option the call is rejected until you pass optionDependencyResolutions: from getDeletionImpact (DEAL_CUSTOM_FIELD_OPTION, the option id), the person picking each replacement. A default that is no longer one of the options is cleared. Names must be unique within the pipeline. Returns the updated field with its full option list.

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": "updateDealCustomField",
    "variables": {
      "customFieldId": "<customFieldId>"
    }
  }'
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.deals.updateDealCustomField(
  {
    customFieldId: '<customFieldId>'
  },
  { 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: 'updateDealCustomField',
    variables: {
      customFieldId: '<customFieldId>'
    }
  }),
})
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.

customFieldIdID!required
nameString
options[UpsertPipelineItemCustomFieldOptionInput!]
idID
labelString!required
defaultValueString
optionDependencyResolutions[DependencyResolutionInput!]
impactVersionString!required
replacements[DependencyReplacementSelectionInput!]!required
Every field, all the way down
variables
[
  {
    "name": "customFieldId",
    "type": "ID!",
    "required": true,
    "description": null,
    "defaultValue": null
  },
  {
    "name": "name",
    "type": "String",
    "required": false,
    "description": null,
    "defaultValue": null
  },
  {
    "name": "options",
    "type": "[UpsertPipelineItemCustomFieldOptionInput!]",
    "required": false,
    "description": null,
    "defaultValue": null,
    "fields": [
      {
        "name": "id",
        "type": "ID",
        "required": false,
        "description": null,
        "defaultValue": null
      },
      {
        "name": "label",
        "type": "String!",
        "required": true,
        "description": null,
        "defaultValue": null
      }
    ]
  },
  {
    "name": "defaultValue",
    "type": "String",
    "required": false,
    "description": null,
    "defaultValue": null
  },
  {
    "name": "optionDependencyResolutions",
    "type": "[DependencyResolutionInput!]",
    "required": false,
    "description": null,
    "defaultValue": null,
    "fields": [
      {
        "name": "impactVersion",
        "type": "String!",
        "required": true,
        "description": null,
        "defaultValue": null
      },
      {
        "name": "replacements",
        "type": "[DependencyReplacementSelectionInput!]!",
        "required": true,
        "description": null,
        "defaultValue": null,
        "fields": [
          {
            "name": "targetKind",
            "type": "DependencyTargetKind!",
            "required": true,
            "description": null,
            "defaultValue": null,
            "enumValues": [
              "PIPELINE_ITEM",
              "DEAL",
              "PIPELINE_STAGE_PIPELINE_ITEMS",
              "DEAL_STAGE_DEALS",
              "PIPELINE_ITEM_CUSTOM_FIELD",
              "DEAL_CUSTOM_FIELD",
              "PIPELINE_ITEM_CUSTOM_FIELD_OPTION",
              "DEAL_CUSTOM_FIELD_OPTION",
              "PROPERTY_TAG",
              "PROPERTY_LIST",
              "CONTACT_TAG",
              "CONTACT_LIST",
              "CONTACT_CUSTOM_FIELD",
              "CONTACT_CUSTOM_FIELD_OPTION",
              "PIPELINE",
              "DEAL_PIPELINE",
              "PIPELINE_STAGE",
              "DEAL_STAGE",
              "TWILIO_PHONE_NUMBER",
              "EMAIL_IDENTITY",
              "LIBRARY_FOLDER",
              "USER",
              "USER_GROUP",
              "WORKFLOW_GROUP",
              "WORKFLOW_AUTOMATION",
              "CONTENT_TEMPLATE",
              "AGENT",
              "MARKETING_CAMPAIGN",
              "UPLOADED_FILE",
              "WORKFLOW_WEBHOOK_CREDENTIAL",
              "SCRAPER_PIPELINE",
              "FILTER",
              "EMBED_FORM",
              "WORKFLOW_TABLE",
              "WORKFLOW_TABLE_COLUMN",
              "CONTACT",
              "PROPERTY",
              "ORGANIZATION",
              "SLACK_CHANNEL",
              "SLACK_USER",
              "MACHINE_GROUP",
              "MACHINE_HOST"
            ]
          },
          {
            "name": "targetId",
            "type": "ID!",
            "required": true,
            "description": null,
            "defaultValue": null
          },
          {
            "name": "replacementId",
            "type": "ID!",
            "required": true,
            "description": null,
            "defaultValue": null
          }
        ]
      }
    ]
  }
]

Response

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

response shape
{
  "data": {
    "dealCustomFieldMutation": {
      "updateCustomField": {
        "id": "<ID>",
        "name": "…",
        "type": "DROPDOWN",
        "options": [
          {
            "id": "<ID>",
            "label": "…"
          }
        ],
        "displayOrder": 0,
        "allowMultiple": true,
        "defaultValue": "…"
      }
    }
  }
}

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 →