Download OpenAPI specification:
Discovery and signaling layer for the Verita platform. Handles personalized and trending feeds, user/topic subscriptions, notifications, and behavioral interaction tracking for the recommendation engine.
Feed endpoints return a postIds list. The frontend fetches card data by
calling GET /api/v1/posts/cards?ids=... in content-service.
Internal endpoint called by user-service during account deletion. Removes user-owned recommendation, subscription, notification, and interaction data. The operation is idempotent.
| userId required | string <uuid> |
{- "timestamp": "2019-08-24T14:15:22Z",
- "status": 0,
- "error": "string",
- "message": "string"
}Internal endpoint called by content-service's scheduled digest job. Returns topic IDs subscribed by the requested user. Gated by X-Internal-Service-Token (ADR-0007), not a user JWT.
| userId required | string <uuid> |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08"
}
]Internal endpoint called by content-service's daily digest job to seed the public digest (ADR-0018/0019). Returns the most-subscribed topic IDs across the platform, most popular first. Gated by X-Internal-Service-Token (ADR-0007), not a user JWT.
| limit | integer [ 1 .. 50 ] Default: 8 |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08"
}
]Returns posts ranked by the personalization algorithm based on the user's topic subscriptions and behavioral history. Topic filter is intentionally absent — the personal feed is already scoped to subscribed topics.
Uses cursor-based pagination for stable infinite scroll: pass the nextCursor
from the previous response to load the next batch. Omit cursor for the first request.
| cursor | string Opaque cursor from the previous response. Omit for the first page. |
| size | integer [ 1 .. 50 ] Default: 20 |
{- "postIds": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "nextCursor": "string"
}Returns posts ranked by engagement score (likes, comments, views, recency).
Supply topic to browse trending posts within a topic — this is the ranked
alternative to GET /api/v1/posts?topic= in content-service.
Authenticated requests populate isLikedByMe; unauthenticated requests return false.
Uses cursor-based pagination for stable infinite scroll: pass the nextCursor
from the previous response to load the next batch. Omit cursor for the first request.
| topic | string Example: topic=LLMs Filter by topic name (case-insensitive). |
| cursor | string Opaque cursor from the previous response. Omit for the first page. |
| size | integer [ 1 .. 50 ] Default: 20 |
{- "postIds": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "nextCursor": "string"
}| unreadOnly | boolean Default: false |
| page | integer >= 0 Default: 0 |
| size | integer [ 1 .. 50 ] Default: 20 |
{- "content": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "type": "COMMENT",
- "content": "Chris Olah liked your post",
- "relatedPostId": "b975f99f-96d5-46f6-98a3-eb8a7c5e632a",
- "isRead": true,
- "createdAt": "2019-08-24T14:15:22Z"
}
], - "page": 0,
- "size": 0,
- "totalPages": 0,
- "totalElements": 0,
- "hasNext": true
}Records implicit behavioral signals (dwell, scroll, clicks, shares) for the
personalization model. Populate durationSeconds for DWELL events and
scrollDepth (0–100) for SCROLL events.
| postId required | string <uuid> |
| interactionType required | string Enum: "CLICK" "VIEW" "DWELL" "SCROLL" "SHARE" |
| durationSeconds | integer or null >= 0 Seconds in viewport. Relevant for DWELL events. |
| scrollDepth | integer or null [ 0 .. 100 ] Scroll percentage reached (0–100). Relevant for SCROLL events. |
object or null |
{- "postId": "1d33c5d7-f0cb-41cc-a647-907f16832fc3",
- "interactionType": "CLICK",
- "durationSeconds": 0,
- "scrollDepth": 100,
- "metadata": { }
}{- "timestamp": "2019-08-24T14:15:22Z",
- "status": 0,
- "error": "string",
- "message": "string"
}