| id | uuid | The unique identifier for the signal. |
| name | string | Display name for the signal. For typed text signals, Zentrik can generate this automatically from the signal type and timestamp. |
| publicId | string | Workspace-scoped, human-readable identifier in the form "SIGNAL-123". Useful for referencing signals in UI and exports. |
| workspaceId | uuid | ID of the workspace this signal belongs to. |
| status | 'pending' | 'processing' | 'processed' | 'failed' | Processing status of the signal. Create responses that queue work now typically return processing immediately, then later settle to processed or failed. |
| signalType | 'transcript' | 'support_ticket' | 'review' | 'feedback_record' | 'discovery_report' | null | Present for manual text signals. Indicates which typed ingestion flow created the signal. |
| processorType | string | Canonical operational processor route, such as manual-text, manual-transcript, gong, or zendesk. |
| providerType | string | Canonical source system or channel, such as external_api, manual, gong, zendesk, gmail_mailbox, app_store, reddit, or g2. |
| evidenceKind | string | Canonical evidence shape, such as transcript, support_ticket, review, feedback_record, forum_discussion, discovery_report, or email_thread. |
| analysisProfile | 'default_transcript' | 'support_ticket' | 'survey_response' | 'discovery_report' | 'community_discussion' | Canonical prompt/extraction profile used by processing. |
| provenance | { providerType: string; evidenceKind: string; analysisProfile: string } | Canonical signal provenance grouped for clients that do not need operational processor routing. |
| sourceFacet | string | Derived filter/grouping key in the form providerType:evidenceKind. |
| sourceLabel | string | Derived display label for the source facet. |
| sourceLinks | { name: string; url: string; type: string; primary?: boolean }[] | Normalized source links users can open from Discovery to inspect the original evidence. These are derived from sourceLinks on create and legacy URL fields stored in source.external_data, data, or import metadata. |
| context | string | null | Normalized interaction context inferred or stored for the signal, such as user_interview, feature_feedback, or support_request. Most clients do not need to send this on create. |
| source | { type: string; external_data?: object } | Provider-specific source payload. Canonical provenance lives in processorType, providerType, evidenceKind, and analysisProfile. |
| data | object | null | The source-shaped payload you sent on create, and only that. Keys Zentrik writes into the stored column while processing (attribution, import receipts, storage keys, processing timestamps) are projected into transcript, import, and processing instead of echoed here. Null when you sent none. |
| transcript | { coveragePercent, totalTurnCount, resolvedTurnCount, externalTurnCount, internalTurnCount, unresolvedTurnCount, participantCount, analysis } | null | For transcript evidence: how much of the call was attributed to a named speaker, and what processing decided to do with it. Null for other evidence kinds. |
| transcript.analysis | { outcome: 'no_analytical_content' | 'analyzed_no_insights' | 'analyzed_with_insights'; reason: string; generatedInsightCount: number } | null | Why a processed call did or did not produce insights. no_analytical_content means the call never reached insight analysis; analyzed_no_insights means it was analyzed in full and nothing in it was supported well enough to become an insight; analyzed_with_insights means it produced them. generatedInsightCount counts what that processing run produced rather than the length of insightIds, so a call can report analyzed_no_insights and still list insights a person linked by hand. Null until the signal has been processed, so a call with no insights and no analysis is still in flight rather than declined. |
| import | object | null | Scalar provenance facts from the import that created this signal, such as provider, filename, sheet, row, and record IDs. Null when the signal was not imported. |
| rawData | object | null | The whole stored data column, returned only when a read request includes ?include=raw. A processed transcript carries every attributed turn and the provider import response and can exceed several hundred KB, so it is opt-in per request and never returned on a list. |
| insightIds | uuid[] | List of insight IDs that have been linked to this signal. |
| accountIds | uuid[] | List of account IDs linked directly to this signal. |
| contactIds | uuid[] | Workspace people linked to this signal from participant resolution or later curation. |
| accountId | uuid | null | Legacy single-account field. When multiple accounts are linked, this returns the first linked account ID. |
| accountExternalId | string | null | Client-provided external account identifier when the signal was created with accountExternalId. |
| externalId | string | null | Identifier of the record in the external system (for example, a ticket or event identifier). |
| createdAt | iso-date | Timestamp when the signal was first created. |
| updatedAt | iso-date | Timestamp of the last modification. |
| jobId | string | undefined | Returned on create/process responses when an asynchronous processing job has been queued. |
| processing | { lastJobId?: string | null; startedAt?: string | null; processedAt?: string | null; failedAt?: string | null; lastError?: string | null } | null | Operational processing metadata. Use this to debug queue progress and retries before assuming a signal is stuck. |