Heartbeat Public API
Heartbeat has no documented API, but the JSON calls its own pages make under h.ki/api answer without sign-in; seven were seen on Nov 7, 2026 (a moment, a playlist's or viki's moments, a video's community moments, suggestions, comments, tags and a heartbeat's playlists), each wrapped in {"code":0,"data":{"objList":[...]}}.
Heartbeat publishes no API documentation, but the pages of h.ki fetch their data as JSON from https://h.ki/api/..., and seven of those calls answered a plain request without sign-in on Nov 7, 2026: one moment, a playlist's or viki's moments, a video's community moments, suggested moments, comments, tags, and a heartbeat's playlists. The community list is the one the Dec 25, 2023 features video describes, where you "look at other people's moments in the community" beside a video. Everything below is what Vi.ki saw by watching h.ki's own network requests and trying each address once; it is not an official interface and may change without notice.
Quick facts
| Base address | https://h.ki/api/ |
| Sign-in | None needed for the seven calls below |
| Format | JSON: {"code":0,"message":"","data":{"objList":[...]}} |
| Documentation | None published; no API key, terms or rate limit stated |
| Paging | page and per_page (h.ki's pages ask for 8 to 100) |
| Ids | Moments mo..., vikis vi..., playlists li..., heartbeats he..., photos ph... |
| For lists of everything | The sitemaps at h.ki/sitemaps/index.xml, which robots.txt names |
| Checked | Nov 7, 2026 |
The seven calls
| Call | Returns |
|---|---|
GET /api/moments/{custom_id} |
One moment, e.g. /api/moments/morxesfsh |
GET /api/moments?playlist_id={id}&source=me&page=1&per_page=50 |
A playlist's or viki's moments in order (data.objList[0] = {total, items}); add sort_by[][field]=order&sort_by[][sort]=asc for h.ki's order |
GET /api/moments?source=others&yt_video_id={YouTube id}&moment_id={custom_id}&page=1&per_page=50 |
A video's community moments, the list beside the player (Moment Pages) |
GET /api/recommender/suggested?page=1&per_page=8&exclude_moments[]={custom_id} |
Suggested moments, the row under a moment page's list |
GET /api/comments?video_id={YouTube id}&page=1&per_page=35 |
A video's comments on Heartbeat (comments, pagination) |
GET /api/moments/tags?yt_video_id={YouTube id}&per_page=100&source=others |
The tags on a video's moments (source=me for your own) |
GET /api/playlists?handle=@{handle}&source=owner&page=1&per_page=50&sort_column=created_at&sort=desc |
A heartbeat's playlists, each with custom_id (li...), name, visibility, default_sort_order, moments_count (Playlists) |
h.ki's pages add fields=fav_count,own_fav to the moment lists; signed out, own_fav has nothing to say. The viki h.ki/about, for example, is playlist 21279: its moment list answered with 239 moments.
A sample request
curl "https://h.ki/api/moments/morxesfsh"
The answer, shortened (Nov 7, 2026):
{"code":0,"message":"","data":{"objList":[{
"id":7815,
"custom_id":"morxesfsh",
"title":"Press H while watching any video on YouTubeto crea te a moment",
"start_time":20.594200134277344,
"end_time":null,
"url":"https://www.youtube.com/embed/Nr2Q9KEiUjQ?showinfo=0&rel=0&autohide=1&enablejsapi=1&autoplay=0",
"source":"user",
"fav_count":0,
"playback_count":12,
"visibility":"public",
"created_at":"2023-12-25T16:06:20.000Z",
"heartbeats":[{"custom_id":"hez7xmbh5","name":"...","handle":"...","avatar":"..."}],
...
}]}}
Fields of a moment
| Field | Meaning |
|---|---|
custom_id |
The moment's address on h.ki: https://h.ki/<custom_id> |
title, description |
As the creator wrote them |
start_time |
Seconds from the start, with fractions (20.594 is 0:20.6) |
end_time |
Seconds, or null for a moment that plays on |
url |
The YouTube embed address of the video |
yt_video_id, video |
The YouTube id; video adds the YouTube title, channel and aspect ratio ("16:9") |
source |
"user" for one a person made |
fav_count, playback_count, trending_score |
Favorites, plays on Heartbeat, a ranking score |
visibility |
"public" for the moments we read |
is_title_draft, is_title_foreign |
Flags on the title (0 or 1) |
hash |
A 64-character hex digest Heartbeat keeps for the moment |
created_at, updated_at, deleted_at |
Times in UTC |
heartbeats |
The creator: custom_id (he...), name, handle, avatar, description |
tags, playlist_details |
The moment's tags and the playlists it is in |
List items add views, length_in_sec, handle, heartbeat_owner_display_name, is_short, total_comments, unlisted, unlisted_video and order. Thumbnails are YouTube's own, https://img.youtube.com/vi/<id>/0.jpg.
What is not there
- Search and the home page: their results came with the page itself; no JSON call was seen for them (Search).
- Anything signed in: saving, editing, favorites and payments go through calls Vi.ki did not see.
- Analytics: h.ki's pages post beacons to
a.h.ki/collect;a.h.kiitself sits behind a login. - gRPC: h.ki/about says the front end uses gRPC; only the REST addresses above were seen.
Using it politely
These addresses exist for Heartbeat's own pages, and every request reaches Heartbeat's servers. If you read them, ask one thing at a time, keep what you get instead of asking again, and never loop over every moment or heartbeat: for a list of everything, the sitemaps (creators.xml, moments.xml, playlists.xml, pretty_links.xml, tags.xml, vikis.xml in h.ki/sitemaps/index.xml) are what robots.txt points crawlers to. Moments belong to the people who made them, and the creator's name and avatar come with each one; the Privacy Policy covers them. Vi.ki tried each call once and looped over none.
We think a small documented version of these calls (a moment, a viki's moments, a heartbeat's playlists) would be Heartbeat's quickest route to being built on, since the data is already public and the shapes are already simple. Until then, treat them as unofficial: a field name or path can change with any release of h.ki (the footer read "Heartbeat 2.107.59" on Nov 7, 2026).
Frequently asked questions
Does Heartbeat have a public API?
Not a documented one. The JSON calls its pages make under h.ki/api/ answered without sign-in on Nov 7, 2026, and they are listed above.
How do I get a moment's start time from its link?
Take the id from h.ki/<id> and request https://h.ki/api/moments/<id>; start_time is in seconds.
Is there an API key or rate limit?
No key is needed and no limit is published. Ask sparingly and keep what you get.
How do I list every viki or moment?
Use the sitemaps listed in h.ki/sitemaps/index.xml rather than paging through the API.
Can I write to Heartbeat through the API?
Not without signing in; saving and editing were not part of what a visitor could see.
Sources
- Vi.ki's reading of h.ki's network requests in Chrome and one request to each call above, Nov 7, 2026
- Heartbeat features - No fluff, Freedom!, Dec 25, 2023 (video)
- What is Heartbeat?, h.ki, read Nov 7, 2026
- robots.txt and sitemap index, h.ki, read Nov 7, 2026
Moments
Heartbeat features - No fluff
Freedom!
See also
-
Moment PagesEvery Heartbeat moment has its own page at h.ki/mo plus seven characters, with the YouTube video starting at the moment's second, its title and creator, Follow, a favorite heart, Share, comments, and the video's other moments in a docked list on the right.
-
PlaylistsA Heartbeat playlist, at h.ki/li plus seven characters, is a list of moments that can come from many YouTube videos, each starting at its own second; it shows as a chip on the home grid and in a video's moment list, and anyone signed in can make one.
-
Heartbeat SearchHeartbeat's search box opens h.ki/search?q= with matching moments and videos in two blocks, and Filters narrow them by date added (last hour to this year), type (Moment, Video, Heartbeat) and sort (date added, view count, favorite count).
-
Privacy PolicyHeartbeat's privacy policy is the Freedom! Privacy Policy (last modified Feb 2, 2024), shared by Freedom! Family Limited's sites; it says Heartbeat collects only what it needs, does not sell data, signs you in with Google, reads profile, email and channel data through YouTube's API services, uses cookies, and is not for children under 13.