Summary
The catalogue now carries, per show and per language, a transparent title logo (logoTitle), two landscape pictures (artwork.landscape with the logo burned in, artwork.landscape_no_logo without it), and, on What's New items, the show's cover (seriesImage) and a hasTrailer flag. The TV app uses them as follows:
- The hero of every VOD page shows the title logo instead of the text title when the show has one for the current language. Without a logo, the text title is set in a heavy, logo-like style.
- Cards show the picture with the logo; the hero background shows the clean picture without it.
- What's New episode items show the show's cover on the card and the episode frame in the hero, carry the show's logo, and do not show the genre / year line. What's New movies keep it.
- Trailers are requested only when the item says
hasTrailer: true. - No extra requests: everything above comes from the list and What's New answers the apps already make.
API fields
Base: https://apps-api.ipt.to. Catalogue calls send locale and no session id.
| Endpoint | Fields used |
|---|---|
GET /v2/vod/categories/main?locale=he|en | Root tabs (series, movies, telenovelas, docu, kids). |
GET /v2/vod/categories/{id}/list?locale=&page=&size= |
results.items[] (child categories = shows): logoTitle, artwork.landscape, artwork.landscape_no_logo, artwork.portrait, showpic, hasTrailer, name, genre, year, description.results.category (the requested show itself): the same fields, used by the series page. |
GET /v2/vod/categories/{id}/vods?locale=&page=&size= | Movies and episodes: showpic, hasTrailer, logoTitle when present. As of 22 Oct 2026 movie items do not carry artwork yet; the app falls back to showpic for both card and hero until they do. |
GET /v2/vod/categories/{mainId}/vods/new?locale=&upper=1&size=25 | What's New. Each item has vod, category (the season) and upper[] (main → broadcaster → show → season, ids and names). On vod: seriesImage, logoTitle, hasTrailer, showpic (episode frame), type (episode or vod). |
GET /v2/play/trailer/{series|movie}/{id}?sid= | Trailer stream. Needs a session. Answer: { error: 0, streams: [url, …] }; play streams[0]. |
Field reference
| Field | Value | Use |
|---|---|---|
logoTitle | Absolute URL of a transparent PNG, or null | Title logo in the hero's title slot |
artwork.landscape | Absolute URL (JPG) or null | Card picture (logo burned in) |
artwork.landscape_no_logo | Absolute URL or null | Hero background behind the focused item; series page background |
artwork.portrait | Absolute URL or null | Not used by the TV app yet |
showpic | Protocol-relative URL (//images.peer5.net/…) | Fallback for card and hero; the episode frame in What's New |
seriesImage | Absolute URL | What's New episode card (the show's cover) |
hasTrailer | true / false | Whether to request a trailer at all |
// gets https: in front; a value starting with http is used as is; anything else is appended to the API base. Card copies are resized by the CDN with ?s=480 (poster and programme paths only); hero and logo images are loaded at full size.Language
The API localises logoTitle. With locale=he it returns the Hebrew logo; with locale=en it returns the English logo only when one exists, otherwise null. The apps therefore never choose a logo themselves: request the catalogue in the UI's language and use what comes back. A Hebrew logo must not appear in the English UI; when logoTitle is null, show the text title.
Any cache of catalogue data that includes logos must be keyed by language as well as by id.
Card and hero images
The rule in words: every show has two landscape pictures. The one with the logo burned in (artwork.landscape) is for the card in a row, where there is no room for a separate title. The one without the logo (artwork.landscape_no_logo) is for the hero behind the focused show and for the series page background, because there the title is drawn separately, as the logoTitle image or as text, and a second logo inside the picture would double it.
Fallbacks, in order, when a field is missing or null:
- Card:
artwork.landscape→showpic(the picture the catalogue always had). - Hero:
artwork.landscape_no_logo→artwork.landscape→showpic. A show without the clean picture simply shows its card picture in the hero, as before. - Title:
logoTitle→ the text title in the logo style (see Text fallback).
Nothing is left empty: the pre-existing showpic is always the last fallback for both pictures, so a show with none of the new fields looks exactly as it did before.
| Item | Card | Hero / background |
|---|---|---|
| Series (category item) | artwork.landscape, else showpic | artwork.landscape_no_logo, else the card picture |
| Movie (vod item) | artwork.landscape, else showpic | artwork.landscape_no_logo, else the card picture |
| What's New episode | seriesImage (the show's cover), else the episode showpic | The episode showpic (episode frame) |
| What's New movie | showpic | showpic |
| Series page background | — | category.artwork.landscape_no_logo, else category.showpic |
What's New row
- Title: the show's name, from
upper[upper.length − 2](the show); the episode's own name is shown as a second line under it. - Logo:
vod.logoTitle(the show's logo for the current language). - Genre / year line: hidden for episode items (
vod.type === "episode"). Shown for movie items. - Trailer: only when
vod.hasTrailer === true, called with the show id (upper[upper.length − 2].id) and typeseries; movies use their own id and typemovie. - No per-show requests: the row is built from the single What's New answer.
Title slot
The hero reserves a fixed box at the top for the title, so the rows below start at the same height for every show, whatever the logo's shape.
| Property | Value (fraction of screen) | At 1920 × 1080 |
|---|---|---|
| Box height | 17.5 % of screen height | 189 px |
| Box width | Hero text width, 36.5 % of screen width | 700 px |
| Alignment | Contents at the bottom of the box, on the start side (left in LTR, right in RTL) | — |
| Headroom under the logo | 1.6 % of screen height between the logo (or text title) and the next row, the same gap the text blocks keep | 17 px |
| Below the box | Episode title (What's New), genre | year, description (3 lines), duration | — |
| Logo shadow | drop-shadow(0 0.2vh 0.6vh rgba(0,0,0,0.6)) | — |
Logo sizing formula
The logos come in every shape, from portrait 0.44:1 to 13:1. Scaling them to fit a box makes wide logos enormous and tall ones tiny, so each logo is sized by its visual area and then capped. All lengths below are fractions of the screen width W, which keeps the result identical on every 16:9 screen.
// natural size of the PNG: naturalW × naturalH
r = naturalW / naturalH // aspect ratio (default 2 when unknown)
AREA = 0.0114 · W² // target visual area (42 000 px² at 1920)
H_MAX = 0.088 · W // tallest allowed (169 px at 1920)
W_MAX = 0.29 · W // widest allowed (557 px at 1920)
H_MIN = 0.049 · W // shortest, if width allows (94 px at 1920)
h = sqrt(AREA / r)
h = min(h, H_MAX, W_MAX / r) // caps
h = max(h, min(H_MIN, W_MAX / r)) // floor, unless the width cap forbids it
w = h · r
render the PNG at w × h (object-fit: contain), anchored bottom / start of the slot
Results at 1920 × 1080, measured over the catalogue:
| Logo shape | Example | Rendered size |
|---|---|---|
| Portrait (0.6:1) | אתה חייב לקרוא את זה | 101 × 169 px |
| Square (1:1) | המטבח המנצח | 169 × 169 px |
| Wide (2–3:1) | דה וויס, הכוורת | 290–350 × 120–145 px |
| Very wide (3.5–6:1) | ערב טוב עם גיא פינס | 385–400 × 100–110 px |
Text fallback (no logo)
When logoTitle is null the title is set as text in the same slot. Keep the font and size your app already uses for the title — there is no need to change them. The only requirements are that the text sits in the title slot (bottom of the box, start side, same headroom) and keeps the fallback image rules above.
For reference only, this is how the trial build styles it (not required):
| Property | Value |
|---|---|
| Font | Rubik Bold (covers Hebrew and Latin), fallback Noto Sans Hebrew / Roboto Bold |
| Size | 3.4 % of screen width (65 px at 1920), line height 1.05, letter spacing −0.01 em |
| Case | Uppercase for Latin text (no effect on Hebrew) |
| Weight effects | Text stroke 0.05 % of screen width, shadow 0 0.3vh 0.9vh rgba(0,0,0,.75) + 0 0 2vh rgba(0,0,0,.35) |
| Lines | Up to 3 across the full hero width, then an ellipsis |
Trailers
- Request a trailer only when the item's
hasTraileristrue. Never call the endpoint blindly. - The TV app fetches the trailer URL 0.5 s after a card gets focus and starts playback 3 s after focus; moving the focus before that cancels the request.
- Endpoint:
GET /v2/play/trailer/{series|movie}/{id}?sid=…→streams[0]. The call needs a session; it is a play call, so no bursts.
Series page
- Title:
category.logoTitlefromGET /v2/vod/categories/{seriesId}/list, rendered in a box 8 % of the screen height by 20 % of the screen width, centred,object-fit: contain. Without a logo, the text title as before. - Background: always prefer the clean picture,
category.artwork.landscape_no_logo, when the show has one; fall back tocategory.artwork.landscape, thencategory.showpic.
Implementation checklist
Catalogue
Read logoTitle, artwork.*, hasTrailer on list items and on results.category. Request in the UI language. Cache per language.
Pictures
Card = artwork.landscape → showpic. Hero = artwork.landscape_no_logo → card picture.
What's New
Card = seriesImage; hero = episode frame; title = show name + episode name; logo = vod.logoTitle; no genre / year for episodes; trailer only if hasTrailer.
Title slot
Fixed box, contents bottom / start aligned; logo sized by the area formula with caps; text fallback in the logo style.