Data Models

This page documents the request bodies and response shapes used by the Sybill API, organized by resource. Each resource section walks through its read shapes, write shapes, and any sub-objects it embeds; cross-cutting types that show up across many resources live in the Reference section at the bottom.

Conventions

All field names are camelCase. Timestamps are ISO 8601 strings in UTC unless noted otherwise — except in request bodies for POST / PATCH endpoints, where timestamp fields (createdAt, updatedAt, startedAt, endedAt, timestamp) accept ISO 8601 strings, Unix seconds, or Unix milliseconds (auto-detected). UUIDs are represented as strings. Fields marked nullable may be null or absent from the response.


Conversations

Conversation (list)

Returned by GET /v1/conversations.

FieldTypeDescription
conversationIdstring (UUID)Unique identifier
sourceIdstring | nullOrigin of the conversation. Native meeting-provider string (e.g. gong) or a source UUID.
titlestring | nullMeeting title
startTimestring (ISO 8601)Meeting start time
endTimestring (ISO 8601)Meeting end time
typestringINTERNAL or EXTERNAL
participantsParticipant[]Meeting participants
crmCrmInfo | nullAssociated CRM record
{
  "conversationId": "550e8400-e29b-41d4-a716-446655440000",
  "sourceId": "gong",
  "title": "Q4 Pipeline Review",
  "startTime": "2023-11-14T22:13:20Z",
  "endTime": "2023-11-15T00:13:20Z",
  "type": "EXTERNAL",
  "participants": [
    { "name": "Jane Smith", "email": "jane@example.com", "attended": true }
  ],
  "crm": { "id": "006...", "name": "Acme Deal", "type": "opportunity" }
}

Conversation (detail)

Returned by GET /v1/conversations/{conversationId}. Extends the list shape with transcript, recordings, summary, and category.

FieldTypeDescription
(all fields from Conversation list)
categorystring | nullAI-classified category (see Categories)
summaryobject | nullAI-generated meeting summary; keys vary by meeting type
transcriptTranscriptEntry[] | nullSpeaker-segmented transcript
recordingsRecordings | nullSigned video/audio recording URLs (download and stream variants)

ConversationRequest

Request body for POST /v1/conversations. Extends BaseRequest.

FieldTypeRequiredDescription
(all fields from BaseRequest)
transcriptTranscriptSentence[]conditionalPre-transcribed sentences (max 10,000). Required if recordingUrl is absent.
recordingUrlstring | nullconditionalURL Sybill can fetch to transcribe/enrich audio or video. Required if transcript is empty.
recordingMimeTypestring | nullnoHint for the recording's content type
startedAtstring | numberyesWhen the meeting started
endedAtstring | number | nullnoWhen the meeting ended. If provided, must be after startedAt and within 10 hours.
participantsPerson[]yes1–1000 attendees

At least one of transcript or recordingUrl must be provided. Each transcript sentence's timestamp must fall within [startedAt, endedAt] (or [startedAt, startedAt + 10h] if endedAt is omitted).


Participant

A person on a conversation read response.

FieldTypeDescription
namestring | nullDisplay name
emailstring | nullEmail address
attendedbooleanWhether the person actually attended (defaults to true)

CrmInfo

CRM record (deal/account) linked to a conversation.

FieldTypeDescription
idstring | nullCRM remote identifier
namestring | nullDeal/account name
typestring | nullOne of contact, account, opportunity, lead, owner, activity, task

Recordings

Signed URLs for meeting recordings on ConversationDetail. URLs expire after 24 hours.

videoUrl and audioUrl are intended for downloading (the browser will save the file). For in-browser playback (e.g. inside a <video> or <audio> element), use videoStreamUrl and audioStreamUrl — these URLs serve the media inline with the correct Content-Type and support HTTP range requests for seeking and progressive buffering.

