Metadata Structure by Content Type
Content: Metadata Structure by Content Type
User Intent
"What metadata is captured for each content type? How do I access it?"
Operation
Concept: Content metadata fields
GraphQL Fields: Type-specific metadata objects
Entity Type: Content
Common Use Cases: Accessing email details, message info, document properties, image metadata, event details
Metadata Fields Overview
Each ContentType has a corresponding metadata field with type-specific properties automatically captured during ingestion.
TypeScript (Canonical)
import { Graphlit } from 'graphlit-client';
import { ContentTypes, FileTypes } from 'graphlit-client/dist/generated/graphql-types';
const graphlit = new Graphlit();
const content = await graphlit.getContent('content-id');
// Access metadata based on content type
if (content.content.type === ContentTypes.Email && content.content.email) {
const email = content.content.email;
console.log(`Subject: ${email.subject}`);
console.log(`From: ${email.from[0].email}`);
console.log(`To: ${email.to?.map(p => p.email).join(', ')}`);
console.log(`Labels: ${email.labels?.join(', ')}`);
console.log(`Attachments: ${email.attachmentCount}`);
}
if (content.content.type === ContentTypes.Message && content.content.message) {
const msg = content.content.message;
console.log(`Channel: ${msg.channelName}`);
console.log(`Author: ${msg.author?.name} (${msg.author?.email})`);
console.log(`Mentions: ${msg.mentions?.map(p => p.name).join(', ')}`);
}
if (content.content.fileType === FileTypes.Document && content.content.document) {
const doc = content.content.document;
console.log(`Pages: ${doc.pageCount}`);
console.log(`Author: ${doc.author}`);
console.log(`Words: ${doc.wordCount}`);
console.log(`Encrypted: ${doc.isEncrypted}`);
}Email Metadata (ContentTypes.Email)
Field: content.email (EmailMetadata)
Properties:
Example Access:
Message Metadata (ContentTypes.Message)
Field: content.message (MessageMetadata)
Properties:
Example Access:
Document Metadata (FileDocument)
Field: content.document (DocumentMetadata)
Properties:
Example Access:
Image Metadata (FileImage)
Field: content.image (ImageMetadata)
Properties:
Example Access:
Audio Metadata (FileAudio)
Field: content.audio (AudioMetadata)
Properties:
Example Access:
Video Metadata (FileVideo)
Field: content.video (VideoMetadata)
Properties:
Example Access:
Event Metadata (ContentEvent)
Field: content.event (EventMetadata)
Properties:
Example Access:
Issue Metadata (ContentTypes.Issue)
Field: content.issue (IssueMetadata)
Properties:
Example Access:
Post Metadata (ContentPost)
Field: content.post (PostMetadata)
Properties:
Example Access:
Access email metadata (snake_case fields)
if content.content.type == "EMAIL" and content.content.email: email = content.content.email print(f"Subject: {email.subject}") print(f"From: {email.from_[0].email}") # Note: from_ (reserved word) print(f"Attachments: {email.attachment_count}")
Access message metadata
if content.content.type == "MESSAGE" and content.content.message: msg = content.content.message print(f"Channel: {msg.channel_name}") print(f"Author: {msg.author.name}")
Access document metadata
if content.content.file_type == "DOCUMENT" and content.content.document: doc = content.content.document print(f"Pages: {doc.page_count}") print(f"Words: {doc.word_count}")
Developer Hints
Always Check Type First
Null-Safe Access
PersonReference Pattern
Common Issues & Solutions
Issue: Metadata field is undefined Solution: Check content type matches expected type
Issue: Arrays are null instead of empty Solution: Use nullish coalescing
Issue: Date fields are strings not Date objects Solution: Parse ISO 8601 strings
Production Example
Last updated
Was this helpful?