# Slug Resolve Endpoint Resolves a URL slug to an entity (Channel, Content, or Video) and returns its data. ## Endpoint ``` GET /client/v1/slugs/{slug} GET /mobile/v1/slugs/{slug} ``` ## Usage in Next.js In your catch-all route `app/[...slug]/page.tsx`, take the full path and pass it to the endpoint: ```tsx // app/[...slug]/page.tsx const fullSlug = params.slug.join("/"); const res = await fetch(`${API_URL}/client/v1/slugs/${fullSlug}`); const { entityType, data } = await res.json(); ``` ## Slug Parsing Rules The API parses nested slugs automatically. It takes the **last non-reserved segment** from the path. **Reserved keywords** (ignored during resolution): - `per-shfaqjen` - `sezoni-{number}` (e.g. `sezoni-1`, `sezoni-2`) | URL Path | Resolved Slug | |---|---| | `/rrushe` | `rrushe` | | `/rrushe/rrushe-sezoni-1` | `rrushe-sezoni-1` | | `/rrushe/sezoni-2` | `rrushe` | | `/rrushe/per-shfaqjen` | `rrushe` | | `/rrushe/rrushe-sezoni-1/per-shfaqjen` | `rrushe-sezoni-1` | ## Response ```json { "entityType": 1, "data": { ... } } ``` ### Entity Types | Value | Type | |---|---| | 1 | Channel | | 2 | Content | | 3 | Video | ### Response per Entity Type **Channel (entityType: 1)** ```json { "entityType": 1, "data": { "id": "abc123", "name": "Channel Name", "handle": "channel-handle", "about": "...", "image": "...", "banner": "...", "mobileBanner": "...", "link": "/channel-handle", "status": 1, "metrics": { "subscribers": 100, "videos": 50 }, "isPremium": false, "payToViewConfig": null } } ``` **Content (entityType: 2)** ```json { "entityType": 2, "data": { "id": "xyz789", "title": "Movie Title", "description": "...", "handle": "movie-title", "type": 1, "releaseDate": "2026-01-15T00:00:00", "thumbnail": "...", "banner": "...", "landscapeBanner": "...", "mobileBanner": "...", "videos": [ { "videoId": "vid123", "type": 1, "name": "Main Video", "thumbnail": "..." } ] } } ``` Content `type` values: `1` = Movie, `2` = Series, `3` = Season, `5` = Match, `6` = Playlist **Video (entityType: 3)** ```json { "entityType": 3, "data": { "id": "vid123", "name": "Video Title", "shortDescription": "...", "thumbnail": "...", "duration": 3600, "type": 0, "status": 0, "channel": { "id": "abc123", "name": "Channel Name", "handle": "channel-handle", "image": "..." }, "metrics": { "views": 1000, "likes": 50 }, "playerConfig": { ... } } } ``` ## Error Responses **404 - Slug not found** ```json { "message": "Slug 'unknown-slug' not found", "entity": "slug" } ``` ## Front-end Example ```tsx // app/[...slug]/page.tsx import { notFound } from "next/navigation"; enum EntityType { Channel = 1, Content = 2, Video = 3, } export default async function SlugPage({ params }: { params: { slug: string[] } }) { const fullSlug = params.slug.join("/"); const res = await fetch(`${process.env.API_URL}/client/v1/slugs/${fullSlug}`); if (!res.ok) return notFound(); const { entityType, data } = await res.json(); switch (entityType) { case EntityType.Channel: return ; case EntityType.Content: return ; case EntityType.Video: return ; default: return notFound(); } } ```