APIs & widgets for developers
APIs and widgets that let you use our world clock, QR codes, polls and calculators on your own site or in your own program. They are free and need no sign-up or key.
The clock below is the script widget (Seoul, London, New York)
Common rules
- Every address starts with https://appdogu.com. Answers are JSON (UTF-8), except QR images, which are PNG or SVG.
- APIs without a key send Access-Control-Allow-Origin: *, so browser scripts on other sites can call them too.
- Each IP address can make up to 60 calls a minute. Above that you get 429 with a Retry-After header (in seconds). Wait a little and try again.
- The responses below are examples. Times, codes and counts differ on each call.
- Bad input returns 400 with {"ok":false,"error":"name","message":"what went wrong"}. Unknown codes return 404.
- If the part after ? contains things like localhost, SQL words (select, union and so on), javascript: or text starting with 0x, our server's security rules block it with 403. For APIs that take text, like QR, send it with POST in a JSON body instead.
- What you make through the API and the request details (IP address, browser information, referring page) are recorded to prevent illegal use.
World clock API
GET /api/v1/time/now?tz=Asia/Seoul,Europe/London
Gives the current time in each time zone. Put up to 10 IANA time zone names in tz, separated by commas. Without tz you get UTC.
curl "https://appdogu.com/api/v1/time/now?tz=Asia/Seoul,Europe/London" {"ok":true,"unix":1793769006,"utc":"2026-11-04T05:10:06Z","zones":[
{"tz":"Asia/Seoul","iso":"2026-11-04T14:10:06+09:00","utc":"2026-11-04T05:10:06Z","offset":"+09:00","offset_sec":32400,"dst":false,"abbr":"KST"},
{"tz":"Europe/London","iso":"2026-11-04T05:10:06+00:00","utc":"2026-11-04T05:10:06Z","offset":"+00:00","offset_sec":0,"dst":false,"abbr":"GMT"}]} dst tells you whether daylight saving time is on at that moment. abbr is the zone abbreviation; zones without one come back like +04. This answer is not cached.
GET /api/v1/time/meet/<code>
The meeting time behind a share link made on our world clock page (/t/<code>). You get the start and end (UTC), length in minutes, title, and each city with its local time. Nothing like the edit key is included.
{"ok":true,"code":"Ab3xY","title":"Weekly call","start":"2026-11-10T01:00:00Z","start_unix":1794358800,"end":"2026-11-10T02:00:00Z","duration_min":60,
"cities":[{"id":"seoul","name":{"en":"Seoul","ko":"서울"},"country":"KR","tz":"Asia/Seoul","start":"2026-11-10T10:00:00+09:00","end":"2026-11-10T11:00:00+09:00"}],
"url":"https://appdogu.com/t/Ab3xY"}
Calculator API
These use the same formulas and rounding as our calculator pages. Money comes back as text (for example "10000" or "10.50") so no digits are lost. dec=0 means whole units such as won, dec=2 means two decimal places (default 0).
GET /api/v1/calc/vat
Splits VAT out of a total, or adds it to a net price.
| Parameter | Meaning |
|---|---|
total | Total with VAT included (splits it into net and VAT) |
net | Net price before VAT (adds VAT on top) |
rate | VAT rate in % · default 10 |
round | Rounding of the last unit · floor (default) · round · ceil |
dec | 0 or 2 |
GET https://appdogu.com/api/v1/calc/vat?total=11000
{"ok":true,"mode":"total","rate":10.0,"round":"floor","dec":0,"net":"10000","vat":"1000","total":"11000"} GET /api/v1/calc/convert?from=km&to=mi&v=10
Unit conversion. Leave out cat and we find the group that holds both units.
| Group (cat) | Units |
|---|---|
length | mm cm m km in ft yd mi nmi |
weight | mg g kg t oz lb st don |
temperature | C F K |
area | mm2 cm2 m2 km2 a ha in2 ft2 yd2 ac mi2 py |
volume | ml L m3 usgal ukgal usqt uspt uscup usfloz ukfloz tbsp tsp |
speed | ms kmh mph kn fts |
data | bit B kbit Mbit Gbit KB MB GB TB PB KiB MiB GiB TiB PiB |
fuel | kml l100 mpgus mpguk |
GET https://appdogu.com/api/v1/calc/convert?from=km&to=mi&v=10
{"ok":true,"cat":"length","from":"km","to":"mi","v":10.0,"result":6.2137119223733395} py is the Korean pyeong (400/121 m²) and don is 3.75 g. result is not rounded, so round it yourself for display.
GET /api/v1/calc/margin?price=20000&cost=10000&ship=3000&fee=10
From price, cost, shipping (ship), other costs, fee % and VAT % (leave vat out to skip it) you get the payout and margin.
{"ok":true,"dec":0,"fee":"2000","payout":"18000","vat_owed":"0","margin":"5000","margin_rate":25.0} GET /api/v1/calc/price?cost=10000&margin=20&fee=10
Works back to a selling price from target margin %, fee % and instant discount %. step is the round-up unit (1, 10 or 100 of the smallest unit).
{"ok":true,"dec":0,"price":"14286","discount":"0","customer_pays":"14286","fee":"1429","vat_owed":"0","margin":"2857","margin_rate":19.9986} GET /api/v1/calc/percent?op=of&x=15&y=200
op=of is x% of y, op=what is what percent x is of y, and op=change is the percent change from "from" to "to".
GET https://appdogu.com/api/v1/calc/percent?op=of&x=15&y=200 → {"ok":true,"op":"of","result":30.0}
GET https://appdogu.com/api/v1/calc/percent?op=change&from=80&to=100 → {"ok":true,"op":"change","result":25.0,"diff":20.0}
Poll results API
GET /api/v1/poll/results/<code>
Only for polls whose maker chose "everyone can see results", or polls that have closed. Other polls return 404. You get the question, options, vote counts and percentages, and nothing about who voted. Cached for 10 seconds.
{"ok":true,"code":"zvfb8","question":"Lunch?","multi":false,"closed":false,"close_at":null,"voters":12,
"options":[{"text":"Noodles","votes":7,"pct":58},{"text":"Rice","votes":5,"pct":42}],"url":"https://appdogu.com/p/zvfb8"}
QR code API
GET /api/v1/qr/png?d=<text>&s=300&ec=M&m=4
Returns the QR image directly, so you can use it in <img src>. /api/v1/qr/svg takes the same values and returns SVG. Cached for one day.
| Parameter | Meaning |
|---|---|
d | Text to encode (UTF-8, up to 1000 characters, URL-encoded in the address) |
s | Image size in pixels, 64 to 1024, default 300. If it is smaller than the number of modules, it grows to fit |
ec | Error correction level L, M, Q or H, default M |
m | Quiet zone in modules, 0 to 8, default 4 |
<img src="https://appdogu.com/api/v1/qr/png?d=https%3A%2F%2Fexample.com&s=240" width="240" height="240" alt="QR code"> If your text has blocked words or is long, use POST. The X-QR-Version response header tells you the QR version used.
curl -X POST "https://appdogu.com/api/v1/qr/png" -H "Content-Type: application/json" \
-d '{"d":"WIFI:T:WPA;S:MyCafe;P:secret;;","s":400,"ec":"Q"}' -o qr.png GET /api/v1/qr/stats/<code>
Daily scan counts for a dynamic QR code (/q/<code>). Put that code's management key in the X-Edit-Key header. In your management link /qr/edit#code.key, the part after the dot is the key. Keep the key out of browser scripts (this API is not open to browser calls from other sites).
curl -H "X-Edit-Key: <key>" "https://appdogu.com/api/v1/qr/stats/Ab3xY"
{"ok":true,"code":"Ab3xY","total":42,"days":[{"date":"2026-11-04","scans":5,"korea":4}],"note":"Last 90 days, Korea time. Bots are not counted."}
Widgets
You can pick options and copy ready-made code from the "Add to your site" box on the world clock, calculator and poll management pages.
World clock · script
<script src="https://appdogu.com/embed/clock.js" data-tz="Asia/Seoul,Europe/London" data-lang="ko" data-theme="light" data-seconds="1" async></script> | Attribute | Meaning |
|---|---|
data-tz | Up to 10 IANA time zones, comma-separated. To rename one, add it after |, like Asia/Seoul|Head office |
data-lang | ko · en |
data-theme | light · dark |
data-seconds | 1 shows seconds |
The clock appears right where you paste the script. It draws inside a Shadow DOM, so it does not mix with your site's CSS, and you can put several on one page. The time comes from the visitor's device clock and the browser's time zone rules.
World clock · iframe
<iframe src="https://appdogu.com/embed/clock#tz=Asia/Seoul,Europe/London&lang=ko&theme=dark&seconds=1" width="100%" height="130" loading="lazy" title="World clock" style="border:0"></iframe> Settings go after #. That part never reaches the server, so it cannot trip the security rules.
Calculator · iframe
<iframe src="https://appdogu.com/embed/calc/vat?lang=ko" width="100%" height="330" loading="lazy" title="VAT calculator" style="border:0"></iframe> Calculators you can embed: vat, percent, length, weight, temperature, area, volume, speed, data, fuel · lang=ko|en · theme=light|dark
Poll · iframe
<iframe src="https://appdogu.com/embed/poll/<code>" width="100%" height="380" loading="lazy" title="Poll" style="border:0"></iframe> People vote right inside the iframe. If the browser blocks the cookie we use for one vote per browser inside other sites, a "Vote in a new window" button shows instead. Browsers keep cookies separate per site, so the same person could vote once on our poll page and once in an iframe on another site.
Blogs and site builders
We have not tried these ourselves yet. Some services remove script or iframe code, so if one does not work, try the other.
- WordPress · Paste the script or iframe code into a Custom HTML block.
- Tistory · Switch the editor to HTML mode and paste it, or add it in the skin editor.
- Notion · Notion does not run scripts. Paste only the iframe address (the URL inside src) into an Embed block.
- Naver Blog · Not checked yet. We do not know whether Naver Blog accepts our script or iframe code. We will update this once we have checked.
Questions people ask
Do I need an API key?
No. These APIs are free and need no key. Each IP address can make up to 60 calls a minute.
Why do I get a 403 error?
Our server blocks some text after the ? in an address, such as localhost, SQL words or javascript:. For the QR API, send the text with POST in a JSON body instead.
Does the clock widget work on Naver Blog?
We have not checked yet, so we do not know whether Naver Blog accepts our script or iframe code.