Download OpenAPI specification:Download
HTTP API for the PinePods podcast server. Most endpoints require an Api-Key header tied to a user account; admin-only endpoints additionally require an admin (or web) key. This reference is generated directly from the backend source, so it stays in sync with the running code.
| state required | string |
| client_id required | string |
| origin_url | string or null |
| code_verifier | string or null |
| redirect_uri | string or null |
{- "state": "string",
- "client_id": "string",
- "origin_url": "string",
- "code_verifier": "string",
- "redirect_uri": "string"
}null| username required | string |
| password required | string |
| email required | string |
| fullname required | string |
{- "username": "string",
- "password": "string",
- "email": "string",
- "fullname": "string"
}{- "message": "string",
- "user_id": 0
}{- "providers": [
- {
- "provider_id": 0,
- "provider_name": "string",
- "client_id": "string",
- "authorization_url": "string",
- "scope": "string",
- "button_color": "string",
- "button_text": "string",
- "button_text_color": "string",
- "icon_svg": "string"
}
], - "disable_standard_login": true
}| user_id required | integer <int32> |
| timezone required | string |
| hour_pref required | integer <int32> |
| date_format required | string |
{- "user_id": 0,
- "timezone": "string",
- "hour_pref": 0,
- "date_format": "string"
}null| reset_code required | string |
| email required | string |
| new_password required | string |
{- "reset_code": "string",
- "email": "string",
- "new_password": "string"
}{- "message": "string"
}| mfa_session_token required | string |
| mfa_code required | string |
{- "mfa_session_token": "string",
- "mfa_code": "string"
}{- "status": "string",
- "retrieved_key": "string",
- "verified": true
}required | object (PodcastValues) |
| podcast_index_id | integer or null <int64> |
{- "podcast_values": {
- "pod_title": "string",
- "pod_artwork": "string",
- "pod_author": "string",
- "categories": {
- "property1": "string",
- "property2": "string"
}, - "pod_description": "string",
- "pod_episode_count": 0,
- "pod_feed_url": "string",
- "pod_website": "string",
- "pod_explicit": true,
- "user_id": 0
}, - "podcast_index_id": 0
}{- "success": true,
- "podcast_id": 0,
- "first_episode_id": 0
}| episode_id required | integer <int32> |
| user_id required | integer <int32> |
| is_youtube | boolean or null |
{- "episode_id": 0,
- "user_id": 0,
- "is_youtube": true
}null| podcast_id required | integer <int32> |
| user_id required | integer <int32> |
| is_youtube | boolean or null |
{- "podcast_id": 0,
- "user_id": 0,
- "is_youtube": true
}null| user_id required | integer <int32> |
{- "downloaded_episodes": [
- {
- "podcastid": 0,
- "podcastname": "string",
- "artworkurl": "string",
- "episodeid": 0,
- "episodetitle": "string",
- "episodepubdate": "string",
- "episodedescription": "string",
- "episodeartwork": "string",
- "episodeurl": "string",
- "episodeduration": 0,
- "podcastindexid": 0,
- "websiteurl": "string",
- "downloadedlocation": "string",
- "listenduration": 0,
- "completed": true,
- "saved": true,
- "queued": true,
- "downloaded": true,
- "is_youtube": true,
- "is_video": true
}
]
}| episode_id required | integer <int32> |
| user_id required | integer <int32> |
| is_youtube | boolean or null |
{- "episode_id": 0,
- "user_id": 0,
- "is_youtube": true
}nullThe caller's podcasts whose last refresh failed (with the kind of error) and feeds a sync app subscribed to that couldn't be added.
{- "feeds": [
- {
- "podcast_id": 0,
- "name": "string",
- "feed_url": "string",
- "artwork": "string",
- "kind": "gone",
- "error": "string",
- "failures": 0,
- "failing_since": 0,
- "last_attempt": 0,
- "reported": true
}
], - "imports": [
- {
- "id": 0,
- "feed_url": "string",
- "source": "string",
- "kind": "gone",
- "error": "string",
- "attempts": 0,
- "first_failed_at": 0,
- "last_attempt_at": 0,
- "next_attempt_at": 0
}
]
}Forgets the failed import and records an unsubscribe, so sync apps and the external sync server drop the feed too.
| id required | integer <int32> |
{- "success": true
}Refreshes one of the caller's podcasts straight away and returns its state afterwards: absent from feeds when it worked.
| podcast_id required | integer <int32> |
{- "feeds": [
- {
- "podcast_id": 0,
- "name": "string",
- "feed_url": "string",
- "artwork": "string",
- "kind": "gone",
- "error": "string",
- "failures": 0,
- "failing_since": 0,
- "last_attempt": 0,
- "reported": true
}
], - "imports": [
- {
- "id": 0,
- "feed_url": "string",
- "source": "string",
- "kind": "gone",
- "error": "string",
- "attempts": 0,
- "first_failed_at": 0,
- "last_attempt_at": 0,
- "next_attempt_at": 0
}
]
}| user_id required | integer <int32> |
| podcast_id | integer or null <int32> |
{- "user_id": 0,
- "podcast_id": 0
}null| podcast_id required | integer <int32> |
| user_id required | integer <int32> |
{- "podcast_id": 0,
- "user_id": 0
}{- "auto_download": true
}| podcast_id required | integer <int32> |
| user_id required | integer <int32> |
{- "podcast_id": 0,
- "user_id": 0
}{- "auto_play_next": true
}| podcast_id required | integer <int32> |
| user_id required | integer <int32> |
{- "podcast_id": 0,
- "user_id": 0
}{- "auto_queue": true
}| episode_id required | integer <int32> |
| user_id required | integer <int32> |
| person_episode | boolean or null |
| is_youtube | boolean or null |
{- "episode_id": 0,
- "user_id": 0,
- "person_episode": true,
- "is_youtube": true
}null| episode_id required | integer <int32> |
| playlist_id required | integer <int32> |
| user_id required | integer <int32> |
{- "episode_id": 0,
- "playlist_id": 0,
- "user_id": 0
}{- "episodetitle": "string",
- "podcastname": "string",
- "podcastid": 0,
- "episodepubdate": "string",
- "episodedescription": "string",
- "episodeartwork": "string",
- "episodeurl": "string",
- "queueposition": 0,
- "episodeduration": 0,
- "queuedate": "string",
- "listenduration": 0,
- "episodeid": 0,
- "completed": true,
- "saved": true,
- "queued": true,
- "downloaded": true,
- "is_youtube": true,
- "is_video": true
}| episode_id required | integer <int32> |
| user_id required | integer <int32> |
{- "episode_id": 0,
- "user_id": 0
}{- "episodetitle": "string",
- "podcastname": "string",
- "podcastid": 0,
- "episodepubdate": "string",
- "episodedescription": "string",
- "episodeartwork": "string",
- "episodeurl": "string",
- "queueposition": 0,
- "episodeduration": 0,
- "queuedate": "string",
- "listenduration": 0,
- "episodeid": 0,
- "completed": true,
- "saved": true,
- "queued": true,
- "downloaded": true,
- "is_youtube": true,
- "is_video": true
}| podcast_id required | integer <int32> |
| user_id required | integer <int32> |
| is_youtube | boolean or null |
{- "podcast_id": 0,
- "user_id": 0,
- "is_youtube": true
}{- "playback_speed": 0.1,
- "start_skip": 0,
- "end_skip": 0,
- "playback_speed_customized": true
}| user_id required | integer <int32> |
| podcast_title required | string |
| podcast_url required | string |
| podcast_index_id required | integer <int32> |
| added required | boolean |
| display_only | boolean or null |
{- "podcastid": 0,
- "podcastname": "string",
- "feedurl": "string",
- "description": "string",
- "author": "string",
- "artworkurl": "string",
- "explicit": true,
- "episodecount": 0,
- "categories": null,
- "websiteurl": "string",
- "podcastindexid": 0,
- "is_youtube": true
}{- "data": [
- {
- "episodetitle": "string",
- "podcastname": "string",
- "podcastid": 0,
- "episodepubdate": "string",
- "episodedescription": "string",
- "episodeartwork": "string",
- "episodeurl": "string",
- "queueposition": 0,
- "episodeduration": 0,
- "queuedate": "string",
- "listenduration": 0,
- "episodeid": 0,
- "completed": true,
- "saved": true,
- "queued": true,
- "downloaded": true,
- "is_youtube": true,
- "is_video": true
}
]
}| episode_id required | integer <int32> |
| user_id required | integer <int32> |
| is_youtube | boolean or null |
{- "episode_id": 0,
- "user_id": 0,
- "is_youtube": true
}null| episode_id required | integer <int32> |
| user_id required | integer <int32> |
| is_youtube | boolean |
{- "episode_id": 0,
- "user_id": 0,
- "is_youtube": true
}null| user_id required | integer <int32> |
| podcast_id required | integer <int32> |
{- "user_id": 0,
- "podcast_id": 0
}{- "is_favorite": true
}| user_id required | integer <int32> |
| podcast_id required | integer <int32> |
{- "user_id": 0,
- "podcast_id": 0
}{- "enabled": true
}| user_id required | integer <int32> |
| limit | integer or null <int64> |
| offset | integer or null <int64> |
| sort_by | string or null |
| sort_order | string or null |
| filter | string or null |
| search | string or null |
{- "podcasts": [
- {
- "podcastid": 0,
- "podcastname": "string",
- "artworkurl": "string",
- "episode_count": 0
}
]
}| user_id required | integer <int32> |
| podcast_id required | integer <int32> |
| limit | integer or null <int64> |
| offset | integer or null <int64> |
| sort_by | string or null |
| sort_order | string or null |
| filter | string or null |
| search | string or null |
{- "episodes": [
- {
- "podcastid": 0,
- "podcastname": "string",
- "artworkurl": "string",
- "episodeid": 0,
- "episodetitle": "string",
- "episodepubdate": "string",
- "episodedescription": "string",
- "episodeartwork": "string",
- "episodeurl": "string",
- "episodeduration": 0,
- "podcastindexid": 0,
- "websiteurl": "string",
- "downloadedlocation": "string",
- "listenduration": 0,
- "completed": true,
- "saved": true,
- "queued": true,
- "downloaded": true,
- "is_youtube": true,
- "is_video": true
}
], - "total": 0
}| user_id required | integer <int32> |
| podcast_id required | integer <int32> |
| limit | integer or null <int64> |
| offset | integer or null <int64> |
| sort_by | string or null |
| sort_order | string or null |
| search | string or null |
| filter | string or null |
{- "episodes": [
- {
- "podcastname": "string",
- "Episodetitle": "string",
- "Episodepubdate": "string",
- "Episodedescription": "string",
- "Episodeartwork": "string",
- "Episodeurl": "string",
- "Episodeduration": 0,
- "Listenduration": 0,
- "Episodeid": 0,
- "Completed": true,
- "saved": true,
- "queued": true,
- "downloaded": true,
- "is_youtube": true,
- "is_video": true
}
], - "total": 0
}| episode_id required | integer <int32> |
| user_id required | integer <int32> |
| is_youtube required | boolean |
| playing_episode_id | integer or null <int32> Optional hint: the episode currently playing on the caller's device, so the
server can insert the new episode directly under it ("play next"). When
absent the episode is inserted at the top of the queue. Ignored by
remove_queued_pod. The anchor may itself be a YouTube video, hence the
companion |
| playing_is_youtube | boolean or null |
{- "episode_id": 0,
- "user_id": 0,
- "is_youtube": true,
- "playing_episode_id": 0,
- "playing_is_youtube": true
}{- "data": "string"
}| episode_id required | integer <int32> |
| user_id required | integer <int32> |
| is_youtube required | boolean |
| playing_episode_id | integer or null <int32> Optional hint: the episode currently playing on the caller's device, so the
server can insert the new episode directly under it ("play next"). When
absent the episode is inserted at the top of the queue. Ignored by
remove_queued_pod. The anchor may itself be a YouTube video, hence the
companion |
| playing_is_youtube | boolean or null |
{- "episode_id": 0,
- "user_id": 0,
- "is_youtube": true,
- "playing_episode_id": 0,
- "playing_is_youtube": true
}{- "data": "string"
}| refresh | boolean or null |
| limit | integer or null >= 0 |
[- {
- "podcastindexid": 0,
- "title": "string",
- "author": "string",
- "image": "string",
- "description": "string",
- "feedurl": "string",
- "categories": {
- "property1": "string",
- "property2": "string"
}, - "score": 0.1,
- "reason": "string"
}
]| episode_id required | integer <int32> |
| user_id required | integer <int32> |
| listen_duration required | number <double> |
| is_youtube | boolean |
| episode_duration | number or null <double> The player's duration for the episode in seconds, if it knows it. Stored when the feed gave none (new episodes beyond the newest few are inserted with duration 0). |
{- "episode_id": 0,
- "user_id": 0,
- "listen_duration": 0.1,
- "is_youtube": true,
- "episode_duration": 0
}null| episode_id required | integer <int32> |
| episode_pos required | number <float> |
| user_id required | integer <int32> |
| is_youtube required | boolean |
{- "episode_id": 0,
- "episode_pos": 0.1,
- "user_id": 0,
- "is_youtube": true
}{- "detail": "string"
}Reads the podcast's feed in full now, even if it looks unchanged, and updates its name, artwork, author, description, website and episodes. Details the user edited are kept unless reset_edits is set.
| podcast_id required | integer <int32> |
| reset_edits | boolean Also hand the details the user edited (name, artwork, ...) back to the feed. |
{- "podcast_id": 0,
- "reset_edits": true
}{- "success": true,
- "message": "string"
}| user_id required | integer <int32> |
| podcast_name required | string |
| podcast_url required | string |
{- "user_id": 0,
- "podcast_name": "string",
- "podcast_url": "string"
}{- "success": true
}| user_id required | integer <int32> |
| podcast_id required | integer <int32> |
{- "user_id": 0,
- "podcast_id": 0
}{- "success": true
}| episode_id required | integer <int32> |
| user_id required | integer <int32> |
| is_youtube required | boolean |
| playing_episode_id | integer or null <int32> Optional hint: the episode currently playing on the caller's device, so the
server can insert the new episode directly under it ("play next"). When
absent the episode is inserted at the top of the queue. Ignored by
remove_queued_pod. The anchor may itself be a YouTube video, hence the
companion |
| playing_is_youtube | boolean or null |
{- "episode_id": 0,
- "user_id": 0,
- "is_youtube": true,
- "playing_episode_id": 0,
- "playing_is_youtube": true
}{- "data": "string"
}| episode_id required | integer <int32> |
| user_id required | integer <int32> |
| is_youtube required | boolean |
{- "episode_id": 0,
- "user_id": 0,
- "is_youtube": true
}{- "detail": "string"
}| user_id required | integer <int32> |
| channel_name required | string |
| channel_url required | string |
{- "user_id": 0,
- "channel_name": "string",
- "channel_url": "string"
}null| user_id required | integer <int32> |
Array of objects or null (ReorderQueueItem) Preferred, type-aware ordering. Element 0 becomes queue position 1 (top). | |
| episode_ids | Array of integers or null <int32> [ items <int32 > ] Legacy id-only ordering, kept for backward compatibility with older clients.
Used only when |
{- "episodes": [
- {
- "episode_id": 0,
- "is_youtube": true
}
], - "episode_ids": [
- 0
]
}{- "message": "string"
}| user_id required | integer <int32> |
| limit | integer or null <int64> |
| offset | integer or null <int64> |
| since | string or null |
{- "episodes": [
- {
- "podcastid": 0,
- "podcastname": "string",
- "episodetitle": "string",
- "episodepubdate": "string",
- "episodedescription": "string",
- "episodeartwork": "string",
- "episodeurl": "string",
- "episodeduration": 0,
- "listenduration": 0,
- "episodeid": 0,
- "completed": true,
- "saved": true,
- "queued": true,
- "downloaded": true,
- "is_youtube": true,
- "is_video": true
}
], - "total": 0
}{- "pods": [
- {
- "podcastid": 0,
- "podcastname": "string",
- "artworkurl": "string",
- "description": "string",
- "episodecount": 0,
- "websiteurl": "string",
- "feedurl": "string",
- "author": "string",
- "categories": {
- "property1": "string",
- "property2": "string"
}, - "explicit": true,
- "podcastindexid": 0,
- "is_favorite": true,
- "is_video": true,
- "oldest_episode_date": "string",
- "newest_episode_date": "string",
- "play_count": 0
}
]
}{- "pods": [
- {
- "podcastid": 0,
- "podcastname": "string",
- "artworkurl": "string",
- "description": "string",
- "episodecount": 0,
- "websiteurl": "string",
- "feedurl": "string",
- "author": "string",
- "categories": {
- "property1": "string",
- "property2": "string"
}, - "explicit": true,
- "podcastindexid": 0,
- "play_count": 0,
- "episodes_played": 0,
- "oldest_episode_date": "string",
- "is_youtube": true,
- "is_video": true,
- "is_favorite": true
}
]
}| episode_id required | integer <int32> |
| user_id required | integer <int32> |
| is_youtube required | boolean |
{- "episode_id": 0,
- "user_id": 0,
- "is_youtube": true
}{- "detail": "string"
}| user_id required | integer <int32> |
| limit | integer or null <int64> |
| offset | integer or null <int64> |
| sort_by | string or null |
| sort_order | string or null |
| filter | string or null |
| search | string or null |
{- "saved_episodes": [
- {
- "episodetitle": "string",
- "podcastname": "string",
- "episodepubdate": "string",
- "episodedescription": "string",
- "episodeartwork": "string",
- "episodeurl": "string",
- "episodeduration": 0,
- "listenduration": 0,
- "episodeid": 0,
- "websiteurl": "string",
- "completed": true,
- "saved": true,
- "queued": true,
- "downloaded": true,
- "is_youtube": true,
- "podcastid": 0,
- "savedate": "string"
}
], - "total": 0
}| limit | integer or null <int64> |
| offset | integer or null <int64> |
| filter | string or null |
| search_term required | string |
| user_id required | integer <int32> |
| categories | Array of strings or null |
{- "search_term": "string",
- "user_id": 0,
- "categories": [
- "string"
]
}{- "data": [
- null
], - "total": 0
}| episode_id required | integer <int32> |
| new_duration required | integer <int32> |
| is_youtube required | boolean |
{- "episode_id": 0,
- "new_duration": 0,
- "is_youtube": true
}null| podcast_id required | integer <int32> |
| user_id required | integer <int32> |
| feed_cutoff_days required | integer <int32> |
{- "podcast_id": 0,
- "user_id": 0,
- "feed_cutoff_days": 0
}null| user_id required | integer <int32> |
| podcast_id required | integer <int32> |
| feed_url | string or null |
| username | string or null |
| password | string or null |
| podcast_name | string or null |
| description | string or null |
| author | string or null |
| artwork_url | string or null |
| website_url | string or null |
| podcast_index_id | integer or null <int64> |
{- "user_id": 0,
- "podcast_id": 0,
- "feed_url": "string",
- "username": "string",
- "password": "string",
- "podcast_name": "string",
- "description": "string",
- "author": "string",
- "artwork_url": "string",
- "website_url": "string",
- "podcast_index_id": 0
}{- "success": true,
- "message": "string"
}| user_id required | integer <int32> |
| limit | integer or null <int64> |
| offset | integer or null <int64> |
| sort_by | string or null |
| sort_order | string or null |
| filter | string or null |
| search | string or null |
null| podcast_id required | integer <int32> |
| secondary_podcast_ids required | Array of integers <int32> [ items <int32 > ] |
{- "secondary_podcast_ids": [
- 0
]
}{- "success": true,
- "message": "string"
}Hosts and guests on podcasts and episodes, person pages, follows, and contributing to PodPeopleDB
| podcast_id required | integer <int32> |
| episode_id | integer or null <int32> Credit these people on one episode instead of the whole show. |
required | Array of objects (ContributePerson) |
{- "podcast_id": 0,
- "episode_id": 0,
- "people": [
- {
- "person_id": 0,
- "podpeople_id": 0,
- "name": "string",
- "role": "string"
}
]
}[- {
- "id": 0,
- "podpeople_id": 0,
- "name": "string",
- "img": "string",
- "href": "string",
- "role": "string",
- "roles": [
- "string"
], - "group": "string",
- "scope": "string",
- "episode_count": 0,
- "sources": [
- "string"
], - "verified": true,
- "followed": true
}
]| episode_id required | integer <int32> Your episode id |
[- {
- "id": 0,
- "podpeople_id": 0,
- "name": "string",
- "img": "string",
- "href": "string",
- "role": "string",
- "roles": [
- "string"
], - "group": "string",
- "scope": "string",
- "episode_count": 0,
- "sources": [
- "string"
], - "verified": true,
- "followed": true
}
]| podcast_id required | integer <int32> Your podcast id |
{- "people": [
- {
- "id": 0,
- "podpeople_id": 0,
- "name": "string",
- "img": "string",
- "href": "string",
- "role": "string",
- "roles": [
- "string"
], - "group": "string",
- "scope": "string",
- "episode_count": 0,
- "sources": [
- "string"
], - "verified": true,
- "followed": true
}
], - "guests": [
- {
- "id": 0,
- "podpeople_id": 0,
- "name": "string",
- "img": "string",
- "href": "string",
- "role": "string",
- "roles": [
- "string"
], - "group": "string",
- "scope": "string",
- "episode_count": 0,
- "sources": [
- "string"
], - "verified": true,
- "followed": true
}
]
}| person_id required | integer <int32> PinePods person id |
| limit | integer or null <int64> Library episodes per page (default 50, max 200). |
| offset | integer or null <int64> |
{- "person": {
- "id": 0,
- "podpeople_id": 0,
- "name": "string",
- "img": "string",
- "href": "string",
- "followed": true
}, - "podcasts": [
- {
- "podcastid": 0,
- "podcastname": "string",
- "artworkurl": "string",
- "feedurl": "string",
- "podcastindexid": 0,
- "roles": [
- "string"
], - "podcast_level": true,
- "episode_count": 0
}
], - "episodes": [
- {
- "podcastid": 0,
- "podcastname": "string",
- "episodetitle": "string",
- "episodepubdate": "string",
- "episodedescription": "string",
- "episodeartwork": "string",
- "episodeurl": "string",
- "episodeduration": 0,
- "listenduration": 0,
- "episodeid": 0,
- "completed": true,
- "saved": true,
- "queued": true,
- "downloaded": true,
- "is_youtube": true,
- "is_video": true
}
], - "external_episodes": [
- {
- "episodeid": 0,
- "podcastid": 0,
- "podcastname": "string",
- "feedurl": "string",
- "podcastindexid": 0,
- "episodetitle": "string",
- "episodepubdate": "string",
- "episodedescription": "string",
- "episodeartwork": "string",
- "episodeurl": "string",
- "episodeduration": 0,
- "listenduration": 0,
- "completed": true,
- "saved": true,
- "queued": true,
- "downloaded": true,
- "is_youtube": true,
- "is_video": true,
- "role": "string"
}
], - "refreshing": true
}| episode_ids required | Array of integers <int32> [ items <int32 > ] |
| user_id required | integer <int32> |
| is_youtube | boolean or null |
{- "episode_ids": [
- 0
], - "user_id": 0,
- "is_youtube": true
}{- "message": "string",
- "processed_count": 0,
- "failed_count": 0
}| episode_ids required | Array of integers <int32> [ items <int32 > ] |
| user_id required | integer <int32> |
| is_youtube | boolean or null |
{- "episode_ids": [
- 0
], - "user_id": 0,
- "is_youtube": true
}{- "message": "string",
- "processed_count": 0,
- "failed_count": 0
}| episode_ids required | Array of integers <int32> [ items <int32 > ] |
| user_id required | integer <int32> |
| is_youtube | boolean or null |
{- "episode_ids": [
- 0
], - "user_id": 0,
- "is_youtube": true
}{- "message": "string",
- "processed_count": 0,
- "failed_count": 0
}| episode_ids required | Array of integers <int32> [ items <int32 > ] |
| user_id required | integer <int32> |
| is_youtube | boolean or null |
{- "episode_ids": [
- 0
], - "user_id": 0,
- "is_youtube": true
}{- "message": "string",
- "processed_count": 0,
- "failed_count": 0
}| episode_ids required | Array of integers <int32> [ items <int32 > ] |
| user_id required | integer <int32> |
| is_youtube | boolean or null |
{- "episode_ids": [
- 0
], - "user_id": 0,
- "is_youtube": true
}{- "message": "string",
- "processed_count": 0,
- "failed_count": 0
}| user_id required | integer <int32> |
| name required | string |
| description | string or null |
| podcast_ids | Array of integers or null <int32> [ items <int32 > ] |
| include_unplayed required | boolean |
| include_partially_played required | boolean |
| include_played required | boolean |
| play_progress_min | number or null <double> |
| play_progress_max | number or null <double> |
| time_filter_hours | integer or null <int32> |
| min_duration | integer or null <int32> Minimum episode length in minutes (stored, and returned by get_playlists, in seconds). |
| max_duration | integer or null <int32> Maximum episode length in minutes (stored, and returned by get_playlists, in seconds). |
| sort_order required | string One of date_asc, date_desc, duration_asc, duration_desc, listen_progress, completion. |
| group_by_podcast required | boolean |
| max_episodes | integer or null <int32> |
| icon_name required | string |
{- "user_id": 0,
- "name": "string",
- "description": "string",
- "podcast_ids": [
- 0
], - "include_unplayed": true,
- "include_partially_played": true,
- "include_played": true,
- "play_progress_min": 0,
- "play_progress_max": 0,
- "time_filter_hours": 0,
- "min_duration": 0,
- "max_duration": 0,
- "sort_order": "date_desc",
- "group_by_podcast": true,
- "max_episodes": 0,
- "icon_name": "string"
}{- "detail": "string",
- "playlist_id": 0
}| user_id required | integer <int32> |
| playlist_id required | integer <int32> |
{- "user_id": 0,
- "playlist_id": 0
}{- "detail": "string"
}| user_id required | integer <int32> |
| playlist_id required | integer <int32> |
| name required | string |
| description | string or null |
| podcast_ids | Array of integers or null <int32> [ items <int32 > ] |
| include_unplayed required | boolean |
| include_partially_played required | boolean |
| include_played required | boolean |
| play_progress_min | number or null <double> |
| play_progress_max | number or null <double> |
| time_filter_hours | integer or null <int32> |
| min_duration | integer or null <int32> Minimum episode length in minutes (stored, and returned by get_playlists, in seconds). |
| max_duration | integer or null <int32> Maximum episode length in minutes (stored, and returned by get_playlists, in seconds). |
| sort_order required | string One of date_asc, date_desc, duration_asc, duration_desc, listen_progress, completion. |
| group_by_podcast required | boolean |
| max_episodes | integer or null <int32> |
| icon_name required | string |
{- "user_id": 0,
- "playlist_id": 0,
- "name": "string",
- "description": "string",
- "podcast_ids": [
- 0
], - "include_unplayed": true,
- "include_partially_played": true,
- "include_played": true,
- "play_progress_min": 0,
- "play_progress_max": 0,
- "time_filter_hours": 0,
- "min_duration": 0,
- "max_duration": 0,
- "sort_order": "date_desc",
- "group_by_podcast": true,
- "max_episodes": 0,
- "icon_name": "string"
}{- "detail": "string"
}| podcast_id required | integer <int32> |
| user_id required | integer <int32> |
| category required | string |
{- "podcast_id": 0,
- "user_id": 0,
- "category": "string"
}null| feed_url required | string |
| user_id required | integer <int32> |
| username | string or null |
| password | string or null |
| youtube_channel | boolean or null |
| feed_cutoff | integer or null <int32> |
{- "feed_url": "string",
- "user_id": 0,
- "username": "string",
- "password": "string",
- "youtube_channel": true,
- "feed_cutoff": 0
}null| gpodder_url required | string |
| gpodder_username required | string |
| gpodder_password required | string |
{- "gpodder_url": "string",
- "gpodder_username": "string",
- "gpodder_password": "string"
}null| fullname required | string |
| username required | string |
| email required | string |
| hash_pw required | string |
{- "fullname": "string",
- "username": "string",
- "email": "string",
- "hash_pw": "string"
}null| user_id required | integer <int32> |
| token required | string |
| poll_endpoint required | string |
| nextcloud_url required | string |
{- "user_id": 0,
- "token": "string",
- "poll_endpoint": "string",
- "nextcloud_url": "string"
}null| provider_name required | string |
| client_id required | string |
| client_secret required | string |
| authorization_url required | string |
| token_url required | string |
| user_info_url required | string |
| button_text required | string |
| scope required | string |
| button_color required | string |
| button_text_color required | string |
| icon_svg | string or null |
| name_claim | string or null |
| email_claim | string or null |
| username_claim | string or null |
| roles_claim | string or null |
| user_role | string or null |
| admin_role | string or null |
{- "provider_name": "string",
- "client_id": "string",
- "client_secret": "string",
- "authorization_url": "string",
- "token_url": "string",
- "user_info_url": "string",
- "button_text": "string",
- "scope": "string",
- "button_color": "string",
- "button_text_color": "string",
- "icon_svg": "string",
- "name_claim": "string",
- "email_claim": "string",
- "username_claim": "string",
- "roles_claim": "string",
- "user_role": "string",
- "admin_role": "string"
}null| fullname required | string |
| username required | string |
| email required | string |
| hash_pw required | string |
{- "fullname": "string",
- "username": "string",
- "email": "string",
- "hash_pw": "string"
}null| segment_id required | integer <int32> |
| user_id required | integer <int32> |
| status required | string |
{- "segment_id": 0,
- "user_id": 0,
- "status": "string"
}null| podcast_id required | integer <int32> |
| user_id required | integer <int32> |
| enabled | boolean |
{- "podcast_id": 0,
- "user_id": 0,
- "enabled": true
}null| podcast_id required | integer <int32> |
| user_id required | integer <int32> |
| enabled | boolean |
{- "podcast_id": 0,
- "user_id": 0,
- "enabled": true
}null| podcast_id required | integer <int32> |
| user_id required | integer <int32> |
| enabled | boolean |
{- "podcast_id": 0,
- "user_id": 0,
- "enabled": true
}null| podcast_id required | integer <int32> |
| user_id required | integer <int32> |
| enabled | boolean |
| threshold | integer <int32> |
{- "podcast_id": 0,
- "user_id": 0,
- "enabled": true,
- "threshold": 0
}null| podcast_id required | integer <int32> |
| start_skip | integer <int32> |
| end_skip | integer <int32> |
| user_id required | integer <int32> |
{- "podcast_id": 0,
- "start_skip": 0,
- "end_skip": 0,
- "user_id": 0
}null| kind required | string |
| model required | string |
| repo | string or null |
| filename | string or null |
| url | string or null |
{- "kind": "string",
- "model": "string",
- "repo": "string",
- "filename": "string",
- "url": "string"
}null| transcription_model required | string |
| llm_backend required | string |
| llm_model | string or null |
| llm_url | string or null |
| llm_api_key | string or null |
| clear_api_key | boolean |
| whisper_device | string or null |
| whisper_compute_type | string or null |
{- "transcription_model": "string",
- "llm_backend": "string",
- "llm_model": "string",
- "llm_url": "string",
- "llm_api_key": "string",
- "clear_api_key": true,
- "whisper_device": "string",
- "whisper_compute_type": "string"
}null| user_id required | integer <int32> |
| podcast_id required | integer <int32> |
{- "user_id": 0,
- "podcast_id": 0
}null| user_id required | integer <int32> |
| podcast_id required | integer <int32> |
{- "user_id": 0,
- "podcast_id": 0
}null| user_id required | integer <int32> |
| rssonly required | boolean |
| podcast_ids | Array of integers or null <int32> [ items <int32 > ] |
{- "user_id": 0,
- "rssonly": true,
- "podcast_ids": [
- 0
]
}null| episode_id required | integer <int32> |
| user_id required | integer <int32> |
| force | boolean |
| download_first | boolean Download the episode to the server first (when it isn't) and detect ads on that copy, so ad times match what the user plays. |
{- "episode_id": 0,
- "user_id": 0,
- "force": true,
- "download_first": true
}null| episode_id required | integer <int32> |
| user_id required | integer <int32> |
| force | boolean |
{- "episode_id": 0,
- "user_id": 0,
- "force": true
}null| folder_cover required | boolean |
| episode_cover required | boolean |
| metadata_sidecar required | boolean |
| metadata_format required | string |
| metadata_subfolder required | boolean |
{- "folder_cover": true,
- "episode_cover": true,
- "metadata_sidecar": true,
- "metadata_format": "string",
- "metadata_subfolder": true
}null| podcast_id required | integer <int32> |
| auto_download required | boolean |
| user_id required | integer <int32> |
{- "podcast_id": 0,
- "auto_download": true,
- "user_id": 0
}null| podcast_id required | integer <int32> |
| auto_play_next required | boolean |
| user_id required | integer <int32> |
{- "podcast_id": 0,
- "auto_play_next": true,
- "user_id": 0
}null| podcast_id required | integer <int32> |
| auto_queue required | boolean |
| user_id required | integer <int32> |
{- "podcast_id": 0,
- "auto_queue": true,
- "user_id": 0
}null| user_id required | integer <int32> |
| podcast_id | integer or null <int32> |
{- "user_id": 0,
- "podcast_id": 0
}null| user_id required | integer <int32> |
| podcast_id required | integer <int32> |
| ignore required | boolean |
{- "user_id": 0,
- "podcast_id": 0,
- "ignore": true
}null| user_id required | integer <int32> |
| nextcloud_url required | string |
{- "user_id": 0,
- "nextcloud_url": "string"
}null| url required | string Issuer URL or full .well-known/openid-configuration URL |
{- "url": "string"
}{- "issuer": "string",
- "authorization_endpoint": "string",
- "token_endpoint": "string",
- "userinfo_endpoint": "string",
- "scopes_supported": [
- "string"
], - "claims_supported": [
- "string"
]
}| user_id required | integer <int32> |
| podcast_id required | integer <int32> |
{- "user_id": 0,
- "podcast_id": 0
}null| user_id required | integer <int32> |
| podcast_id required | integer <int32> |
| enabled | boolean or null
|
{- "user_id": 0,
- "podcast_id": 0,
- "enabled": true
}null| user_id required | integer <int32> |
| podcast_id required | integer <int32> |
| days required | integer <int32> |
{- "user_id": 0,
- "podcast_id": 0,
- "days": 0
}null| user_id required | integer <int32> |
| podcast_id required | integer <int32> |
| use_podcast_covers required | boolean |
{- "user_id": 0,
- "podcast_id": 0,
- "use_podcast_covers": true
}null| user_id required | integer <int32> |
| podcast_id required | integer <int32> |
| playback_speed required | number <double> |
{- "user_id": 0,
- "podcast_id": 0,
- "playback_speed": 0.1
}null| user_id required | integer <int32> |
| podcast_id required | integer <int32> |
| is_favorite required | boolean |
{- "user_id": 0,
- "podcast_id": 0,
- "is_favorite": true
}null| user_id required | integer <int32> |
| podcast_id required | integer <int32> |
| enabled required | boolean |
{- "user_id": 0,
- "podcast_id": 0,
- "enabled": true
}null| podcast_id required | integer <int32> |
| user_id required | integer <int32> |
| category required | string |
{- "podcast_id": 0,
- "user_id": 0,
- "category": "string"
}nullrequired | object (EmailSettings) | ||||||||||||||||
| |||||||||||||||||
{- "email_settings": {
- "server_name": "string",
- "server_port": "587",
- "from_email": "string",
- "send_mode": "string",
- "encryption": "string",
- "auth_required": true,
- "email_username": "string",
- "email_password": "string"
}
}null| user_id required | integer <int32> |
| cron_schedule required | string |
| enabled required | boolean |
| retention_count | integer or null <int32> |
{- "user_id": 0,
- "cron_schedule": "string",
- "enabled": true,
- "retention_count": 0
}null| to_email required | string |
| subject required | string |
| message required | string |
{- "to_email": "string",
- "subject": "string",
- "message": "string"
}null| server_name required | string |
| server_port required | string |
| from_email required | string |
| encryption required | string |
| auth_required required | boolean |
| email_username required | string |
| email_password required | string |
| to_email required | string |
| message required | string |
{- "server_name": "string",
- "server_port": "string",
- "from_email": "string",
- "encryption": "string",
- "auth_required": true,
- "email_username": "string",
- "email_password": "string",
- "to_email": "string",
- "message": "string"
}null| episode_id required | integer <int32> |
| user_id required | integer <int32> |
| force | boolean |
{- "episode_id": 0,
- "user_id": 0,
- "force": true
}null| provider_id required | integer <int32> |
| provider_name required | string |
| client_id required | string |
| client_secret required | string |
| authorization_url required | string |
| token_url required | string |
| user_info_url required | string |
| button_text required | string |
| scope required | string |
| button_color required | string |
| button_text_color required | string |
| icon_svg | string or null |
| name_claim | string or null |
| email_claim | string or null |
| username_claim | string or null |
| roles_claim | string or null |
| user_role | string or null |
| admin_role | string or null |
{- "provider_name": "string",
- "client_id": "string",
- "client_secret": "string",
- "authorization_url": "string",
- "token_url": "string",
- "user_info_url": "string",
- "button_text": "string",
- "scope": "string",
- "button_color": "string",
- "button_text_color": "string",
- "icon_svg": "string",
- "name_claim": "string",
- "email_claim": "string",
- "username_claim": "string",
- "roles_claim": "string",
- "user_role": "string",
- "admin_role": "string"
}null| user_id required | integer <int32> |
| podcast_id required | integer <int32> |
| podcast_index_id required | integer <int32> |
{- "user_id": 0,
- "podcast_id": 0,
- "podcast_index_id": 0
}nullAdmin only. Checks that the search service answers and reports Podping: whether it's on, the relay's state and what this server did with its announcements.
{- "search": {
- "url": "string",
- "reachable": true,
- "latency_ms": 0,
- "error": "string"
}, - "podping": {
- "enabled": true,
- "relay_url": "string",
- "relay": { },
- "relay_error": "string",
- "client": {
- "last_poll_at": 0,
- "last_success_at": 0,
- "last_error": "string",
- "pings_seen": 0,
- "feeds_refreshed": 0,
- "last_refresh_at": 0
}
}
}Admin only. When on, Pinepods reads which feeds Podping announced from the relay and refreshes the ones it has right away. Only announcements are fetched; what this server subscribes to is never sent.
| enabled required | boolean |
{- "enabled": true
}{- "search": {
- "url": "string",
- "reachable": true,
- "latency_ms": 0,
- "error": "string"
}, - "podping": {
- "enabled": true,
- "relay_url": "string",
- "relay": { },
- "relay_error": "string",
- "client": {
- "last_poll_at": 0,
- "last_success_at": 0,
- "last_error": "string",
- "pings_seen": 0,
- "feeds_refreshed": 0,
- "last_refresh_at": 0
}
}
}| user_id required | integer <int32> |
| name required | string |
| background_color required | string |
| button_color required | string |
| container_button_color required | string |
| button_text_color required | string |
| text_color required | string |
| text_secondary_color required | string |
| border_color required | string |
| accent_color required | string |
| prog_bar_color required | string |
| error_color required | string |
| bonus_color required | string |
| secondary_background required | string |
| container_background required | string |
| standout_color required | string |
| hover_color required | string |
| link_color required | string |
| thumb_color required | string |
| unfilled_color required | string |
| check_box_color required | string |
{- "user_id": 0,
- "name": "string",
- "background_color": "string",
- "button_color": "string",
- "container_button_color": "string",
- "button_text_color": "string",
- "text_color": "string",
- "text_secondary_color": "string",
- "border_color": "string",
- "accent_color": "string",
- "prog_bar_color": "string",
- "error_color": "string",
- "bonus_color": "string",
- "secondary_background": "string",
- "container_background": "string",
- "standout_color": "string",
- "hover_color": "string",
- "link_color": "string",
- "thumb_color": "string",
- "unfilled_color": "string",
- "check_box_color": "string"
}null| user_id required | integer <int32> |
| platform required | string |
| enabled required | boolean |
| ntfy_topic | string or null |
| ntfy_server_url | string or null |
| ntfy_username | string or null |
| ntfy_password | string or null |
| ntfy_access_token | string or null |
| gotify_url | string or null |
| gotify_token | string or null |
| http_url | string or null |
| http_token | string or null |
| http_method | string or null |
{- "user_id": 0,
- "platform": "string",
- "enabled": true,
- "ntfy_topic": "string",
- "ntfy_server_url": "string",
- "ntfy_username": "string",
- "ntfy_password": "string",
- "ntfy_access_token": "string",
- "gotify_url": "string",
- "gotify_token": "string",
- "http_url": "string",
- "http_token": "string",
- "http_method": "string"
}null| user_id required | integer <int32> |
| enabled required | boolean |
{- "user_id": 0,
- "enabled": true
}null| user_id required | integer <int32> |
| days required | integer <int32> |
{- "user_id": 0,
- "days": 0
}null| user_id required | integer <int32> |
| volume required | integer <int32> |
{- "user_id": 0,
- "volume": 0
}null| user_id required | integer <int32> |
| use_podcast_covers required | boolean |
| podcast_id | integer or null <int32> |
{- "user_id": 0,
- "use_podcast_covers": true,
- "podcast_id": 0
}null| user_id required | integer <int32> |
| playback_speed required | number <double> |
{- "user_id": 0,
- "playback_speed": 0.1
}null| user_id required | integer <int32> |
| enabled required | boolean |
{- "user_id": 0,
- "enabled": true
}null| gpodder_url required | string |
| gpodder_username required | string |
| gpodder_password required | string |
{- "gpodder_url": "string",
- "gpodder_username": "string",
- "gpodder_password": "string"
}null| auto_update required | boolean |
| channel required | string |
{- "auto_update": true,
- "channel": "string"
}null| device_name required | string |
| device_type required | string |
| device_caption | string or null |
{- "device_name": "string",
- "device_type": "string",
- "device_caption": "string"
}null{- "server_url": "string",
- "sync_type": "string",
- "sync_enabled": true,
- "server_devices": [
- {
- "id": "string",
- "caption": "string",
- "device_type": "string",
- "subscriptions": 0
}
], - "total_devices": 0,
- "server_subscriptions": [
- {
- "url": "string",
- "title": "string",
- "description": "string"
}
], - "total_subscriptions": 0,
- "recent_episode_actions": [
- {
- "podcast": "string",
- "episode": "string",
- "action": "string",
- "timestamp": "string",
- "position": 0,
- "device": "string"
}
], - "total_episode_actions": 0,
- "connection_status": "string",
- "last_sync_timestamp": "string",
- "api_endpoints_tested": [
- {
- "endpoint": "string",
- "status": "string",
- "response_time_ms": 0,
- "error": "string"
}
]
}| device_id required | integer <int32> |
| caption required | string |
{- "caption": "string"
}{- "success": true
}| full | boolean or null Full sync: pull everything again and send the whole library and listening state. |
{- "success": true,
- "message": "string",
- "summary": {
- "full": true,
- "subscriptions_queued": 0,
- "subscriptions_removed": 0,
- "subscriptions_pushed": 0,
- "actions_pulled": 0,
- "actions_applied": 0,
- "actions_pushed": 0
}, - "target": {
- "kind": "string",
- "url": "string",
- "username": "string",
- "device_name": "string",
- "enabled": true,
- "needs_full_sync": true,
- "last_attempt_at": 0,
- "last_success_at": 0,
- "last_error": "string",
- "consecutive_failures": 0,
- "in_backoff": true,
- "retry_at": 0
}
}| enabled required | boolean |
{- "enabled": true
}{- "enabled": true,
- "username": "string",
- "server_url": "string",
- "server_url_configured": true,
- "notice": "string"
}Creates a password for a gpodder app. The password is in this response only.
| label | string or null What it's for, e.g. "AntennaPod on my phone". |
{- "label": "string"
}{- "id": 0,
- "label": "string",
- "password": "string"
}{- "server_enabled": true,
- "subscriptions": 0,
- "devices": 0,
- "total_episode_actions": 0,
- "last_change": 0,
- "recent_episode_actions": [
- {
- "podcast": "string",
- "episode": "string",
- "action": "string",
- "timestamp": 0,
- "position": 0,
- "device": "string",
- "origin": "string"
}
], - "target": {
- "kind": "string",
- "url": "string",
- "last_success_at": 0,
- "pending_subscriptions": 0,
- "pending_actions": 0
}
}{- "target": {
- "kind": "string",
- "url": "string",
- "username": "string",
- "device_name": "string",
- "enabled": true,
- "needs_full_sync": true,
- "last_attempt_at": 0,
- "last_success_at": 0,
- "last_error": "string",
- "consecutive_failures": 0,
- "in_backoff": true,
- "retry_at": 0
}
}| kind required | string
|
| url required | string |
| username required | string |
| password | string or null Leave out to reuse the stored password of the same server and account. |
| device_name | string or null gpodder only: the device Pinepods syncs as. Left out: keep the current one, or pick one. |
{- "kind": "string",
- "url": "string",
- "username": "string",
- "password": "string",
- "device_name": "string"
}{- "target": {
- "kind": "string",
- "url": "string",
- "username": "string",
- "device_name": "string",
- "enabled": true,
- "needs_full_sync": true,
- "last_attempt_at": 0,
- "last_success_at": 0,
- "last_error": "string",
- "consecutive_failures": 0,
- "in_backoff": true,
- "retry_at": 0
}, - "task_id": "string"
}Signs in with the given credentials (gpodder: and lists the devices) without saving anything or creating a device.
| kind required | string
|
| url required | string |
| username required | string |
| password | string or null Leave out to reuse the stored password of the same server and account. |
| device_name | string or null gpodder only: the device Pinepods syncs as. Left out: keep the current one, or pick one. |
{- "kind": "string",
- "url": "string",
- "username": "string",
- "password": "string",
- "device_name": "string"
}{- "success": true,
- "message": "string",
- "devices": [
- {
- "id": "string",
- "caption": "string",
- "type": "string",
- "subscriptions": 0
}
], - "device_name": "string"
}[- {
- "id": "string",
- "task_type": "string",
- "user_id": 0,
- "status": "PENDING",
- "progress": 0.1,
- "message": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "result": null,
- "episode_title": "string",
- "podcast_name": "string",
- "completed_at": "2019-08-24T14:15:22Z",
- "art_url": "string",
- "detail": "string",
- "group": "string",
- "group_label": "string",
- "total": 0
}
][- {
- "id": "string",
- "task_type": "string",
- "user_id": 0,
- "status": "PENDING",
- "progress": 0.1,
- "message": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "result": null,
- "episode_title": "string",
- "podcast_name": "string",
- "completed_at": "2019-08-24T14:15:22Z",
- "art_url": "string",
- "detail": "string",
- "group": "string",
- "group_label": "string",
- "total": 0
}
]{- "id": "string",
- "task_type": "string",
- "user_id": 0,
- "status": "PENDING",
- "progress": 0.1,
- "message": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "result": null,
- "episode_title": "string",
- "podcast_name": "string",
- "completed_at": "2019-08-24T14:15:22Z",
- "art_url": "string",
- "detail": "string",
- "group": "string",
- "group_label": "string",
- "total": 0
}| user_id required | integer <int32> |
[- {
- "id": "string",
- "user_id": 0,
- "category": "string",
- "severity": "info",
- "title": "string",
- "body": "string",
- "episode_id": 0,
- "podcast_id": 0,
- "art_url": "string",
- "link": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "read": true,
- "expires_at": "2019-08-24T14:15:22Z"
}
]| user_id required | integer <int32> |
| api_key required | string |
| limit | integer or null <int32> |
| podcast_id | integer or null <int32> |
| type | string or null |
| source | string or null Which collection to build the feed from. Absent = all subscriptions (default). One of: saved, queue, playlist, collection, downloads, history. |
| id | integer or null <int32> Playlist or collection id (required when |
| user_id required | integer <int32> |
| directory_path required | string |
| podcast_name required | string |
| description | string or null |
| author | string or null |
| explicit | boolean or null |
{- "user_id": 0,
- "directory_path": "string",
- "podcast_name": "string",
- "description": "string",
- "author": "string",
- "explicit": true
}null| podcast_id required | integer <int32> |
| user_id required | integer <int32> |
| min_minutes | integer or null <int32> Shortest video to add, in minutes; empty or 0 for no limit. |
| max_minutes | integer or null <int32> Longest video to add, in minutes; empty or 0 for no limit. |
| title_contains | string or null Only add videos whose title contains this (any case); empty for all. |
{- "podcast_id": 0,
- "user_id": 0,
- "min_minutes": 0,
- "max_minutes": 0,
- "title_contains": "string"
}{- "min_minutes": 0,
- "max_minutes": 0,
- "title_contains": "string"
}| user_id required | integer <int32> |
| collection_id required | integer <int32> |
required | Array of items Each entry is (episode_id, is_youtube) |
{- "user_id": 0,
- "collection_id": 0,
- "episodes": [
- [
- 0,
- true
]
]
}{- "detail": "string"
}| user_id required | integer <int32> |
| name required | string |
| description | string or null |
| icon | string or null |
| auto_add_categories | Array of strings or null Podcast categories to auto-add episodes from (None/empty = disabled). |
| backfill | boolean or null When true, immediately backfill existing matching episodes after saving. |
{- "user_id": 0,
- "name": "string",
- "description": "string",
- "icon": "string",
- "auto_add_categories": [
- "string"
], - "backfill": true
}{- "detail": "string",
- "collection_id": 0
}| user_id required | integer <int32> |
{- "collections": [
- {
- "collection_id": 0,
- "user_id": 0,
- "name": "string",
- "description": "string",
- "is_default": true,
- "icon": "string",
- "created_at": "string",
- "last_updated": "string",
- "episode_count": 0,
- "auto_add_categories": [
- "string"
]
}
]
}| collection_id required | integer <int32> |
| name | string or null |
| description | string or null |
| icon | string or null |
| auto_add_categories | Array of strings or null Podcast categories to auto-add episodes from (empty vec clears the rule). |
| backfill | boolean or null When true, immediately backfill existing matching episodes after saving. |
{- "name": "string",
- "description": "string",
- "icon": "string",
- "auto_add_categories": [
- "string"
], - "backfill": true
}{- "detail": "string"
}| collection_id required | integer <int32> |
| user_id required | integer <int32> |
| episode_id required | integer <int32> |
| is_youtube required | boolean |
{- "user_id": 0,
- "episode_id": 0,
- "is_youtube": true
}{- "detail": "string"
}| collection_id required | integer <int32> |
| limit required | integer <int64> |
| offset required | integer <int64> |
| sort_by required | string |
| sort_order required | string |
| filter required | string |
{- "saved_episodes": [
- {
- "episodetitle": "string",
- "podcastname": "string",
- "episodepubdate": "string",
- "episodedescription": "string",
- "episodeartwork": "string",
- "episodeurl": "string",
- "episodeduration": 0,
- "listenduration": 0,
- "episodeid": 0,
- "websiteurl": "string",
- "completed": true,
- "saved": true,
- "queued": true,
- "downloaded": true,
- "is_youtube": true,
- "podcastid": 0,
- "savedate": "string"
}
], - "total": 0
}| collection_id required | integer <int32> |
| user_id required | integer <int32> |
| episode_id required | integer <int32> |
| is_youtube required | boolean |
{- "user_id": 0,
- "episode_id": 0,
- "is_youtube": true
}{- "detail": "string"
}| user_id required | integer <int32> |
{- "devices": [
- {
- "device_id": "string",
- "device_name": "string",
- "device_type": "string",
- "episode_id": 0,
- "is_youtube": true,
- "title": "string",
- "artwork_url": "string",
- "position_sec": 0.1,
- "duration_sec": 0.1,
- "playing": true,
- "speed": 0.1,
- "updated_at": 0,
- "capabilities": [
- "string"
]
}
]
}