# Check My OG > Checks how a web page's link preview will look when the URL is shared: it fetches the page as Twitterbot and facebookexternalhit, reads the Open Graph and Twitter tags, downloads and probes the og:video and og:image files (status, content type, range requests, MP4 faststart, codec, size, duration), and says which apps will play the video and which will show the og:image poster. Base URL: https://checkmyog.com No key, no sign-in. CORS is open. Rate limit: 20 checks per minute per client IP. The hosted instance records each checked URL in its analytics; self-host it (see the repo) if that matters. ## Call it - Markdown report (best for reading into a model): `curl -s "https://checkmyog.com/api/inspect?url=https://example.com/&format=md"` - JSON (best for code): `curl -s "https://checkmyog.com/api/inspect?url=https://example.com/"` - Human page with players and app previews: `https://checkmyog.com/?url=https://example.com/` `https://checkmyog.com/api/stats` returns `{"checks": N}`, the number of successful checks so far; each JSON report also carries it as `total_checks`. URL-encode the `url` parameter if it has its own query string. `/api/check` is an alias of `/api/inspect`. `Accept: text/markdown` also selects the Markdown report. ## JSON response, the fields that matter - `summary.video_plays_in`: apps that will play og:video for this URL (today usually `["iMessage"]` or `[]`). - `summary.everywhere_else`: `"poster"` (og:image shown) or `"none"` (text-only card). - `summary.checks_failed`: labels of failed checks; empty means everything passed. - `platforms[]`: `{platform, result: "plays"|"poster"|"none", note, source}` per app. - `checks[]`: `{ok, group, key, label, detail}`; groups are `page`, `tags`, `video`, `platform`, `poster`. `platform` rows are facts (YES/NO), not errors. - `card`: resolved title, description, image, video, og:type, twitter:card, domain. - `video`: ffprobe facts (codec, profile, pix_fmt, width, height, fps, duration, audio, bytes). - `poster`: format, width, height, bytes of og:image. - `tags`: every og:* and twitter:* tag as `[name, content]`. Errors are JSON `{"error": "..."}` with status 400 (bad or refused URL: private addresses, ports other than 80/443, non-http schemes), 429 (rate limit) or 502 (the target failed to answer). ## What the results mean (as of 24 Oct 2026) - Only iMessage is confirmed to play og:video (device-tested 24 Oct 2026: autoplays muted and loops; poster with a play button when the recipient has autoplay off or Reduce Motion on). Apple's size figures are guidelines, not hard limits: the page itself under 1 MB, and icon, image and video together under 10 MB. - Discord plays it only when og:type is video or video.*, or twitter:card is player. Do not tell a site to declare og:type video on a normal page just for Discord: it misdescribes the page to every other consumer. - X (Twitter), Facebook, Telegram, WhatsApp, Slack, LinkedIn, Bluesky, Mastodon, Signal and Matrix (Element) show og:image. Facebook and Telegram were tested on devices; the rest follow each platform's own documentation (sources in support.json). The viral "og:video works on X" posts were screen recordings of iMessage. - So og:image is what most people see: it must exist, be 1.91:1 and at least 600 px wide (Apple suggests 900 or more), and match the video's first frame if there is a video. ## Advice an agent should give - Video: H.264 (High or Main), yuv420p, MP4 with faststart (moov before mdat), served as video/mp4 over https with range requests (206), well under 10 MB, ideally a short loop with no audio. The size figure is Apple's guideline; the codec, pixel format and faststart advice is what plays most widely, not a published rule. - Tags: og:video, og:video:secure_url, og:video:type=video/mp4, og:video:width, og:video:height, plus og:image (the poster) with og:image:width/height and og:image:alt, and twitter:card=summary_large_image. - Version the video URL (for example `?v=`) when the file changes; previews are cached by URL. - X overlays the domain in a dark pill at the bottom-left of the card image; keep text and logos out of the bottom-left corner (about the lower 15% and left 40%). Keep important content away from the edges too: some apps crop to a different aspect or round the corners. ## Specs - Open Graph protocol (defines og:video and og:image and their structured properties): https://ogp.me/ (see https://ogp.me/#structured) - Apple TN3156, rich previews in Messages (the og:video autoplay rules): https://developer.apple.com/documentation/technotes/tn3156-create-rich-previews-for-messages - Discord link previews (og:video needs og:type video.* or twitter:card player): https://docs.discord.com/developers/link-previews/overview - X has no current public cards documentation; its old Card Validator was retired. ## Other files - OpenAPI spec: https://checkmyog.com/openapi.json - Platform support data: https://checkmyog.com/support.json ## Source, issues and pull requests Open source (MIT): https://github.com/twidtwid/checkmyog - Found a wrong verdict, or an app that previews differently than `support.json` says? Open an issue with the "Platform behavior" form: https://github.com/twidtwid/checkmyog/issues/new?template=platform.yml. Include the URL you checked, the app and its version, the device, and what you saw (a screenshot or screen recording is the best evidence). - Bug in the checker itself: https://github.com/twidtwid/checkmyog/issues/new?template=bug.yml with the URL checked and the JSON or Markdown report. - Pull requests are welcome, including ones written by agents. Read https://github.com/twidtwid/checkmyog/blob/main/CONTRIBUTING.md first (section "For AI agents"): run the tests, keep the server stdlib-only, cite a source for any change to `support.json`, and say in the PR that an agent wrote it. - Security problems (for example a way around the private-address block): don't open a public issue; see https://github.com/twidtwid/checkmyog/security/policy.