API

photo-resize

Runs in your own browser. One upload produces the whole set of platform-correct crops at once, delivered as a ZIP — which is why this is one call and not fifteen. The subject is kept in frame rather than centre-cropped blindly.

v2 beta browser · 1 tokens

Call it

POST https://timbrica.com/v1/tools/photo-resize/runs
Authorization: Bearer $TIMBRICA_KEY
Idempotency-Key: <your retry-safe key>
Content-Type: application/json

Input

FieldTypeRequiredNotes
format string no Output format. `same` keeps the source format.
one of: same, jpeg, png, webp
default: same

Input file

Your browser sets the file at the recipe's `upload` step. Do not stage it with /v1/uploads.
accepts: .jpg, .jpeg, .png, .webp

Browser recipe

This tool runs in your own browser. The work order you receive carries this recipe with the placeholders filled in; the selectors below are a versioned contract, not implementation detail — they do not change without a version bump.

{
    "engine": "dom",
    "steps": [
        {
            "action": "upload",
            "selector": "[data-tmb-api=\"input-file\"]",
            "accept": [
                ".jpg",
                ".jpeg",
                ".png",
                ".webp"
            ]
        },
        {
            "action": "click",
            "selector": "[data-tmb-api=\"select-all\"]"
        },
        {
            "action": "select",
            "selector": "[data-tmb-api=\"format\"]",
            "value": "{{format}}"
        },
        {
            "action": "click",
            "selector": "[data-tmb-api=\"run\"]"
        },
        {
            "action": "wait",
            "selector": "[data-tmb-api=\"download\"]",
            "timeout_s": 300
        },
        {
            "action": "click",
            "selector": "[data-tmb-api=\"download\"]"
        }
    ],
    "result": {
        "kind": "download",
        "settles": "automatically"
    }
}

What each action obliges you to do — recipes use nothing else:

uploadPut the input file into the file input matched by `selector` (it may be visually hidden: set it directly, e.g. Playwright setInputFiles). The file must match `accept`.
clickClick the element once it is visible AND enabled. A control that stays disabled means an earlier step did not take effect.
fillReplace the value of a text input with `value`, firing input/change events as typing would.
selectChoose the option whose value is `value` in a <select>.
waitWait until the element is visible, up to `timeout_s` seconds (default 30).

Race every step against the work order's abort_when selector (html[data-tmb-run="failed"]). If it matches, the tool refused the job — for example a video that would not get any smaller. Stop, and GET the run: error.detail says why. Nothing is charged.

Errors it can return

validation_failed  insufficient_tokens 

History

  • v2 — 2026-09-11 — Recipe fixed: a `select-all` step now picks every platform before the run. Without it the run button stayed disabled and v1 orders could not complete.
  • v1 — 2026-08-02 — Initial release (browser lane).

This contract cannot change without a new version and a line above: a test compares the published schema, pricing and limits against a committed lockfile and fails the build otherwise. Subscribe to /v1/changelog to be told when something moves.