2026-07-13 01:15:30 +00:00
|
|
|
|
syntax = "v1"
|
|
|
|
|
|
|
|
|
|
|
|
// M5: inspire + research + media image + scout
|
|
|
|
|
|
|
|
|
|
|
|
type (
|
|
|
|
|
|
// --- Inspire ---
|
|
|
|
|
|
TrendPublic {
|
|
|
|
|
|
Id string `json:"id"`
|
|
|
|
|
|
Kind string `json:"kind"`
|
|
|
|
|
|
Label string `json:"label"`
|
|
|
|
|
|
Summary string `json:"summary"`
|
|
|
|
|
|
Heat int `json:"heat"`
|
|
|
|
|
|
Keywords []string `json:"keywords"`
|
|
|
|
|
|
Samples []string `json:"samples"`
|
|
|
|
|
|
SourceLabel string `json:"source_label"`
|
|
|
|
|
|
ObservedAt int64 `json:"observed_at"`
|
|
|
|
|
|
}
|
|
|
|
|
|
TrendListData {
|
|
|
|
|
|
List []TrendPublic `json:"list"`
|
|
|
|
|
|
}
|
|
|
|
|
|
InspireElementPublic {
|
|
|
|
|
|
Id string `json:"id"`
|
|
|
|
|
|
Kind string `json:"kind"`
|
|
|
|
|
|
Title string `json:"title"`
|
|
|
|
|
|
Body string `json:"body"`
|
|
|
|
|
|
RefId string `json:"ref_id,optional"`
|
|
|
|
|
|
Reusable bool `json:"reusable"`
|
|
|
|
|
|
CreatedAt int64 `json:"created_at"`
|
|
|
|
|
|
UpdatedAt int64 `json:"updated_at"`
|
|
|
|
|
|
}
|
|
|
|
|
|
InspireElementListData {
|
|
|
|
|
|
List []InspireElementPublic `json:"list"`
|
|
|
|
|
|
}
|
|
|
|
|
|
InspireElementSaveReq {
|
|
|
|
|
|
Id string `json:"id,optional"`
|
|
|
|
|
|
Kind string `json:"kind,optional"`
|
|
|
|
|
|
Title string `json:"title"`
|
|
|
|
|
|
Body string `json:"body"`
|
|
|
|
|
|
RefId string `json:"ref_id,optional"`
|
|
|
|
|
|
Reusable bool `json:"reusable,optional"`
|
|
|
|
|
|
}
|
|
|
|
|
|
InspireElementIdPath {
|
|
|
|
|
|
Id string `path:"id"`
|
|
|
|
|
|
}
|
|
|
|
|
|
InspireDraftPublic {
|
|
|
|
|
|
Title string `json:"title,optional"`
|
|
|
|
|
|
Body string `json:"body"`
|
|
|
|
|
|
}
|
|
|
|
|
|
InspireMessagePublic {
|
|
|
|
|
|
Id string `json:"id"`
|
|
|
|
|
|
Role string `json:"role"`
|
|
|
|
|
|
Text string `json:"text"`
|
|
|
|
|
|
Draft InspireDraftPublic `json:"draft,optional"`
|
|
|
|
|
|
CreatedAt int64 `json:"created_at"`
|
|
|
|
|
|
}
|
|
|
|
|
|
InspireSessionPublic {
|
|
|
|
|
|
Id string `json:"id"`
|
|
|
|
|
|
Title string `json:"title,optional"`
|
|
|
|
|
|
Messages []InspireMessagePublic `json:"messages"`
|
|
|
|
|
|
PinnedElementIds []string `json:"pinned_element_ids"`
|
|
|
|
|
|
CreatedAt int64 `json:"created_at,optional"`
|
|
|
|
|
|
UpdatedAt int64 `json:"updated_at"`
|
|
|
|
|
|
}
|
|
|
|
|
|
// 列表摘要(不含完整 messages)
|
|
|
|
|
|
InspireSessionSummaryPublic {
|
|
|
|
|
|
Id string `json:"id"`
|
|
|
|
|
|
Title string `json:"title"`
|
|
|
|
|
|
Preview string `json:"preview"`
|
|
|
|
|
|
MessageCount int `json:"message_count"`
|
|
|
|
|
|
UpdatedAt int64 `json:"updated_at"`
|
|
|
|
|
|
CreatedAt int64 `json:"created_at"`
|
|
|
|
|
|
Active bool `json:"active"`
|
|
|
|
|
|
}
|
|
|
|
|
|
InspireSessionListData {
|
|
|
|
|
|
List []InspireSessionSummaryPublic `json:"list"`
|
|
|
|
|
|
}
|
|
|
|
|
|
InspireSessionIdPath {
|
|
|
|
|
|
Id string `path:"id"`
|
|
|
|
|
|
}
|
|
|
|
|
|
InspireSessionCreateReq {
|
|
|
|
|
|
Title string `json:"title,optional"`
|
|
|
|
|
|
}
|
|
|
|
|
|
InspireChatReq {
|
|
|
|
|
|
Message string `json:"message"`
|
|
|
|
|
|
PinnedIds []string `json:"pinned_ids,optional"`
|
|
|
|
|
|
Mode string `json:"mode,optional"` // chat|generate
|
|
|
|
|
|
PersonaId string `json:"persona_id,optional"`
|
|
|
|
|
|
SessionId string `json:"session_id,optional"` // 空 = active
|
|
|
|
|
|
// generate 專用:待改寫素材(鎖定內容);空則拒絕產文
|
|
|
|
|
|
Material string `json:"material,optional"`
|
|
|
|
|
|
}
|
|
|
|
|
|
InspireChatData {
|
|
|
|
|
|
Session InspireSessionPublic `json:"session"`
|
|
|
|
|
|
Messages []InspireMessagePublic `json:"messages"`
|
|
|
|
|
|
}
|
|
|
|
|
|
// 觀測:與送出相同的 prompt 組裝(不呼叫 AI、不計費)
|
|
|
|
|
|
InspirePromptPreviewReq {
|
|
|
|
|
|
Message string `json:"message,optional"`
|
|
|
|
|
|
PinnedIds []string `json:"pinned_ids,optional"`
|
|
|
|
|
|
Mode string `json:"mode,optional"` // chat|generate
|
|
|
|
|
|
PersonaId string `json:"persona_id,optional"`
|
|
|
|
|
|
SessionId string `json:"session_id,optional"`
|
|
|
|
|
|
Material string `json:"material,optional"`
|
|
|
|
|
|
}
|
|
|
|
|
|
InspirePromptPinnedPublic {
|
|
|
|
|
|
Id string `json:"id"`
|
|
|
|
|
|
Kind string `json:"kind"`
|
|
|
|
|
|
Title string `json:"title"`
|
|
|
|
|
|
Body string `json:"body"`
|
|
|
|
|
|
}
|
|
|
|
|
|
InspirePromptBlockPublic {
|
|
|
|
|
|
Title string `json:"title"`
|
|
|
|
|
|
Body string `json:"body"`
|
|
|
|
|
|
}
|
|
|
|
|
|
InspirePromptPreviewData {
|
|
|
|
|
|
Prompt string `json:"prompt"`
|
|
|
|
|
|
Mode string `json:"mode"`
|
|
|
|
|
|
Sections []string `json:"sections"`
|
|
|
|
|
|
Blocks []InspirePromptBlockPublic `json:"blocks"`
|
|
|
|
|
|
Fingerprint string `json:"fingerprint"`
|
|
|
|
|
|
CharCount int `json:"char_count"`
|
|
|
|
|
|
RuneCount int `json:"rune_count"`
|
|
|
|
|
|
Pinned []InspirePromptPinnedPublic `json:"pinned"`
|
|
|
|
|
|
Note string `json:"note,optional"`
|
|
|
|
|
|
}
|
|
|
|
|
|
ResearchSearchReq {
|
|
|
|
|
|
Query string `json:"query"`
|
|
|
|
|
|
}
|
|
|
|
|
|
ResearchHitPublic {
|
|
|
|
|
|
Id string `json:"id"`
|
|
|
|
|
|
Title string `json:"title"`
|
|
|
|
|
|
Snippet string `json:"snippet"`
|
|
|
|
|
|
Url string `json:"url"`
|
|
|
|
|
|
Summary string `json:"summary,optional"`
|
|
|
|
|
|
LearnPoints []string `json:"learn_points,optional"`
|
|
|
|
|
|
ReplyHooks []string `json:"reply_hooks,optional"`
|
|
|
|
|
|
SourceLabel string `json:"source_label,optional"`
|
|
|
|
|
|
}
|
|
|
|
|
|
ResearchSearchData {
|
|
|
|
|
|
List []ResearchHitPublic `json:"list"`
|
|
|
|
|
|
}
|
|
|
|
|
|
GenerateImageReq {
|
|
|
|
|
|
Prompt string `json:"prompt"`
|
|
|
|
|
|
}
|
|
|
|
|
|
GenerateImageData {
|
|
|
|
|
|
Id string `json:"id"`
|
|
|
|
|
|
Url string `json:"url"`
|
|
|
|
|
|
Prompt string `json:"prompt"`
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// --- Scout ---
|
|
|
|
|
|
BrandPublic {
|
|
|
|
|
|
Id string `json:"id"`
|
|
|
|
|
|
DisplayName string `json:"display_name"`
|
|
|
|
|
|
Brief string `json:"brief"`
|
|
|
|
|
|
TargetAudience string `json:"target_audience,optional"`
|
|
|
|
|
|
Goals string `json:"goals,optional"`
|
|
|
|
|
|
}
|
|
|
|
|
|
BrandListData {
|
|
|
|
|
|
List []BrandPublic `json:"list"`
|
|
|
|
|
|
}
|
|
|
|
|
|
BrandSaveReq {
|
|
|
|
|
|
Id string `json:"id,optional"`
|
|
|
|
|
|
DisplayName string `json:"display_name"`
|
|
|
|
|
|
Brief string `json:"brief,optional"`
|
|
|
|
|
|
TargetAudience string `json:"target_audience,optional"`
|
|
|
|
|
|
Goals string `json:"goals,optional"`
|
|
|
|
|
|
}
|
|
|
|
|
|
BrandIdPath {
|
|
|
|
|
|
Id string `path:"id"`
|
|
|
|
|
|
}
|
|
|
|
|
|
BrandActiveData {
|
|
|
|
|
|
Id string `json:"id"`
|
|
|
|
|
|
}
|
|
|
|
|
|
BrandSetActiveReq {
|
|
|
|
|
|
Id string `json:"id"`
|
|
|
|
|
|
}
|
|
|
|
|
|
ProductPublic {
|
|
|
|
|
|
Id string `json:"id"`
|
|
|
|
|
|
BrandId string `json:"brand_id"`
|
|
|
|
|
|
Label string `json:"label"`
|
|
|
|
|
|
ProductContext string `json:"product_context"`
|
|
|
|
|
|
MatchTags []string `json:"match_tags"`
|
|
|
|
|
|
PainPoints []string `json:"pain_points"`
|
|
|
|
|
|
PlacementUrl string `json:"placement_url,optional"`
|
|
|
|
|
|
CreatedAt int64 `json:"created_at"`
|
|
|
|
|
|
UpdatedAt int64 `json:"updated_at"`
|
|
|
|
|
|
}
|
|
|
|
|
|
ProductListData {
|
|
|
|
|
|
List []ProductPublic `json:"list"`
|
|
|
|
|
|
}
|
|
|
|
|
|
ProductSaveReq {
|
|
|
|
|
|
Id string `json:"id,optional"`
|
|
|
|
|
|
BrandId string `json:"brand_id"`
|
|
|
|
|
|
Label string `json:"label"`
|
|
|
|
|
|
ProductContext string `json:"product_context,optional"`
|
|
|
|
|
|
MatchTags []string `json:"match_tags,optional"`
|
|
|
|
|
|
PainPoints []string `json:"pain_points,optional"`
|
|
|
|
|
|
PlacementUrl string `json:"placement_url,optional"`
|
|
|
|
|
|
}
|
|
|
|
|
|
ProductIdPath {
|
|
|
|
|
|
Id string `path:"id"`
|
|
|
|
|
|
}
|
|
|
|
|
|
ProductListReq {
|
|
|
|
|
|
BrandId string `form:"brand_id,optional"`
|
|
|
|
|
|
}
|
|
|
|
|
|
ImportProductReq {
|
|
|
|
|
|
Url string `json:"url"`
|
|
|
|
|
|
}
|
|
|
|
|
|
ImportProductData {
|
|
|
|
|
|
Label string `json:"label"`
|
|
|
|
|
|
ProductContext string `json:"product_context"`
|
|
|
|
|
|
PainPoints []string `json:"pain_points"`
|
|
|
|
|
|
MatchTags []string `json:"match_tags"`
|
|
|
|
|
|
PlacementUrl string `json:"placement_url"`
|
|
|
|
|
|
SourceNote string `json:"source_note"`
|
|
|
|
|
|
}
|
|
|
|
|
|
ScoutBriefReq {
|
|
|
|
|
|
Intent string `json:"intent"`
|
|
|
|
|
|
BrandId string `json:"brand_id,optional"`
|
|
|
|
|
|
ProductId string `json:"product_id,optional"`
|
|
|
|
|
|
Purpose string `json:"purpose,optional"`
|
|
|
|
|
|
Deep bool `json:"deep,optional"`
|
|
|
|
|
|
}
|
|
|
|
|
|
ScoutBriefPublic {
|
|
|
|
|
|
Intent string `json:"intent"`
|
|
|
|
|
|
Mode string `json:"mode"`
|
|
|
|
|
|
BrandId string `json:"brand_id,optional"`
|
|
|
|
|
|
ProductId string `json:"product_id,optional"`
|
|
|
|
|
|
ProductLabel string `json:"product_label,optional"`
|
|
|
|
|
|
Pains []string `json:"pains"`
|
|
|
|
|
|
Tags []string `json:"tags"`
|
|
|
|
|
|
Periphery []string `json:"periphery"`
|
|
|
|
|
|
ScanTerms []string `json:"scan_terms"`
|
|
|
|
|
|
PlacementNote string `json:"placement_note,optional"`
|
|
|
|
|
|
ResponseStance string `json:"response_stance,optional"`
|
|
|
|
|
|
ThemeKey string `json:"theme_key,optional"`
|
|
|
|
|
|
ThemeLabel string `json:"theme_label,optional"`
|
|
|
|
|
|
ProductContext string `json:"product_context,optional"`
|
|
|
|
|
|
}
|
|
|
|
|
|
ScoutScanReq {
|
|
|
|
|
|
Brief ScoutBriefPublic `json:"brief"`
|
|
|
|
|
|
}
|
2026-07-13 08:59:13 +00:00
|
|
|
|
ScoutScanJobData {
|
|
|
|
|
|
Job JobPublic `json:"job"`
|
|
|
|
|
|
}
|
2026-07-13 01:15:30 +00:00
|
|
|
|
ScoutPostPublic {
|
|
|
|
|
|
Id string `json:"id"`
|
|
|
|
|
|
BrandId string `json:"brand_id,optional"`
|
|
|
|
|
|
Author string `json:"author"`
|
|
|
|
|
|
Text string `json:"text"`
|
|
|
|
|
|
SearchTag string `json:"search_tag"`
|
|
|
|
|
|
Opportunity string `json:"opportunity"`
|
|
|
|
|
|
OutreachStatus string `json:"outreach_status"`
|
|
|
|
|
|
DraftText string `json:"draft_text,optional"`
|
|
|
|
|
|
Score int `json:"score"`
|
|
|
|
|
|
MatchedProductId string `json:"matched_product_id,optional"`
|
|
|
|
|
|
MatchedProductLabel string `json:"matched_product_label,optional"`
|
|
|
|
|
|
MatchReason string `json:"match_reason,optional"`
|
|
|
|
|
|
ScoutMode string `json:"scout_mode,optional"`
|
|
|
|
|
|
IntentSnippet string `json:"intent_snippet,optional"`
|
|
|
|
|
|
ThemeKey string `json:"theme_key,optional"`
|
|
|
|
|
|
ThemeLabel string `json:"theme_label,optional"`
|
|
|
|
|
|
ScanPath string `json:"scan_path,optional"`
|
2026-07-13 08:59:13 +00:00
|
|
|
|
Classification string `json:"classification,optional"`
|
|
|
|
|
|
Permalink string `json:"permalink,optional"`
|
2026-07-13 01:15:30 +00:00
|
|
|
|
CreatedAt int64 `json:"created_at"`
|
|
|
|
|
|
}
|
|
|
|
|
|
ScoutPostListData {
|
|
|
|
|
|
List []ScoutPostPublic `json:"list"`
|
|
|
|
|
|
}
|
|
|
|
|
|
ScoutPostListReq {
|
|
|
|
|
|
BrandId string `form:"brand_id,optional"`
|
|
|
|
|
|
}
|
|
|
|
|
|
ScoutPostIdPath {
|
|
|
|
|
|
Id string `path:"id"`
|
|
|
|
|
|
}
|
|
|
|
|
|
ScoutDraftPathReq {
|
|
|
|
|
|
Id string `path:"id"`
|
|
|
|
|
|
PersonaId string `json:"persona_id,optional"`
|
|
|
|
|
|
}
|
|
|
|
|
|
ScoutSendPathReq {
|
|
|
|
|
|
Id string `path:"id"`
|
|
|
|
|
|
Text string `json:"text,optional"`
|
|
|
|
|
|
AccountId string `json:"account_id,optional"`
|
|
|
|
|
|
}
|
|
|
|
|
|
ScoutThemePath {
|
|
|
|
|
|
ThemeKey string `path:"themeKey"`
|
|
|
|
|
|
}
|
|
|
|
|
|
ScoutHomeworkPublic {
|
|
|
|
|
|
ThemeKey string `json:"theme_key"`
|
|
|
|
|
|
ThemeLabel string `json:"theme_label"`
|
|
|
|
|
|
Purpose string `json:"purpose"`
|
|
|
|
|
|
Brief ScoutBriefPublic `json:"brief"`
|
|
|
|
|
|
CreatedAt int64 `json:"created_at"`
|
|
|
|
|
|
}
|
|
|
|
|
|
ScoutHomeworkListData {
|
|
|
|
|
|
List []ScoutHomeworkPublic `json:"list"`
|
|
|
|
|
|
}
|
|
|
|
|
|
ScoutHomeworkSaveReq {
|
|
|
|
|
|
ThemeKey string `json:"theme_key"`
|
|
|
|
|
|
ThemeLabel string `json:"theme_label"`
|
|
|
|
|
|
Purpose string `json:"purpose,optional"`
|
|
|
|
|
|
Brief ScoutBriefPublic `json:"brief"`
|
|
|
|
|
|
}
|
|
|
|
|
|
ScoutCrawlerSessionReq {
|
|
|
|
|
|
Token string `json:"token"`
|
|
|
|
|
|
}
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
@server (
|
|
|
|
|
|
jwt: Auth
|
|
|
|
|
|
group: inspire
|
|
|
|
|
|
prefix: /api/v1/inspire
|
|
|
|
|
|
middleware: AuthJWT
|
|
|
|
|
|
)
|
|
|
|
|
|
service gateway {
|
|
|
|
|
|
@handler ListTrends
|
|
|
|
|
|
get /trends returns (TrendListData)
|
|
|
|
|
|
|
|
|
|
|
|
@handler RefreshTrends
|
|
|
|
|
|
post /trends/refresh returns (TrendListData)
|
|
|
|
|
|
|
|
|
|
|
|
@handler ListInspireElements
|
|
|
|
|
|
get /elements returns (InspireElementListData)
|
|
|
|
|
|
|
|
|
|
|
|
@handler SaveInspireElement
|
|
|
|
|
|
post /elements (InspireElementSaveReq) returns (InspireElementPublic)
|
|
|
|
|
|
|
|
|
|
|
|
@handler RemoveInspireElement
|
|
|
|
|
|
delete /elements/:id (InspireElementIdPath) returns (OkData)
|
|
|
|
|
|
|
|
|
|
|
|
@handler GetInspireSession
|
|
|
|
|
|
get /session returns (InspireSessionPublic)
|
|
|
|
|
|
|
|
|
|
|
|
@handler ClearInspireSession
|
|
|
|
|
|
post /session/clear returns (InspireSessionPublic)
|
|
|
|
|
|
|
|
|
|
|
|
@handler ListInspireSessions
|
|
|
|
|
|
get /sessions returns (InspireSessionListData)
|
|
|
|
|
|
|
|
|
|
|
|
@handler CreateInspireSession
|
|
|
|
|
|
post /sessions (InspireSessionCreateReq) returns (InspireSessionPublic)
|
|
|
|
|
|
|
|
|
|
|
|
@handler GetInspireSessionById
|
|
|
|
|
|
get /sessions/:id (InspireSessionIdPath) returns (InspireSessionPublic)
|
|
|
|
|
|
|
|
|
|
|
|
@handler ActivateInspireSession
|
|
|
|
|
|
post /sessions/:id/activate (InspireSessionIdPath) returns (InspireSessionPublic)
|
|
|
|
|
|
|
|
|
|
|
|
@handler DeleteInspireSession
|
|
|
|
|
|
delete /sessions/:id (InspireSessionIdPath) returns (InspireSessionPublic)
|
|
|
|
|
|
|
|
|
|
|
|
@handler InspireChat
|
|
|
|
|
|
post /chat (InspireChatReq) returns (InspireChatData)
|
|
|
|
|
|
|
|
|
|
|
|
@handler InspirePromptPreview
|
|
|
|
|
|
post /prompt-preview (InspirePromptPreviewReq) returns (InspirePromptPreviewData)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@server (
|
|
|
|
|
|
jwt: Auth
|
|
|
|
|
|
group: research
|
|
|
|
|
|
prefix: /api/v1/research
|
|
|
|
|
|
middleware: AuthJWT
|
|
|
|
|
|
)
|
|
|
|
|
|
service gateway {
|
|
|
|
|
|
@handler ResearchSearch
|
|
|
|
|
|
post /search (ResearchSearchReq) returns (ResearchSearchData)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@server (
|
|
|
|
|
|
jwt: Auth
|
|
|
|
|
|
group: media
|
|
|
|
|
|
prefix: /api/v1/media
|
|
|
|
|
|
middleware: AuthJWT
|
|
|
|
|
|
)
|
|
|
|
|
|
service gateway {
|
|
|
|
|
|
@handler GenerateImage
|
|
|
|
|
|
post /generate-image (GenerateImageReq) returns (GenerateImageData)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@server (
|
|
|
|
|
|
jwt: Auth
|
|
|
|
|
|
group: scout
|
|
|
|
|
|
prefix: /api/v1/scout
|
|
|
|
|
|
middleware: AuthJWT
|
|
|
|
|
|
)
|
|
|
|
|
|
service gateway {
|
|
|
|
|
|
@handler ListBrands
|
|
|
|
|
|
get /brands returns (BrandListData)
|
|
|
|
|
|
|
|
|
|
|
|
@handler SaveBrand
|
|
|
|
|
|
post /brands (BrandSaveReq) returns (BrandPublic)
|
|
|
|
|
|
|
|
|
|
|
|
@handler GetBrand
|
|
|
|
|
|
get /brands/:id (BrandIdPath) returns (BrandPublic)
|
|
|
|
|
|
|
|
|
|
|
|
@handler RemoveBrand
|
|
|
|
|
|
delete /brands/:id (BrandIdPath) returns (OkData)
|
|
|
|
|
|
|
|
|
|
|
|
@handler GetActiveBrand
|
|
|
|
|
|
get /brands-active returns (BrandActiveData)
|
|
|
|
|
|
|
|
|
|
|
|
@handler SetActiveBrand
|
|
|
|
|
|
post /brands-active (BrandSetActiveReq) returns (BrandActiveData)
|
|
|
|
|
|
|
|
|
|
|
|
@handler ListProducts
|
|
|
|
|
|
get /products (ProductListReq) returns (ProductListData)
|
|
|
|
|
|
|
|
|
|
|
|
@handler ListAllProducts
|
|
|
|
|
|
get /products/all returns (ProductListData)
|
|
|
|
|
|
|
|
|
|
|
|
@handler SaveProduct
|
|
|
|
|
|
post /products (ProductSaveReq) returns (ProductPublic)
|
|
|
|
|
|
|
|
|
|
|
|
@handler GetProduct
|
|
|
|
|
|
get /products/:id (ProductIdPath) returns (ProductPublic)
|
|
|
|
|
|
|
|
|
|
|
|
@handler RemoveProduct
|
|
|
|
|
|
delete /products/:id (ProductIdPath) returns (OkData)
|
|
|
|
|
|
|
|
|
|
|
|
@handler ImportProduct
|
|
|
|
|
|
post /products/import (ImportProductReq) returns (ImportProductData)
|
|
|
|
|
|
|
|
|
|
|
|
@handler PrepareBrief
|
|
|
|
|
|
post /brief (ScoutBriefReq) returns (ScoutBriefPublic)
|
|
|
|
|
|
|
|
|
|
|
|
@handler RunScan
|
2026-07-13 08:59:13 +00:00
|
|
|
|
post /scan (ScoutScanReq) returns (ScoutScanJobData)
|
2026-07-13 01:15:30 +00:00
|
|
|
|
|
|
|
|
|
|
@handler ListScoutPosts
|
|
|
|
|
|
get /posts (ScoutPostListReq) returns (ScoutPostListData)
|
|
|
|
|
|
|
|
|
|
|
|
@handler DraftOutreach
|
|
|
|
|
|
post /posts/:id/draft (ScoutDraftPathReq) returns (ScoutPostPublic)
|
|
|
|
|
|
|
|
|
|
|
|
@handler SkipOutreach
|
|
|
|
|
|
post /posts/:id/skip (ScoutPostIdPath) returns (ScoutPostPublic)
|
|
|
|
|
|
|
|
|
|
|
|
@handler MarkPublished
|
|
|
|
|
|
post /posts/:id/mark-published (ScoutPostIdPath) returns (ScoutPostPublic)
|
|
|
|
|
|
|
|
|
|
|
|
@handler SendOutreach
|
|
|
|
|
|
post /posts/:id/send (ScoutSendPathReq) returns (ScoutPostPublic)
|
|
|
|
|
|
|
|
|
|
|
|
@handler RemoveScoutPost
|
|
|
|
|
|
delete /posts/:id (ScoutPostIdPath) returns (OkData)
|
|
|
|
|
|
|
|
|
|
|
|
@handler RemoveScoutTheme
|
|
|
|
|
|
delete /themes/:themeKey (ScoutThemePath) returns (OkData)
|
|
|
|
|
|
|
|
|
|
|
|
@handler ListHomework
|
|
|
|
|
|
get /homework returns (ScoutHomeworkListData)
|
|
|
|
|
|
|
|
|
|
|
|
@handler SaveHomework
|
|
|
|
|
|
post /homework (ScoutHomeworkSaveReq) returns (ScoutHomeworkPublic)
|
|
|
|
|
|
|
|
|
|
|
|
@handler GetHomework
|
|
|
|
|
|
get /homework/:themeKey (ScoutThemePath) returns (ScoutHomeworkPublic)
|
|
|
|
|
|
|
|
|
|
|
|
@handler RemoveHomework
|
|
|
|
|
|
delete /homework/:themeKey (ScoutThemePath) returns (OkData)
|
|
|
|
|
|
|
|
|
|
|
|
@handler SetCrawlerSession
|
|
|
|
|
|
post /crawler-session (ScoutCrawlerSessionReq) returns (OkData)
|
|
|
|
|
|
|
|
|
|
|
|
@handler ClearCrawlerSession
|
|
|
|
|
|
delete /crawler-session returns (OkData)
|
|
|
|
|
|
}
|