English

저장한 흐름을 API·MCP 로 실행

워크플로 화면에서 만든 흐름은 내보내기 → 흐름 파일 받기로 작은 JSON 파일로 받을 수 있습니다. 단계와 옵션만 들어 있고 파일은 들어 있지 않습니다. 같은 흐름을 API 나 AI 도우미에서 화면과 같은 단계 규칙·같은 도구 코드로 실행합니다.

파일이 가는 곳

API: POST /v1/flows/run

curl -X POST https://toolsthatdontupload.com/v1/flows/run \
  -H "X-API-Key: 내_키" \
  -F 'flow={"schema":"ttdu.flow/v1","steps":[{"tool":"pdf.merge","scope":"all","options":{}}]}' \
  -F files=@a.pdf -F files=@b.pdf

JSON 으로도 보낼 수 있습니다: {"flow": {...}, "files": [{"name": "a.pdf", "base64": "..."}]}. 파일은 보낸 순서대로 처리합니다. 응답은 {"ok": true, "steps": [...], "notes": [...], "outputs": [{"name", "mime", "size", "sha256", "base64"}]} 입니다. notes 는 단계가 남긴 메모입니다(예: 가리기 단계가 가릴 정보를 찾지 못한 파일). 비어 있는 경우가 많습니다.

실행 때 받는 값 (vars)

흐름에 실행할 때 채울 값을 둘 수 있습니다. 예: 결과 파일 이름에 쓰는 거래처 이름 "vars": [{"key": "client", "label": "거래처"}] 와 단계의 "outName": "{client}-합본". 값은 폼 필드 vars 에 JSON 객체로 보냅니다(JSON 요청이면 vars 객체). "default": "today" 인 값은 비워 두면 실행 날짜(YYYYMMDD)가 들어갑니다.

curl -X POST https://toolsthatdontupload.com/v1/flows/run \
  -H "X-API-Key: 내_키" \
  -F 'flow={"schema":"ttdu.flow/v1","vars":[{"key":"client","label":"거래처"}],"steps":[{"tool":"pdf.merge","scope":"all","options":{},"outName":"{client}-합본"}]}' \
  -F 'vars={"client":"한빛상사"}' \
  -F files=@a.pdf -F files=@b.pdf

결과 이름은 한빛상사-합본.pdf 입니다. 선언한 값이 빠지면 422, "code": "needs_input", "details": {"reason": "vars", "missing": ["client"]} 로 답합니다. vars 가 JSON 객체가 아니면 400 입니다. MCP 에서는 run_flow 의 vars 인자로 같은 값을 넘깁니다.

도구 하나만 실행

도구별 주소는 따로 없고, 단계 하나짜리 흐름을 보냅니다. 예: 파일마다 모든 쪽을 90도 돌리기

curl -X POST https://toolsthatdontupload.com/v1/flows/run \
  -H "X-API-Key: 내_키" \
  -F 'flow={"schema":"ttdu.flow/v1","steps":[{"tool":"pdf.rotate","scope":"each","options":{"angle":90}}]}' \
  -F files=@scan.pdf

"scope": "each" 는 파일마다 따로, "all" 은 모든 파일을 한 번에(합치기처럼) 도구에 넘깁니다. 도구 이름과 옵션은 워크플로 화면에서 내보낸 흐름과 같습니다.

한도와 비용: 실행 1번은 PDF API 와 같은 파일 호출 1회입니다. 키가 있으면 하루 무료 파일 호출 20회 중 1회(넘으면 60크레딧), 키가 없으면 IP 당 하루 20회 중 1회입니다. 파일 20개·합계 15 MB(MCP 는 10 MB). 흐름이 오류로 멈춰도 1회로 셉니다.

오류: 400 흐름이 ttdu.flow/v1 이 아니거나 파일 없음, vars 가 JSON 객체가 아님, 413 크기 초과, 422 단계 실패(응답에 단계와 이유) 또는 브라우저가 필요한 단계(예: image.batch, 워크플로 화면에서 실행), 또는 값 빠짐(needs_input), 401·402·429 는 다른 API 와 같습니다.

이 주소와 HWP 주소의 OpenAPI 명세: /openapi/files.json (OpenAPI 3.0).

MCP: run_flow

MCP 서버(연결 방법)의 run_flow 도구에 flow 와 files: [{name, base64}], 값이 필요한 흐름이면 vars 를 넘깁니다. 같은 API 를 같은 한도로 씁니다.

세 곳의 결과가 같은지

2026-11-06 시험에서 같은 흐름 9개가 워크플로 화면·API·MCP 에서 바이트까지 같은 파일을 냈습니다: PDF 합치기, 용량 줄이기, 크기 맞추기, 쪽 고르기, 돌리기, 나누기, 사진→PDF, 워드 글 추출, PDF 요약.

내 컴퓨터에서 오프라인으로

네트워크 없이 같은 흐름을 돌리는 명령줄 실행기는 기업에 따로 제공합니다. 기업 문의.