{"openapi":"3.1.0","info":{"title":"SMPTE Timecode","version":"0.1.0","description":"SMPTE timecode toolkit — parse, rebase between frame rates and do frame-exact arithmetic, with correct non-drop and drop-frame (29.97/59.94) counting.","x-guidance":"SMPTE timecode toolkit — parse, rebase between frame rates and do frame-exact arithmetic, with correct non-drop and drop-frame (29.97/59.94) counting. Each operation is an HTTP POST to its /v1/<operation> path with a JSON request body (see each operation's requestBody schema) and returns a JSON response. Endpoints are paid per successful call via x402 or MPP (USDC on Base); an unpaid request returns 402 with payment metadata in the WWW-Authenticate header.","contact":{"email":"hello@openverbs.com"}},"x-discovery":{"ownershipProofs":["0xb1401a71756f51464a9962db12f1eb3e9522490cd20010b06d00cf7b7770acfd5f79721f9dfdf2643f8cecd29af3bde9ec133941a386042b32d9886053a70de61b","0xc1c1f11793e18a00fcb7072421f26e89fb75b6aa517fa84370564991f4b10efa024f6f57e4e67eefd20cf46cc01fc5a62d793fa8fbcda04f26c946a3433d73f91b","0x676b474af0ef9ed4809b5d12d2e789b36e52d56215b21f601d71f76620e36ec630347116a7b2b349a3c3681e5db0fbfa76c4169a676b6d6f27864d0e5017284a1c","0xc2ab96522515ed9e9bc4f1a241b774bd48df42e951ddbf7f6aa8fc76f5a96a20421703e1ec402ce7eb1e4eabea3b6e4e4129cf39d56ea91cf4fcf38561fc94fc1c"]},"servers":[{"url":"https://timecode.openverbs.com"}],"paths":{"/health":{"get":{"summary":"Health check","security":[],"responses":{"200":{"description":"Healthy","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"service":{"type":"string"},"version":{"type":"string"}}}}}}}}},"/v1/parse":{"post":{"summary":"Parse timecode","description":"Parse an SMPTE timecode (HH:MM:SS:FF, or HH:MM:SS;FF for drop-frame) at a given frame rate into its components, total frame count and real-time seconds. Drop-frame is auto-detected from a ';' separator unless dropFrame is set. Out-of-range or non-existent drop-frame values are a clean 400. Paid endpoint (x402 + MPP). Price: $0.002000 USDC per successful payment.","tags":["parse timecode","smpte timecode parser","timecode to frames","drop frame detection","video frame count","timecode seconds lookup"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"timecode":{"type":"string","minLength":1,"maxLength":20,"description":"Timecode, e.g. 01:00:00:00 or 00:01:00;02."},"frameRate":{"type":"number","enum":[24,25,30,48,50,60,23.976,29.97,47.952,59.94],"description":"Frame rate, e.g. 24, 25, 29.97, 30, 59.94, 60."},"dropFrame":{"type":"boolean","description":"Force drop-frame counting (29.97/59.94 only). Default: auto-detect from separator."}},"required":["timecode","frameRate"],"additionalProperties":false},"example":{"timecode":"01:00:00:00","frameRate":24,"dropFrame":false}}}},"responses":{"200":{"description":"`{ timecode, frameRate, dropFrame, hours, minutes, seconds, frames, totalFrames, totalSeconds }`.","content":{"application/json":{"schema":{"type":"object","description":"`{ timecode, frameRate, dropFrame, hours, minutes, seconds, frames, totalFrames, totalSeconds }`."}}}},"400":{"description":"Invalid request; no payment is attempted"},"402":{"description":"Payment required; x402/MPP metadata returned in headers"},"502":{"description":"Upstream provider error after payment verification"}},"x-payment-info":{"amount":"2000","currency":"0x20c000000000000000000000b9537d11c60e8b50","description":"Parse an SMPTE timecode (HH:MM:SS:FF, or HH:MM:SS;FF for drop-frame) at a given frame rate into its components, total frame count and real-time seconds. Drop-frame is auto-detected from a ';' separator unless dropFrame is set. Out-of-range or non-existent drop-frame values are a clean 400.","method":"tempo","preferredOffer":"mpp-tempo","price":{"mode":"fixed","currency":"USD","amount":"0.002000"},"protocols":[{"x402":{"scheme":"exact","network":"eip155:8453","currency":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}},{"mpp":{"method":"evm","intent":"charge","network":"8453","currency":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}},{"mpp":{"method":"tempo","intent":"charge","network":"4217","currency":"0x20c000000000000000000000b9537d11c60e8b50","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}}],"network":"4217","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A","offers":[{"amount":"2000","currency":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","description":"Parse an SMPTE timecode (HH:MM:SS:FF, or HH:MM:SS;FF for drop-frame) at a given frame rate into its components, total frame count and real-time seconds. Drop-frame is auto-detected from a ';' separator unless dropFrame is set. Out-of-range or non-existent drop-frame values are a clean 400.","intent":"charge","method":"evm","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"},{"amount":"2000","currency":"0x20c000000000000000000000b9537d11c60e8b50","description":"Parse an SMPTE timecode (HH:MM:SS:FF, or HH:MM:SS;FF for drop-frame) at a given frame rate into its components, total frame count and real-time seconds. Drop-frame is auto-detected from a ';' separator unless dropFrame is set. Out-of-range or non-existent drop-frame values are a clean 400.","intent":"charge","method":"tempo","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}]}}},"/v1/convert":{"post":{"summary":"Convert / rebase timecode","description":"Rebase a timecode (or a raw frame count) from one frame rate to another on a real-time basis, so the wall-clock position is preserved. Give a source frameRate plus timecode or totalFrames, and a toFrameRate (with optional toDropFrame). Returns the target timecode, frame count and seconds. Paid endpoint (x402 + MPP). Price: $0.002000 USDC per successful payment.","tags":["convert timecode","rebase frame rate","timecode frame rate conversion","frames to timecode","drop frame conversion","video fps conversion"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"frameRate":{"type":"number","enum":[24,25,30,48,50,60,23.976,29.97,47.952,59.94],"description":"Source frame rate."},"dropFrame":{"type":"boolean","description":"Source drop-frame (auto-detected from a timecode separator if omitted)."},"toFrameRate":{"type":"number","enum":[24,25,30,48,50,60,23.976,29.97,47.952,59.94],"description":"Target frame rate."},"toDropFrame":{"type":"boolean","description":"Target drop-frame (29.97/59.94 only). Default false."},"timecode":{"type":"string","minLength":1,"maxLength":20,"description":"Source timecode (use instead of totalFrames)."},"totalFrames":{"type":"integer","minimum":0,"maximum":1000000000000,"description":"Source frame count (use instead of timecode)."}},"required":["frameRate","toFrameRate"],"additionalProperties":false},"example":{"frameRate":24,"toFrameRate":25,"timecode":"01:00:00:00","dropFrame":false,"toDropFrame":false}}}},"responses":{"200":{"description":"`{ timecode, totalFrames, totalSeconds, frameRate, dropFrame }`.","content":{"application/json":{"schema":{"type":"object","description":"`{ timecode, totalFrames, totalSeconds, frameRate, dropFrame }`."}}}},"400":{"description":"Invalid request; no payment is attempted"},"402":{"description":"Payment required; x402/MPP metadata returned in headers"},"502":{"description":"Upstream provider error after payment verification"}},"x-payment-info":{"amount":"2000","currency":"0x20c000000000000000000000b9537d11c60e8b50","description":"Rebase a timecode (or a raw frame count) from one frame rate to another on a real-time basis, so the wall-clock position is preserved. Give a source frameRate plus timecode or totalFrames, and a toFrameRate (with optional toDropFrame). Returns the target timecode, frame count and seconds.","method":"tempo","preferredOffer":"mpp-tempo","price":{"mode":"fixed","currency":"USD","amount":"0.002000"},"protocols":[{"x402":{"scheme":"exact","network":"eip155:8453","currency":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}},{"mpp":{"method":"evm","intent":"charge","network":"8453","currency":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}},{"mpp":{"method":"tempo","intent":"charge","network":"4217","currency":"0x20c000000000000000000000b9537d11c60e8b50","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}}],"network":"4217","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A","offers":[{"amount":"2000","currency":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","description":"Rebase a timecode (or a raw frame count) from one frame rate to another on a real-time basis, so the wall-clock position is preserved. Give a source frameRate plus timecode or totalFrames, and a toFrameRate (with optional toDropFrame). Returns the target timecode, frame count and seconds.","intent":"charge","method":"evm","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"},{"amount":"2000","currency":"0x20c000000000000000000000b9537d11c60e8b50","description":"Rebase a timecode (or a raw frame count) from one frame rate to another on a real-time basis, so the wall-clock position is preserved. Give a source frameRate plus timecode or totalFrames, and a toFrameRate (with optional toDropFrame). Returns the target timecode, frame count and seconds.","intent":"charge","method":"tempo","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}]}}},"/v1/add":{"post":{"summary":"Timecode arithmetic","description":"Add or subtract from a timecode, either another timecode (b) or a raw frame count (frames), at a given frame rate. Uses frame-exact SMPTE math (including drop-frame). A result below zero is rejected as a clean 400. Paid endpoint (x402 + MPP). Price: $0.002000 USDC per successful payment.","tags":["timecode arithmetic","add timecode","subtract timecode","add frames to timecode","frame exact calculation","smpte timecode math"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"frameRate":{"type":"number","enum":[24,25,30,48,50,60,23.976,29.97,47.952,59.94],"description":"Frame rate for both operands."},"dropFrame":{"type":"boolean","description":"Drop-frame counting (auto-detected from a's separator if omitted)."},"a":{"type":"string","minLength":1,"maxLength":20,"description":"The base timecode."},"b":{"type":"string","minLength":1,"maxLength":20,"description":"A timecode to add/subtract (use instead of frames)."},"frames":{"type":"integer","minimum":-1000000000000,"maximum":1000000000000,"description":"A frame count to add/subtract (use instead of b)."},"operation":{"type":"string","enum":["add","subtract"],"description":"Operation. Default add."}},"required":["frameRate","a"],"additionalProperties":false},"example":{"frameRate":24,"a":"01:00:00:00","b":"00:00:10:00","dropFrame":false,"operation":"add"}}}},"responses":{"200":{"description":"`{ timecode, totalFrames, totalSeconds, frameRate, dropFrame }`.","content":{"application/json":{"schema":{"type":"object","description":"`{ timecode, totalFrames, totalSeconds, frameRate, dropFrame }`."}}}},"400":{"description":"Invalid request; no payment is attempted"},"402":{"description":"Payment required; x402/MPP metadata returned in headers"},"502":{"description":"Upstream provider error after payment verification"}},"x-payment-info":{"amount":"2000","currency":"0x20c000000000000000000000b9537d11c60e8b50","description":"Add or subtract from a timecode, either another timecode (b) or a raw frame count (frames), at a given frame rate. Uses frame-exact SMPTE math (including drop-frame). A result below zero is rejected as a clean 400.","method":"tempo","preferredOffer":"mpp-tempo","price":{"mode":"fixed","currency":"USD","amount":"0.002000"},"protocols":[{"x402":{"scheme":"exact","network":"eip155:8453","currency":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}},{"mpp":{"method":"evm","intent":"charge","network":"8453","currency":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}},{"mpp":{"method":"tempo","intent":"charge","network":"4217","currency":"0x20c000000000000000000000b9537d11c60e8b50","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}}],"network":"4217","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A","offers":[{"amount":"2000","currency":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","description":"Add or subtract from a timecode, either another timecode (b) or a raw frame count (frames), at a given frame rate. Uses frame-exact SMPTE math (including drop-frame). A result below zero is rejected as a clean 400.","intent":"charge","method":"evm","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"},{"amount":"2000","currency":"0x20c000000000000000000000b9537d11c60e8b50","description":"Add or subtract from a timecode, either another timecode (b) or a raw frame count (frames), at a given frame rate. Uses frame-exact SMPTE math (including drop-frame). A result below zero is rejected as a clean 400.","intent":"charge","method":"tempo","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}]}}}},"x-service-info":{"categories":["media"],"docs":{"homepage":"https://timecode.openverbs.com","apiReference":"https://timecode.openverbs.com/openapi.json"}}}