getEmployee
One AI employee in full. abilities is what it can do RIGHT NOW, resolved.
One AI employee in full. abilities is what it can do RIGHT NOW, resolved (a tool missing from the stored config follows its default, and most defaults are on, so read abilities, never infer from the document). config.wakes is what wakes it. mailboxes and triggerForms are its channels; legacyPhoneLines lists only lines it still holds from before lines were shared, since an employee needs no number of its own (it texts on the number the conversation is on, otherwise a shared organization number): an empty list is the normal state, never something to attach, ask about or report; defaultAssignees who owns a contact it works when nobody does. commitments: assignedContactCount the contacts it is on, scheduledContactCount only those on a repeating schedule, and bookedFollowUpContactCount those with a follow-up it booked itself that has not run yet, so 0 scheduled never means no follow-up is coming. It holds no trust of its own: what it does on its own follows the trust of the person each act is for (the line or mailbox owner, else the contact's teammate, else its Manager), set on that person's Memory, Trust page. A text sendWindow holds only what it starts (follow-ups, outreach): its text reply to a lead who wrote in goes out at any hour. configDocument is the whole configuration as one JSON document; change part of it with updateEmployeeConfig's edits and configPatch. Webhook urls read back redacted and are kept on save. updatedAt is the expectedUpdatedAt to pass so a teammate's save in between is refused rather than overwritten.
curl https://server.goliathdata.com/api/v1/call \
-H "Authorization: Bearer $GOLIATH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"operationId": "getEmployee",
"variables": {
"employeeId": "<employeeId>"
}
}'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.employees.getEmployee({
employeeId: '<employeeId>'
})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',
},
body: JSON.stringify({
operationId: 'getEmployee',
variables: {
employeeId: '<employeeId>'
}
}),
})
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": {
"aiEmployeesQuery": {
"contactAgent": {
"id": "<ID>",
"name": "…",
"title": "…",
"status": "ACTIVE",
"origin": "CUSTOM",
"canAnswerCalls": true,
"cannotAnswerReason": "PAUSED",
"dailyRunCap": 0,
"dailyCallCap": 0,
"configDocument": "…",
"textHours": "…",
"quietHoursNotice": "…",
"abilities": [
{
"tool": "…",
"label": "…",
"on": true,
"explicitlySet": true,
"gate": "…"
}
],
"config": {
"wakes": {
"inboundText": true,
"inboundEmail": true,
"callEnded": true,
"meetingSummary": true,
"formSubmitted": true,
"inboundSlack": true,
"teammateText": true,
"teammateEmail": true,
"teammateSlack": true,
"otherEmployeeCallEnded": true,
"dealStageEntered": true,
"dealCreated": true,
"contactNoteAdded": true,
"dealNoteAdded": true,
"taskCreated": true,
"taskCompleted": true,
"appointmentCreated": true,
"appointmentChanged": true,
"contactFieldChanged": true
}
},
"legacyPhoneLines": [
{
"id": "<ID>",
"e164Number": "…",
"holderUserId": "<ID>"
}
],
"mailboxes": [
{
"id": "<ID>",
"emailAddress": "…",
"provider": "…",
"hasActiveConnection": true
}
],
"triggerForms": [
{
"id": "<ID>",
"name": "…",
"status": "…"
}
],
"defaultAssignees": {
"mode": "TEAM_RANDOM",
"assigneeUserIds": [
"<ID>"
]
},
"commitments": {
"assignedContactCount": 0,
"scheduledContactCount": 0,
"bookedFollowUpContactCount": 0,
"openSessionCount": 0
},
"createdAt": "2026-01-01T00:00:00.000Z",
"updatedAt": "2026-01-01T00:00:00.000Z"
}
}
}
}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.
Behaviour
A read. It rejects an Idempotency-Key header with 400 bad_request.