syntax = "v1" type ( CopyResearchMapData { AudienceSummary string `json:"audience_summary,omitempty"` ContentGoal string `json:"content_goal,omitempty"` Questions []string `json:"questions,omitempty"` Pillars []string `json:"pillars,omitempty"` Exclusions []string `json:"exclusions,omitempty"` SuggestedTags []string `json:"suggested_tags,omitempty"` BenchmarkNotes string `json:"benchmark_notes,omitempty"` } PersonaData { ID string `json:"id"` DisplayName string `json:"display_name,omitempty"` Persona string `json:"persona,omitempty"` Brief string `json:"brief,omitempty"` StyleProfile string `json:"style_profile,omitempty"` StyleBenchmark string `json:"style_benchmark,omitempty"` SeedQuery string `json:"seed_query,omitempty"` CopyResearchMap CopyResearchMapData `json:"copy_research_map,omitempty"` CreateAt int64 `json:"create_at"` UpdateAt int64 `json:"update_at"` } ListPersonasData { List []PersonaData `json:"list"` } CreatePersonaReq { DisplayName string `json:"display_name,optional"` } PersonaPath { ID string `path:"id" validate:"required"` } UpdatePersonaReq { DisplayName *string `json:"display_name,optional"` Persona *string `json:"persona,optional"` Brief *string `json:"brief,optional"` StyleProfile *string `json:"style_profile,optional"` StyleBenchmark *string `json:"style_benchmark,optional"` } StartPersonaStyleAnalysisReq { BenchmarkUsername string `json:"benchmark_username" validate:"required"` } StartPersonaStyleAnalysisData { JobID string `json:"job_id"` Status string `json:"status"` Message string `json:"message"` } UpdatePersonaHandlerReq { PersonaPath UpdatePersonaReq } StartPersonaStyleAnalysisHandlerReq { PersonaPath StartPersonaStyleAnalysisReq } StartPersonaViralScanJobReq { Keywords []string `json:"keywords,optional"` } StartPersonaViralScanJobData { JobID string `json:"job_id"` Status string `json:"status"` Message string `json:"message"` } StartPersonaViralScanJobHandlerReq { PersonaPath StartPersonaViralScanJobReq } ListPersonaViralScanPostsReq { Limit int `form:"limit,optional"` } ViralScanPostData { ID string `json:"id"` SearchTag string `json:"search_tag"` Permalink string `json:"permalink"` Author string `json:"author"` AuthorVerified bool `json:"author_verified,omitempty"` FollowerCount int `json:"follower_count,omitempty"` Text string `json:"text"` LikeCount int `json:"like_count"` ReplyCount int `json:"reply_count"` EngagementScore int `json:"engagement_score"` Source string `json:"source"` ScanJobID string `json:"scan_job_id"` Replies []ScanReplyData `json:"replies,omitempty"` CreateAt int64 `json:"create_at"` } ListPersonaViralScanPostsData { List []ViralScanPostData `json:"list"` Total int `json:"total"` } ListPersonaViralScanPostsHandlerReq { PersonaPath ListPersonaViralScanPostsReq } CopyDraftData { ID string `json:"id"` PersonaID string `json:"persona_id"` CopyMissionID string `json:"copy_mission_id,omitempty"` ScanPostID string `json:"scan_post_id,omitempty"` FormulaID string `json:"formula_id,omitempty"` DraftType string `json:"draft_type"` SortOrder int `json:"sort_order,omitempty"` Text string `json:"text"` Angle string `json:"angle,omitempty"` Hook string `json:"hook,omitempty"` Rationale string `json:"rationale,omitempty"` ReferenceNotes string `json:"reference_notes,omitempty"` Sources []string `json:"sources,omitempty"` Status string `json:"status,omitempty"` PublishQueueID string `json:"publish_queue_id,omitempty"` PublishedMediaID string `json:"published_media_id,omitempty"` PublishedPermalink string `json:"published_permalink,omitempty"` PublishedAt int64 `json:"published_at,omitempty"` CreateAt int64 `json:"create_at"` } ListPersonaCopyDraftsData { List []CopyDraftData `json:"list"` Total int `json:"total"` } GeneratePersonaCopyDraftReq { ScanPostID string `json:"scan_post_id" validate:"required"` } GeneratePersonaCopyDraftHandlerReq { PersonaPath GeneratePersonaCopyDraftReq } GeneratePersonaCopyDraftData { Draft CopyDraftData `json:"draft"` Message string `json:"message"` } CopyDraftPath { ID string `path:"id" validate:"required"` DraftID string `path:"draftId" validate:"required"` } UpdateCopyDraftReq { Text *string `json:"text,optional"` Hook *string `json:"hook,optional"` Angle *string `json:"angle,optional"` Status *string `json:"status,optional"` } UpdateCopyDraftHandlerReq { CopyDraftPath UpdateCopyDraftReq } PublishCopyDraftReq { Text string `json:"text,optional"` Confirm bool `json:"confirm"` } PublishCopyDraftHandlerReq { CopyDraftPath PublishCopyDraftReq } PublishCopyDraftData { DraftID string `json:"draft_id"` MediaID string `json:"media_id"` Permalink string `json:"permalink,omitempty"` Status string `json:"status"` Message string `json:"message"` } SchedulePersonaDraftsHandlerReq { PersonaPath ScheduleCopyDraftsReq } StylePresetData { ID string `json:"id"` PersonaID string `json:"persona_id"` Name string `json:"name"` Tone string `json:"tone,omitempty"` CTA []string `json:"cta,omitempty"` BannedWords []string `json:"banned_words,omitempty"` Notes string `json:"notes,omitempty"` CreateAt int64 `json:"create_at"` UpdateAt int64 `json:"update_at"` } ListStylePresetsData { List []StylePresetData `json:"list"` } UpsertStylePresetReq { Name string `json:"name" validate:"required"` Tone string `json:"tone,optional"` CTA []string `json:"cta,optional"` BannedWords []string `json:"banned_words,optional"` Notes string `json:"notes,optional"` Apply bool `json:"apply,optional"` } StylePresetPath { ID string `path:"id" validate:"required"` PresetID string `path:"presetId" validate:"required"` } UpsertStylePresetHandlerReq { StylePresetPath UpsertStylePresetReq } DeleteCopyDraftData { DraftID string `json:"draft_id"` Message string `json:"message"` } ListPersonaContentInboxReq { Page int64 `form:"page,optional"` PageSize int64 `form:"pageSize,optional"` Status string `form:"status,optional"` RangeStart int64 `form:"rangeStart,optional"` RangeEnd int64 `form:"rangeEnd,optional"` } ListPersonaContentInboxHandlerReq { PersonaPath ListPersonaContentInboxReq } ContentInboxItemData { CopyDraftData ScheduledAt int64 `json:"scheduled_at,omitempty"` Lifecycle string `json:"lifecycle"` GroupDate int64 `json:"group_date"` FormulaLabel string `json:"formula_label,omitempty"` } ListPersonaContentInboxData { Pagination PaginationData `json:"pagination"` List []ContentInboxItemData `json:"list"` } SchedulePersonaCopyDraftReq { AccountID string `json:"account_id" validate:"required"` ScheduledAt int64 `json:"scheduled_at,optional"` } SchedulePersonaCopyDraftHandlerReq { CopyDraftPath SchedulePersonaCopyDraftReq } ContentFormulaPath { ID string `path:"id" validate:"required"` FormulaID string `path:"formulaId" validate:"required"` } GenerateFromContentFormulaReq { AccountID string `json:"account_id" validate:"required"` Topic string `json:"topic" validate:"required"` Brief string `json:"brief,optional"` UseWebSearch bool `json:"use_web_search,optional"` DraftCount int `json:"draft_count,optional"` } GenerateFromContentFormulaHandlerReq { ContentFormulaPath GenerateFromContentFormulaReq } GenerateFromContentFormulaData { List []CopyDraftData `json:"list"` Message string `json:"message"` } ) @server( group: persona prefix: /api/v1/personas middleware: AuthJWT tags: "Persona" summary: "Reusable persona profiles with 8D style strategy. Requires Bearer JWT." ) service gateway { @handler listPersonas get / returns (ListPersonasData) @handler createPersona post / (CreatePersonaReq) returns (PersonaData) @handler getPersona get /:id (PersonaPath) returns (PersonaData) @handler updatePersona patch /:id (UpdatePersonaHandlerReq) returns (PersonaData) @handler deletePersona delete /:id (PersonaPath) @handler startPersonaStyleAnalysis post /:id/style-analysis (StartPersonaStyleAnalysisHandlerReq) returns (StartPersonaStyleAnalysisData) @handler startPersonaViralScanJob post /:id/viral-scan-jobs (StartPersonaViralScanJobHandlerReq) returns (StartPersonaViralScanJobData) @handler listPersonaViralScanPosts get /:id/viral-scan-posts (ListPersonaViralScanPostsHandlerReq) returns (ListPersonaViralScanPostsData) @handler listPersonaCopyDrafts get /:id/copy-drafts (PersonaPath) returns (ListPersonaCopyDraftsData) @handler listPersonaContentInbox get /:id/content-inbox (ListPersonaContentInboxHandlerReq) returns (ListPersonaContentInboxData) @handler generatePersonaCopyDraft post /:id/copy-drafts/generate (GeneratePersonaCopyDraftHandlerReq) returns (GeneratePersonaCopyDraftData) @handler updatePersonaCopyDraft patch /:id/copy-drafts/:draftId (UpdateCopyDraftHandlerReq) returns (CopyDraftData) @handler publishPersonaCopyDraft post /:id/copy-drafts/:draftId/publish (PublishCopyDraftHandlerReq) returns (PublishCopyDraftData) @handler schedulePersonaDrafts post /:id/copy-drafts/schedule (SchedulePersonaDraftsHandlerReq) returns (ScheduleCopyDraftsData) @handler schedulePersonaCopyDraft post /:id/copy-drafts/:draftId/schedule (SchedulePersonaCopyDraftHandlerReq) returns (ScheduleCopyDraftsData) @handler generateFromContentFormula post /:id/content-formulas/:formulaId/generate (GenerateFromContentFormulaHandlerReq) returns (GenerateFromContentFormulaData) @handler deletePersonaCopyDraft delete /:id/copy-drafts/:draftId (CopyDraftPath) returns (DeleteCopyDraftData) @handler listStylePresets get /:id/style-presets (PersonaPath) returns (ListStylePresetsData) @handler upsertStylePreset put /:id/style-presets/:presetId (UpsertStylePresetHandlerReq) returns (StylePresetData) @handler deleteStylePreset delete /:id/style-presets/:presetId (StylePresetPath) }