confirmContactImport
Import every row of the spreadsheet as contacts.
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.
Response
What comes back under data: a list shows as one entry, and a value as its type.
{
"data": {
"fileProcessingTaskMutation": {
"confirmContactTransformerUpload": {
"id": "<ID>",
"status": "CREATED"
}
}
}
}Errors
unknown_variableA variable the operation does not declare. A typo is refused rather than silently dropped.
unauthorizedNo bearer header, or the key is invalid or revoked.
insufficient_scopeThe key lacks the scope the operation requires.
forbiddenA referenced record does not exist, was deleted, or is outside your organization. The gateway cannot tell those apart.
idempotency_conflictA request with this Idempotency-Key is still in flight.
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 →