FieldTypeDescription
videoUrlstring | nullPresigned URL to download the video recording (browsers save the file). Expires after 24 hours. null if no video recording is available.
videoStreamUrlstring | nullPresigned URL to stream the video recording inline in a media element. Expires after 24 hours. null if no video recording is available, or if streaming URLs are not enabled for your org.
audioUrlstring | nullPresigned URL to download the audio recording (browsers save the file). Expires after 24 hours. null if no audio recording is available.
audioStreamUrlstring | nullPresigned URL to stream the audio recording inline in a media element. Expires after 24 hours. null if no audio recording is available, or if streaming URLs are not enabled for your org.

TranscriptEntry

A single segment of a meeting transcript on ConversationDetail. Returned by the read API — distinct from TranscriptSentence which is the request-side shape callers send to ingest.

FieldTypeDescription
speakerstringName of the speaker
textstringWhat was said
startTimenumberOffset in seconds from meeting start
endTimenumberOffset in seconds from meeting start

TranscriptSentence

A single transcript sentence in ConversationRequest.transcript. Distinct from TranscriptEntry (the response-side shape).

FieldTypeRequiredDescription
speakerIdstring | nullconditionalRemote ID of the speaker. At least one of speakerId or speakerName is required.
speakerNamestring | nullconditionalDisplay name of the speaker
textstringyesSentence text
timestampstring | numberyesAbsolute timestamp (ISO 8601, Unix seconds, or Unix milliseconds). Relative offsets are rejected.

Categories

Conversation category values returned on ConversationDetail.

External meetings (type: "EXTERNAL"): prospect_discovery, prospect_demo, prospect_trial, prospect_negotiation, closed_lost, closed_won, customer_onboarding, customer_support, customer_checkin, customer_commercials, interview, user_research, vendor_call, investor_call, advisor_call, other.

Internal meetings (type: "INTERNAL"): one_on_one, sales_team, customer_team, marketing_team, product_team, engineering_team, hr_team, operations_team, finance_team, investment_team, company_wide, other.


Messages

Message (list)

Returned by GET /v1/messages as MessageListItem.

FieldTypeDescription
messageIdstring (UUID)Sybill message identifier
sourceIdstringOrigin (UUID of a source you created, or a native string like gmail, salesforce_crm)
remoteIdstring | nullProvider-assigned upstream identifier
threadIdstring | nullThread identifier
subjectstring | nullMessage subject line (when the upstream provider exposes one)
senderMessageParty | nullMessage sender
recipientsMessageParty[]Message recipients
bodyPreviewstringTruncated preview of the body
createdAtstring (ISO 8601)Source-system creation time

Message (detail)

Returned by GET /v1/messages/{messageId}. Extends the list shape with the full body and attachments.

FieldTypeDescription
(all fields from Message list)
bodystringFull message body
attachmentsMessageAttachmentInfo[]Attachment metadata (no inline content)

MessageRequest

Request body for POST /v1/messages. Extends BaseRequest.

FieldTypeRequiredDescription
(all fields from BaseRequest)
bodystring (≤100,000)yesMessage body (plain text)
senderPersonyesThe message sender
recipientsPerson[]yes1–1000 recipients
attachmentsAttachment[]noFile attachments
threadIdstring | nullnoIdentifier grouping messages into a thread

MessageParty

A sender or recipient on a message read response.

FieldTypeDescription
namestring | nullDisplay name
emailstring | nullEmail address

MessageAttachmentInfo

Trimmed attachment info on MessageDetail. Inline content is not exposed.

FieldTypeDescription
idstring (UUID)Sybill attachment identifier
filenamestring | nullFilename
contentTypestring | nullMIME type
sizeinteger | nullFile size in bytes

Attachment

Attachment metadata used by MessageRequest.attachments. Distinct from MessageAttachmentInfo (the response-side shape).

FieldTypeRequiredDescription
namestringyesAttachment filename
urlstringyesURL Sybill can fetch to retrieve the attachment
mimeTypestring | nullnoMIME type
sizeBytesinteger | nullnoFile size in bytes

Rows

Row (list / detail)

Returned by GET /v1/rows and GET /v1/rows/{rowId} as RowListItem (the detail shape is identical).

