{"success":true,"endpoints":[{"group":"site","method":"GET","path":"/api/views","title":"view counts","description":"See how many times the site and each page have been viewed.","auth":"none","response":"{ success, views, routes, timestamp }","example":"curl \"https://www.yourpov.dev/api/views\""},{"group":"site","method":"POST","path":"/api/views","title":"record a view","description":"Adds one view for this IP today.","auth":"none","query":[{"name":"route","required":false,"description":"page path, like /tools"}],"response":"{ success, views, routes, timestamp }","example":"curl -X POST \"https://www.yourpov.dev/api/views?route=/tools\""},{"group":"reviews","method":"GET","path":"/api/reviews","title":"published reviews","description":"list of reviews shown on my site.","auth":"none","response":"{ success, reviews, timestamp }","example":"curl \"https://www.yourpov.dev/api/reviews\""},{"group":"lookups","method":"GET","path":"/api/lookup/discord","title":"discord lookup","description":"Look up a discord profile, including its banner, badges, status and activity. limited per IP.","auth":"none","query":[{"name":"user","required":true,"description":"user id or profile link"}],"response":"{ success, profile, timestamp }","example":"curl \"https://www.yourpov.dev/api/lookup/discord?user=1470172610636808425\""},{"group":"lookups","method":"GET","path":"/api/lookup/roblox","title":"roblox lookup","description":"Look up a roblox profile, groups, badges and old usernames. pass outfits to get outfit data. limited per IP.","auth":"none","query":[{"name":"user","required":false,"description":"username, id or profile link. ignored when outfits is set"},{"name":"outfits","required":false,"description":"user id whose outfits to list"},{"name":"cursor","required":false,"description":"cursor for the next page of outfits"}],"response":"{ success, profile | outfits, timestamp }","example":"curl \"https://www.yourpov.dev/api/lookup/roblox?user=builderman\""},{"group":"lookups","method":"GET","path":"/api/lookup/media","title":"media downloader","description":"Pull mp4, images and gifs from an X post. limited per IP.","auth":"none","query":[{"name":"url","required":true,"description":"x post link"}],"response":"{ success, post, timestamp }","example":"curl \"https://www.yourpov.dev/api/lookup/media?url=https://x.com/goingmiaa/status/2087387479494017525\""},{"group":"lookups","method":"GET","path":"/api/lookup/twitter/<post link>","title":"media file","description":"Download the mp4, image or gif from an X post as file bytes. append the post link to the path, pass index for multi-file posts. limited per IP.","auth":"none","query":[{"name":"index","required":false,"description":"1-based file number on the post, default 1"}],"response":"file bytes with content-disposition set to the original file name","example":"curl -o \"Download.mp4\" \"https://www.yourpov.dev/api/lookup/twitter/https://x.com/goingmiaa/status/2087387479494017525\""},{"group":"github","method":"GET","path":"/api/github-summary","title":"github summary","description":"Profile stats from a cache. refreshes about every 30 minutes.","auth":"none","response":"{ success, summary, timestamp }","example":"curl \"https://www.yourpov.dev/api/github-summary\""},{"group":"github","method":"GET","path":"/api/github-streak","title":"github streak","description":"An svg streak card you can drop into a readme.","auth":"none","response":"image/svg+xml","example":"<img src=\"https://www.yourpov.dev/api/github-streak\">"},{"group":"images","method":"GET","path":"/images/waifu","title":"random image","description":"Get one random waifu.im image through this domain. use the filters below.","auth":"key only required for nsfw","query":[{"name":"IncludedTags","required":false,"description":"repeatable. every tag must match, like waifu"},{"name":"ExcludedTags","required":false,"description":"repeatable. skip images with any of these tags"},{"name":"IncludedArtists","required":false,"description":"repeatable. artist names to include"},{"name":"ExcludedArtists","required":false,"description":"repeatable. artist names to skip"},{"name":"IncludedIds","required":false,"description":"repeatable. only choose from these image ids"},{"name":"ExcludedIds","required":false,"description":"repeatable. never choose these image ids"},{"name":"IsNsfw","required":false,"description":"False by default, True, or All. True and All need a key"},{"name":"IsAnimated","required":false,"description":"False, True, or All"},{"name":"Orientation","required":false,"description":"All, Landscape, Portrait, or Square"},{"name":"Width","required":false,"description":"pixels. exact, or a range like >=1920 or 1280..1920"},{"name":"Height","required":false,"description":"pixels. same format as Width"},{"name":"ByteSize","required":false,"description":"bytes. same format. defaults to <=4400000"},{"name":"format","required":false,"description":"image by default, or json for details about the image"},{"name":"key","required":false,"description":"key from /waifu/. pair with IsNsfw=True or All to unlock nsfw and get a higher limit"}],"response":"image bytes (image/png, image/jpeg, ...)","example":"curl -o waifu.jpg \"https://www.yourpov.dev/images/waifu?IncludedTags=maid\"\n# NSFW:\ncurl -o waifu.jpg \"https://www.yourpov.dev/images/waifu?key=YOUR_KEY&IsNsfw=True\"","note":"NSFW needs a key. Generate one free, no account needed: https://www.yourpov.dev/waifu/"},{"group":"images","method":"GET","path":"/images/waifu","title":"image metadata","description":"Get the same random pick as image details. the returned url serves the file from this domain.","auth":"key only required for nsfw","query":[{"name":"format","required":true,"description":"json. the filters from random image work here too"}],"response":"{ success, image: { url, width, height, tags, artists, source, dominantColor }, attribution, timestamp }","example":"curl \"https://www.yourpov.dev/images/waifu?IncludedTags=waifu&format=json\""},{"group":"images","method":"GET","path":"/images/waifu/<file>","title":"image by link","description":"Serve one image from this domain. first call image metadata with format=json, it returns a signed url in image.url. curl that url to download the bytes. the signature expires, so always fetch a fresh url, never hardcode one.","auth":"none. the link signature is the permission","query":[{"name":"sig","required":true,"description":"signature from the image.url returned by format=json (fetch a fresh one, it expires)"}],"response":"image bytes (image/png, image/jpeg, ...)","example":"URL=$(curl -s \"https://www.yourpov.dev/images/waifu?IncludedTags=waifu&format=json\" | jq -r .image.url)\ncurl -o waifu.png \"$URL\"","examplePs":"$URL = (curl.exe -s \"https://www.yourpov.dev/images/waifu?IncludedTags=waifu&format=json\" | jq -r .image.url)\ncurl.exe -o waifu.png $URL","note":"The filter step needs jq installed."},{"group":"keys","method":"GET","path":"/waifu/","title":"api keys","description":"Generate a key without making an account. it unlocks nsfw images plus a higher limit.","auth":"none","response":"text/html","example":"https://www.yourpov.dev/waifu/","exampleLang":"link","note":"Open the URL above in your browser. the key stays in this browser."},{"group":"keys","method":"POST","path":"/api/keys/generate","title":"generate a key","description":"Make up to 10 keys per browser, 10 per hour and 20 per day per IP. the secret is shown once.","auth":"none","body":"{ label?: string (60 characters or fewer) }","response":"{ success, id, label, createdAt, key, timestamp }","example":"curl -s -X POST \"https://www.yourpov.dev/api/keys/generate\" -c cookies.txt","note":"Saves an owner cookie to cookies.txt in the current folder. Pass it back with -b on the list and revoke examples below."},{"group":"keys","method":"GET","path":"/api/keys/list","title":"your keys","description":"List the keys generated in this browser. uses the owner cookie saved as cookies.txt by the generate example.","auth":"owner cookie","response":"{ success, keys: [{ id, label, createdAt, lastUsedAt }], timestamp }","example":"curl -s -b cookies.txt \"https://www.yourpov.dev/api/keys/list\""},{"group":"keys","method":"DELETE","path":"/api/keys/revoke","title":"revoke a key","description":"Revoke it immediately. anything still using it stops working. the id comes from the generate or list response above.","auth":"owner cookie","body":"{ id: \"<16 hex chars>\" }","response":"{ success, revoked, timestamp }","example":"KEY_ID=\ncurl -s -X DELETE \"https://www.yourpov.dev/api/keys/revoke\" -H \"Content-Type: application/json\" -b cookies.txt -d \"{\\\"id\\\":\\\"$KEY_ID\\\"}\"","examplePs":"$KEY_ID = \"\"\n$Body = @{ id = $KEY_ID } | ConvertTo-Json -Compress\ncurl.exe -s -X DELETE \"https://www.yourpov.dev/api/keys/revoke\" -H \"Content-Type: application/json\" -b cookies.txt -d $Body","note":"Replace the id with one from the generate or list response above."},{"group":"meta","method":"GET","path":"/api/endpoints","title":"this page","description":"Get this list as json.","auth":"none","query":[{"name":"format","required":false,"description":"set to json for the list"}],"response":"html, or { success, endpoints, timestamp }","example":"curl \"https://www.yourpov.dev/api/endpoints?format=json\""}],"timestamp":"2026-10-06T21:08:12.971Z"}