개발자용 API · 위젯
세계 시간·QR 코드·투표·계산기를 내 사이트나 프로그램에서 쓸 수 있게 열어 둔 API 와 위젯이에요. 가입이나 키 없이 무료로 써요.
아래 시계가 script 위젯이에요(서울·런던·뉴욕)
공통 규칙
- 주소는 모두 https://appdogu.com 로 시작해요. 답은 JSON(UTF-8)이고 QR 그림만 PNG·SVG 예요.
- 키가 없는 API 는 Access-Control-Allow-Origin: * 를 보내서 다른 사이트의 브라우저 스크립트에서도 불러 쓸 수 있어요.
- IP 하나에 1분 60번까지예요. 넘으면 429 와 Retry-After(초) 머리가 와요. 잠시 기다렸다 다시 불러 주세요.
- 아래 응답은 예시예요. 시각·코드·수는 부를 때마다 달라요.
- 잘못된 값에는 400 과 {"ok":false,"error":"이름","message":"설명"} 이 와요. 없는 코드는 404 예요.
- 주소 뒤 ?… 에 localhost, SQL 낱말(select, union 등), javascript:, 0x 로 시작하는 글 같은 것이 들어가면 서버 보안 규칙이 403 으로 막아요. QR 처럼 글을 보내는 API 는 POST(JSON 몸통)로 보내면 돼요.
- API 로 만든 내용과 접속 정보(IP·브라우저 정보·보낸 쪽 주소)는 불법 사용을 막기 위해 기록해요.
세계 시간 API
GET /api/v1/time/now?tz=Asia/Seoul,Europe/London
지금 시각을 시간대마다 줘요. tz 에 IANA 시간대 이름을 쉼표로 10개까지 넣어요. 없으면 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 는 그 시각에 서머타임인지예요. abbr 는 시간대 약자이고, 약자가 없는 곳은 +04 같은 꼴로 와요. 이 답은 캐시하지 않아요.
GET /api/v1/time/meet/<code>
세계 시간 쪽에서 만든 공유 링크(/t/<코드>)의 모임 시각이에요. 시작·끝(UTC)·길이(분)·제목·도시와 그 도시 시각만 줘요. 고치는 링크의 비밀값 같은 것은 주지 않아요.
{"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"}
계산기 API
우리 계산기 쪽과 같은 식, 같은 끝수 처리로 셈해요. 돈은 글자(예: "10000", "10.50")로 와서 끝자리가 틀어지지 않아요. dec=0 이면 원 단위, dec=2 면 소수 두 자리예요(기본 0).
GET /api/v1/calc/vat
부가세 나누기·더하기예요.
| 값 | 뜻 |
|---|---|
total | 부가세가 들어 있는 합계(이것을 넣으면 공급가와 세액으로 나눔) |
net | 부가세 전 공급가(이것을 넣으면 세액을 더함) |
rate | 세율 % · 기본 10 |
round | 원(센트) 아래 끝수 · floor(버림, 기본) · round(반올림) · ceil(올림) |
dec | 0 또는 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
단위 변환이에요. cat 을 빼면 두 단위가 들어 있는 묶음을 찾아요.
| 묶음(cat) | 단위 |
|---|---|
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 는 평(400/121 m²), don 은 돈(3.75 g)이에요. result 는 반올림하지 않은 수라서 보여 줄 때 알맞게 줄여 주세요.
GET /api/v1/calc/margin?price=20000&cost=10000&ship=3000&fee=10
판매가·매입가·배송비·기타(other)·수수료율(fee %)·부가세율(vat %, 비우면 안 뺌)로 정산금액과 마진을 구해요.
{"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
원하는 마진율(margin %)·수수료율(fee %)·즉시할인율(discount %)로 판매가를 거꾸로 구해요. step 은 올림 단위(1·10·100 최소 단위)예요.
{"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 는 y 의 x%, op=what 은 x 가 y 의 몇 %, op=change 는 from 에서 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}
투표 결과 API
GET /api/v1/poll/results/<code>
만든 사람이 '누구나 바로 보기'로 둔 투표, 또는 마감된 투표의 결과만 줘요. 그 밖의 투표는 404 예요. 질문·보기·표 수·%만 있고 누가 투표했는지는 없어요. 10초 캐시예요.
{"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 코드 API
GET /api/v1/qr/png?d=<text>&s=300&ec=M&m=4
QR 그림을 바로 줘요. <img src> 에 그대로 넣어도 돼요. /api/v1/qr/svg 는 같은 값으로 SVG 를 줘요. 하루 동안 캐시해요.
| 값 | 뜻 |
|---|---|
d | 넣을 글(UTF-8 · 1000자까지 · 주소에 넣을 때는 URL 인코딩) |
s | 한 변 픽셀 64~1024 · 기본 300 · 칸 수보다 작으면 칸 수에 맞춰 커짐 |
ec | 오류 정정 단계 L·M·Q·H · 기본 M |
m | 둘레 여백 칸 수 0~8 · 기본 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"> 글에 막히는 낱말이 있거나 길면 POST 로 보내요. 응답 머리 X-QR-Version 에 QR 판 번호가 와요.
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>
움직이는 QR(/q/<코드>)의 날마다 찍힌 수예요. 그 QR 의 관리 비밀값을 X-Edit-Key 머리에 넣어야 해요. 관리 링크 /qr/edit#코드.비밀값 에서 점 뒤가 비밀값이에요. 비밀값을 브라우저 스크립트에 넣지 마세요(이 API 는 다른 사이트 브라우저에서 부르는 것을 열어 두지 않았어요).
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."}
위젯 넣기
코드는 세계 시간·계산기·투표 관리 쪽의 '내 사이트에 넣기' 상자에서 골라 만들고 복사할 수 있어요.
세계 시간 · 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> | 속성 | 뜻 |
|---|---|
data-tz | IANA 시간대를 쉼표로 10개까지 · 이름을 바꾸려면 Asia/Seoul|본사 처럼 | 뒤에 |
data-lang | ko · en |
data-theme | light · dark |
data-seconds | 1 이면 초까지 |
스크립트를 붙인 바로 그 자리에 시계가 그려져요. Shadow DOM 안에 그려서 내 사이트 CSS 와 섞이지 않고, 한 쪽에 여러 개 넣어도 돼요. 시각은 보는 사람 기기의 시계와 브라우저 시간대 규칙으로 셈해요.
세계 시간 · 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> 설정은 # 뒤에 적어요. # 뒤는 서버로 가지 않아서 보안 규칙에 걸리지 않아요.
계산기 · iframe
<iframe src="https://appdogu.com/embed/calc/vat?lang=ko" width="100%" height="330" loading="lazy" title="VAT calculator" style="border:0"></iframe> 넣을 수 있는 계산기: vat, percent, length, weight, temperature, area, volume, speed, data, fuel · lang=ko|en · theme=light|dark
투표 · iframe
<iframe src="https://appdogu.com/embed/poll/<code>" width="100%" height="380" loading="lazy" title="Poll" style="border:0"></iframe> iframe 안에서 바로 투표해요. 한 표를 가리는 쿠키를 브라우저가 다른 사이트 안에서 막으면 '새 창에서 투표하기' 단추가 대신 나와요. 브라우저가 쿠키를 사이트마다 나눠 두기 때문에, 같은 사람이 우리 투표 쪽과 다른 사이트의 iframe 에서 따로 한 표씩 낼 수 있어요.
블로그·사이트별 안내
아래 곳들에 우리가 직접 넣어 본 적은 아직 없어요. 서비스에 따라 script 나 iframe 을 지우는 곳이 있으니, 하나가 안 되면 다른 코드를 써 보세요.
- 워드프레스 · '사용자 정의 HTML' 블록에 script 나 iframe 코드를 붙여요.
- 티스토리 · 글쓰기를 HTML 모드로 바꿔 붙이거나, 블로그 꾸미기의 스킨 편집에서 넣어요.
- 노션 · 노션은 script 를 받지 않아요. '임베드' 블록에 iframe 주소(src 안의 주소)만 붙여요.
- 네이버 블로그 · 아직 확인하지 못했어요. 네이버 블로그가 우리 script 나 iframe 코드를 받는지 모르는 상태예요. 확인하면 여기에 적을게요.
자주 묻는 것
API 키가 있어야 하나요?
아니요. 키 없이 무료로 써요. IP 하나에 1분 60번까지 부를 수 있어요.
403 오류가 나요.
주소의 ? 뒤에 localhost, SQL 낱말, javascript: 같은 글이 있으면 서버 보안 규칙이 막아요. QR API 는 글을 POST(JSON 몸통)로 보내 주세요.
네이버 블로그에도 시계 위젯을 넣을 수 있나요?
아직 확인하지 못했어요. 네이버 블로그가 우리 script 나 iframe 코드를 받는지 모르는 상태예요.