FieldTypeDescription
rowIdstring (UUID)Sybill row identifier
sourceIdstringUUID of the source the row belongs to
objectTypeIdstring (UUID)Object type the row conforms to
objectTypeNamestringObject type's machine name
remoteIdstringYour id supplied at create time
namestringRow primary name
displayNamestringDisplay name
fieldsobject<string, FieldValueResponse>Field map keyed by field name
createdAtstring (ISO 8601) | nullCaller-supplied source creation timestamp (the createdAt from the original ingest payload)
updatedAtstring (ISO 8601) | nullCaller-supplied source last-modified timestamp

RowRequest

Request body for POST /v1/rows. Extends BaseRequest.

FieldTypeRequiredDescription
(all fields from BaseRequestcreatedAt is optional here)
objectTypeIdstring (UUID)yesThe object type this row conforms to
namestring (1–1000)yesPrimary display name for the row
fieldsobject<string, RowFieldValue>yes1–50 typed field values keyed by field name

UpdateRowRequest

Request body for PATCH /v1/rows.

All fields optional. Top-level fields (displayName, name, public, ownerEmails, updatedAt) are not nullable — passing null is silently ignored. The fields map merges per RFC 7396: keys present overwrite, keys absent are preserved, and an explicit null value deletes the key.

FieldTypeDescription
displayNamestring | nullNew display name
namestring (1–1000) | nullNew row primary name
publicboolean | nullToggle visibility
ownerEmailsstring[] | nullReplace owner list
updatedAtstring | number | nullNew source-system updated-at timestamp
fieldsobject<string, RowFieldValue | null> | nullField merge map

FieldValueResponse

A typed field value returned inside Row.fields.

FieldTypeDescription
valueanyField value (shape determined by fieldType)
fieldTypestringDeclared field type (see FieldTypes)
labelstring | nullDisplay label

RowFieldValue

Typed field value used inside RowRequest.fields and UpdateRowRequest.fields. Distinct from FieldValueResponse (the response-side shape).

FieldTypeRequiredDescription
valueanyyesThe field value (shape determined by fieldType)
fieldTypestring (FieldTypes)yesMust match the object type's declared fieldType for this field
labelstring | nullnoOptional human-readable label for the value

Documents

Document (list)

Returned by GET /v1/documents.

