{"openapi":"3.1.0","info":{"title":"Toolty API","version":"1.0.0","description":"Pay-as-you-go document processing. Upload a file to the signed URL you receive, start the job, poll it (or receive a webhook), then fetch the result. Files are deleted at most one hour after processing. Each delivered result is charged once, from your prepaid balance, per second of processing: from the moment a worker starts the job to its end, rounded up to the next second, at the tool's `pricePerSecondUsd`. Failed jobs are not charged. Opening or starting a job requires a balance covering one minute of the tool's processing. One open upload per key at a time. Webhooks: pass `webhook` (HTTPS) when starting a job; we POST `{ id, type: \"job.completed\", createdAt, data: { job } }` with the header `Toolty-Signature: t=<unix seconds>,v1=<hex HMAC-SHA256 of \"t.body\" with your key's webhook secret>`, and retry after 1 min, 5 min, 30 min, 2 h, 6 h, 12 h and 24 h until a 2xx answer."},"servers":[{"url":"https://toolty.io/api/v1/public"}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"An API key: tk_live_…"}},"schemas":{"Job":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"tool":{"type":"string"},"status":{"type":"string","enum":["upload","queued","processing","succeeded","failed","expired"]},"position":{"type":"integer"},"error":{"type":"string"},"result":{"type":"object","properties":{"size":{"type":"integer"},"expiresAt":{"type":"string","format":"date-time"}}}}},"Error":{"type":"object","properties":{"error":{"type":"string"}}}}},"security":[{"bearer":[]}],"x-tools":[{"id":"ocr-pdf","title":"OCR PDF: make a scanned PDF searchable","available":true,"pricePerSecondUsd":0.003427,"accepts":["application/pdf"],"formats":["PDF"],"maxSizeMb":100,"maxPages":100,"options":{"langue":{"title":"Document language","description":"English is recognized alongside the chosen language.","values":{"fra":"French","eng":"English","spa":"Spanish","deu":"German","por":"Portuguese","ita":"Italian","ara":"Arabic","chi-sim":"Chinese (Simplified)","chi-tra":"Chinese (Traditional)","jpn":"Japanese","kor":"Korean"},"enum":["fra","eng","spa","deu","por","ita","ara","chi-sim","chi-tra","jpn","kor"],"default":"eng"},"redresser":{"title":"Straighten tilted pages","values":{"oui":"Yes","non":"No"},"enum":["oui","non"],"default":"oui"},"pivoter":{"title":"Rotate sideways pages","values":{"oui":"Yes","non":"No"},"enum":["oui","non"],"default":"oui"},"nettoyer":{"title":"Clean background","description":"Removes stains and grey before reading, for poor-quality scans.","values":{"non":"No","oui":"Yes"},"enum":["non","oui"],"default":"non"}},"translations":{"fr":{"title":"OCR PDF : rendre un PDF scanné cherchable","options":{"langue":{"title":"Langue du document","description":"L'anglais est reconnu en plus de la langue choisie.","values":{"fra":"Français","eng":"Anglais","spa":"Espagnol","deu":"Allemand","por":"Portugais","ita":"Italien","ara":"Arabe","chi-sim":"Chinois simplifié","chi-tra":"Chinois traditionnel","jpn":"Japonais","kor":"Coréen"}},"redresser":{"title":"Redresser les pages penchées","values":{"oui":"Oui","non":"Non"}},"pivoter":{"title":"Pivoter les pages couchées","values":{"oui":"Oui","non":"Non"}},"nettoyer":{"title":"Nettoyer le fond","description":"Retire taches et grisé avant la lecture, pour les scans de mauvaise qualité.","values":{"non":"Non","oui":"Oui"}}}}}},{"id":"word-to-pdf","title":"Convert Word to PDF","available":true,"pricePerSecondUsd":0.001714,"accepts":["application/vnd.openxmlformats-officedocument.wordprocessingml.document","application/msword","application/vnd.oasis.opendocument.text","application/rtf","text/rtf"],"formats":["DOCX","DOC","ODT","RTF"],"maxSizeMb":50,"maxPages":500,"options":{},"translations":{"fr":{"title":"Convertir un document Word en PDF","options":{}}}},{"id":"excel-to-pdf","title":"Convert Excel to PDF","available":true,"pricePerSecondUsd":0.00257,"accepts":["application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","application/vnd.ms-excel","application/vnd.oasis.opendocument.spreadsheet"],"formats":["XLSX","XLS","ODS"],"maxSizeMb":50,"maxPages":500,"options":{"feuilles":{"title":"Sheets","description":"Hidden sheets are never printed.","values":{"toutes":"All","premiere":"First only"},"enum":["toutes","premiere"],"default":"toutes"},"miseEnPage":{"title":"Layout","description":"Automatic: the workbook's own page setup if it has one, otherwise each sheet fitted to the page width.","values":{"auto":"Automatic","ajuster":"Fit to width","tel-quel":"As is"},"enum":["auto","ajuster","tel-quel"],"default":"auto"},"orientation":{"title":"Orientation","values":{"fichier":"From workbook","portrait":"Portrait","paysage":"Landscape"},"enum":["fichier","portrait","paysage"],"default":"fichier"}},"translations":{"fr":{"title":"Convertir un fichier Excel en PDF","options":{"feuilles":{"title":"Feuilles","description":"Les feuilles masquées ne sont jamais imprimées.","values":{"toutes":"Toutes","premiere":"La première"}},"miseEnPage":{"title":"Mise en page","description":"Automatique : la mise en page du classeur s'il en a une, sinon chaque feuille à la largeur de la page.","values":{"auto":"Automatique","ajuster":"Ajuster à la largeur","tel-quel":"Telle quelle"}},"orientation":{"title":"Orientation","values":{"fichier":"Du classeur","portrait":"Portrait","paysage":"Paysage"}}}}}},{"id":"powerpoint-to-pdf","title":"Convert PowerPoint to PDF","available":true,"pricePerSecondUsd":0.001714,"accepts":["application/vnd.openxmlformats-officedocument.presentationml.presentation","application/vnd.ms-powerpoint","application/vnd.oasis.opendocument.presentation"],"formats":["PPTX","PPT","ODP"],"maxSizeMb":50,"maxPages":300,"options":{"notes":{"title":"Pages","description":"With notes: one page per slide, the slide at the top, your notes below.","values":{"non":"Slides","oui":"With notes"},"enum":["non","oui"],"default":"non"}},"translations":{"fr":{"title":"Convertir un PowerPoint en PDF","options":{"notes":{"title":"Pages","description":"Avec les notes : une page par diapositive, la diapositive en haut, vos notes dessous.","values":{"non":"Diapositives","oui":"Avec les notes"}}}}}},{"id":"pdf-to-word","title":"Convert PDF to editable Word","available":true,"pricePerSecondUsd":0.00514,"accepts":["application/pdf"],"formats":["PDF"],"maxSizeMb":50,"maxPages":50,"options":{"mise-en-page":{"title":"Layout","description":"\"Faithful\" reproduces each page; \"Editable\" rebuilds the structure (headings, lists, tables) for reworking the text.","values":{"fidele":"Faithful to the original","modifiable":"Editable document"},"enum":["fidele","modifiable"],"default":"fidele"},"langue":{"title":"Document language","description":"Used to read scanned pages; English is recognized as well.","values":{"fra":"French","eng":"English","spa":"Spanish","deu":"German","por":"Portuguese","ita":"Italian","ara":"Arabic","chi-sim":"Chinese (Simplified)","chi-tra":"Chinese (Traditional)","jpn":"Japanese","kor":"Korean"},"enum":["fra","eng","spa","deu","por","ita","ara","chi-sim","chi-tra","jpn","kor"],"default":"eng"}},"translations":{"fr":{"title":"Convertir un PDF en Word modifiable","options":{"mise-en-page":{"title":"Mise en page","description":"« Fidèle » reproduit chaque page ; « Modifiable » rend la structure (titres, listes, tableaux) pour retravailler le texte.","values":{"fidele":"Fidèle à l'original","modifiable":"Document modifiable"}},"langue":{"title":"Langue du document","description":"Sert à lire les pages scannées ; l'anglais est reconnu en plus.","values":{"fra":"Français","eng":"Anglais","spa":"Espagnol","deu":"Allemand","por":"Portugais","ita":"Italien","ara":"Arabe","chi-sim":"Chinois simplifié","chi-tra":"Chinois traditionnel","jpn":"Japonais","kor":"Coréen"}}}}}}],"paths":{"/tools":{"get":{"summary":"List the tools open to the API, their price per second of processing and their options (`x-tools` also lists those coming soon, with `available: false`)","responses":{"200":{"description":"Tools"}}}},"/balance":{"get":{"summary":"Your prepaid balance, in US dollars","responses":{"200":{"description":"Balance"}}}},"/jobs":{"post":{"summary":"Open a job and receive the signed URL where to upload the file","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["tool","size","type"],"properties":{"tool":{"type":"string","enum":["ocr-pdf","word-to-pdf","excel-to-pdf","powerpoint-to-pdf","pdf-to-word"]},"size":{"type":"integer"},"type":{"type":"string"}}}}}},"responses":{"201":{"description":"Job opened: `upload.url`, `upload.method`, `upload.headers`"},"402":{"description":"Insufficient balance"}}}},"/jobs/{id}/start":{"post":{"summary":"Start the job once the file is uploaded","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"options":{"type":"object"},"webhook":{"type":"string","format":"uri","description":"HTTPS URL called when the job ends"}}}}}},"responses":{"200":{"description":"Job","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}}}}},"/jobs/{id}":{"get":{"summary":"Job status","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Job"}}}},"/jobs/{id}/result":{"post":{"summary":"Get the result's download URL; the first call charges the processing seconds","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"`url`, `size`, `expiresAt`, `billedSeconds`, `chargedUsd`"}}}}}}