Skip to content

Content services

Package pulse.v1. Every method needs a bearer token. See Content pipeline and Studio.

ContentService

MethodRequest → ResponseNotes
GenerateContentGenerateContentRequest → stream StreamChunkSaves the result and moves it to pending review when done
ListContentListContentRequest → ListContentResponseFilter by status, channel, campaign
UpdateContentUpdateContentRequest → ContentEdit a draft before review
SaveGeneratedContentSaveGeneratedContentRequest → ContentStore Studio output so it can be approved and scheduled
ApproveContentApproveContentRequest → ContentAlso publishes at once on an armed channel that has a publisher
RejectContentRejectContentRequest → Content
CreateCreativeCreateCreativeRequest → CreativeRegisters metadata for an asset you already have
ListCreativesListCreativesRequest → ListCreativesResponse
UpdateCreativeUpdateCreativeRequest → Creative
DeleteCreativeDeleteCreativeRequest → EmptySoft delete
GenerateCreativeGenerateCreativeRequest → stream StreamChunkVideo 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.

MethodRequestOutput
GenerateWhitepaperGenerateWhitepaperRequestA long-form document, grounded in your diagnosis
GeneratePodcastGeneratePodcastRequestA podcast script
GenerateShortsGenerateShortsRequestA short-video script
GeneratePresentationGeneratePresentationRequestA slide outline
GenerateInfographicGenerateInfographicRequestInfographic copy
GenerateReportGenerateReportRequestA 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

MethodRequest → Response
CreateAvatarCreateAvatarRequest → Avatar
ListAvatarsListAvatarsRequest → 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

MethodRequest → ResponseNotes
GenerateCourseGenerateCourseRequest → CourseUnary, not streamed. A module gets a video only when avatar_id is set and the deployment can generate video; otherwise video_url is empty.
ListCoursesEmpty → 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

MethodRequest → ResponseNotes
SchedulePostSchedulePostRequest → ScheduledPostThe worker dispatches it when due, if the channel is armed
ListScheduledPostsEmpty → 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;
}