Content services
Package pulse.v1. Every method needs a bearer token. See
Content pipeline and
Studio.
ContentService
| Method | Request → Response | Notes |
|---|---|---|
GenerateContent | GenerateContentRequest → stream StreamChunk | Saves the result and moves it to pending review when done |
ListContent | ListContentRequest → ListContentResponse | Filter by status, channel, campaign |
UpdateContent | UpdateContentRequest → Content | Edit a draft before review |
SaveGeneratedContent | SaveGeneratedContentRequest → Content | Store Studio output so it can be approved and scheduled |
ApproveContent | ApproveContentRequest → Content | Also publishes at once on an armed channel that has a publisher |
RejectContent | RejectContentRequest → Content | |
CreateCreative | CreateCreativeRequest → Creative | Registers metadata for an asset you already have |
ListCreatives | ListCreativesRequest → ListCreativesResponse | |
UpdateCreative | UpdateCreativeRequest → Creative | |
DeleteCreative | DeleteCreativeRequest → Empty | Soft delete |
GenerateCreative | GenerateCreativeRequest → stream StreamChunk | Video only. A still-image request (no format, duration 0) returns Unimplemented: the image tier was retired. The proto comment still mentions stable-diffusion; that path is gone. |
message GenerateContentRequest {
Channel channel = 1;
string topic = 2;
string tone = 3; // "professional", "casual", "bold", "educational"
string target_audience = 4;
string campaign_id = 5; // optional - link to campaign
string diagnostic_id = 6; // optional - use diagnostic context
string additional_context = 7;
string language = 8; // e.g. "pt-BR"
}
message Content {
string id = 1;
string user_id = 2;
Channel channel = 3;
string title = 4;
string body = 5;
string hashtags = 6;
string call_to_action = 7;
ContentStatus status = 8;
string campaign_id = 9;
string tone = 10;
string language = 11;
string reviewer_notes = 12;
map<string, string> metadata = 13;
google.protobuf.Timestamp created_at = 14;
google.protobuf.Timestamp updated_at = 15;
google.protobuf.Timestamp published_at = 16;
string diagnostic_id = 17;
}
message ListContentRequest {
PaginationRequest pagination = 1;
ContentStatus status_filter = 2;
Channel channel_filter = 3;
string campaign_id = 4;
}
message ListContentResponse {
repeated Content content = 1;
PaginationResponse pagination = 2;
}
message UpdateContentRequest {
string content_id = 1;
string title = 2;
string body = 3;
string hashtags = 4;
string call_to_action = 5;
}
message SaveGeneratedContentRequest {
string title = 1;
string body = 2;
Channel channel = 3; // optional; a sensible default is applied server-side
string campaign_id = 4; // optional
string diagnostic_id = 5; // optional
}
message ApproveContentRequest {
string content_id = 1;
string reviewer_notes = 2;
}
message RejectContentRequest {
string content_id = 1;
string reviewer_notes = 2;
string rejection_reason = 3;
}
message Creative {
string id = 1;
string content_id = 2;
string campaign_id = 3;
string type = 4; // "image", "video", "carousel", "story"
string prompt = 5; // AI generation prompt
string url = 6; // asset URL after generation/upload
string alt_text = 7;
string dimensions = 8; // e.g. "1080x1080", "1920x1080"
map<string, string> metadata = 9;
google.protobuf.Timestamp created_at = 10;
google.protobuf.Timestamp updated_at = 11;
int32 duration = 12; // video duration in seconds (if type == "video")
}
message CreateCreativeRequest {
string content_id = 1;
string campaign_id = 2;
string type = 3;
string prompt = 4;
string alt_text = 5;
string dimensions = 6;
}
message ListCreativesRequest {
string content_id = 1;
string campaign_id = 2;
PaginationRequest pagination = 3;
}
message ListCreativesResponse {
repeated Creative creatives = 1;
PaginationResponse pagination = 2;
}
message UpdateCreativeRequest {
string id = 1;
string prompt = 2;
string alt_text = 3;
string url = 4;
string dimensions = 5;
}
message DeleteCreativeRequest {
string id = 1;
}
message GenerateCreativeRequest {
string prompt = 1;
string content_id = 2; // optional
string campaign_id = 3; // optional
int32 width = 4; // defaults to 1024 if unset (image / legacy video)
int32 height = 5; // defaults to 1024 if unset (image / legacy video)
int32 duration = 6; // requested video duration in seconds (0 = image)
string format = 7;
int32 scene_count = 8;
int32 fps = 9;
string avatar_id = 10; // optional, ID of the avatar to use for video generation
string voice_id = 11;
string template_id = 12;
string diagnostic_id = 13;
string target_language = 14; // English, French, Spanish, Portuguese, etc.
}StudioService
Every method streams text. None of them produce audio, video, or files.
| Method | Request | Output |
|---|---|---|
GenerateWhitepaper | GenerateWhitepaperRequest | A long-form document, grounded in your diagnosis |
GeneratePodcast | GeneratePodcastRequest | A podcast script |
GenerateShorts | GenerateShortsRequest | A short-video script |
GeneratePresentation | GeneratePresentationRequest | A slide outline |
GenerateInfographic | GenerateInfographicRequest | Infographic copy |
GenerateReport | GenerateReportRequest | A report draft. It does not read your metrics; export_format is only a hint in the prompt. |
message GenerateWhitepaperRequest {
string topic = 1;
string industry = 2;
string length_preference = 3; // "short", "medium", "in-depth"
}
message GeneratePodcastRequest {
string source_material = 1;
string host_style = 2; // "conversational", "deep_dive", "news"
int32 target_duration_minutes = 3;
}
message GenerateShortsRequest {
string topic = 1;
string target_platform = 2; // "youtube", "instagram"
string visual_style = 3;
}
message GeneratePresentationRequest {
string objective = 1;
int32 slide_count = 2;
string brand_colors = 3;
}
message GenerateInfographicRequest {
string data_source = 1;
string layout_style = 2; // "timeline", "comparison", "process"
}
message GenerateReportRequest {
string timeframe = 1; // "last_30_days", "Q1_2024"
repeated string highlight_metrics = 2;
string export_format = 3; // "pdf", "csv"
}AvatarService
| Method | Request → Response |
|---|---|
CreateAvatar | CreateAvatarRequest → Avatar |
ListAvatars | ListAvatarsRequest → ListAvatarsResponse |
message Avatar {
string id = 1;
string name = 2;
string image_url = 3;
google.protobuf.Timestamp created_at = 4;
string voice_url = 5;
}
message CreateAvatarRequest {
string name = 1;
string image_b64 = 2; // base64 encoded image data
string voice_b64 = 3; // base64 encoded audio for voice cloning
}
message ListAvatarsRequest {}
message ListAvatarsResponse {
repeated Avatar avatars = 1;
}
message ListAvatarsResponse {
repeated Avatar avatars = 1;
}CourseService
| Method | Request → Response | Notes |
|---|---|---|
GenerateCourse | GenerateCourseRequest → Course | Unary, not streamed. A module gets a video only when avatar_id is set and the deployment can generate video; otherwise video_url is empty. |
ListCourses | Empty → ListCoursesResponse |
message GenerateCourseRequest {
string topic = 1;
string avatar_id = 2;
int32 modules_count = 3;
string voice_id = 4;
string template_id = 5;
string diagnostic_id = 6;
}
message Course {
string id = 1;
string title = 2;
string description = 3;
repeated CourseModule modules = 4;
}
message CourseModule {
string id = 1;
string title = 2;
string video_url = 3;
string script = 4;
string quiz_json = 5;
}
message ListCoursesResponse {
repeated Course courses = 1;
}PublishingService
| Method | Request → Response | Notes |
|---|---|---|
SchedulePost | SchedulePostRequest → ScheduledPost | The worker dispatches it when due, if the channel is armed |
ListScheduledPosts | Empty → ListScheduledPostsResponse |
status is pending, publishing, posted, withheld, or failed.
reason_status is recorded, none, missing, or unavailable; never treat
an empty reason as “nothing to report” without checking it.
message ScheduledPost {
string id = 1;
string content_id = 2;
Channel channel = 3;
google.protobuf.Timestamp scheduled_at = 4;
string status = 5;
string reason = 6;
string reason_status = 7;
}
message SchedulePostRequest {
string content_id = 1;
Channel channel = 2;
google.protobuf.Timestamp scheduled_at = 3;
}
message ListScheduledPostsResponse {
repeated ScheduledPost posts = 1;
}