FieldTypeDescription
idstringSybill document identifier
displayNamestringDisplay name
sourceIdstringOrigin (UUID of a source you created, or chat_upload)
remoteIdstringYour id supplied at create time (or the source system's id)
urlstringStored or signed URL where the document can be fetched
contentTypestringMIME type
createdAtstring | nullSource-system creation timestamp
updatedAtstring | nullSource-system update timestamp

Document (detail)

Returned by GET /v1/documents/{documentId}. Extends the list shape with normalized-content pointers populated by enrichment.

FieldTypeDescription
(all fields from Document list)
normalizedUrlstring | nullStable URL for the normalized text representation
normalizedContentTypestring | nullMIME type of the normalized content

DocumentRequest

Request body for POST /v1/documents. Extends BaseRequest.

FieldTypeRequiredDescription
(all fields from BaseRequestcreatedAt is optional here)
urlstring | nullconditionalURL Sybill can fetch to retrieve the document
contentstring | nullconditionalBase64-encoded document bytes
filenamestring | nullnoSuggested filename when only content is supplied
contentTypestringnoMIME type. Defaults to text/plain.
authorPerson | nullnoDocument author. Cannot be changed via PATCH.

Exactly one of url or content must be provided.


UpdateDocumentRequest

Request body for PATCH /v1/documents.

All fields optional. Supplying url or content creates a new version and reprocesses the document. A PATCH with neither performs a metadata-only update.

FieldTypeDescription
displayNamestring | nullNew display name
publicboolean | nullToggle visibility
ownerEmailsstring[] | nullReplace owner list
updatedAtstring | number | nullNew source-system updated-at timestamp
urlstring | nullNew source URL (mutually exclusive with content)
contentstring | nullNew base64 content (mutually exclusive with url)
filenamestring | nullNew filename hint
contentTypestring | nullNew MIME type

author is intentionally not updatable. To change a document's author, delete and recreate.


Deals

Deal (list)

Returned by GET /v1/deals.

FieldTypeDescription
dealIdstringCRM remote identifier
namestring | nullDeal name
accountNamestring | nullAssociated account name
stagestring | nullPipeline stage
pipelinestring | nullPipeline name
amountnumber | nullDeal value
closeDatestring (ISO 8601) | nullExpected or actual close date
closedboolean | nullWhether the deal is closed (won or lost)
createdDatestring (ISO 8601) | nullCreated date in the CRM
lastActivityDatestring (ISO 8601) | nullMost recent activity date
ownerOwner | nullDeal owner

Deal (detail)

Returned by GET /v1/deals/{dealId}. Extends the list shape with summary, CRM autofill, and contacts.

FieldTypeDescription
(all fields from Deal list)
summaryobject | nullAI-generated deal summary with dynamic keys
crmAutofillobject | nullSuggested CRM field updates from AI analysis
contactsContact[]People associated with the deal

Owner

The owner of a CRM deal or account. Used by both Deal and Account responses.

FieldTypeDescription
namestring | nullDisplay name
emailstring | nullEmail address

Contact

A person associated with a CRM deal or account. Used by both Deal (detail) and Account (detail) responses.

FieldTypeDescription
namestring | nullFull name
emailstring | nullEmail address
titlestring | nullJob title
phonestring | nullPhone number

Accounts

Account (list)

Returned by GET /v1/accounts.

FieldTypeDescription
accountIdstringCRM remote identifier
namestring | nullAccount name
websitestring | nullWebsite URL
ownerOwner | nullAccount owner
createdDatestring (ISO 8601) | nullCreated date in the CRM
lastActivityDatestring (ISO 8601) | nullMost recent activity date
latestDealLatestDeal | nullMost recent open deal (or most recent closed if no open)

Account (detail)

Returned by GET /v1/accounts/{accountId}.

FieldTypeDescription
(all fields from Account list)
contactsContact[]People associated with the account
syncedCrmFieldsobject | nullLabel-to-value map of all synced CRM fields

LatestDeal

The most recent deal associated with an account. Selection: latest open deal by creation date; if no open deals, latest closed deal by creation date.

FieldTypeDescription
dealIdstringCRM remote identifier
namestring | nullDeal name
stagestring | nullPipeline stage
amountnumber | nullDeal value
closeDatestring (ISO 8601) | nullExpected or actual close date

Sources

SourceResponse

Returned by source endpoints (GET / POST / PATCH /v1/sources and /v1/sources/{sourceId}).

FieldTypeDescription
idstring (UUID)Source identifier
namestringStable machine identifier
displayNamestringDisplay name
createdAtstring (ISO 8601)When the source was created
updatedAtstring (ISO 8601)Last modification time

CreateSourceRequest

Request body for POST /v1/sources.

FieldTypeRequiredDescription
namestring (1–255)yesStable machine identifier; unique within your organization
displayNamestring (1–255)yesDisplay name shown in Sybill

UpdateSourceRequest

Request body for PATCH /v1/sources/{sourceId}. Only displayName is mutable; name is immutable.

FieldTypeRequiredDescription
displayNamestring (1–255)yesNew display name

Object types

ObjectTypeResponse

Returned by object-type endpoints.

FieldTypeDescription
idstring (UUID)Object type identifier
sourceIdstring (UUID)Source it belongs to
namestringStable machine identifier
displayNamestringDisplay name
fieldDefinitionsFieldDefinitionResponse[]Field definitions
createdAtstring (ISO 8601)Creation time
updatedAtstring (ISO 8601)Last modification time

CreateObjectTypeRequest

Request body for POST /v1/object-types.

FieldTypeRequiredDescription
sourceIdstring (UUID)yesThe source this object type belongs to
namestring (1–255)yesStable machine identifier; unique within (sourceId)
displayNamestring (1–255)yesDisplay name shown in Sybill
fieldDefinitionsFieldDefinitionRequest[]yes1–50 field definitions; names must be unique

UpdateObjectTypeRequest

Request body for PATCH /v1/object-types/{objectTypeId}. Both fields optional; supplying fieldDefinitions replaces the full schema.

FieldTypeDescription
displayNamestring (1–255) | nullNew display name
fieldDefinitionsFieldDefinitionRequest[] | nullNew schema

FieldDefinitionRequest

A single field declaration on a CreateObjectTypeRequest or UpdateObjectTypeRequest.

FieldTypeRequiredDescription
namestring (1–255)yesField name (must be unique within an object type)
fieldTypestring (FieldTypes)yesDeclared type
labelstring | nullnoDisplay label
requiredbooleannoDefaults to false

FieldDefinitionResponse

A single field declaration on ObjectTypeResponse.

FieldTypeDescription
namestringField name
fieldTypestring (FieldTypes)Declared type
labelstring | nullDisplay label
requiredbooleanWhether the field is required

FieldTypes

Enum used by FieldDefinitionRequest.fieldType, FieldDefinitionResponse.fieldType, RowFieldValue.fieldType, and FieldValueResponse.fieldType.

ValueDescription
textareaMulti-line string
stringSingle-line string
booleantrue / false
intSigned integer
doubleFloating-point number
datetimeISO 8601 datetime
dateISO 8601 date
listGeneric list of values

Reference

Cross-cutting types reused across multiple resources or endpoints. They live here rather than being duplicated under every resource section.

Person

A person reference attached to ingest request bodies. Used by ConversationRequest.participants, MessageRequest.sender / .recipients, and DocumentRequest.author.

FieldTypeDescription
idstring | nullYour remote identifier for the person
namestring | nullDisplay name
emailstring | nullEmail address

At least one of id or email must be supplied.


BaseRequest

Shared base fields on every ingest POST body — ConversationRequest, MessageRequest, RowRequest, and DocumentRequest all extend this.

FieldTypeRequiredDescription
idstringyesYour remote identifier — unique within (sourceId, archetype)
sourceIdstring (UUID)yesA source you own (see POST /v1/sources)
displayNamestringnoHuman-readable name shown in Sybill. Defaults to an empty string when omitted.
createdAtstring | numbervariesSource-system creation timestamp. Required for conversations and messages; optional for rows and documents. Accepts ISO 8601, Unix seconds, or Unix milliseconds.
updatedAtstring | number | nullnoSource-system last-modified timestamp
publicbooleannoIf true, all users in your organization can read the record. Defaults to false (only ownerEmails and admins can read).
ownerEmailsstring[]noEmail addresses of users who own the record

RecordResponse

Returned by POST and PATCH on /v1/conversations, /v1/messages, /v1/rows, and /v1/documents.

FieldTypeDescription
statusstring (RecordStatus)created (new record) or updated (existing record overwritten)
recordIdstringYour remote id echoed back
idstringSybill record UUID
sourceIdstringThe source the record belongs to

RecordStatus

Enum used in RecordResponse.status: created or updated.


DeletedRecordResponse

Returned by DELETE on /v1/conversations, /v1/messages, /v1/rows, and /v1/documents.

FieldTypeDescription
statusstringAlways deleted
recordIdstringYour remote id
idstringSybill record UUID
sourceIdstringThe source the record belonged to
deletedAtstring (ISO 8601)When the record was soft-deleted

ErrorResponse

Body of the detail field on 400 / 403 / 404 / 409 / 411 / 413 responses from the POST / PATCH / DELETE endpoints.

FieldTypeDescription
errorstringMachine-readable error code (validation_error, forbidden, conflict, not_found, length_required, payload_too_large)
messagestringHuman-readable description
fieldstring | nullField name that triggered the error, if applicable
request_idstringCorrelation id for support

Pagination

Wrapper returned inside the pagination field of every list endpoint (/v1/conversations, /v1/deals, /v1/accounts, /v1/messages, /v1/rows, /v1/documents).

FieldTypeDescription
nextCursorstring | nullOpaque cursor for the next page. null if no more results.
hasMorebooleantrue if additional pages exist

Pass the nextCursor value back as the cursor query parameter to fetch the next page. See the Pagination page for a full overview.