Download OpenAPI specification:
AI-powered service for post summarization, tag suggestions, and daily digest generation. Daily digest generation is asynchronous: internal callers submit a job, poll its status, and persist the final digest when the job succeeds.
Accepts post content and an optional post title, then returns exactly three concise bullet summaries generated by the configured LLM. This endpoint is called by the Content Service when a user requests summary generation for a post.
| postId required | string ID of the post being summarized. |
| content required | string [ 50 .. 50000 ] characters Full post content to summarize. |
| title | string or null <= 300 characters Optional post title for additional context. |
{- "postId": "123e4567-e89b-12d3-a456-426614174000",
- "title": "GPT-5 Released: First Impressions and Benchmarks",
- "content": "OpenAI just released GPT-5 with significant improvements in reasoning, code generation, and multimodal understanding. The model shows 40% improvement on HumanEval benchmarks and introduces a new thinking mode that makes its reasoning process transparent. Early benchmarks suggest it outperforms Claude and Gemini on most coding tasks, though it struggles with very long context windows. Pricing is set at $10/1M input tokens."
}{- "postId": "123e4567-e89b-12d3-a456-426614174000",
- "summary": [
- "GPT-5 introduces improved reasoning, code generation, and multimodal understanding for AI practitioners.",
- "Early benchmarks show stronger coding performance, though long-context behavior remains a limitation.",
- "Premium pricing positions the model as a higher-cost option for production LLM workloads."
], - "model": "gemini-2.0-flash",
- "usage": {
- "input_tokens": 0,
- "output_tokens": 0,
- "total_tokens": 0
}
}Creates an asynchronous in-memory job that generates a personalized text digest for the supplied topics and one-day period. The caller does not provide source items. GenAI fetches external sources internally from the MVP provider set: GitHub, GNews, and Hugging Face models/datasets.
The endpoint returns 202 Accepted because digest generation continues
after the HTTP response. The caller must poll statusUrl until the job is
SUCCEEDED or FAILED, then persist the result outside GenAI.
MVP limitations: job state is in-memory, lost on restart, and local to one GenAI service instance. Redis/Postgres or a queue-backed worker should replace this for production.
| requestId | string <= 120 characters Optional caller correlation ID. Echoed in job responses, but not treated as an idempotency key. |
| userId | string <uuid> Optional user receiving the personalized digest. The caller owns durable user-to-digest mapping. |
| digestDate required | string <date> Calendar date represented by the digest in the requested timezone. |
| periodStart required | string <date-time> Inclusive start of the one-day content window. |
| periodEnd required | string <date-time> Exclusive end of the one-day content window. Must be after periodStart and no more than 24 hours later. |
| timezone required | string IANA timezone used to interpret digestDate and the one-day window. |
required | Array of objects (DigestTopic) [ 1 .. 50 ] items Topics the user is subscribed to, supplied by the internal caller. |
| maxSourcesPerTopic | integer [ 1 .. 20 ] Default: 5 Optional final selected source limit per topic across all internal providers. |
| maxEvents | integer [ 1 .. 20 ] Default: 8 Optional maximum number of digest events to return. |
| tone | string Default: "technical" Enum: "concise" "technical" "executive" Optional writing style for the generated digest text. |
{- "requestId": "recommendation-2026-06-04-user-123",
- "userId": "123e4567-e89b-12d3-a456-426614174000",
- "digestDate": "2026-06-04",
- "periodStart": "2026-06-03T00:00:00Z",
- "periodEnd": "2026-06-04T00:00:00Z",
- "timezone": "Europe/Berlin",
- "topics": [
- {
- "id": "7f7d0f5a-9f75-4971-9624-89a01c3439d6",
- "name": "LLMs"
}, - {
- "id": "1ff86b78-d1ef-4fb2-8eec-4f8931f22f1a",
- "name": "AI Agents"
}
], - "maxSourcesPerTopic": 5,
- "maxEvents": 8,
- "tone": "technical"
}{- "jobId": "9d222c6d-893e-4e79-8201-3c9ca16a0f39",
- "status": "QUEUED",
- "statusUrl": "/api/v1/genai/digests/jobs/8df7f6e0-6c3f-4b82-8d90-7d3d5b8dc8e8",
- "requestId": "string",
- "userId": "2c4a230c-5085-4924-a3e1-25fb4fc5965b",
- "submittedAt": "2019-08-24T14:15:22Z"
}Returns the current state of an asynchronous digest generation job. When
the job status is SUCCEEDED, the response includes the generated digest
result. When the job status is FAILED, the response includes an error;
LLM provider failures are represented here with error.code = llm_error
instead of an immediate 502 from the job creation endpoint.
| jobId required | string <uuid> |
{- "jobId": "9d222c6d-893e-4e79-8201-3c9ca16a0f39",
- "status": "QUEUED",
- "requestId": "string",
- "userId": "2c4a230c-5085-4924-a3e1-25fb4fc5965b",
- "submittedAt": "2019-08-24T14:15:22Z",
- "startedAt": "2019-08-24T14:15:22Z",
- "completedAt": "2019-08-24T14:15:22Z",
- "warnings": [
- {
- "provider": "github",
- "topicId": "97b608a9-302e-4387-a5f4-fd35969cdc21",
- "code": "missing_credentials",
- "message": "string"
}
], - "result": {
- "digestDate": "2019-08-24",
- "periodStart": "2019-08-24T14:15:22Z",
- "periodEnd": "2019-08-24T14:15:22Z",
- "topStorySubtitle": "string",
- "summary": "string",
- "topics": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string"
}
], - "events": [
- {
- "headline": "string",
- "summaryBullets": [
- "string"
], - "topicIds": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "sources": [
- {
- "sourceName": "string",
- "provider": "string",
- "publishedAt": "2019-08-24T14:15:22Z",
- "title": "string"
}
]
}
], - "eventCount": 0,
- "sourceCount": 0,
- "readTimeMinutes": 1,
- "generatedAt": "2019-08-24T14:15:22Z",
- "model": "string",
- "usage": {
- "input_tokens": 0,
- "output_tokens": 0,
- "total_tokens": 0
}
}, - "error": {
- "code": "no_sources_found",
- "message": "string",
- "details": "string"
}
}