GoliathDevelopersGet an API key
Reference/Contact Importsgenerated from the gateway manifest

confirmContactImport

Import every row of the spreadsheet as contacts.

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

Import every row of the spreadsheet as contacts: the step the Import page’s Import button runs. Rows that match an existing contact update it instead of duplicating it. Every import puts its contacts on its own list, “Contacts from <file name>”; tagName adds a second list of that name (optional; a list, not a tag), so pass it only for a list the person named or picked, never one you made from the file’s name. attestationAccepted records that the person affirmed they have a lawful basis to contact everyone on the list; the import is refused without it, so pass true only on their yes (in a chat, their yes on the import task’s approval card, which shows the attestation). reviveArchivedMatches (default true) restores archived contacts the file matches. optOutTagName is the tag the mapping puts on the file’s opt-outs (a DNC column or tag, for example "DNC"): when the import finishes, every contact it imported that carries that tag is marked Do Not Contact, as part of the import, so nothing waits on it to mark them; omit it when the file marks nobody. Only after the person has seen the preview and said yes to importing this file, with this list. It starts a background task and returns at once; the chat that started it is told when it finishes, so never wait on it.

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": "confirmContactImport",
    "variables": {
      "fileProcessingTaskId": "<fileProcessingTaskId>",
      "attestationAccepted": true
    }
  }'
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.contactImports.confirmContactImport(
  {
    fileProcessingTaskId: '<fileProcessingTaskId>',
    attestationAccepted: true
  },
  { 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: 'confirmContactImport',
    variables: {
      fileProcessingTaskId: '<fileProcessingTaskId>',
      attestationAccepted: true
    }
  }),
})
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.

fileProcessingTaskIdID!required
tagNameString
attestationAcceptedBoolean!required
reviveArchivedMatchesBoolean
optOutTagNameString

Response

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

response shape
{
  "data": {
    "fileProcessingTaskMutation": {
      "confirmContactTransformerUpload": {
        "id": "<ID>",
        "status": "CREATED"
      }
    }
  }
}

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 →