Iminify
Server Details
Compress, convert and resize images, and scan web pages for every image they load.
- Status
- Healthy
- Uptime
- 99.4% over 42 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 19 tools
Most tools target distinct resources and actions clearly. A few pairs could be confused at a glance (scan_page vs crawl_site, get_scan vs get_crawl, share_image vs share_scan_report), but the detailed descriptions make the boundaries clear enough that an agent can pick correctly.
All names follow a consistent snake_case verb_noun pattern (get_image, list_images, create_zip, share_scan_report, stop_monitor). The convention is uniform across the entire set with no mixed casing or style deviations.
19 tools is slightly heavy but reasonable for a service covering compression, page scans, site crawls, monitoring, sharing, and reporting. Each tool corresponds to a real operation, though the surface is on the larger side.
Coverage is broad: create/upload, compress, get, list, rename, delete for images, plus scans, crawls, monitors, sharing, reports, and usage. Minor gaps exist (no bulk delete or account-settings update), but core lifecycle workflows are fully supported.
Available Tools
19 toolscompress_imagesCompress imagesAInspect
Compress, convert or resize images. Send public image addresses in urls, uploads made with create_upload_link in upload_ids, or small files inline as base64 in files. Each image counts one against the account's daily images and compressions a minute, the same as on the website. Images are queued and compress in the background, usually in a few seconds: call get_image with each id until its status is completed, already-optimized, failed or cancelled, then download it from its download_url. Each image also gets an AI alt text and a suggested file name unless alt_text is false; they arrive in alt_text a few seconds after the image is completed or already-optimized. One call takes up to 20 images across urls, upload_ids and files; send the rest in another.
| Name | Required | Description | Default |
|---|---|---|---|
| urls | No | Public http or https addresses of images to fetch. Iminify refuses private networks, follows up to five redirects and names each file after its address. | |
| files | No | Small files sent inline, up to 4 MB each. Use create_upload_link for anything bigger. | |
| level | No | How hard to compress. "smart" (the default) finds the lowest quality that still looks like the original; "ultra" goes further and softens fine texture a little; "lossless" changes no pixel unless a size_limit needs it to; "none" only converts, resizes, fits a size limit and strips metadata. | |
| scale | No | Resize to this percentage of the original, 1 to 100. Not together with width or height. Like width, it is refused for an animated WebP or PNG. | |
| width | No | Resize to this width in pixels. Alone, the height follows the aspect ratio; with height too, the image is resized to exactly that size. An animated WebP or PNG cannot be resized and is refused with animation_not_resizable; an animated GIF can. | |
| folder | No | Paid plans: the folder every image of this call belongs in, like "holiday/beach", so create_zip puts them there. Send each folder's images in a call of their own. On another plan the call is refused with pro_required. | |
| format | No | Convert to this format. "auto" encodes every format that can hold the image and keeps the smallest. Leave it out to keep each image's own format (a HEIC or TIFF always comes back in another one). | |
| height | No | Resize to this height in pixels, the same way as width. | |
| alt_text | No | Write an alt text and a suggested file name for each image with AI. On by default; false leaves it out. They arrive a few seconds after the image finishes, each counting against the account's daily AI alt texts; once those are used up the images still compress, without one. | |
| size_limit | No | The most each optimized file may weigh, in KB of 1,000 bytes, for a form or a page with a file size limit ("under 100 KB" is 100). Iminify lowers the quality until it fits, and makes the image smaller in pixels when the lowest quality is still over. The limit comes before the level: under "lossless" or "none", a file over it is encoded again with loss. A PNG or GIF kept in its own format that is over the limit comes back as JPG, WebP or AVIF, so format "png" is refused with it; animations are never fitted. Each finished image's size_limit_status says under, resized or over. | |
| upload_ids | No | Upload ids from create_upload_link whose file has been sent. Each upload can be compressed once. | |
| keep_metadata | No | Keep the EXIF metadata (camera, date, location). Off by default, which strips it; the orientation is applied to the pixels first. | |
| alt_text_language | No | The language to write the alt text in, as a language tag. English ("en") by default. The suggested file name follows it for languages written in the Latin alphabet and is in English otherwise. | |
| responsive_widths | No | Paid plans: also make each image at these widths in pixels, for an <img srcset>, like [480, 768, 1200, 1600], the website's default. Each width is made from the original, at the same level and in the delivered format, and never enlarged: one wider than the image is made at its own width, once. They are made a few seconds after the image finishes; responsive on the image lists them. On another plan the call is refused with pro_required. | |
| use_suggested_name | No | Rename the optimized copy to the suggested file name as soon as the alt text arrives, unless it already has a new name by then. Off by default. |
Output Schema
| Name | Required | Description |
|---|---|---|
| next | No | |
| images | No | The images queued. |
| refused | No | The sources refused, each with the reason. |
| not_started | No | Addresses not fetched because the call ran out of time. |
| not_started_note | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations only declaring non-read-only, non-destructive and open-world, the description carries the real behavioural load: images are queued and processed asynchronously in seconds, each image consumes a daily quota and per-minute compression rate, polling is required, and alt text arrives late and is quota-limited. It also notes the 20-image cap and the Boolean opt-out for alt text. None of this is derivable from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: purpose first, then input routes, then quota, then the async poll-and-download workflow, then alt text, then the batch cap. Every sentence carries information, though the run-on sentences and repeated 'a few seconds' phrasing could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A 15-parameter asynchronous job tool with an output schema; the description correctly avoids explaining return values and instead supplies the missing operational context — async lifecycle, mandatory follow-up with get_image, download_url, and delayed alt text. Nothing needed to invoke and then retrieve results is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3; the description adds value by explaining that url, upload_id and inline file inputs can be mixed up to a combined 20-image ceiling, a cross-parameter constraint the schema does not state. It does not add much on level, scale/width/height or size_limit, leaving those to the rich schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific triple verb (compress, convert, resize) on a specific resource, then immediately enumerates the three input routes (urls, upload_ids, files), which is the main ambiguity for this tool. Clear against siblings like create_upload_link and get_image, which are named in their roles.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to guidance: use create_upload_link for files too large for inline base64, call get_image polling until status reaches completed/already-optimized/failed/cancelled, and split into multiple calls beyond 20 images. Names the alternatives and the conditions that select them rather than leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crawl_siteCrawl a siteAInspect
Paid plans: scan several pages of one site at once, from its sitemap's address or a list of its pages, each as a page scan of its own, compressing every image they load with the settings given; an image the pages share is compressed once. It answers straight away with the crawl queued; a crawl takes a few minutes, so call get_crawl until it is done. Each crawl counts one against the account's daily site crawls, and takes up to the plan's pages per crawl (get_usage, limits.pages_per_crawl); its pages do not count against the daily page scans, nor their images against the daily images. A list longer than the plan takes, or one mixing two sites, is refused. Another plan is refused with pro_required: scan the pages one at a time with scan_page instead. The site crawls reference: https://www.iminify.com/docs/site-crawls
| Name | Required | Description | Default |
|---|---|---|---|
| level | No | How hard to compress. "smart" (the default) finds the lowest quality that still looks like the original; "ultra" goes further and softens fine texture a little; "lossless" changes no pixel unless a size_limit needs it to; "none" only converts, resizes, fits a size limit and strips metadata. | |
| pages | No | The pages to crawl, all on one site. https:// can be left out. Send this or sitemap, not both. | |
| scale | No | Resize to this percentage of the original, 1 to 100. Not together with width or height. Like width, it is refused for an animated WebP or PNG. | |
| width | No | Resize to this width in pixels. Alone, the height follows the aspect ratio; with height too, the image is resized to exactly that size. An animated WebP or PNG cannot be resized and is refused with animation_not_resizable; an animated GIF can. | |
| format | No | Convert to this format. "auto" encodes every format that can hold the image and keeps the smallest. Leave it out to keep each image's own format (a HEIC or TIFF always comes back in another one). | |
| height | No | Resize to this height in pixels, the same way as width. | |
| sitemap | No | The address of the site's sitemap (XML, a sitemap index, or a text file with one address a line). The crawl takes its first pages on the sitemap's own site. Send this or pages, not both. | |
| alt_text | No | Write an AI alt text for each image the page shows with no alt attribute, for the audit's suggested_alt. On by default; false leaves it out. Each counts against the account's daily AI alt texts. | |
| keep_metadata | No | Keep the EXIF metadata (camera, date, location). Off by default, which strips it; the orientation is applied to the pixels first. | |
| alt_text_language | No | The language to write the alt text in, as a language tag. English ("en") by default. The suggested file name follows it for languages written in the Latin alphabet and is in English otherwise. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | The crawl's id. |
| url | No | The sitemap read, or the first page listed. |
| hint | No | What to do next: poll again while pages or images are at work, then where each page's images and report are. |
| note | No | Why the crawl failed. |
| audit | No | The site's report, an image the pages share counted once. Null until the crawl is done. |
| pages | No | Each page, in the order the crawl took them. |
| source | No | |
| status | No | completed once every page and its images have finished. failed: the crawl could not start its pages; note says why. |
| settings | No | |
| created_at | No | |
| monitor_id | No | The weekly site check this crawl is a run of, or null. |
| updated_at | No | |
| pages_count | No | |
| saved_bytes | No | |
| images_count | No | |
| pages_failed | No | |
| original_size | No | Bytes, over the finished images. |
| saved_percent | No | |
| optimized_size | No | Bytes, over the finished images. |
| pages_left_out | No | Pages past the plan's pages per crawl, not scanned. |
| images_finished | No | |
| pages_in_progress | No | |
| images_in_progress | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses that the crawl is queued and takes minutes, consumes daily site-crawl quota, does not count pages against daily page scans, shares image compression across pages, and can be refused by plan limits. This is exactly the operational context an agent needs before invoking it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The key paid-plan and bulk-crawl context is front-loaded, and the dense paragraph earns most of its length through quota, polling, and refusal details. It could be split into shorter statements for easier scanning, but it is not padded with irrelevant material.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex asynchronous, quota-limited crawl tool, the description covers initiation, polling, billing, limits, refusal behavior, and the alternative sibling tool. With a rich schema and an output schema present, this is sufficiently complete for correct selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so nearly all parameter meaning is already in the schema. The description reinforces the `pages` versus `sitemap` choice and the idea of per-page settings, but it does not add significant parameter-level detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific action and resource: scanning several pages of one site at once, each as its own page scan, with images compressed. It distinguishes this bulk crawl from the sibling `scan_page` and makes the paid-plan scope clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use this tool, how to poll with `get_crawl`, how to check page limits with `get_usage`, and when to fall back to `scan_page` if the plan is refused with `pro_required`. It also states refusal cases such as lists longer than the plan or mixing two sites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_upload_linkCreate an upload linkAInspect
Get a one-time address to send a local file to, for an agent that can run a shell. PUT the file's bytes to upload_url (the answer includes a curl command), then call compress_images with the upload_id. The link expires after a few minutes and works once; the uploaded file keeps for about a day. Ask for one link per file. Uploads not yet compressed never outnumber the images the plan can still compress today, and never more than a fixed number of them: past that, a new link is refused with uploads_waiting, naming the upload ids already sent: compress those, then ask again.
| Name | Required | Description | Default |
|---|---|---|---|
| file_name | Yes | The file's name, like "hero.png". It names the image; the extension is corrected to what the bytes turn out to be. |
Output Schema
| Name | Required | Description |
|---|---|---|
| curl | No | A command that sends the file. |
| next | No | |
| method | No | |
| upload_id | No | The id to pass to compress_images in upload_ids once the file is sent. |
| expires_at | No | |
| upload_url | No | |
| max_file_size | No | Bytes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavior beyond the annotations: the link expires after a few minutes, works once, the uploaded file keeps for about a day, and there is a quota/backpressure condition that returns uploads_waiting. These details let an agent plan retries and cleanup correctly, even though annotations already mark this as a non-destructive creation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and immediate workflow are front-loaded, and each subsequent sentence adds operational detail about expiry, one-time use, per-file linking, or quota behavior. There is no wasted prose, and the density is appropriate for a tool with non-obvious upload constraints.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return values, and it still covers the key operational context: how to upload, when to compress, expiry, retention, and backpressure. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one parameter and schema description coverage is 100%, so the schema already defines file_name and its extension-correction behavior. The description adds workflow context but not parameter-level meaning beyond what the schema provides, making 3 the appropriate baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: get a one-time address to send a local file to, for an agent that can run a shell. It clearly distinguishes this tool from siblings by naming compress_images as the follow-up step, so an agent can recognize the upload-link workflow without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit usage steps: PUT the file's bytes to upload_url, then call compress_images with the upload_id, and it states one link per file. It also describes the refusal condition when too many uploads are waiting, telling the agent to compress those and ask again. This is strong when-to-use and when-not/retry guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_zipCreate a zipAInspect
One download address for a zip of the optimized copies of several finished images, by their ids, by a page scan's id or by a site crawl's id. A scan's zip keeps each image in the folders of its address on the page and adds manifest.csv, mapping each address it fetched to its file. A crawl's zip has a folder for each page laid out the same way, with its own manifest.csv, once get_crawl says the crawl is done. Otherwise an image sent to compress_images with a folder goes in that folder, and the rest at the top of the zip. Images that have not finished are left out and listed, and responsive sizes are never in it: get_image's responsive.download_url zips an image's sizes. The address works without a token and expires after an hour. For a single image, get_image's optimized.download_url downloads it directly.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | No | Up to 150 image ids, as compress_images, get_image and list_images return them. Send one of ids, scan_id and crawl_id. | |
| scan_id | No | The id scan_page returned, to zip every finished image that scan found. Send one of ids, scan_id and crawl_id. | |
| crawl_id | No | The id crawl_site returned, to zip every page of a finished site crawl. Send one of ids, scan_id and crawl_id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| images | No | How many images the zip holds. |
| left_out | No | The ids of the images left out because they had not finished. |
| expires_at | No | |
| download_url | No | Works without a token until expires_at. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnlyHint=false, destructiveHint=false): the returned address needs no token and expires after an hour, unfinished images are left out and listed, responsive sizes are never included, and scan/crawl zips have a defined folder layout plus manifest.csv. Those are exactly the operational facts an agent cannot get from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then alternatives and constraints in a compact block with no filler sentence. Dense but every clause carries either a routing decision or a behavioral fact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return values need not be explained, and the description still covers the expiry, tokenless access, and omission behavior that matter for correct use. Nothing an agent needs in order to call this with the right selector is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description explains the consequence of each selector – what a scan_id zip looks like versus a crawl_id zip, and how folder assignments from compress_images affect layout. It does not add anything about ids itself beyond the schema's 150-id cap note, which is already documented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource – a single download address for a zip of optimized image copies – and immediately scopes the three ways to select content (image ids, a scan id, a crawl id). It is clearly distinct from sibling get_image, whose direct download it explicitly contrasts with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing rules: use get_image's optimized.download_url for a single image, responsive.download_url for an image's sizes, and only zip a crawl once get_crawl says it is done. It also states that unfinished images are omitted rather than failing the call, which tells the agent what to expect before invoking.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_imageDelete an imageADestructiveInspect
Delete an image and both of its files from storage for good. There is no trash and no undo, so only do this when the person asked for it. An image still queued or compressing, or whose responsive sizes are still being made, is refused.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The image's id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| deleted | No | The id of the image deleted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description discloses important behavior: deletion is permanent, there is no trash or undo, both files are removed, and certain in-progress image states cause refusal. These details are exactly what an agent needs before invoking a destructive operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three tight sentences, front-loading the permanent deletion and then adding the consent and refusal constraints. Every sentence contributes useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive tool with annotations and an output schema, the description is complete. It covers permanence, side effects, consent requirements, and state-based refusal without needing to explain return values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% description coverage for the single required id parameter, so it already documents the input fully. The description does not add syntax or format details beyond referring to "an image," which is acceptable given the high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: "Delete an image" and clarifies that both of its files are removed from storage. This is unambiguous and clearly distinguishes the tool from siblings such as get_image, rename_image, or share_image.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear usage condition: "only do this when the person asked for it." It also states when deletion is refused, namely while an image is queued, compressing, or still generating responsive sizes. It does not name alternatives, but there is no obvious sibling alternative for permanent deletion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_scan_reportDownload a page reportARead-onlyIdempotentInspect
One download address for a finished page scan's report: format csv for a spreadsheet of every image address on the page with everything measured about it and what is worth fixing, or pdf for the report printed for a client (the findings with how to fix them, then every image to fix). The address works without a token and expires after an hour; a PDF takes a second or two to print when it is fetched. Comes with a paid plan, and is refused with pro_required on other plans.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The scan's id, as scan_page returned it. | |
| format | Yes | csv or pdf. |
Output Schema
| Name | Required | Description |
|---|---|---|
| format | No | |
| file_name | No | The name the file downloads with. |
| expires_at | No | |
| download_url | No | Works without a token until expires_at. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description adds important operational details: the address works without a token, expires after an hour, PDF generation takes a second or two, and non-paid plans are refused with pro_required. These are concrete behavioral traits an agent needs for correct invocation and error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and then adds only decision-relevant details about format, expiration, latency, and plan requirements. Despite being dense, every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only export tool with a full schema and an output schema, the description supplies the missing operational context: format contents, token-free access, expiration, latency, and paid-plan gating. Nothing important for correct use appears to be left out.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is high, and the description adds meaningful format semantics by explaining what csv and pdf each contain. The id parameter is not further elaborated in the description, but its meaning is already fully covered in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that this returns a download address for a finished page scan's report, and it distinguishes the two output formats csv and pdf. It does not explicitly name or differentiate itself from close siblings such as share_scan_report, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives useful format-selection guidance: csv for a spreadsheet of image addresses and findings, pdf for a client-facing printed report. It also states a paid-plan prerequisite and the pro_required failure mode, but it does not name alternative tools or explicitly say when to use this versus share_scan_report.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_crawlGet a site crawlARead-onlyIdempotentInspect
One site crawl: where it is, each of its pages with its status and image counts, the totals saved, and, once every page has finished, the site's report in audit: how many image addresses the pages had, how many are worth fixing, and how many have each finding (oversized, without width and height or alt text, lazy loading in the wrong place, the largest contentful paint unprioritized), an image the pages share counted once. Poll this, a few seconds apart, while a crawl runs: it is done once its status is completed or failed and pages_in_progress and images_in_progress are 0. Each page is a page scan: call get_scan with its id (and audit_images true) for what to fix on that page, list_images with scan set to its id for its images, and create_zip with crawl_id to download every page's images at once, a folder per page.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The crawl's id, as crawl_site returned it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | The crawl's id. |
| url | No | The sitemap read, or the first page listed. |
| hint | No | What to do next: poll again while pages or images are at work, then where each page's images and report are. |
| note | No | Why the crawl failed. |
| audit | No | The site's report, an image the pages share counted once. Null until the crawl is done. |
| pages | No | Each page, in the order the crawl took them. |
| source | No | |
| status | No | completed once every page and its images have finished. failed: the crawl could not start its pages; note says why. |
| settings | No | |
| created_at | No | |
| monitor_id | No | The weekly site check this crawl is a run of, or null. |
| updated_at | No | |
| pages_count | No | |
| saved_bytes | No | |
| images_count | No | |
| pages_failed | No | |
| original_size | No | Bytes, over the finished images. |
| saved_percent | No | |
| optimized_size | No | Bytes, over the finished images. |
| pages_left_out | No | Pages past the plan's pages per crawl, not scanned. |
| images_finished | No | |
| pages_in_progress | No | |
| images_in_progress | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/non-destructive, so safety is covered; the description adds genuinely new behavioral context: the poll-until-terminal pattern, the exact completion predicate, and the deduplication rule ('an image the pages share counted once') that affects how the audit totals should be interpreted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, but the bulk of the description is one long run-on stream that re-enumerates the audit findings and per-page fields already covered by the output schema. The routing guidance earns its place; the field-by-field return recap does not, making it denser than necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't explain return values, yet it still supplies the two things an agent cannot infer from structured fields: the polling cadence and the exact condition under which the crawl is finished. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single id parameter is already documented as 'the crawl's id, as crawl_site returned it.' The description adds meaning by mapping the related ids across tools (per-page scan ids for get_scan/list_images, crawl_id for create_zip), though it does not add syntax or format detail for the id itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific resource ('One site crawl') and enumerates exactly what it returns: location, per-page status and image counts, totals, and audit report. It also implicitly distinguishes itself from crawl_site (the creator) and get_scan (the per-page view) by scoping itself to a single existing crawl.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit polling protocol ('Poll this, a few seconds apart, while a crawl runs') and a precise termination condition (status completed/failed and pages_in_progress and images_in_progress both 0). It also names the correct siblings for narrower needs: get_scan with audit_images for per-page fixes, list_images with scan for per-page images, create_zip with crawl_id for bulk download.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_imageGet an imageARead-onlyIdempotentInspect
One image with its status, sizes and savings. Poll this, a few seconds apart, until the status is completed, already-optimized, failed or cancelled. Once finished, optimized.download_url downloads the result and original.download_url the file as it was sent; both addresses work without a token and expire after an hour, so ask again for fresh ones. An image sent with responsive_widths lists its sizes under responsive once responsive.status is ready, each with its own download_url, plus one for a zip of them all and an in html.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The image's id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | The image's id. |
| hint | No | What to do next, when the status alone does not say. |
| name | No | The name the optimized copy downloads under. |
| folder | No | The folder it was sent with, which a zip puts it in. Null for an image on its own. |
| status | No | |
| scan_id | No | The page scan that found it, if one did. |
| alt_text | No | The AI alt text, or null when none was asked for. |
| original | No | |
| settings | No | |
| optimized | No | Null until the image has finished. |
| share_url | No | Its public page, once shared. |
| created_at | No | |
| responsive | No | The responsive sizes (paid plans), or null when none were asked for. list_images carries only their status. |
| source_url | No | The address it was fetched from: its address on the scanned page, or the url it was sent as. Null for a file. |
| updated_at | No | |
| saved_bytes | No | Negative when the optimized copy is larger. |
| saved_percent | No | |
| size_limit_status | No | Against settings.size_limit: under, resized (made smaller in pixels to fit) or over. Null without a limit, and until the image has finished. |
| content_credentials | No | The Content Credentials (a signed C2PA record of where the image came from) the file sent carried, or null when it carried none, and until the image has finished. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, it discloses that download URLs require no token and expire after an hour, so the caller must re-fetch for fresh links, and it explains how responsive_widths images expose per-size download_urls plus a zip and srcset once responsive.status is ready. Those are exactly the operational details annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with what is returned and then the polling rule and the URL expiry caveat. Everything earns its place, though the final responsive/srcset sentence packs several ideas together and is the least scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description did not need the download-URL and responsive breakdown, but including it makes the polling workflow self-contained. Only minor gap is that it never mentions what a failed/cancelled status implies or whether polling should back off.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single id parameter is documented in the schema as 'The image's id.' The description adds no syntax or format guidance for the id beyond referring to 'this', so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the resource (a single image) and its payload (status, sizes, savings), which cleanly separates it from list_images and the scan/crawl siblings. The verb is implicit in the fragment 'One image with...' rather than a stated action, which keeps it just short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly prescribes usage: poll a few seconds apart until the status reaches one of four named terminal values (completed, already-optimized, failed, cancelled). That is a concrete when-to-use and when-to-stop rule an agent can follow without inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_scanGet a page scanARead-onlyIdempotentInspect
One page scan: where it is, how many images it found and how many are still compressing, the ones it skipped with the reason for each, the totals saved, and, once it has finished, its page report in audit: how many images are oversized, lack width and height or alt text, or are lazy loaded in the wrong place, and the largest contentful paint. Poll this, a few seconds apart, while a scan runs: it is done once its status is no longer queued or scanning and images_in_progress is 0, and its report's suggested_alt texts once alt_texts_in_progress is 0 too. The images themselves are not in this answer, so polling stays small: once images_in_progress is 0, call list_images with scan set to this id for them, a page at a time, with their sizes and download links, or create_zip with scan_id to download every finished one at once. Pass audit_images true, once, after the scan is done, for every image address on the page with what is worth fixing about each; leave it out while polling.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The scan's id. | |
| audit_images | No | Add the page report's entry for every image address on the page (up to 1000). Ask once the scan is done, not while polling. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | The scan's id. |
| url | No | The page scanned. |
| hint | No | What to do next: poll again while the scan or its images are still running, then where to read its images. |
| note | No | What the scan found, or why it stopped. |
| audit | No | The page audit: oversized images, missing dimensions and alt text, lazy loading in the wrong place, the largest contentful paint. Null until the scan has finished. |
| status | No | |
| skipped | No | The images the scan found and did not compress, each with why. |
| crawl_id | No | The site crawl this scan is a page of, for get_crawl, or null. |
| settings | No | |
| share_url | No | The page report's public link while it is shared; it answers only while the account is on a paid plan. |
| created_at | No | |
| updated_at | No | |
| saved_bytes | No | |
| images_count | No | |
| original_size | No | Bytes, over the finished images. |
| saved_percent | No | |
| optimized_size | No | Bytes, over the finished images. |
| images_finished | No | |
| images_in_progress | No | |
| alt_texts_in_progress | No | Finished images whose AI alt text for the audit's suggested_alt is still being written. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (readOnly, idempotent, non-destructive), and the description adds substantial behavior beyond that: the poll cadence, the exact termination predicates for status/images_in_progress/alt_texts_in_progress, and the deliberate design choice that image payloads are excluded so polling stays small. That is exactly the context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Return contents are front-loaded and every clause carries real information; there is no filler. It loses a point for form: the opening is a single very long run-on clause chain that is harder to parse than the same content in short sentences or a list.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a polling read tool with an output schema and full annotation coverage, nothing an agent needs is missing: what comes back, when it is complete, how to poll, and which sibling tool to call next for images or a bulk download. The output schema handles the return shape, and the description fills in the process semantics around it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds intent the schema cannot: audit_images is for enumerating every image address with what is worth fixing, and must be passed once post-scan rather than during polling. The id parameter is left to the schema, which is acceptable given complete coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (fetch a single page scan) and enumerates exactly what it returns: location, image counts, in-progress count, skipped images with reasons, savings totals, and the page report metrics. It explicitly carves itself away from list_images ('the images themselves are not in this answer'), so an agent can distinguish it from the nearest sibling without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit operating instructions: poll a few seconds apart, stop when status is not queued/scanning and images_in_progress is 0, wait on alt_texts_in_progress for suggested alts, then hand off to list_images or create_zip. It also states the audit_images condition positively ('once, after the scan is done') and negatively ('leave it out while polling').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_usageGet usageARead-onlyIdempotentInspect
Your Iminify plan, what it allows, and how much of today's allowance is used, with when it resets. The website, the API and this server spend the same counts. On max, which is unlimited, the images and page scans a day and what is left of them are null. Check this before a large batch.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| plan | No | pro and max are the paid plans; trial is the days of Pro an account gets once, as its email is verified or with the trial button on the website; it then answers free. |
| usage | No | |
| limits | No | |
| plan_ends_at | No | When a cancelled paid plan or a trial ends. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, closed-world and non-destructive, so the safety profile is covered. The description adds genuinely new behavior: counts are shared across the website, the API and this server, and on the 'max' unlimited plan the per-day image and page-scan figures are null rather than absent or an error. That null-handling note is exactly the kind of detail an agent cannot infer from structured fields. It stops short of saying how often counts refresh or whether partial-day data lags, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with what the tool returns and ending with the actionable trigger 'Check this before a large batch'. Every sentence carries distinct information — allowance, shared-count semantics, null case, usage timing. The third sentence is grammatically tangled but still decodable and not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description is not obliged to enumerate return fields, and it correctly avoids that. It covers the one return-value edge case (nulls on unlimited plans) that would otherwise confuse an agent, plus cross-surface count sharing. The only gap is reset-timezone or caching behavior, which is minor for a zero-parameter read.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters and the schema is an empty object, so there is nothing for the description to disambiguate. Baseline of 4 applies; the description correctly spends no words on inputs and does not invent any.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the specific resource set: the Iminify plan, its allowances, today's consumption, and the reset time. That is far more specific than the name 'get_usage' alone, though it reads as a noun phrase rather than a verb-plus-resource statement. An agent can immediately tell this apart from every sibling (compress_images, list_images, monitor_site, etc.), none of which report quota.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives one explicit usage condition — 'Check this before a large batch' — which is the primary scenario an agent would need it for. There are no exclusions or named alternatives, but no plausible alternative exists for quota inspection, so the guidance is effectively complete for practical selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_imagesList imagesARead-onlyIdempotentInspect
The account's images, newest first: uploads, images found by page scans, and re-runs. Filter by status, by source (upload or scan) or by one scan's id, which is how a page scan's images are read once get_scan says they are done. An image with responsive sizes carries only their status here; get_image has their links. Pages of up to 50; ask for the next page while page is below last_page. For one image whose id you already have, call get_image instead.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | The page to read, starting at 1 (the default). | |
| scan | No | Only the images one page scan found, by the id scan_page returned. | |
| source | No | "upload" for images that were sent, "scan" for the ones page scans found. | |
| status | No | Only images with this status. queued and optimizing are still running; completed, already-optimized, failed and cancelled are finished. | |
| per_page | No | Images a page, from 1 to 50. 15 by default. |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | No | |
| total | No | |
| images | No | |
| per_page | No | |
| last_page | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a safe read-only, idempotent operation. The description adds useful behavioral detail beyond that: results are newest first, pagination is capped at 50 per page, responsive-size images expose only status here, and get_image provides their links.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but efficient, with the core listing scope front-loaded and filtering, pagination, and the get_image alternative following in logical order. Every sentence contributes useful selection or invocation guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return values. It still covers ordering, filters, scan workflow, pagination limits, and the key responsive-size caveat, making it complete for an agent to call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all five parameters. The description still adds semantic context for the scan parameter by tying it to get_scan completion and for pagination by explaining how to advance pages, going slightly beyond the structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: listing the account's images, newest first, including uploads, scan-found images, and re-runs. It clearly distinguishes this listing operation from get_image, which should be used for a single image.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit filtering guidance by status, source, and scan id, explains the scan workflow after get_scan reports completion, and names get_image as the alternative when an image id is already known. Pagination guidance is also explicit: request the next page while page is below last_page.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_monitorsList weekly site checksARead-onlyIdempotentInspect
The account's weekly site checks, oldest first, each with when it runs next, whether its emails are on, whether it is paused (the plan has no weekly checks, or checks fewer sites and this is not among its oldest, so it waits until the plan covers it), and its newest run, a site crawl with its totals. For a run's pages and the site's report, call get_crawl with last_run.id; create_zip with crawl_id set to it downloads the images that run compressed, the new or changed ones.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | Where to read a run, or how to start a check when there is none. |
| monitors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description adds substantial meaning on top: result ordering and the semantics of the paused flag (plan has no weekly checks, or this check isn't among the plan's oldest sites). That 'why is it paused' explanation is exactly the kind of behavior an agent cannot infer from any structured field.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the resource and ordering, and every clause about the returned item fields is load-bearing. The long nested parenthesis explaining the paused state is informative but makes the second half dense and slows parsing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still adds semantic value by explaining what the paused flag means and how last_run connects to get_crawl/create_zip. For a zero-param list tool with annotations and an output schema, nothing an agent needs is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so the baseline is 4; there is nothing for the description to disambiguate. The parameter names it does mention (last_run.id, crawl_id) belong to sibling tools, where they usefully tell the agent how to wire the chained calls.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names the specific resource (the account's weekly site checks) and pins down ordering ("oldest first"), so 'monitors' is resolved to a concrete object. It also distinguishes itself from get_crawl/create_zip by scoping those to follow-up calls rather than duplicating them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent onward: get_crawl with last_run.id for a run's pages and report, create_zip with crawl_id for the changed images. That's clear contextual guidance, though it never states when to prefer monitor_site or stop_monitor over listing, so no explicit exclusion is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monitor_siteCheck a site every weekAIdempotentInspect
Paid plans: have a site crawled with crawl_site crawled again every week, the same way and with the same settings, compressing only the images that are new or changed since the last check, and email the account a link to a zip of them when a check finds some. Pass the crawl's id; the crawl must have scanned at least one page. Nothing runs now and nothing counts against the day: the first check is a week from now, at next_run_at. A crawl already checked answers its check. The plan sets how many sites can be checked at once (get_usage, limits.monitors). Another plan is refused with pro_required. The weekly site checks reference: https://www.iminify.com/docs/site-checks
| Name | Required | Description | Default |
|---|---|---|---|
| crawl_id | Yes | The id of a site crawl on the account, as crawl_site returned it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | The check's id, for stop_monitor. |
| url | No | The sitemap each run reads again, or the first of the pages it takes. |
| hint | No | When the first check runs, and how to read what it finds. |
| emails | No | Whether a run that finds new or changed images emails the account. |
| paused | No | True while the check does not run on the plan: the plan has no weekly checks, or it checks fewer sites than the account holds and this is not among its oldest. The check is kept and runs again once the plan covers it. |
| source | No | |
| crawl_id | No | The site crawl the check was made from, or null once that crawl is deleted. |
| last_run | No | The newest run, a site crawl: get_crawl with its id for its pages and report, create_zip with crawl_id for the images it compressed. Null before the first. |
| settings | No | |
| created_at | No | |
| next_run_at | No | When the next run is due. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, it discloses scheduling behavior, delayed first run, quota/plan constraints, idempotent handling of already-checked crawls, and error behavior. These details materially help an agent understand the side effects and operational boundaries.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but substantially informative, with the core action and paid-plan constraint front-loaded. Some sentences are awkward and run-on, especially the opening sentence, but little content is extraneous.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a scheduling/monitoring tool with an output schema and annotations, the description covers prerequisites, timing, plan restrictions, idempotency, and failure behavior. An agent has enough context to invoke it correctly without needing undocumented assumptions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already fully documents crawl_id at 100% coverage, but the description adds a meaningful constraint: the crawl must have scanned at least one page. This goes beyond the schema's basic identifier description, though no additional parameter syntax is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific recurring action: re-crawl a site weekly using an existing crawl_site crawl, compress only new/changed images, and email a zip link. This clearly distinguishes monitor_site from the one-time crawl_site sibling and from list_monitors/stop_monitor.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit prerequisites and exclusions: paid plans only, pass a crawl_id from crawl_site, the crawl must have scanned at least one page, nothing runs immediately, and the first check occurs at next_run_at. It also names plan-limit guidance via get_usage and the pro_required refusal condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rename_imageRename an imageAIdempotentInspect
Change the name a finished image's optimized copy downloads under, for example to an SEO-friendly name like "red-running-shoes". The extension is always the delivered format's, so a typed one is dropped. The original keeps the name it was sent with.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The image's id. | |
| name | Yes | The new name, without an extension. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | The image's id. |
| hint | No | What to do next, when the status alone does not say. |
| name | No | The name the optimized copy downloads under. |
| folder | No | The folder it was sent with, which a zip puts it in. Null for an image on its own. |
| status | No | |
| scan_id | No | The page scan that found it, if one did. |
| alt_text | No | The AI alt text, or null when none was asked for. |
| original | No | |
| settings | No | |
| optimized | No | Null until the image has finished. |
| share_url | No | Its public page, once shared. |
| created_at | No | |
| responsive | No | The responsive sizes (paid plans), or null when none were asked for. list_images carries only their status. |
| source_url | No | The address it was fetched from: its address on the scanned page, or the url it was sent as. Null for a file. |
| updated_at | No | |
| saved_bytes | No | Negative when the optimized copy is larger. |
| saved_percent | No | |
| size_limit_status | No | Against settings.size_limit: under, resized (made smaller in pixels to fit) or over. Null without a limit, and until the image has finished. |
| content_credentials | No | The Content Credentials (a signed C2PA record of where the image came from) the file sent carried, or null when it carried none, and until the image has finished. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotent=true and destructive=false, but the description adds real behavior beyond them: the extension is forced to the delivered format and any typed extension is dropped, and the original's name is untouched. It omits any mention of auth requirements or what happens if the image isn't yet finished, which is why it isn't a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the primary action, then two constraint sentences that each carry new information (extension handling, original unaffected). No repetition of the title and nothing wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with an output schema, the description covers what changes, what stays the same, and how the name argument is normalized. The only soft spot is the unstated prerequisite/error behavior if the image has no finished optimized copy, which the phrase 'finished image's optimized copy' only implies.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage the baseline is 3, but the description goes further by explaining the consequence of passing an extension despite the schema's 'without an extension' note — it is silently dropped in favor of the delivered format. That resolves ambiguity the schema alone leaves open.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (rename) and precise resource scope: the download name of a finished image's optimized copy, not the image itself. The closing line 'The original keeps the name it was sent with' separates it cleanly from sibling mutations like delete_image or get_image.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete motivating use case ('an SEO-friendly name like "red-running-shoes"') and implicitly scopes usage to finished images with an optimized copy. It stops short of stating when not to use it or naming an alternative tool, so it lands at clear-context-but-no-exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scan_pageScan a web pageAInspect
Open a web page in a browser on Iminify's servers, collect every image it loads (scrolling to the bottom), and compress each one with the settings given; the finished scan also reports how the page shows its images (get_scan, in audit). It answers straight away with the scan queued; a scan takes from a few seconds to a few minutes, so call get_scan until its status is no longer queued or scanning and images_in_progress is 0. Each scan counts one against the account's daily page scans; the images it finds do not count against its daily images. Pages on private networks are refused, and a page behind a login usually comes back with no images. The page scans reference: https://www.iminify.com/docs/page-scans
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The page to scan. https:// can be left out. | |
| level | No | How hard to compress. "smart" (the default) finds the lowest quality that still looks like the original; "ultra" goes further and softens fine texture a little; "lossless" changes no pixel unless a size_limit needs it to; "none" only converts, resizes, fits a size limit and strips metadata. | |
| scale | No | Resize to this percentage of the original, 1 to 100. Not together with width or height. Like width, it is refused for an animated WebP or PNG. | |
| width | No | Resize to this width in pixels. Alone, the height follows the aspect ratio; with height too, the image is resized to exactly that size. An animated WebP or PNG cannot be resized and is refused with animation_not_resizable; an animated GIF can. | |
| format | No | Convert to this format. "auto" encodes every format that can hold the image and keeps the smallest. Leave it out to keep each image's own format (a HEIC or TIFF always comes back in another one). | |
| height | No | Resize to this height in pixels, the same way as width. | |
| alt_text | No | Write an AI alt text for each image the page shows with no alt attribute, for the audit's suggested_alt. On by default; false leaves it out. Each counts against the account's daily AI alt texts. | |
| keep_metadata | No | Keep the EXIF metadata (camera, date, location). Off by default, which strips it; the orientation is applied to the pixels first. | |
| alt_text_language | No | The language to write the alt text in, as a language tag. English ("en") by default. The suggested file name follows it for languages written in the Latin alphabet and is in English otherwise. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | The scan's id. |
| url | No | The page scanned. |
| hint | No | What to do next: poll again while the scan or its images are still running, then where to read its images. |
| note | No | What the scan found, or why it stopped. |
| audit | No | The page audit: oversized images, missing dimensions and alt text, lazy loading in the wrong place, the largest contentful paint. Null until the scan has finished. |
| status | No | |
| skipped | No | The images the scan found and did not compress, each with why. |
| crawl_id | No | The site crawl this scan is a page of, for get_crawl, or null. |
| settings | No | |
| share_url | No | The page report's public link while it is shared; it answers only while the account is on a paid plan. |
| created_at | No | |
| updated_at | No | |
| saved_bytes | No | |
| images_count | No | |
| original_size | No | Bytes, over the finished images. |
| saved_percent | No | |
| optimized_size | No | Bytes, over the finished images. |
| images_finished | No | |
| images_in_progress | No | |
| alt_texts_in_progress | No | Finished images whose AI alt text for the audit's suggested_alt is still being written. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: asynchronous queueing, expected duration range, the exact poll-termination condition, that each scan consumes one daily page scan while discovered images do not consume daily images, and that private-network pages are refused and logged-in pages typically return no images. The docs link is a useful escape hatch for deeper reference.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what the tool does, then workflow, then quota and failure modes, with no filler. A few sentences are long and stack multiple clauses (the login/privacy sentence, the quota sentence), which slightly taxes scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers everything an agent needs to call it correctly: async pattern and termination condition, quota implications, expected refusals, and pointer to the reference docs. An output schema exists, so omitting return-shape detail costs nothing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the per-parameter descriptions are already rich (level, scale/width/height interactions, format, alt_text). The tool description adds only the vague phrase 'with the settings given' and no parameter-level guidance of its own, so it holds at the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource: open a page in a browser, collect every image it loads (scrolling to the bottom), and compress each one. Scope is clearly one page, which implicitly separates it from crawl_site's multi-page job, but it never names crawl_site or compress_images outright, so the sibling differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit follow-up instructions: the call returns immediately with the scan queued, then poll get_scan until status leaves queued/scanning and images_in_progress is 0. It also warns about private networks and login-protected pages, but does not say when to prefer crawl_site over repeated scan_page calls on the same site.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stop_monitorStop a weekly site checkADestructiveInspect
Stop a weekly site check for good and delete every run it made, with their pages, images and files; the crawl it was made from stays. There is no undo, so only do this when the person asked for it. A check whose run is still at work is refused with scan_in_progress. To stop only the emails, the person follows the link in any of them.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The check's id, from list_monitors. |
Output Schema
| Name | Required | Description |
|---|---|---|
| stopped | No | The id of the check stopped. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Although annotations already mark the tool as destructive, the description adds substantial behavioral detail beyond them: exactly what is deleted, what is retained, that the action is irreversible, and the specific refusal condition. This is the kind of context an agent needs before invoking a destructive tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the destructive effect and deletion scope, then covers irreversibility, an error condition, and an alternative. Every sentence contributes useful information, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a single required parameter, full schema coverage, destructive annotations, and an output schema, the description supplies all missing operational context. It explains impact, irreversibility, refusal behavior, and an alternative, so an agent can call it safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema already documents the single parameter as the check id from list_monitors. The description does not add syntax or lookup detail beyond that, so the baseline score of 3 is appropriate when the schema carries parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: stopping a weekly site check. It also defines the scope precisely by saying every run and its pages, images, and files are deleted while the underlying crawl remains. This distinguishes it from adjacent monitor and scan operations without requiring the schemas to be opened.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage constraints: only use it when the person asked for it, there is no undo, and a run still in progress is refused with scan_in_progress. It also names the alternative path for stopping only emails, which is a clear when-not-to-use-this case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
write_alt_textWrite alt textAInspect
Ask AI for the alt text and a suggested file name of a finished image, for example one compressed with alt_text false or whose alt text failed. A written one can be asked again in another language. It counts one against the account's daily AI alt texts, unless an image with the same bytes already has one in that language. Then call get_image until alt_text.status is no longer pending.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The image's id. | |
| alt_text_language | No | The language to write the alt text in, as a language tag. English ("en") by default. The suggested file name follows it for languages written in the Latin alphabet and is in English otherwise. | |
| use_suggested_name | No | Rename the optimized copy to the suggested file name as soon as the alt text arrives, unless it already has a new name by then. Off by default. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | The image's id. |
| hint | No | What to do next, when the status alone does not say. |
| name | No | The name the optimized copy downloads under. |
| folder | No | The folder it was sent with, which a zip puts it in. Null for an image on its own. |
| status | No | |
| scan_id | No | The page scan that found it, if one did. |
| alt_text | No | The AI alt text, or null when none was asked for. |
| original | No | |
| settings | No | |
| optimized | No | Null until the image has finished. |
| share_url | No | Its public page, once shared. |
| created_at | No | |
| responsive | No | The responsive sizes (paid plans), or null when none were asked for. list_images carries only their status. |
| source_url | No | The address it was fetched from: its address on the scanned page, or the url it was sent as. Null for a file. |
| updated_at | No | |
| saved_bytes | No | Negative when the optimized copy is larger. |
| saved_percent | No | |
| size_limit_status | No | Against settings.size_limit: under, resized (made smaller in pixels to fit) or over. Null without a limit, and until the image has finished. |
| content_credentials | No | The Content Credentials (a signed C2PA record of where the image came from) the file sent carried, or null when it carried none, and until the image has finished. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal a non-destructive write (readOnlyHint=false, destructiveHint=false), so the safety profile is covered. The description adds genuinely useful context beyond that: quota consumption (one daily AI alt text, waived if identical bytes already have that language) and the asynchronous pending-status polling requirement. However, it omits what happens to existing alt text and error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and packs quota and polling details into four tight sentences. Some phrasing is awkward ('A written one can be asked again in another language'), but nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists so return values need no explanation, and the description still supplies the async polling loop, quota cost, and dedup rule an agent needs to call and follow up correctly. Nothing material is missing for a 3-parameter write tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents id, alt_text_language (including default and enum), and use_suggested_name. The description hints at language re-runs and a suggested file name but adds no syntax or default detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (write/ask AI for) and resource (alt text plus suggested file name) for a finished image, and distinguishes itself from siblings like compress_images and rename_image by targeting already-completed images lacking alt text. An agent can identify the action without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit triggering conditions: use for images compressed with alt_text false or whose alt text failed, and re-ask in another language. It also prescribes the follow-up flow ('call get_image until alt_text.status is no longer pending'). It stops short of naming when-not-to-use or pointing at rename_image as the alternative for the suggested-name behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Changed
get_usage4 fields changed- added
Output schema / properties / limits / properties / files_per_dayAdded value: +{ + "description": "Files the API's upload groups make, which this server never opens. null on max, which is unlimited.", + "type": [ + "integer", + "null" + ] +} - changed
Output schema / properties / limits / requiredPrevious value: -[ - "images_per_day", - "scans_per_day", - "alt_texts_per_day", - "images_per_scan", - "crawls_per_day", - "pages_per_crawl", - "monitors", - "max_file_size", - "max_megapixels", - "compressions_per_minute", - "scans_per_minute", - "requests_per_minute", - "max_batch" -]New value: +[ + "images_per_day", + "scans_per_day", + "alt_texts_per_day", + "files_per_day", + "images_per_scan", + "crawls_per_day", + "pages_per_crawl", + "monitors", + "max_file_size", + "max_megapixels", + "compressions_per_minute", + "scans_per_minute", + "requests_per_minute", + "max_batch" +] - added
Output schema / properties / usage / properties / filesAdded value: +{ + "description": "Files the API's upload groups made; nothing this server does spends them.", + "properties": { + "remaining": { + "description": "null where the daily limit is null.", + "type": [ + "integer", + "null" + ] + }, + "resets_at": { + "type": [ + "string", + "null" + ] + }, + "used": { + "type": "integer" + } + }, + "required": [ + "used", + "remaining", + "resets_at" + ], + "type": "object" +} - changed
Output schema / properties / usage / requiredPrevious value: -[ - "images", - "scans", - "crawls", - "alt_texts" -]New value: +[ + "images", + "scans", + "crawls", + "alt_texts", + "files" +]
1 tool update
- Changed
get_usage7 fields changed- changed
Output schema / properties / limits / properties / alt_texts_per_day / descriptionPrevious value: -"AI alt texts. On max, the fair-use line, which stops before its images."New value: +"AI alt texts. Every plan has a number, max included." - changed
Output schema / properties / limits / properties / images_per_day / descriptionPrevious value: -"On max, which is sold as unlimited, the fair-use line."New value: +"null on max, which is unlimited." - changed
Output schema / properties / limits / properties / scans_per_day / descriptionPrevious value: -"On max, the fair-use line."New value: +"null on max, which is unlimited." - changed
Output schema / properties / usage / properties / alt_texts / properties / remaining / descriptionPrevious value: -"On max, what is left of the fair-use line."New value: +"null where the daily limit is null." - changed
Output schema / properties / usage / properties / crawls / properties / remaining / descriptionPrevious value: -"On max, what is left of the fair-use line."New value: +"null where the daily limit is null." - changed
Output schema / properties / usage / properties / images / properties / remaining / descriptionPrevious value: -"On max, what is left of the fair-use line."New value: +"null where the daily limit is null." - changed
Output schema / properties / usage / properties / scans / properties / remaining / descriptionPrevious value: -"On max, what is left of the fair-use line."New value: +"null where the daily limit is null."
12 tool updates
- Changed
compress_images3 fields changed- changed
Input schema / properties / folder / descriptionPrevious value: -"Pro: the folder every image of this call belongs in, like \"holiday/beach\", so create_zip puts them there. Send each folder's images in a call of their own. On another plan the call is refused with pro_required."New value: +"Paid plans: the folder every image of this call belongs in, like \"holiday/beach\", so create_zip puts them there. Send each folder's images in a call of their own. On another plan the call is refused with pro_required." - changed
Input schema / properties / responsive_widths / descriptionPrevious value: -"Pro: also make each image at these widths in pixels, for an <img srcset>, like [480, 768, 1200, 1600], the website's default. Each width is made from the original, at the same level and in the delivered format, and never enlarged: one wider than the image is made at its own width, once. They are made a few seconds after the image finishes; responsive on the image lists them. On another plan the call is refused with pro_required."New value: +"Paid plans: also make each image at these widths in pixels, for an <img srcset>, like [480, 768, 1200, 1600], the website's default. Each width is made from the original, at the same level and in the delivered format, and never enlarged: one wider than the image is made at its own width, once. They are made a few seconds after the image finishes; responsive on the image lists them. On another plan the call is refused with pro_required." - changed
Output schema / properties / images / items / properties / responsive / descriptionPrevious value: -"The responsive sizes (Pro), or null when none were asked for. list_images carries only their status."New value: +"The responsive sizes (paid plans), or null when none were asked for. list_images carries only their status."
- Changed
get_image1 field changed- changed
Output schema / properties / responsive / descriptionPrevious value: -"The responsive sizes (Pro), or null when none were asked for. list_images carries only their status."New value: +"The responsive sizes (paid plans), or null when none were asked for. list_images carries only their status."
- Changed
get_scan1 field changed- changed
Output schema / properties / share_url / descriptionPrevious value: -"The page report's public link while it is shared; it answers only while the account has Pro."New value: +"The page report's public link while it is shared; it answers only while the account is on a paid plan."
- Changed
get_usage10 fields changed- changed
Output schema / properties / limits / properties / alt_texts_per_day / descriptionPrevious value: -"AI alt texts. Null means no daily cap."New value: +"AI alt texts. On max, the fair-use line, which stops before its images." - changed
Output schema / properties / limits / properties / crawls_per_day / descriptionPrevious value: -"Site crawls. 0 means the plan has none, null no daily cap."New value: +"Site crawls. 0 means the plan has none." - changed
Output schema / properties / limits / properties / images_per_day / descriptionPrevious value: -"Null means no daily cap."New value: +"On max, which is sold as unlimited, the fair-use line." - changed
Output schema / properties / limits / properties / scans_per_day / descriptionPrevious value: -"Null means no daily cap."New value: +"On max, the fair-use line." - changed
Output schema / properties / plan / descriptionPrevious value: -"trial is the days of Pro an account gets once, as its email is verified or with the trial button on the website; it then answers free."New value: +"pro and max are the paid plans; trial is the days of Pro an account gets once, as its email is verified or with the trial button on the website; it then answers free." - changed
Output schema / properties / plan / enumPrevious value: -[ - "guest", - "free", - "trial", - "pro" -]New value: +[ + "guest", + "free", + "trial", + "pro", + "max" +] - changed
Output schema / properties / usage / properties / alt_texts / properties / remaining / descriptionPrevious value: -"Null on a plan without a daily cap."New value: +"On max, what is left of the fair-use line." - changed
Output schema / properties / usage / properties / crawls / properties / remaining / descriptionPrevious value: -"Null on a plan without a daily cap."New value: +"On max, what is left of the fair-use line." - changed
Output schema / properties / usage / properties / images / properties / remaining / descriptionPrevious value: -"Null on a plan without a daily cap."New value: +"On max, what is left of the fair-use line." - changed
Output schema / properties / usage / properties / scans / properties / remaining / descriptionPrevious value: -"Null on a plan without a daily cap."New value: +"On max, what is left of the fair-use line."
- Changed
list_images1 field changed- changed
Output schema / properties / images / items / properties / responsive / descriptionPrevious value: -"The responsive sizes (Pro), or null when none were asked for. list_images carries only their status."New value: +"The responsive sizes (paid plans), or null when none were asked for. list_images carries only their status."
- Changed
list_monitors1 field changed- changed
Output schema / properties / monitors / items / properties / paused / descriptionPrevious value: -"True while the plan has no weekly checks: the check is kept and runs again once the account is back on Pro."New value: +"True while the check does not run on the plan: the plan has no weekly checks, or it checks fewer sites than the account holds and this is not among its oldest. The check is kept and runs again once the plan covers it."
- Changed
monitor_site1 field changed- changed
Output schema / properties / paused / descriptionPrevious value: -"True while the plan has no weekly checks: the check is kept and runs again once the account is back on Pro."New value: +"True while the check does not run on the plan: the plan has no weekly checks, or it checks fewer sites than the account holds and this is not among its oldest. The check is kept and runs again once the plan covers it."
- Changed
rename_image1 field changed- changed
Output schema / properties / responsive / descriptionPrevious value: -"The responsive sizes (Pro), or null when none were asked for. list_images carries only their status."New value: +"The responsive sizes (paid plans), or null when none were asked for. list_images carries only their status."
- Changed
scan_page1 field changed- changed
Output schema / properties / share_url / descriptionPrevious value: -"The page report's public link while it is shared; it answers only while the account has Pro."New value: +"The page report's public link while it is shared; it answers only while the account is on a paid plan."
- Changed
share_image1 field changed- changed
Output schema / properties / responsive / descriptionPrevious value: -"The responsive sizes (Pro), or null when none were asked for. list_images carries only their status."New value: +"The responsive sizes (paid plans), or null when none were asked for. list_images carries only their status."
- Changed
share_scan_report1 field changed- changed
Output schema / properties / share_url / descriptionPrevious value: -"The page report's public link while it is shared; it answers only while the account has Pro."New value: +"The page report's public link while it is shared; it answers only while the account is on a paid plan."
- Changed
write_alt_text1 field changed- changed
Output schema / properties / responsive / descriptionPrevious value: -"The responsive sizes (Pro), or null when none were asked for. list_images carries only their status."New value: +"The responsive sizes (paid plans), or null when none were asked for. list_images carries only their status."
16 tool updates
- Changed
compress_images12 fields changed- added
Input schema / properties / folderAdded value: +{ + "description": "Pro: the folder every image of this call belongs in, like \"holiday/beach\", so create_zip puts them there. Send each folder's images in a call of their own. On another plan the call is refused with pro_required.", + "type": "string" +} - changed
Input schema / properties / level / descriptionPrevious value: -"How hard to compress. \"smart\" (the default) finds the lowest quality that still looks like the original; \"ultra\" goes further and softens fine texture a little; \"lossless\" changes no pixel; \"none\" only converts, resizes and strips metadata."New value: +"How hard to compress. \"smart\" (the default) finds the lowest quality that still looks like the original; \"ultra\" goes further and softens fine texture a little; \"lossless\" changes no pixel unless a size_limit needs it to; \"none\" only converts, resizes, fits a size limit and strips metadata." - added
Input schema / properties / responsive_widthsAdded value: +{ + "description": "Pro: also make each image at these widths in pixels, for an <img srcset>, like [480, 768, 1200, 1600], the website's default. Each width is made from the original, at the same level and in the delivered format, and never enlarged: one wider than the image is made at its own width, once. They are made a few seconds after the image finishes; responsive on the image lists them. On another plan the call is refused with pro_required.", + "items": { + "maximum": 65535, + "minimum": 16, + "type": "integer" + }, + "maxItems": 8, + "minItems": 1, + "type": "array" +} - added
Input schema / properties / size_limitAdded value: +{ + "description": "The most each optimized file may weigh, in KB of 1,000 bytes, for a form or a page with a file size limit (\"under 100 KB\" is 100). Iminify lowers the quality until it fits, and makes the image smaller in pixels when the lowest quality is still over. The limit comes before the level: under \"lossless\" or \"none\", a file over it is encoded again with loss. A PNG or GIF kept in its own format that is over the limit comes back as JPG, WebP or AVIF, so format \"png\" is refused with it; animations are never fitted. Each finished image's size_limit_status says under, resized or over.", + "minimum": 5, + "type": "integer" +} - added
Output schema / properties / images / items / properties / content_credentialsAdded value: +{ + "description": "The Content Credentials (a signed C2PA record of where the image came from) the file sent carried, or null when it carried none, and until the image has finished.", + "properties": { + "generative_ai": { + "description": "Whether they say generative AI made the image, as they state it; the signature is not checked.", + "type": "boolean" + }, + "status": { + "description": "removed: the optimized copy no longer carries them. kept: the optimized copy is the file that was sent, unchanged.", + "enum": [ + "removed", + "kept" + ], + "type": "string" + } + }, + "required": [ + "status", + "generative_ai" + ], + "type": [ + "object", + "null" + ] +} - added
Output schema / properties / images / items / properties / folderAdded value: +{ + "description": "The folder it was sent with, which a zip puts it in. Null for an image on its own.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / images / items / properties / responsiveAdded value: +{ + "description": "The responsive sizes (Pro), or null when none were asked for. list_images carries only their status.", + "properties": { + "download_url": { + "description": "A zip of every width, once ready. Works without a token for an hour. Not in list_images.", + "type": [ + "string", + "null" + ] + }, + "files": { + "description": "Each width, narrowest first, once ready. Not in list_images.", + "items": { + "properties": { + "download_url": { + "description": "Works without a token for an hour.", + "type": "string" + }, + "height": { + "type": "integer" + }, + "name": { + "description": "The name it downloads under, which html uses.", + "type": "string" + }, + "size": { + "description": "Bytes.", + "type": "integer" + }, + "width": { + "type": "integer" + } + }, + "required": [ + "width", + "height", + "size", + "name", + "download_url" + ], + "type": "object" + }, + "type": "array" + }, + "html": { + "description": "An <img srcset> naming the files, once ready. Not in list_images.", + "type": [ + "string", + "null" + ] + }, + "status": { + "description": "pending: being made, a few seconds after the image is completed or already-optimized. ready: every width is made. failed: none was kept; compress it again with responsive_widths. skipped: an animation gets none.", + "enum": [ + "pending", + "ready", + "failed", + "skipped" + ], + "type": "string" + } + }, + "required": [ + "status" + ], + "type": [ + "object", + "null" + ] +} - added
Output schema / properties / images / items / properties / settings / properties / responsive_widthsAdded value: +{ + "description": "The responsive widths asked for, or null.", + "items": { + "type": "integer" + }, + "type": [ + "array", + "null" + ] +} - added
Output schema / properties / images / items / properties / settings / properties / size_limitAdded value: +{ + "description": "The most the optimized copy may weigh, in KB of 1,000 bytes, or null.", + "type": [ + "integer", + "null" + ] +} - changed
Output schema / properties / images / items / properties / settings / requiredPrevious value: -[ - "level", - "format", - "keep_metadata", - "width", - "height", - "scale" -]New value: +[ + "level", + "format", + "keep_metadata", + "width", + "height", + "scale", + "size_limit", + "responsive_widths" +] - added
Output schema / properties / images / items / properties / size_limit_statusAdded value: +{ + "description": "Against settings.size_limit: under, resized (made smaller in pixels to fit) or over. Null without a limit, and until the image has finished.", + "enum": [ + "under", + "resized", + "over", + null + ], + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / images / items / requiredPrevious value: -[ - "id", - "status", - "name", - "original", - "optimized", - "saved_bytes", - "saved_percent", - "settings", - "alt_text", - "scan_id", - "source_url", - "share_url", - "created_at", - "updated_at" -]New value: +[ + "id", + "status", + "name", + "original", + "optimized", + "saved_bytes", + "saved_percent", + "settings", + "size_limit_status", + "content_credentials", + "alt_text", + "responsive", + "scan_id", + "source_url", + "folder", + "share_url", + "created_at", + "updated_at" +]
- Added
crawl_site - Changed
create_zip3 fields changed- added
Input schema / properties / crawl_idAdded value: +{ + "description": "The id crawl_site returned, to zip every page of a finished site crawl. Send one of ids, scan_id and crawl_id.", + "type": "string" +} - changed
Input schema / properties / ids / descriptionPrevious value: -"Up to 150 image ids, as compress_images, get_image and list_images return them. Send this or scan_id, not both."New value: +"Up to 150 image ids, as compress_images, get_image and list_images return them. Send one of ids, scan_id and crawl_id." - changed
Input schema / properties / scan_id / descriptionPrevious value: -"The id scan_page returned, to zip every finished image that scan found. Send this or ids, not both."New value: +"The id scan_page returned, to zip every finished image that scan found. Send one of ids, scan_id and crawl_id."
- Added
get_crawl - Changed
get_image7 fields changed- added
Output schema / properties / content_credentialsAdded value: +{ + "description": "The Content Credentials (a signed C2PA record of where the image came from) the file sent carried, or null when it carried none, and until the image has finished.", + "properties": { + "generative_ai": { + "description": "Whether they say generative AI made the image, as they state it; the signature is not checked.", + "type": "boolean" + }, + "status": { + "description": "removed: the optimized copy no longer carries them. kept: the optimized copy is the file that was sent, unchanged.", + "enum": [ + "removed", + "kept" + ], + "type": "string" + } + }, + "required": [ + "status", + "generative_ai" + ], + "type": [ + "object", + "null" + ] +} - added
Output schema / properties / folderAdded value: +{ + "description": "The folder it was sent with, which a zip puts it in. Null for an image on its own.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / responsiveAdded value: +{ + "description": "The responsive sizes (Pro), or null when none were asked for. list_images carries only their status.", + "properties": { + "download_url": { + "description": "A zip of every width, once ready. Works without a token for an hour. Not in list_images.", + "type": [ + "string", + "null" + ] + }, + "files": { + "description": "Each width, narrowest first, once ready. Not in list_images.", + "items": { + "properties": { + "download_url": { + "description": "Works without a token for an hour.", + "type": "string" + }, + "height": { + "type": "integer" + }, + "name": { + "description": "The name it downloads under, which html uses.", + "type": "string" + }, + "size": { + "description": "Bytes.", + "type": "integer" + }, + "width": { + "type": "integer" + } + }, + "required": [ + "width", + "height", + "size", + "name", + "download_url" + ], + "type": "object" + }, + "type": "array" + }, + "html": { + "description": "An <img srcset> naming the files, once ready. Not in list_images.", + "type": [ + "string", + "null" + ] + }, + "status": { + "description": "pending: being made, a few seconds after the image is completed or already-optimized. ready: every width is made. failed: none was kept; compress it again with responsive_widths. skipped: an animation gets none.", + "enum": [ + "pending", + "ready", + "failed", + "skipped" + ], + "type": "string" + } + }, + "required": [ + "status" + ], + "type": [ + "object", + "null" + ] +} - added
Output schema / properties / settings / properties / responsive_widthsAdded value: +{ + "description": "The responsive widths asked for, or null.", + "items": { + "type": "integer" + }, + "type": [ + "array", + "null" + ] +} - added
Output schema / properties / settings / properties / size_limitAdded value: +{ + "description": "The most the optimized copy may weigh, in KB of 1,000 bytes, or null.", + "type": [ + "integer", + "null" + ] +} - changed
Output schema / properties / settings / requiredPrevious value: -[ - "level", - "format", - "keep_metadata", - "width", - "height", - "scale" -]New value: +[ + "level", + "format", + "keep_metadata", + "width", + "height", + "scale", + "size_limit", + "responsive_widths" +] - added
Output schema / properties / size_limit_statusAdded value: +{ + "description": "Against settings.size_limit: under, resized (made smaller in pixels to fit) or over. Null without a limit, and until the image has finished.", + "enum": [ + "under", + "resized", + "over", + null + ], + "type": [ + "string", + "null" + ] +}
- Changed
get_scan3 fields changed- changed
Output schema / properties / audit / properties / images / items / properties / skip_reason / enumPrevious value: -[ - "duplicate", - "unsupported_format", - "too_large", - "tracking_pixel", - "private_network", - "unreadable", - "unreachable", - "refused", - "failed", - null -]New value: +[ + "duplicate", + "unsupported_format", + "too_large", + "tracking_pixel", + "private_network", + "unreadable", + "unreachable", + "refused", + "failed", + "unchanged", + null +] - added
Output schema / properties / crawl_idAdded value: +{ + "description": "The site crawl this scan is a page of, for get_crawl, or null.", + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / skipped / items / properties / reason / enumPrevious value: -[ - "duplicate", - "unsupported_format", - "too_large", - "tracking_pixel", - "private_network", - "unreadable", - "unreachable", - "refused", - "failed" -]New value: +[ + "duplicate", + "unsupported_format", + "too_large", + "tracking_pixel", + "private_network", + "unreadable", + "unreachable", + "refused", + "failed", + "unchanged" +]
- Changed
get_usage9 fields changed- added
Output schema / properties / limits / properties / crawls_per_dayAdded value: +{ + "description": "Site crawls. 0 means the plan has none, null no daily cap.", + "type": [ + "integer", + "null" + ] +} - added
Output schema / properties / limits / properties / monitorsAdded value: +{ + "description": "Sites checked weekly at once. 0 means the plan has no weekly checks.", + "type": "integer" +} - added
Output schema / properties / limits / properties / pages_per_crawlAdded value: +{ + "description": "0 means the plan has no site crawls.", + "type": "integer" +} - changed
Output schema / properties / limits / requiredPrevious value: -[ - "images_per_day", - "scans_per_day", - "alt_texts_per_day", - "images_per_scan", - "max_file_size", - "max_megapixels", - "compressions_per_minute", - "scans_per_minute", - "requests_per_minute", - "max_batch" -]New value: +[ + "images_per_day", + "scans_per_day", + "alt_texts_per_day", + "images_per_scan", + "crawls_per_day", + "pages_per_crawl", + "monitors", + "max_file_size", + "max_megapixels", + "compressions_per_minute", + "scans_per_minute", + "requests_per_minute", + "max_batch" +] - added
Output schema / properties / plan / descriptionAdded value: +"trial is the days of Pro an account gets once, as its email is verified or with the trial button on the website; it then answers free." - changed
Output schema / properties / plan / enumPrevious value: -[ - "guest", - "free", - "pro" -]New value: +[ + "guest", + "free", + "trial", + "pro" +] - changed
Output schema / properties / plan_ends_at / descriptionPrevious value: -"When a cancelled paid plan ends."New value: +"When a cancelled paid plan or a trial ends." - added
Output schema / properties / usage / properties / crawlsAdded value: +{ + "properties": { + "remaining": { + "description": "Null on a plan without a daily cap.", + "type": [ + "integer", + "null" + ] + }, + "resets_at": { + "type": [ + "string", + "null" + ] + }, + "used": { + "type": "integer" + } + }, + "required": [ + "used", + "remaining", + "resets_at" + ], + "type": "object" +} - changed
Output schema / properties / usage / requiredPrevious value: -[ - "images", - "scans", - "alt_texts" -]New value: +[ + "images", + "scans", + "crawls", + "alt_texts" +]
- Changed
list_images8 fields changed- added
Output schema / properties / images / items / properties / content_credentialsAdded value: +{ + "description": "The Content Credentials (a signed C2PA record of where the image came from) the file sent carried, or null when it carried none, and until the image has finished.", + "properties": { + "generative_ai": { + "description": "Whether they say generative AI made the image, as they state it; the signature is not checked.", + "type": "boolean" + }, + "status": { + "description": "removed: the optimized copy no longer carries them. kept: the optimized copy is the file that was sent, unchanged.", + "enum": [ + "removed", + "kept" + ], + "type": "string" + } + }, + "required": [ + "status", + "generative_ai" + ], + "type": [ + "object", + "null" + ] +} - added
Output schema / properties / images / items / properties / folderAdded value: +{ + "description": "The folder it was sent with, which a zip puts it in. Null for an image on its own.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / images / items / properties / responsiveAdded value: +{ + "description": "The responsive sizes (Pro), or null when none were asked for. list_images carries only their status.", + "properties": { + "download_url": { + "description": "A zip of every width, once ready. Works without a token for an hour. Not in list_images.", + "type": [ + "string", + "null" + ] + }, + "files": { + "description": "Each width, narrowest first, once ready. Not in list_images.", + "items": { + "properties": { + "download_url": { + "description": "Works without a token for an hour.", + "type": "string" + }, + "height": { + "type": "integer" + }, + "name": { + "description": "The name it downloads under, which html uses.", + "type": "string" + }, + "size": { + "description": "Bytes.", + "type": "integer" + }, + "width": { + "type": "integer" + } + }, + "required": [ + "width", + "height", + "size", + "name", + "download_url" + ], + "type": "object" + }, + "type": "array" + }, + "html": { + "description": "An <img srcset> naming the files, once ready. Not in list_images.", + "type": [ + "string", + "null" + ] + }, + "status": { + "description": "pending: being made, a few seconds after the image is completed or already-optimized. ready: every width is made. failed: none was kept; compress it again with responsive_widths. skipped: an animation gets none.", + "enum": [ + "pending", + "ready", + "failed", + "skipped" + ], + "type": "string" + } + }, + "required": [ + "status" + ], + "type": [ + "object", + "null" + ] +} - added
Output schema / properties / images / items / properties / settings / properties / responsive_widthsAdded value: +{ + "description": "The responsive widths asked for, or null.", + "items": { + "type": "integer" + }, + "type": [ + "array", + "null" + ] +} - added
Output schema / properties / images / items / properties / settings / properties / size_limitAdded value: +{ + "description": "The most the optimized copy may weigh, in KB of 1,000 bytes, or null.", + "type": [ + "integer", + "null" + ] +} - changed
Output schema / properties / images / items / properties / settings / requiredPrevious value: -[ - "level", - "format", - "keep_metadata", - "width", - "height", - "scale" -]New value: +[ + "level", + "format", + "keep_metadata", + "width", + "height", + "scale", + "size_limit", + "responsive_widths" +] - added
Output schema / properties / images / items / properties / size_limit_statusAdded value: +{ + "description": "Against settings.size_limit: under, resized (made smaller in pixels to fit) or over. Null without a limit, and until the image has finished.", + "enum": [ + "under", + "resized", + "over", + null + ], + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / images / items / requiredPrevious value: -[ - "id", - "status", - "name", - "original", - "optimized", - "saved_bytes", - "saved_percent", - "settings", - "alt_text", - "scan_id", - "source_url", - "share_url", - "created_at", - "updated_at" -]New value: +[ + "id", + "status", + "name", + "original", + "optimized", + "saved_bytes", + "saved_percent", + "settings", + "size_limit_status", + "content_credentials", + "alt_text", + "responsive", + "scan_id", + "source_url", + "folder", + "share_url", + "created_at", + "updated_at" +]
- Added
list_monitors - Added
monitor_site - Changed
rename_image7 fields changed- added
Output schema / properties / content_credentialsAdded value: +{ + "description": "The Content Credentials (a signed C2PA record of where the image came from) the file sent carried, or null when it carried none, and until the image has finished.", + "properties": { + "generative_ai": { + "description": "Whether they say generative AI made the image, as they state it; the signature is not checked.", + "type": "boolean" + }, + "status": { + "description": "removed: the optimized copy no longer carries them. kept: the optimized copy is the file that was sent, unchanged.", + "enum": [ + "removed", + "kept" + ], + "type": "string" + } + }, + "required": [ + "status", + "generative_ai" + ], + "type": [ + "object", + "null" + ] +} - added
Output schema / properties / folderAdded value: +{ + "description": "The folder it was sent with, which a zip puts it in. Null for an image on its own.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / responsiveAdded value: +{ + "description": "The responsive sizes (Pro), or null when none were asked for. list_images carries only their status.", + "properties": { + "download_url": { + "description": "A zip of every width, once ready. Works without a token for an hour. Not in list_images.", + "type": [ + "string", + "null" + ] + }, + "files": { + "description": "Each width, narrowest first, once ready. Not in list_images.", + "items": { + "properties": { + "download_url": { + "description": "Works without a token for an hour.", + "type": "string" + }, + "height": { + "type": "integer" + }, + "name": { + "description": "The name it downloads under, which html uses.", + "type": "string" + }, + "size": { + "description": "Bytes.", + "type": "integer" + }, + "width": { + "type": "integer" + } + }, + "required": [ + "width", + "height", + "size", + "name", + "download_url" + ], + "type": "object" + }, + "type": "array" + }, + "html": { + "description": "An <img srcset> naming the files, once ready. Not in list_images.", + "type": [ + "string", + "null" + ] + }, + "status": { + "description": "pending: being made, a few seconds after the image is completed or already-optimized. ready: every width is made. failed: none was kept; compress it again with responsive_widths. skipped: an animation gets none.", + "enum": [ + "pending", + "ready", + "failed", + "skipped" + ], + "type": "string" + } + }, + "required": [ + "status" + ], + "type": [ + "object", + "null" + ] +} - added
Output schema / properties / settings / properties / responsive_widthsAdded value: +{ + "description": "The responsive widths asked for, or null.", + "items": { + "type": "integer" + }, + "type": [ + "array", + "null" + ] +} - added
Output schema / properties / settings / properties / size_limitAdded value: +{ + "description": "The most the optimized copy may weigh, in KB of 1,000 bytes, or null.", + "type": [ + "integer", + "null" + ] +} - changed
Output schema / properties / settings / requiredPrevious value: -[ - "level", - "format", - "keep_metadata", - "width", - "height", - "scale" -]New value: +[ + "level", + "format", + "keep_metadata", + "width", + "height", + "scale", + "size_limit", + "responsive_widths" +] - added
Output schema / properties / size_limit_statusAdded value: +{ + "description": "Against settings.size_limit: under, resized (made smaller in pixels to fit) or over. Null without a limit, and until the image has finished.", + "enum": [ + "under", + "resized", + "over", + null + ], + "type": [ + "string", + "null" + ] +}
- Changed
scan_page4 fields changed- changed
Input schema / properties / level / descriptionPrevious value: -"How hard to compress. \"smart\" (the default) finds the lowest quality that still looks like the original; \"ultra\" goes further and softens fine texture a little; \"lossless\" changes no pixel; \"none\" only converts, resizes and strips metadata."New value: +"How hard to compress. \"smart\" (the default) finds the lowest quality that still looks like the original; \"ultra\" goes further and softens fine texture a little; \"lossless\" changes no pixel unless a size_limit needs it to; \"none\" only converts, resizes, fits a size limit and strips metadata." - changed
Output schema / properties / audit / properties / images / items / properties / skip_reason / enumPrevious value: -[ - "duplicate", - "unsupported_format", - "too_large", - "tracking_pixel", - "private_network", - "unreadable", - "unreachable", - "refused", - "failed", - null -]New value: +[ + "duplicate", + "unsupported_format", + "too_large", + "tracking_pixel", + "private_network", + "unreadable", + "unreachable", + "refused", + "failed", + "unchanged", + null +] - added
Output schema / properties / crawl_idAdded value: +{ + "description": "The site crawl this scan is a page of, for get_crawl, or null.", + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / skipped / items / properties / reason / enumPrevious value: -[ - "duplicate", - "unsupported_format", - "too_large", - "tracking_pixel", - "private_network", - "unreadable", - "unreachable", - "refused", - "failed" -]New value: +[ + "duplicate", + "unsupported_format", + "too_large", + "tracking_pixel", + "private_network", + "unreadable", + "unreachable", + "refused", + "failed", + "unchanged" +]
- Changed
share_image7 fields changed- added
Output schema / properties / content_credentialsAdded value: +{ + "description": "The Content Credentials (a signed C2PA record of where the image came from) the file sent carried, or null when it carried none, and until the image has finished.", + "properties": { + "generative_ai": { + "description": "Whether they say generative AI made the image, as they state it; the signature is not checked.", + "type": "boolean" + }, + "status": { + "description": "removed: the optimized copy no longer carries them. kept: the optimized copy is the file that was sent, unchanged.", + "enum": [ + "removed", + "kept" + ], + "type": "string" + } + }, + "required": [ + "status", + "generative_ai" + ], + "type": [ + "object", + "null" + ] +} - added
Output schema / properties / folderAdded value: +{ + "description": "The folder it was sent with, which a zip puts it in. Null for an image on its own.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / responsiveAdded value: +{ + "description": "The responsive sizes (Pro), or null when none were asked for. list_images carries only their status.", + "properties": { + "download_url": { + "description": "A zip of every width, once ready. Works without a token for an hour. Not in list_images.", + "type": [ + "string", + "null" + ] + }, + "files": { + "description": "Each width, narrowest first, once ready. Not in list_images.", + "items": { + "properties": { + "download_url": { + "description": "Works without a token for an hour.", + "type": "string" + }, + "height": { + "type": "integer" + }, + "name": { + "description": "The name it downloads under, which html uses.", + "type": "string" + }, + "size": { + "description": "Bytes.", + "type": "integer" + }, + "width": { + "type": "integer" + } + }, + "required": [ + "width", + "height", + "size", + "name", + "download_url" + ], + "type": "object" + }, + "type": "array" + }, + "html": { + "description": "An <img srcset> naming the files, once ready. Not in list_images.", + "type": [ + "string", + "null" + ] + }, + "status": { + "description": "pending: being made, a few seconds after the image is completed or already-optimized. ready: every width is made. failed: none was kept; compress it again with responsive_widths. skipped: an animation gets none.", + "enum": [ + "pending", + "ready", + "failed", + "skipped" + ], + "type": "string" + } + }, + "required": [ + "status" + ], + "type": [ + "object", + "null" + ] +} - added
Output schema / properties / settings / properties / responsive_widthsAdded value: +{ + "description": "The responsive widths asked for, or null.", + "items": { + "type": "integer" + }, + "type": [ + "array", + "null" + ] +} - added
Output schema / properties / settings / properties / size_limitAdded value: +{ + "description": "The most the optimized copy may weigh, in KB of 1,000 bytes, or null.", + "type": [ + "integer", + "null" + ] +} - changed
Output schema / properties / settings / requiredPrevious value: -[ - "level", - "format", - "keep_metadata", - "width", - "height", - "scale" -]New value: +[ + "level", + "format", + "keep_metadata", + "width", + "height", + "scale", + "size_limit", + "responsive_widths" +] - added
Output schema / properties / size_limit_statusAdded value: +{ + "description": "Against settings.size_limit: under, resized (made smaller in pixels to fit) or over. Null without a limit, and until the image has finished.", + "enum": [ + "under", + "resized", + "over", + null + ], + "type": [ + "string", + "null" + ] +}
- Changed
share_scan_report3 fields changed- changed
Output schema / properties / audit / properties / images / items / properties / skip_reason / enumPrevious value: -[ - "duplicate", - "unsupported_format", - "too_large", - "tracking_pixel", - "private_network", - "unreadable", - "unreachable", - "refused", - "failed", - null -]New value: +[ + "duplicate", + "unsupported_format", + "too_large", + "tracking_pixel", + "private_network", + "unreadable", + "unreachable", + "refused", + "failed", + "unchanged", + null +] - added
Output schema / properties / crawl_idAdded value: +{ + "description": "The site crawl this scan is a page of, for get_crawl, or null.", + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / skipped / items / properties / reason / enumPrevious value: -[ - "duplicate", - "unsupported_format", - "too_large", - "tracking_pixel", - "private_network", - "unreadable", - "unreachable", - "refused", - "failed" -]New value: +[ + "duplicate", + "unsupported_format", + "too_large", + "tracking_pixel", + "private_network", + "unreadable", + "unreachable", + "refused", + "failed", + "unchanged" +]
- Added
stop_monitor - Changed
write_alt_text7 fields changed- added
Output schema / properties / content_credentialsAdded value: +{ + "description": "The Content Credentials (a signed C2PA record of where the image came from) the file sent carried, or null when it carried none, and until the image has finished.", + "properties": { + "generative_ai": { + "description": "Whether they say generative AI made the image, as they state it; the signature is not checked.", + "type": "boolean" + }, + "status": { + "description": "removed: the optimized copy no longer carries them. kept: the optimized copy is the file that was sent, unchanged.", + "enum": [ + "removed", + "kept" + ], + "type": "string" + } + }, + "required": [ + "status", + "generative_ai" + ], + "type": [ + "object", + "null" + ] +} - added
Output schema / properties / folderAdded value: +{ + "description": "The folder it was sent with, which a zip puts it in. Null for an image on its own.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / responsiveAdded value: +{ + "description": "The responsive sizes (Pro), or null when none were asked for. list_images carries only their status.", + "properties": { + "download_url": { + "description": "A zip of every width, once ready. Works without a token for an hour. Not in list_images.", + "type": [ + "string", + "null" + ] + }, + "files": { + "description": "Each width, narrowest first, once ready. Not in list_images.", + "items": { + "properties": { + "download_url": { + "description": "Works without a token for an hour.", + "type": "string" + }, + "height": { + "type": "integer" + }, + "name": { + "description": "The name it downloads under, which html uses.", + "type": "string" + }, + "size": { + "description": "Bytes.", + "type": "integer" + }, + "width": { + "type": "integer" + } + }, + "required": [ + "width", + "height", + "size", + "name", + "download_url" + ], + "type": "object" + }, + "type": "array" + }, + "html": { + "description": "An <img srcset> naming the files, once ready. Not in list_images.", + "type": [ + "string", + "null" + ] + }, + "status": { + "description": "pending: being made, a few seconds after the image is completed or already-optimized. ready: every width is made. failed: none was kept; compress it again with responsive_widths. skipped: an animation gets none.", + "enum": [ + "pending", + "ready", + "failed", + "skipped" + ], + "type": "string" + } + }, + "required": [ + "status" + ], + "type": [ + "object", + "null" + ] +} - added
Output schema / properties / settings / properties / responsive_widthsAdded value: +{ + "description": "The responsive widths asked for, or null.", + "items": { + "type": "integer" + }, + "type": [ + "array", + "null" + ] +} - added
Output schema / properties / settings / properties / size_limitAdded value: +{ + "description": "The most the optimized copy may weigh, in KB of 1,000 bytes, or null.", + "type": [ + "integer", + "null" + ] +} - changed
Output schema / properties / settings / requiredPrevious value: -[ - "level", - "format", - "keep_metadata", - "width", - "height", - "scale" -]New value: +[ + "level", + "format", + "keep_metadata", + "width", + "height", + "scale", + "size_limit", + "responsive_widths" +] - added
Output schema / properties / size_limit_statusAdded value: +{ + "description": "Against settings.size_limit: under, resized (made smaller in pixels to fit) or over. Null without a limit, and until the image has finished.", + "enum": [ + "under", + "resized", + "over", + null + ], + "type": [ + "string", + "null" + ] +}
4 tool updates
- Changed
get_scan2 fields changed- changed
Output schema / properties / hint / descriptionPrevious value: -"What to do next, while the scan or its images are still running."New value: +"What to do next: poll again while the scan or its images are still running, then where to read its images." - removed
Output schema / properties / imagesRemoved value: -{ - "description": "The images the scan found, newest first.", - "items": { - "properties": { - "alt_text": { - "description": "The AI alt text, or null when none was asked for.", - "properties": { - "language": { - "type": [ - "string", - "null" - ] - }, - "status": { - "description": "pending: being written, a few seconds after the image is completed or already-optimized; it waits for a retry while the image is failed or cancelled. written: ready. failed: ask again with write_alt_text. skipped: the day's AI alt texts were used up.", - "enum": [ - "pending", - "written", - "failed", - "skipped" - ], - "type": "string" - }, - "suggested_name": { - "description": "A descriptive file name without an extension, for rename_image.", - "type": [ - "string", - "null" - ] - }, - "text": { - "description": "One sentence for the image's alt attribute, once written.", - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "status", - "text", - "language", - "suggested_name" - ], - "type": [ - "object", - "null" - ] - }, - "created_at": { - "type": [ - "string", - "null" - ] - }, - "hint": { - "description": "What to do next, when the status alone does not say.", - "type": "string" - }, - "id": { - "description": "The image's id.", - "type": "string" - }, - "name": { - "description": "The name the optimized copy downloads under.", - "type": "string" - }, - "optimized": { - "description": "Null until the image has finished.", - "properties": { - "download_url": { - "description": "Works without a token for an hour.", - "type": "string" - }, - "format": { - "type": "string" - }, - "height": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "size": { - "description": "Bytes.", - "type": "integer" - }, - "width": { - "type": "integer" - } - }, - "required": [ - "name", - "format", - "size", - "width", - "height", - "download_url" - ], - "type": [ - "object", - "null" - ] - }, - "original": { - "properties": { - "download_url": { - "description": "Works without a token for an hour.", - "type": "string" - }, - "format": { - "type": "string" - }, - "height": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "size": { - "description": "Bytes.", - "type": "integer" - }, - "width": { - "type": "integer" - } - }, - "required": [ - "name", - "format", - "size", - "width", - "height", - "download_url" - ], - "type": "object" - }, - "saved_bytes": { - "description": "Negative when the optimized copy is larger.", - "type": [ - "integer", - "null" - ] - }, - "saved_percent": { - "type": [ - "number", - "null" - ] - }, - "scan_id": { - "description": "The page scan that found it, if one did.", - "type": [ - "string", - "null" - ] - }, - "settings": { - "properties": { - "format": { - "description": "The format asked for, or null when none was sent. auto stays auto after the image finishes.", - "enum": [ - "auto", - "webp", - "avif", - "png", - "jpg", - null - ], - "type": [ - "string", - "null" - ] - }, - "height": { - "type": [ - "integer", - "null" - ] - }, - "keep_metadata": { - "type": "boolean" - }, - "level": { - "enum": [ - "none", - "lossless", - "ultra", - "smart", - null - ], - "type": [ - "string", - "null" - ] - }, - "scale": { - "type": [ - "integer", - "null" - ] - }, - "width": { - "type": [ - "integer", - "null" - ] - } - }, - "required": [ - "level", - "format", - "keep_metadata", - "width", - "height", - "scale" - ], - "type": "object" - }, - "share_url": { - "description": "Its public page, once shared.", - "type": [ - "string", - "null" - ] - }, - "source_url": { - "description": "The address it was fetched from: its address on the scanned page, or the url it was sent as. Null for a file.", - "type": [ - "string", - "null" - ] - }, - "status": { - "enum": [ - "queued", - "optimizing", - "completed", - "failed", - "already-optimized", - "cancelled" - ], - "type": "string" - }, - "updated_at": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "id", - "status", - "name", - "original", - "optimized", - "saved_bytes", - "saved_percent", - "settings", - "alt_text", - "scan_id", - "source_url", - "share_url", - "created_at", - "updated_at" - ], - "type": "object" - }, - "type": "array" -}
- Changed
list_images2 fields changed- changed
Input schema / properties / per_page / descriptionPrevious value: -"Images a page, from 1 to 100. 15 by default."New value: +"Images a page, from 1 to 50. 15 by default." - changed
Input schema / properties / per_page / maximumPrevious value: -100New value: +50
- Changed
scan_page2 fields changed- changed
Output schema / properties / hint / descriptionPrevious value: -"What to do next, while the scan or its images are still running."New value: +"What to do next: poll again while the scan or its images are still running, then where to read its images." - removed
Output schema / properties / imagesRemoved value: -{ - "description": "The images the scan found, newest first.", - "items": { - "properties": { - "alt_text": { - "description": "The AI alt text, or null when none was asked for.", - "properties": { - "language": { - "type": [ - "string", - "null" - ] - }, - "status": { - "description": "pending: being written, a few seconds after the image is completed or already-optimized; it waits for a retry while the image is failed or cancelled. written: ready. failed: ask again with write_alt_text. skipped: the day's AI alt texts were used up.", - "enum": [ - "pending", - "written", - "failed", - "skipped" - ], - "type": "string" - }, - "suggested_name": { - "description": "A descriptive file name without an extension, for rename_image.", - "type": [ - "string", - "null" - ] - }, - "text": { - "description": "One sentence for the image's alt attribute, once written.", - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "status", - "text", - "language", - "suggested_name" - ], - "type": [ - "object", - "null" - ] - }, - "created_at": { - "type": [ - "string", - "null" - ] - }, - "hint": { - "description": "What to do next, when the status alone does not say.", - "type": "string" - }, - "id": { - "description": "The image's id.", - "type": "string" - }, - "name": { - "description": "The name the optimized copy downloads under.", - "type": "string" - }, - "optimized": { - "description": "Null until the image has finished.", - "properties": { - "download_url": { - "description": "Works without a token for an hour.", - "type": "string" - }, - "format": { - "type": "string" - }, - "height": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "size": { - "description": "Bytes.", - "type": "integer" - }, - "width": { - "type": "integer" - } - }, - "required": [ - "name", - "format", - "size", - "width", - "height", - "download_url" - ], - "type": [ - "object", - "null" - ] - }, - "original": { - "properties": { - "download_url": { - "description": "Works without a token for an hour.", - "type": "string" - }, - "format": { - "type": "string" - }, - "height": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "size": { - "description": "Bytes.", - "type": "integer" - }, - "width": { - "type": "integer" - } - }, - "required": [ - "name", - "format", - "size", - "width", - "height", - "download_url" - ], - "type": "object" - }, - "saved_bytes": { - "description": "Negative when the optimized copy is larger.", - "type": [ - "integer", - "null" - ] - }, - "saved_percent": { - "type": [ - "number", - "null" - ] - }, - "scan_id": { - "description": "The page scan that found it, if one did.", - "type": [ - "string", - "null" - ] - }, - "settings": { - "properties": { - "format": { - "description": "The format asked for, or null when none was sent. auto stays auto after the image finishes.", - "enum": [ - "auto", - "webp", - "avif", - "png", - "jpg", - null - ], - "type": [ - "string", - "null" - ] - }, - "height": { - "type": [ - "integer", - "null" - ] - }, - "keep_metadata": { - "type": "boolean" - }, - "level": { - "enum": [ - "none", - "lossless", - "ultra", - "smart", - null - ], - "type": [ - "string", - "null" - ] - }, - "scale": { - "type": [ - "integer", - "null" - ] - }, - "width": { - "type": [ - "integer", - "null" - ] - } - }, - "required": [ - "level", - "format", - "keep_metadata", - "width", - "height", - "scale" - ], - "type": "object" - }, - "share_url": { - "description": "Its public page, once shared.", - "type": [ - "string", - "null" - ] - }, - "source_url": { - "description": "The address it was fetched from: its address on the scanned page, or the url it was sent as. Null for a file.", - "type": [ - "string", - "null" - ] - }, - "status": { - "enum": [ - "queued", - "optimizing", - "completed", - "failed", - "already-optimized", - "cancelled" - ], - "type": "string" - }, - "updated_at": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "id", - "status", - "name", - "original", - "optimized", - "saved_bytes", - "saved_percent", - "settings", - "alt_text", - "scan_id", - "source_url", - "share_url", - "created_at", - "updated_at" - ], - "type": "object" - }, - "type": "array" -}
- Changed
share_scan_report2 fields changed- changed
Output schema / properties / hint / descriptionPrevious value: -"What to do next, while the scan or its images are still running."New value: +"What to do next: poll again while the scan or its images are still running, then where to read its images." - removed
Output schema / properties / imagesRemoved value: -{ - "description": "The images the scan found, newest first.", - "items": { - "properties": { - "alt_text": { - "description": "The AI alt text, or null when none was asked for.", - "properties": { - "language": { - "type": [ - "string", - "null" - ] - }, - "status": { - "description": "pending: being written, a few seconds after the image is completed or already-optimized; it waits for a retry while the image is failed or cancelled. written: ready. failed: ask again with write_alt_text. skipped: the day's AI alt texts were used up.", - "enum": [ - "pending", - "written", - "failed", - "skipped" - ], - "type": "string" - }, - "suggested_name": { - "description": "A descriptive file name without an extension, for rename_image.", - "type": [ - "string", - "null" - ] - }, - "text": { - "description": "One sentence for the image's alt attribute, once written.", - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "status", - "text", - "language", - "suggested_name" - ], - "type": [ - "object", - "null" - ] - }, - "created_at": { - "type": [ - "string", - "null" - ] - }, - "hint": { - "description": "What to do next, when the status alone does not say.", - "type": "string" - }, - "id": { - "description": "The image's id.", - "type": "string" - }, - "name": { - "description": "The name the optimized copy downloads under.", - "type": "string" - }, - "optimized": { - "description": "Null until the image has finished.", - "properties": { - "download_url": { - "description": "Works without a token for an hour.", - "type": "string" - }, - "format": { - "type": "string" - }, - "height": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "size": { - "description": "Bytes.", - "type": "integer" - }, - "width": { - "type": "integer" - } - }, - "required": [ - "name", - "format", - "size", - "width", - "height", - "download_url" - ], - "type": [ - "object", - "null" - ] - }, - "original": { - "properties": { - "download_url": { - "description": "Works without a token for an hour.", - "type": "string" - }, - "format": { - "type": "string" - }, - "height": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "size": { - "description": "Bytes.", - "type": "integer" - }, - "width": { - "type": "integer" - } - }, - "required": [ - "name", - "format", - "size", - "width", - "height", - "download_url" - ], - "type": "object" - }, - "saved_bytes": { - "description": "Negative when the optimized copy is larger.", - "type": [ - "integer", - "null" - ] - }, - "saved_percent": { - "type": [ - "number", - "null" - ] - }, - "scan_id": { - "description": "The page scan that found it, if one did.", - "type": [ - "string", - "null" - ] - }, - "settings": { - "properties": { - "format": { - "description": "The format asked for, or null when none was sent. auto stays auto after the image finishes.", - "enum": [ - "auto", - "webp", - "avif", - "png", - "jpg", - null - ], - "type": [ - "string", - "null" - ] - }, - "height": { - "type": [ - "integer", - "null" - ] - }, - "keep_metadata": { - "type": "boolean" - }, - "level": { - "enum": [ - "none", - "lossless", - "ultra", - "smart", - null - ], - "type": [ - "string", - "null" - ] - }, - "scale": { - "type": [ - "integer", - "null" - ] - }, - "width": { - "type": [ - "integer", - "null" - ] - } - }, - "required": [ - "level", - "format", - "keep_metadata", - "width", - "height", - "scale" - ], - "type": "object" - }, - "share_url": { - "description": "Its public page, once shared.", - "type": [ - "string", - "null" - ] - }, - "source_url": { - "description": "The address it was fetched from: its address on the scanned page, or the url it was sent as. Null for a file.", - "type": [ - "string", - "null" - ] - }, - "status": { - "enum": [ - "queued", - "optimizing", - "completed", - "failed", - "already-optimized", - "cancelled" - ], - "type": "string" - }, - "updated_at": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "id", - "status", - "name", - "original", - "optimized", - "saved_bytes", - "saved_percent", - "settings", - "alt_text", - "scan_id", - "source_url", - "share_url", - "created_at", - "updated_at" - ], - "type": "object" - }, - "type": "array" -}
2 tool updates
- Changed
compress_images2 fields changed- changed
Input schema / properties / scale / descriptionPrevious value: -"Resize to this percentage of the original, 1 to 100. Not together with width or height."New value: +"Resize to this percentage of the original, 1 to 100. Not together with width or height. Like width, it is refused for an animated WebP or PNG." - changed
Input schema / properties / width / descriptionPrevious value: -"Resize to this width in pixels. Alone, the height follows the aspect ratio; with height too, the image is resized to exactly that size."New value: +"Resize to this width in pixels. Alone, the height follows the aspect ratio; with height too, the image is resized to exactly that size. An animated WebP or PNG cannot be resized and is refused with animation_not_resizable; an animated GIF can."
- Changed
scan_page2 fields changed- changed
Input schema / properties / scale / descriptionPrevious value: -"Resize to this percentage of the original, 1 to 100. Not together with width or height."New value: +"Resize to this percentage of the original, 1 to 100. Not together with width or height. Like width, it is refused for an animated WebP or PNG." - changed
Input schema / properties / width / descriptionPrevious value: -"Resize to this width in pixels. Alone, the height follows the aspect ratio; with height too, the image is resized to exactly that size."New value: +"Resize to this width in pixels. Alone, the height follows the aspect ratio; with height too, the image is resized to exactly that size. An animated WebP or PNG cannot be resized and is refused with animation_not_resizable; an animated GIF can."
10 tool updates
- Changed
compress_images5 fields changed- added
Input schema / properties / alt_textAdded value: +{ + "description": "Write an alt text and a suggested file name for each image with AI. On by default; false leaves it out. They arrive a few seconds after the image finishes, each counting against the account's daily AI alt texts; once those are used up the images still compress, without one.", + "type": "boolean" +} - added
Input schema / properties / alt_text_languageAdded value: +{ + "description": "The language to write the alt text in, as a language tag. English (\"en\") by default. The suggested file name follows it for languages written in the Latin alphabet and is in English otherwise.", + "enum": [ + "en", + "es", + "fr", + "de", + "it", + "pt", + "nl", + "pl", + "sv", + "tr", + "ru", + "uk", + "ar", + "fa", + "he", + "hi", + "id", + "vi", + "th", + "ja", + "ko", + "zh-Hans", + "zh-Hant" + ], + "type": "string" +} - added
Input schema / properties / use_suggested_nameAdded value: +{ + "description": "Rename the optimized copy to the suggested file name as soon as the alt text arrives, unless it already has a new name by then. Off by default.", + "type": "boolean" +} - added
Output schema / properties / images / items / properties / alt_textAdded value: +{ + "description": "The AI alt text, or null when none was asked for.", + "properties": { + "language": { + "type": [ + "string", + "null" + ] + }, + "status": { + "description": "pending: being written, a few seconds after the image is completed or already-optimized; it waits for a retry while the image is failed or cancelled. written: ready. failed: ask again with write_alt_text. skipped: the day's AI alt texts were used up.", + "enum": [ + "pending", + "written", + "failed", + "skipped" + ], + "type": "string" + }, + "suggested_name": { + "description": "A descriptive file name without an extension, for rename_image.", + "type": [ + "string", + "null" + ] + }, + "text": { + "description": "One sentence for the image's alt attribute, once written.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "status", + "text", + "language", + "suggested_name" + ], + "type": [ + "object", + "null" + ] +} - changed
Output schema / properties / images / items / requiredPrevious value: -[ - "id", - "status", - "name", - "original", - "optimized", - "saved_bytes", - "saved_percent", - "settings", - "scan_id", - "source_url", - "share_url", - "created_at", - "updated_at" -]New value: +[ + "id", + "status", + "name", + "original", + "optimized", + "saved_bytes", + "saved_percent", + "settings", + "alt_text", + "scan_id", + "source_url", + "share_url", + "created_at", + "updated_at" +]
- Changed
get_image1 field changed- added
Output schema / properties / alt_textAdded value: +{ + "description": "The AI alt text, or null when none was asked for.", + "properties": { + "language": { + "type": [ + "string", + "null" + ] + }, + "status": { + "description": "pending: being written, a few seconds after the image is completed or already-optimized; it waits for a retry while the image is failed or cancelled. written: ready. failed: ask again with write_alt_text. skipped: the day's AI alt texts were used up.", + "enum": [ + "pending", + "written", + "failed", + "skipped" + ], + "type": "string" + }, + "suggested_name": { + "description": "A descriptive file name without an extension, for rename_image.", + "type": [ + "string", + "null" + ] + }, + "text": { + "description": "One sentence for the image's alt attribute, once written.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "status", + "text", + "language", + "suggested_name" + ], + "type": [ + "object", + "null" + ] +}
- Changed
get_scan5 fields changed- added
Output schema / properties / alt_texts_in_progressAdded value: +{ + "description": "Finished images whose AI alt text for the audit's suggested_alt is still being written.", + "type": "integer" +} - added
Output schema / properties / audit / properties / images / items / properties / suggested_altAdded value: +{ + "description": "An AI alt text for an image the page shows without one, once written; null while alt_texts_in_progress counts it, or when it was skipped, failed or not asked for.", + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / audit / properties / images / items / requiredPrevious value: -[ - "url", - "format", - "bytes", - "natural_width", - "natural_height", - "rendered_width", - "rendered_height", - "above_fold", - "largest_paint", - "alt", - "findings", - "wasted_bytes", - "outcome", - "skip_reason", - "image_id", - "format_sizes" -]New value: +[ + "url", + "format", + "bytes", + "natural_width", + "natural_height", + "rendered_width", + "rendered_height", + "above_fold", + "largest_paint", + "alt", + "findings", + "wasted_bytes", + "outcome", + "skip_reason", + "image_id", + "format_sizes", + "suggested_alt" +] - added
Output schema / properties / images / items / properties / alt_textAdded value: +{ + "description": "The AI alt text, or null when none was asked for.", + "properties": { + "language": { + "type": [ + "string", + "null" + ] + }, + "status": { + "description": "pending: being written, a few seconds after the image is completed or already-optimized; it waits for a retry while the image is failed or cancelled. written: ready. failed: ask again with write_alt_text. skipped: the day's AI alt texts were used up.", + "enum": [ + "pending", + "written", + "failed", + "skipped" + ], + "type": "string" + }, + "suggested_name": { + "description": "A descriptive file name without an extension, for rename_image.", + "type": [ + "string", + "null" + ] + }, + "text": { + "description": "One sentence for the image's alt attribute, once written.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "status", + "text", + "language", + "suggested_name" + ], + "type": [ + "object", + "null" + ] +} - changed
Output schema / properties / images / items / requiredPrevious value: -[ - "id", - "status", - "name", - "original", - "optimized", - "saved_bytes", - "saved_percent", - "settings", - "scan_id", - "source_url", - "share_url", - "created_at", - "updated_at" -]New value: +[ + "id", + "status", + "name", + "original", + "optimized", + "saved_bytes", + "saved_percent", + "settings", + "alt_text", + "scan_id", + "source_url", + "share_url", + "created_at", + "updated_at" +]
- Changed
get_usage4 fields changed- added
Output schema / properties / limits / properties / alt_texts_per_dayAdded value: +{ + "description": "AI alt texts. Null means no daily cap.", + "type": [ + "integer", + "null" + ] +} - changed
Output schema / properties / limits / requiredPrevious value: -[ - "images_per_day", - "scans_per_day", - "images_per_scan", - "max_file_size", - "max_megapixels", - "compressions_per_minute", - "scans_per_minute", - "requests_per_minute", - "max_batch" -]New value: +[ + "images_per_day", + "scans_per_day", + "alt_texts_per_day", + "images_per_scan", + "max_file_size", + "max_megapixels", + "compressions_per_minute", + "scans_per_minute", + "requests_per_minute", + "max_batch" +] - added
Output schema / properties / usage / properties / alt_textsAdded value: +{ + "properties": { + "remaining": { + "description": "Null on a plan without a daily cap.", + "type": [ + "integer", + "null" + ] + }, + "resets_at": { + "type": [ + "string", + "null" + ] + }, + "used": { + "type": "integer" + } + }, + "required": [ + "used", + "remaining", + "resets_at" + ], + "type": "object" +} - changed
Output schema / properties / usage / requiredPrevious value: -[ - "images", - "scans" -]New value: +[ + "images", + "scans", + "alt_texts" +]
- Changed
list_images2 fields changed- added
Output schema / properties / images / items / properties / alt_textAdded value: +{ + "description": "The AI alt text, or null when none was asked for.", + "properties": { + "language": { + "type": [ + "string", + "null" + ] + }, + "status": { + "description": "pending: being written, a few seconds after the image is completed or already-optimized; it waits for a retry while the image is failed or cancelled. written: ready. failed: ask again with write_alt_text. skipped: the day's AI alt texts were used up.", + "enum": [ + "pending", + "written", + "failed", + "skipped" + ], + "type": "string" + }, + "suggested_name": { + "description": "A descriptive file name without an extension, for rename_image.", + "type": [ + "string", + "null" + ] + }, + "text": { + "description": "One sentence for the image's alt attribute, once written.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "status", + "text", + "language", + "suggested_name" + ], + "type": [ + "object", + "null" + ] +} - changed
Output schema / properties / images / items / requiredPrevious value: -[ - "id", - "status", - "name", - "original", - "optimized", - "saved_bytes", - "saved_percent", - "settings", - "scan_id", - "source_url", - "share_url", - "created_at", - "updated_at" -]New value: +[ + "id", + "status", + "name", + "original", + "optimized", + "saved_bytes", + "saved_percent", + "settings", + "alt_text", + "scan_id", + "source_url", + "share_url", + "created_at", + "updated_at" +]
- Changed
rename_image1 field changed- added
Output schema / properties / alt_textAdded value: +{ + "description": "The AI alt text, or null when none was asked for.", + "properties": { + "language": { + "type": [ + "string", + "null" + ] + }, + "status": { + "description": "pending: being written, a few seconds after the image is completed or already-optimized; it waits for a retry while the image is failed or cancelled. written: ready. failed: ask again with write_alt_text. skipped: the day's AI alt texts were used up.", + "enum": [ + "pending", + "written", + "failed", + "skipped" + ], + "type": "string" + }, + "suggested_name": { + "description": "A descriptive file name without an extension, for rename_image.", + "type": [ + "string", + "null" + ] + }, + "text": { + "description": "One sentence for the image's alt attribute, once written.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "status", + "text", + "language", + "suggested_name" + ], + "type": [ + "object", + "null" + ] +}
- Changed
scan_page7 fields changed- added
Input schema / properties / alt_textAdded value: +{ + "description": "Write an AI alt text for each image the page shows with no alt attribute, for the audit's suggested_alt. On by default; false leaves it out. Each counts against the account's daily AI alt texts.", + "type": "boolean" +} - added
Input schema / properties / alt_text_languageAdded value: +{ + "description": "The language to write the alt text in, as a language tag. English (\"en\") by default. The suggested file name follows it for languages written in the Latin alphabet and is in English otherwise.", + "enum": [ + "en", + "es", + "fr", + "de", + "it", + "pt", + "nl", + "pl", + "sv", + "tr", + "ru", + "uk", + "ar", + "fa", + "he", + "hi", + "id", + "vi", + "th", + "ja", + "ko", + "zh-Hans", + "zh-Hant" + ], + "type": "string" +} - added
Output schema / properties / alt_texts_in_progressAdded value: +{ + "description": "Finished images whose AI alt text for the audit's suggested_alt is still being written.", + "type": "integer" +} - added
Output schema / properties / audit / properties / images / items / properties / suggested_altAdded value: +{ + "description": "An AI alt text for an image the page shows without one, once written; null while alt_texts_in_progress counts it, or when it was skipped, failed or not asked for.", + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / audit / properties / images / items / requiredPrevious value: -[ - "url", - "format", - "bytes", - "natural_width", - "natural_height", - "rendered_width", - "rendered_height", - "above_fold", - "largest_paint", - "alt", - "findings", - "wasted_bytes", - "outcome", - "skip_reason", - "image_id", - "format_sizes" -]New value: +[ + "url", + "format", + "bytes", + "natural_width", + "natural_height", + "rendered_width", + "rendered_height", + "above_fold", + "largest_paint", + "alt", + "findings", + "wasted_bytes", + "outcome", + "skip_reason", + "image_id", + "format_sizes", + "suggested_alt" +] - added
Output schema / properties / images / items / properties / alt_textAdded value: +{ + "description": "The AI alt text, or null when none was asked for.", + "properties": { + "language": { + "type": [ + "string", + "null" + ] + }, + "status": { + "description": "pending: being written, a few seconds after the image is completed or already-optimized; it waits for a retry while the image is failed or cancelled. written: ready. failed: ask again with write_alt_text. skipped: the day's AI alt texts were used up.", + "enum": [ + "pending", + "written", + "failed", + "skipped" + ], + "type": "string" + }, + "suggested_name": { + "description": "A descriptive file name without an extension, for rename_image.", + "type": [ + "string", + "null" + ] + }, + "text": { + "description": "One sentence for the image's alt attribute, once written.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "status", + "text", + "language", + "suggested_name" + ], + "type": [ + "object", + "null" + ] +} - changed
Output schema / properties / images / items / requiredPrevious value: -[ - "id", - "status", - "name", - "original", - "optimized", - "saved_bytes", - "saved_percent", - "settings", - "scan_id", - "source_url", - "share_url", - "created_at", - "updated_at" -]New value: +[ + "id", + "status", + "name", + "original", + "optimized", + "saved_bytes", + "saved_percent", + "settings", + "alt_text", + "scan_id", + "source_url", + "share_url", + "created_at", + "updated_at" +]
- Changed
share_image1 field changed- added
Output schema / properties / alt_textAdded value: +{ + "description": "The AI alt text, or null when none was asked for.", + "properties": { + "language": { + "type": [ + "string", + "null" + ] + }, + "status": { + "description": "pending: being written, a few seconds after the image is completed or already-optimized; it waits for a retry while the image is failed or cancelled. written: ready. failed: ask again with write_alt_text. skipped: the day's AI alt texts were used up.", + "enum": [ + "pending", + "written", + "failed", + "skipped" + ], + "type": "string" + }, + "suggested_name": { + "description": "A descriptive file name without an extension, for rename_image.", + "type": [ + "string", + "null" + ] + }, + "text": { + "description": "One sentence for the image's alt attribute, once written.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "status", + "text", + "language", + "suggested_name" + ], + "type": [ + "object", + "null" + ] +}
- Changed
share_scan_report5 fields changed- added
Output schema / properties / alt_texts_in_progressAdded value: +{ + "description": "Finished images whose AI alt text for the audit's suggested_alt is still being written.", + "type": "integer" +} - added
Output schema / properties / audit / properties / images / items / properties / suggested_altAdded value: +{ + "description": "An AI alt text for an image the page shows without one, once written; null while alt_texts_in_progress counts it, or when it was skipped, failed or not asked for.", + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / audit / properties / images / items / requiredPrevious value: -[ - "url", - "format", - "bytes", - "natural_width", - "natural_height", - "rendered_width", - "rendered_height", - "above_fold", - "largest_paint", - "alt", - "findings", - "wasted_bytes", - "outcome", - "skip_reason", - "image_id", - "format_sizes" -]New value: +[ + "url", + "format", + "bytes", + "natural_width", + "natural_height", + "rendered_width", + "rendered_height", + "above_fold", + "largest_paint", + "alt", + "findings", + "wasted_bytes", + "outcome", + "skip_reason", + "image_id", + "format_sizes", + "suggested_alt" +] - added
Output schema / properties / images / items / properties / alt_textAdded value: +{ + "description": "The AI alt text, or null when none was asked for.", + "properties": { + "language": { + "type": [ + "string", + "null" + ] + }, + "status": { + "description": "pending: being written, a few seconds after the image is completed or already-optimized; it waits for a retry while the image is failed or cancelled. written: ready. failed: ask again with write_alt_text. skipped: the day's AI alt texts were used up.", + "enum": [ + "pending", + "written", + "failed", + "skipped" + ], + "type": "string" + }, + "suggested_name": { + "description": "A descriptive file name without an extension, for rename_image.", + "type": [ + "string", + "null" + ] + }, + "text": { + "description": "One sentence for the image's alt attribute, once written.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "status", + "text", + "language", + "suggested_name" + ], + "type": [ + "object", + "null" + ] +} - changed
Output schema / properties / images / items / requiredPrevious value: -[ - "id", - "status", - "name", - "original", - "optimized", - "saved_bytes", - "saved_percent", - "settings", - "scan_id", - "source_url", - "share_url", - "created_at", - "updated_at" -]New value: +[ + "id", + "status", + "name", + "original", + "optimized", + "saved_bytes", + "saved_percent", + "settings", + "alt_text", + "scan_id", + "source_url", + "share_url", + "created_at", + "updated_at" +]
- Added
write_alt_text
4 tool updates
- Added
export_scan_report - Changed
get_scan1 field changed- added
Output schema / properties / share_urlAdded value: +{ + "description": "The page report's public link while it is shared; it answers only while the account has Pro.", + "type": [ + "string", + "null" + ] +}
- Changed
scan_page1 field changed- added
Output schema / properties / share_urlAdded value: +{ + "description": "The page report's public link while it is shared; it answers only while the account has Pro.", + "type": [ + "string", + "null" + ] +}
- Added
share_scan_report
2 tool updates
- Changed
get_scan2 fields changed- added
Input schema / properties / audit_imagesAdded value: +{ + "description": "Add the page report's entry for every image address on the page (up to 1000). Ask once the scan is done, not while polling.", + "type": "boolean" +} - added
Output schema / properties / auditAdded value: +{ + "description": "The page audit: oversized images, missing dimensions and alt text, lazy loading in the wrong place, the largest contentful paint. Null until the scan has finished.", + "properties": { + "bytes": { + "description": "What a browser downloaded for the images listed.", + "type": "integer" + }, + "findings": { + "description": "How many images have each finding.", + "properties": { + "eager_below_fold": { + "type": "integer" + }, + "lazy_above_fold": { + "type": "integer" + }, + "lcp_not_prioritized": { + "type": "integer" + }, + "missing_alt": { + "type": "integer" + }, + "oversized": { + "type": "integer" + }, + "without_dimensions": { + "type": "integer" + } + }, + "required": [ + "oversized", + "without_dimensions", + "lazy_above_fold", + "eager_below_fold", + "missing_alt", + "lcp_not_prioritized" + ], + "type": "object" + }, + "formats": { + "description": "How many images arrived in each format, as a browser received them.", + "items": { + "properties": { + "count": { + "type": "integer" + }, + "format": { + "type": "string" + } + }, + "required": [ + "format", + "count" + ], + "type": "object" + }, + "type": "array" + }, + "images": { + "description": "Every image address the page had, in the page's order. Only when get_scan is called with audit_images.", + "items": { + "properties": { + "above_fold": { + "type": [ + "boolean", + "null" + ] + }, + "alt": { + "enum": [ + "missing", + "empty", + "present", + null + ], + "type": [ + "string", + "null" + ] + }, + "bytes": { + "type": [ + "integer", + "null" + ] + }, + "findings": { + "items": { + "enum": [ + "oversized", + "without_dimensions", + "lazy_above_fold", + "eager_below_fold", + "missing_alt", + "lcp_not_prioritized" + ], + "type": "string" + }, + "type": "array" + }, + "format": { + "type": [ + "string", + "null" + ] + }, + "format_sizes": { + "description": "What each format came to when the scan's format was auto.", + "items": { + "properties": { + "bytes": { + "type": "integer" + }, + "format": { + "type": "string" + } + }, + "required": [ + "format", + "bytes" + ], + "type": "object" + }, + "type": [ + "array", + "null" + ] + }, + "image_id": { + "description": "The compressed image, for get_image.", + "type": [ + "string", + "null" + ] + }, + "largest_paint": { + "type": "boolean" + }, + "natural_height": { + "type": [ + "integer", + "null" + ] + }, + "natural_width": { + "type": [ + "integer", + "null" + ] + }, + "outcome": { + "enum": [ + "compressed", + "skipped", + "left_out" + ], + "type": "string" + }, + "rendered_height": { + "type": [ + "integer", + "null" + ] + }, + "rendered_width": { + "type": [ + "integer", + "null" + ] + }, + "skip_reason": { + "enum": [ + "duplicate", + "unsupported_format", + "too_large", + "tracking_pixel", + "private_network", + "unreadable", + "unreachable", + "refused", + "failed", + null + ], + "type": [ + "string", + "null" + ] + }, + "url": { + "type": "string" + }, + "wasted_bytes": { + "type": [ + "integer", + "null" + ] + } + }, + "required": [ + "url", + "format", + "bytes", + "natural_width", + "natural_height", + "rendered_width", + "rendered_height", + "above_fold", + "largest_paint", + "alt", + "findings", + "wasted_bytes", + "outcome", + "skip_reason", + "image_id", + "format_sizes" + ], + "type": "object" + }, + "type": "array" + }, + "images_found": { + "type": "integer" + }, + "largest_paint": { + "description": "The largest contentful paint: the biggest thing in the first screen.", + "properties": { + "element": { + "type": [ + "string", + "null" + ] + }, + "kind": { + "enum": [ + "image", + "text", + "none" + ], + "type": "string" + }, + "url": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "element", + "url" + ], + "type": [ + "object", + "null" + ] + }, + "oversized_bytes": { + "description": "About how many bytes the oversized images would shed at twice their shown size.", + "type": "integer" + }, + "rendered": { + "description": "False when only the page's HTML could be read, so nothing about how images are shown is known.", + "type": "boolean" + } + }, + "required": [ + "rendered", + "images_found", + "largest_paint", + "findings", + "oversized_bytes", + "bytes", + "formats" + ], + "type": [ + "object", + "null" + ] +}
- Changed
scan_page1 field changed- added
Output schema / properties / auditAdded value: +{ + "description": "The page audit: oversized images, missing dimensions and alt text, lazy loading in the wrong place, the largest contentful paint. Null until the scan has finished.", + "properties": { + "bytes": { + "description": "What a browser downloaded for the images listed.", + "type": "integer" + }, + "findings": { + "description": "How many images have each finding.", + "properties": { + "eager_below_fold": { + "type": "integer" + }, + "lazy_above_fold": { + "type": "integer" + }, + "lcp_not_prioritized": { + "type": "integer" + }, + "missing_alt": { + "type": "integer" + }, + "oversized": { + "type": "integer" + }, + "without_dimensions": { + "type": "integer" + } + }, + "required": [ + "oversized", + "without_dimensions", + "lazy_above_fold", + "eager_below_fold", + "missing_alt", + "lcp_not_prioritized" + ], + "type": "object" + }, + "formats": { + "description": "How many images arrived in each format, as a browser received them.", + "items": { + "properties": { + "count": { + "type": "integer" + }, + "format": { + "type": "string" + } + }, + "required": [ + "format", + "count" + ], + "type": "object" + }, + "type": "array" + }, + "images": { + "description": "Every image address the page had, in the page's order. Only when get_scan is called with audit_images.", + "items": { + "properties": { + "above_fold": { + "type": [ + "boolean", + "null" + ] + }, + "alt": { + "enum": [ + "missing", + "empty", + "present", + null + ], + "type": [ + "string", + "null" + ] + }, + "bytes": { + "type": [ + "integer", + "null" + ] + }, + "findings": { + "items": { + "enum": [ + "oversized", + "without_dimensions", + "lazy_above_fold", + "eager_below_fold", + "missing_alt", + "lcp_not_prioritized" + ], + "type": "string" + }, + "type": "array" + }, + "format": { + "type": [ + "string", + "null" + ] + }, + "format_sizes": { + "description": "What each format came to when the scan's format was auto.", + "items": { + "properties": { + "bytes": { + "type": "integer" + }, + "format": { + "type": "string" + } + }, + "required": [ + "format", + "bytes" + ], + "type": "object" + }, + "type": [ + "array", + "null" + ] + }, + "image_id": { + "description": "The compressed image, for get_image.", + "type": [ + "string", + "null" + ] + }, + "largest_paint": { + "type": "boolean" + }, + "natural_height": { + "type": [ + "integer", + "null" + ] + }, + "natural_width": { + "type": [ + "integer", + "null" + ] + }, + "outcome": { + "enum": [ + "compressed", + "skipped", + "left_out" + ], + "type": "string" + }, + "rendered_height": { + "type": [ + "integer", + "null" + ] + }, + "rendered_width": { + "type": [ + "integer", + "null" + ] + }, + "skip_reason": { + "enum": [ + "duplicate", + "unsupported_format", + "too_large", + "tracking_pixel", + "private_network", + "unreadable", + "unreachable", + "refused", + "failed", + null + ], + "type": [ + "string", + "null" + ] + }, + "url": { + "type": "string" + }, + "wasted_bytes": { + "type": [ + "integer", + "null" + ] + } + }, + "required": [ + "url", + "format", + "bytes", + "natural_width", + "natural_height", + "rendered_width", + "rendered_height", + "above_fold", + "largest_paint", + "alt", + "findings", + "wasted_bytes", + "outcome", + "skip_reason", + "image_id", + "format_sizes" + ], + "type": "object" + }, + "type": "array" + }, + "images_found": { + "type": "integer" + }, + "largest_paint": { + "description": "The largest contentful paint: the biggest thing in the first screen.", + "properties": { + "element": { + "type": [ + "string", + "null" + ] + }, + "kind": { + "enum": [ + "image", + "text", + "none" + ], + "type": "string" + }, + "url": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "element", + "url" + ], + "type": [ + "object", + "null" + ] + }, + "oversized_bytes": { + "description": "About how many bytes the oversized images would shed at twice their shown size.", + "type": "integer" + }, + "rendered": { + "description": "False when only the page's HTML could be read, so nothing about how images are shown is known.", + "type": "boolean" + } + }, + "required": [ + "rendered", + "images_found", + "largest_paint", + "findings", + "oversized_bytes", + "bytes", + "formats" + ], + "type": [ + "object", + "null" + ] +}
7 tool updates
- Changed
compress_images2 fields changed- added
Output schema / properties / images / items / properties / source_urlAdded value: +{ + "description": "The address it was fetched from: its address on the scanned page, or the url it was sent as. Null for a file.", + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / images / items / requiredPrevious value: -[ - "id", - "status", - "name", - "original", - "optimized", - "saved_bytes", - "saved_percent", - "settings", - "scan_id", - "share_url", - "created_at", - "updated_at" -]New value: +[ + "id", + "status", + "name", + "original", + "optimized", + "saved_bytes", + "saved_percent", + "settings", + "scan_id", + "source_url", + "share_url", + "created_at", + "updated_at" +]
- Changed
get_image1 field changed- added
Output schema / properties / source_urlAdded value: +{ + "description": "The address it was fetched from: its address on the scanned page, or the url it was sent as. Null for a file.", + "type": [ + "string", + "null" + ] +}
- Changed
get_scan2 fields changed- added
Output schema / properties / images / items / properties / source_urlAdded value: +{ + "description": "The address it was fetched from: its address on the scanned page, or the url it was sent as. Null for a file.", + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / images / items / requiredPrevious value: -[ - "id", - "status", - "name", - "original", - "optimized", - "saved_bytes", - "saved_percent", - "settings", - "scan_id", - "share_url", - "created_at", - "updated_at" -]New value: +[ + "id", + "status", + "name", + "original", + "optimized", + "saved_bytes", + "saved_percent", + "settings", + "scan_id", + "source_url", + "share_url", + "created_at", + "updated_at" +]
- Changed
list_images2 fields changed- added
Output schema / properties / images / items / properties / source_urlAdded value: +{ + "description": "The address it was fetched from: its address on the scanned page, or the url it was sent as. Null for a file.", + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / images / items / requiredPrevious value: -[ - "id", - "status", - "name", - "original", - "optimized", - "saved_bytes", - "saved_percent", - "settings", - "scan_id", - "share_url", - "created_at", - "updated_at" -]New value: +[ + "id", + "status", + "name", + "original", + "optimized", + "saved_bytes", + "saved_percent", + "settings", + "scan_id", + "source_url", + "share_url", + "created_at", + "updated_at" +]
- Changed
rename_image1 field changed- added
Output schema / properties / source_urlAdded value: +{ + "description": "The address it was fetched from: its address on the scanned page, or the url it was sent as. Null for a file.", + "type": [ + "string", + "null" + ] +}
- Changed
scan_page2 fields changed- added
Output schema / properties / images / items / properties / source_urlAdded value: +{ + "description": "The address it was fetched from: its address on the scanned page, or the url it was sent as. Null for a file.", + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / images / items / requiredPrevious value: -[ - "id", - "status", - "name", - "original", - "optimized", - "saved_bytes", - "saved_percent", - "settings", - "scan_id", - "share_url", - "created_at", - "updated_at" -]New value: +[ + "id", + "status", + "name", + "original", + "optimized", + "saved_bytes", + "saved_percent", + "settings", + "scan_id", + "source_url", + "share_url", + "created_at", + "updated_at" +]
- Changed
share_image1 field changed- added
Output schema / properties / source_urlAdded value: +{ + "description": "The address it was fetched from: its address on the scanned page, or the url it was sent as. Null for a file.", + "type": [ + "string", + "null" + ] +}
7 tool updates
- Changed
compress_images2 fields changed- added
Output schema / properties / images / items / properties / settings / properties / formatAdded value: +{ + "description": "The format asked for, or null when none was sent. auto stays auto after the image finishes.", + "enum": [ + "auto", + "webp", + "avif", + "png", + "jpg", + null + ], + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / images / items / properties / settings / requiredPrevious value: -[ - "level", - "keep_metadata", - "width", - "height", - "scale" -]New value: +[ + "level", + "format", + "keep_metadata", + "width", + "height", + "scale" +]
- Changed
get_image2 fields changed- added
Output schema / properties / settings / properties / formatAdded value: +{ + "description": "The format asked for, or null when none was sent. auto stays auto after the image finishes.", + "enum": [ + "auto", + "webp", + "avif", + "png", + "jpg", + null + ], + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / settings / requiredPrevious value: -[ - "level", - "keep_metadata", - "width", - "height", - "scale" -]New value: +[ + "level", + "format", + "keep_metadata", + "width", + "height", + "scale" +]
- Changed
get_scan3 fields changed- added
Output schema / properties / images / items / properties / settings / properties / formatAdded value: +{ + "description": "The format asked for, or null when none was sent. auto stays auto after the image finishes.", + "enum": [ + "auto", + "webp", + "avif", + "png", + "jpg", + null + ], + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / images / items / properties / settings / requiredPrevious value: -[ - "level", - "keep_metadata", - "width", - "height", - "scale" -]New value: +[ + "level", + "format", + "keep_metadata", + "width", + "height", + "scale" +] - added
Output schema / properties / skippedAdded value: +{ + "description": "The images the scan found and did not compress, each with why.", + "items": { + "properties": { + "message": { + "type": "string" + }, + "reason": { + "enum": [ + "duplicate", + "unsupported_format", + "too_large", + "tracking_pixel", + "private_network", + "unreadable", + "unreachable", + "refused", + "failed" + ], + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "url", + "reason", + "message" + ], + "type": "object" + }, + "type": "array" +}
- Changed
list_images2 fields changed- added
Output schema / properties / images / items / properties / settings / properties / formatAdded value: +{ + "description": "The format asked for, or null when none was sent. auto stays auto after the image finishes.", + "enum": [ + "auto", + "webp", + "avif", + "png", + "jpg", + null + ], + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / images / items / properties / settings / requiredPrevious value: -[ - "level", - "keep_metadata", - "width", - "height", - "scale" -]New value: +[ + "level", + "format", + "keep_metadata", + "width", + "height", + "scale" +]
- Changed
rename_image2 fields changed- added
Output schema / properties / settings / properties / formatAdded value: +{ + "description": "The format asked for, or null when none was sent. auto stays auto after the image finishes.", + "enum": [ + "auto", + "webp", + "avif", + "png", + "jpg", + null + ], + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / settings / requiredPrevious value: -[ - "level", - "keep_metadata", - "width", - "height", - "scale" -]New value: +[ + "level", + "format", + "keep_metadata", + "width", + "height", + "scale" +]
- Changed
scan_page3 fields changed- added
Output schema / properties / images / items / properties / settings / properties / formatAdded value: +{ + "description": "The format asked for, or null when none was sent. auto stays auto after the image finishes.", + "enum": [ + "auto", + "webp", + "avif", + "png", + "jpg", + null + ], + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / images / items / properties / settings / requiredPrevious value: -[ - "level", - "keep_metadata", - "width", - "height", - "scale" -]New value: +[ + "level", + "format", + "keep_metadata", + "width", + "height", + "scale" +] - added
Output schema / properties / skippedAdded value: +{ + "description": "The images the scan found and did not compress, each with why.", + "items": { + "properties": { + "message": { + "type": "string" + }, + "reason": { + "enum": [ + "duplicate", + "unsupported_format", + "too_large", + "tracking_pixel", + "private_network", + "unreadable", + "unreachable", + "refused", + "failed" + ], + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "url", + "reason", + "message" + ], + "type": "object" + }, + "type": "array" +}
- Changed
share_image2 fields changed- added
Output schema / properties / settings / properties / formatAdded value: +{ + "description": "The format asked for, or null when none was sent. auto stays auto after the image finishes.", + "enum": [ + "auto", + "webp", + "avif", + "png", + "jpg", + null + ], + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / settings / requiredPrevious value: -[ - "level", - "keep_metadata", - "width", - "height", - "scale" -]New value: +[ + "level", + "format", + "keep_metadata", + "width", + "height", + "scale" +]
11 tool updates
- Changed
compress_images1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "images": { + "description": "The images queued.", + "items": { + "properties": { + "created_at": { + "type": [ + "string", + "null" + ] + }, + "hint": { + "description": "What to do next, when the status alone does not say.", + "type": "string" + }, + "id": { + "description": "The image's id.", + "type": "string" + }, + "name": { + "description": "The name the optimized copy downloads under.", + "type": "string" + }, + "optimized": { + "description": "Null until the image has finished.", + "properties": { + "download_url": { + "description": "Works without a token for an hour.", + "type": "string" + }, + "format": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "size": { + "description": "Bytes.", + "type": "integer" + }, + "width": { + "type": "integer" + } + }, + "required": [ + "name", + "format", + "size", + "width", + "height", + "download_url" + ], + "type": [ + "object", + "null" + ] + }, + "original": { + "properties": { + "download_url": { + "description": "Works without a token for an hour.", + "type": "string" + }, + "format": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "size": { + "description": "Bytes.", + "type": "integer" + }, + "width": { + "type": "integer" + } + }, + "required": [ + "name", + "format", + "size", + "width", + "height", + "download_url" + ], + "type": "object" + }, + "saved_bytes": { + "description": "Negative when the optimized copy is larger.", + "type": [ + "integer", + "null" + ] + }, + "saved_percent": { + "type": [ + "number", + "null" + ] + }, + "scan_id": { + "description": "The page scan that found it, if one did.", + "type": [ + "string", + "null" + ] + }, + "settings": { + "properties": { + "height": { + "type": [ + "integer", + "null" + ] + }, + "keep_metadata": { + "type": "boolean" + }, + "level": { + "enum": [ + "none", + "lossless", + "ultra", + "smart", + null + ], + "type": [ + "string", + "null" + ] + }, + "scale": { + "type": [ + "integer", + "null" + ] + }, + "width": { + "type": [ + "integer", + "null" + ] + } + }, + "required": [ + "level", + "keep_metadata", + "width", + "height", + "scale" + ], + "type": "object" + }, + "share_url": { + "description": "Its public page, once shared.", + "type": [ + "string", + "null" + ] + }, + "status": { + "enum": [ + "queued", + "optimizing", + "completed", + "failed", + "already-optimized", + "cancelled" + ], + "type": "string" + }, + "updated_at": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "id", + "status", + "name", + "original", + "optimized", + "saved_bytes", + "saved_percent", + "settings", + "scan_id", + "share_url", + "created_at", + "updated_at" + ], + "type": "object" + }, + "type": "array" + }, + "next": { + "type": "string" + }, + "not_started": { + "description": "Addresses not fetched because the call ran out of time.", + "items": { + "type": "string" + }, + "type": "array" + }, + "not_started_note": { + "type": "string" + }, + "refused": { + "description": "The sources refused, each with the reason.", + "items": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "retry_after": { + "description": "Seconds to wait before sending it again.", + "type": "integer" + }, + "source": { + "description": "The address, upload id or file name refused.", + "type": "string" + } + }, + "required": [ + "source", + "message", + "code" + ], + "type": "object" + }, + "type": "array" + } + }, + "type": "object" +}
- Changed
create_upload_link1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "curl": { + "description": "A command that sends the file.", + "type": "string" + }, + "expires_at": { + "type": "string" + }, + "max_file_size": { + "description": "Bytes.", + "type": "integer" + }, + "method": { + "enum": [ + "PUT" + ], + "type": "string" + }, + "next": { + "type": "string" + }, + "upload_id": { + "description": "The id to pass to compress_images in upload_ids once the file is sent.", + "type": "string" + }, + "upload_url": { + "type": "string" + } + }, + "type": "object" +}
- Changed
create_zip1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "download_url": { + "description": "Works without a token until expires_at.", + "type": "string" + }, + "expires_at": { + "type": "string" + }, + "images": { + "description": "How many images the zip holds.", + "type": "integer" + }, + "left_out": { + "description": "The ids of the images left out because they had not finished.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" +}
- Changed
delete_image1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "deleted": { + "description": "The id of the image deleted.", + "type": "string" + } + }, + "type": "object" +}
- Changed
get_image1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "created_at": { + "type": [ + "string", + "null" + ] + }, + "hint": { + "description": "What to do next, when the status alone does not say.", + "type": "string" + }, + "id": { + "description": "The image's id.", + "type": "string" + }, + "name": { + "description": "The name the optimized copy downloads under.", + "type": "string" + }, + "optimized": { + "description": "Null until the image has finished.", + "properties": { + "download_url": { + "description": "Works without a token for an hour.", + "type": "string" + }, + "format": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "size": { + "description": "Bytes.", + "type": "integer" + }, + "width": { + "type": "integer" + } + }, + "required": [ + "name", + "format", + "size", + "width", + "height", + "download_url" + ], + "type": [ + "object", + "null" + ] + }, + "original": { + "properties": { + "download_url": { + "description": "Works without a token for an hour.", + "type": "string" + }, + "format": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "size": { + "description": "Bytes.", + "type": "integer" + }, + "width": { + "type": "integer" + } + }, + "required": [ + "name", + "format", + "size", + "width", + "height", + "download_url" + ], + "type": "object" + }, + "saved_bytes": { + "description": "Negative when the optimized copy is larger.", + "type": [ + "integer", + "null" + ] + }, + "saved_percent": { + "type": [ + "number", + "null" + ] + }, + "scan_id": { + "description": "The page scan that found it, if one did.", + "type": [ + "string", + "null" + ] + }, + "settings": { + "properties": { + "height": { + "type": [ + "integer", + "null" + ] + }, + "keep_metadata": { + "type": "boolean" + }, + "level": { + "enum": [ + "none", + "lossless", + "ultra", + "smart", + null + ], + "type": [ + "string", + "null" + ] + }, + "scale": { + "type": [ + "integer", + "null" + ] + }, + "width": { + "type": [ + "integer", + "null" + ] + } + }, + "required": [ + "level", + "keep_metadata", + "width", + "height", + "scale" + ], + "type": "object" + }, + "share_url": { + "description": "Its public page, once shared.", + "type": [ + "string", + "null" + ] + }, + "status": { + "enum": [ + "queued", + "optimizing", + "completed", + "failed", + "already-optimized", + "cancelled" + ], + "type": "string" + }, + "updated_at": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" +}
- Changed
get_scan1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "created_at": { + "type": [ + "string", + "null" + ] + }, + "hint": { + "description": "What to do next, while the scan or its images are still running.", + "type": "string" + }, + "id": { + "description": "The scan's id.", + "type": "string" + }, + "images": { + "description": "The images the scan found, newest first.", + "items": { + "properties": { + "created_at": { + "type": [ + "string", + "null" + ] + }, + "hint": { + "description": "What to do next, when the status alone does not say.", + "type": "string" + }, + "id": { + "description": "The image's id.", + "type": "string" + }, + "name": { + "description": "The name the optimized copy downloads under.", + "type": "string" + }, + "optimized": { + "description": "Null until the image has finished.", + "properties": { + "download_url": { + "description": "Works without a token for an hour.", + "type": "string" + }, + "format": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "size": { + "description": "Bytes.", + "type": "integer" + }, + "width": { + "type": "integer" + } + }, + "required": [ + "name", + "format", + "size", + "width", + "height", + "download_url" + ], + "type": [ + "object", + "null" + ] + }, + "original": { + "properties": { + "download_url": { + "description": "Works without a token for an hour.", + "type": "string" + }, + "format": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "size": { + "description": "Bytes.", + "type": "integer" + }, + "width": { + "type": "integer" + } + }, + "required": [ + "name", + "format", + "size", + "width", + "height", + "download_url" + ], + "type": "object" + }, + "saved_bytes": { + "description": "Negative when the optimized copy is larger.", + "type": [ + "integer", + "null" + ] + }, + "saved_percent": { + "type": [ + "number", + "null" + ] + }, + "scan_id": { + "description": "The page scan that found it, if one did.", + "type": [ + "string", + "null" + ] + }, + "settings": { + "properties": { + "height": { + "type": [ + "integer", + "null" + ] + }, + "keep_metadata": { + "type": "boolean" + }, + "level": { + "enum": [ + "none", + "lossless", + "ultra", + "smart", + null + ], + "type": [ + "string", + "null" + ] + }, + "scale": { + "type": [ + "integer", + "null" + ] + }, + "width": { + "type": [ + "integer", + "null" + ] + } + }, + "required": [ + "level", + "keep_metadata", + "width", + "height", + "scale" + ], + "type": "object" + }, + "share_url": { + "description": "Its public page, once shared.", + "type": [ + "string", + "null" + ] + }, + "status": { + "enum": [ + "queued", + "optimizing", + "completed", + "failed", + "already-optimized", + "cancelled" + ], + "type": "string" + }, + "updated_at": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "id", + "status", + "name", + "original", + "optimized", + "saved_bytes", + "saved_percent", + "settings", + "scan_id", + "share_url", + "created_at", + "updated_at" + ], + "type": "object" + }, + "type": "array" + }, + "images_count": { + "type": "integer" + }, + "images_finished": { + "type": "integer" + }, + "images_in_progress": { + "type": "integer" + }, + "note": { + "description": "What the scan found, or why it stopped.", + "type": [ + "string", + "null" + ] + }, + "optimized_size": { + "description": "Bytes, over the finished images.", + "type": "integer" + }, + "original_size": { + "description": "Bytes, over the finished images.", + "type": "integer" + }, + "saved_bytes": { + "type": "integer" + }, + "saved_percent": { + "type": [ + "number", + "null" + ] + }, + "settings": { + "properties": { + "format": { + "type": [ + "string", + "null" + ] + }, + "height": { + "type": [ + "integer", + "null" + ] + }, + "keep_metadata": { + "type": "boolean" + }, + "level": { + "enum": [ + "none", + "lossless", + "ultra", + "smart" + ], + "type": "string" + }, + "scale": { + "type": [ + "integer", + "null" + ] + }, + "width": { + "type": [ + "integer", + "null" + ] + } + }, + "required": [ + "level", + "format", + "keep_metadata", + "width", + "height", + "scale" + ], + "type": "object" + }, + "status": { + "enum": [ + "queued", + "scanning", + "completed", + "failed", + "no-image-found", + "cancelled" + ], + "type": "string" + }, + "updated_at": { + "type": [ + "string", + "null" + ] + }, + "url": { + "description": "The page scanned.", + "type": "string" + } + }, + "type": "object" +}
- Changed
get_usage1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "limits": { + "properties": { + "compressions_per_minute": { + "type": "integer" + }, + "images_per_day": { + "description": "Null means no daily cap.", + "type": [ + "integer", + "null" + ] + }, + "images_per_scan": { + "type": "integer" + }, + "max_batch": { + "type": "integer" + }, + "max_file_size": { + "description": "Bytes.", + "type": "integer" + }, + "max_megapixels": { + "type": "integer" + }, + "requests_per_minute": { + "type": "integer" + }, + "scans_per_day": { + "description": "Null means no daily cap.", + "type": [ + "integer", + "null" + ] + }, + "scans_per_minute": { + "type": "integer" + } + }, + "required": [ + "images_per_day", + "scans_per_day", + "images_per_scan", + "max_file_size", + "max_megapixels", + "compressions_per_minute", + "scans_per_minute", + "requests_per_minute", + "max_batch" + ], + "type": "object" + }, + "plan": { + "enum": [ + "guest", + "free", + "pro" + ], + "type": "string" + }, + "plan_ends_at": { + "description": "When a cancelled paid plan ends.", + "type": [ + "string", + "null" + ] + }, + "usage": { + "properties": { + "images": { + "properties": { + "remaining": { + "description": "Null on a plan without a daily cap.", + "type": [ + "integer", + "null" + ] + }, + "resets_at": { + "type": [ + "string", + "null" + ] + }, + "used": { + "type": "integer" + } + }, + "required": [ + "used", + "remaining", + "resets_at" + ], + "type": "object" + }, + "scans": { + "properties": { + "remaining": { + "description": "Null on a plan without a daily cap.", + "type": [ + "integer", + "null" + ] + }, + "resets_at": { + "type": [ + "string", + "null" + ] + }, + "used": { + "type": "integer" + } + }, + "required": [ + "used", + "remaining", + "resets_at" + ], + "type": "object" + } + }, + "required": [ + "images", + "scans" + ], + "type": "object" + } + }, + "type": "object" +}
- Changed
list_images1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "images": { + "items": { + "properties": { + "created_at": { + "type": [ + "string", + "null" + ] + }, + "hint": { + "description": "What to do next, when the status alone does not say.", + "type": "string" + }, + "id": { + "description": "The image's id.", + "type": "string" + }, + "name": { + "description": "The name the optimized copy downloads under.", + "type": "string" + }, + "optimized": { + "description": "Null until the image has finished.", + "properties": { + "download_url": { + "description": "Works without a token for an hour.", + "type": "string" + }, + "format": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "size": { + "description": "Bytes.", + "type": "integer" + }, + "width": { + "type": "integer" + } + }, + "required": [ + "name", + "format", + "size", + "width", + "height", + "download_url" + ], + "type": [ + "object", + "null" + ] + }, + "original": { + "properties": { + "download_url": { + "description": "Works without a token for an hour.", + "type": "string" + }, + "format": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "size": { + "description": "Bytes.", + "type": "integer" + }, + "width": { + "type": "integer" + } + }, + "required": [ + "name", + "format", + "size", + "width", + "height", + "download_url" + ], + "type": "object" + }, + "saved_bytes": { + "description": "Negative when the optimized copy is larger.", + "type": [ + "integer", + "null" + ] + }, + "saved_percent": { + "type": [ + "number", + "null" + ] + }, + "scan_id": { + "description": "The page scan that found it, if one did.", + "type": [ + "string", + "null" + ] + }, + "settings": { + "properties": { + "height": { + "type": [ + "integer", + "null" + ] + }, + "keep_metadata": { + "type": "boolean" + }, + "level": { + "enum": [ + "none", + "lossless", + "ultra", + "smart", + null + ], + "type": [ + "string", + "null" + ] + }, + "scale": { + "type": [ + "integer", + "null" + ] + }, + "width": { + "type": [ + "integer", + "null" + ] + } + }, + "required": [ + "level", + "keep_metadata", + "width", + "height", + "scale" + ], + "type": "object" + }, + "share_url": { + "description": "Its public page, once shared.", + "type": [ + "string", + "null" + ] + }, + "status": { + "enum": [ + "queued", + "optimizing", + "completed", + "failed", + "already-optimized", + "cancelled" + ], + "type": "string" + }, + "updated_at": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "id", + "status", + "name", + "original", + "optimized", + "saved_bytes", + "saved_percent", + "settings", + "scan_id", + "share_url", + "created_at", + "updated_at" + ], + "type": "object" + }, + "type": "array" + }, + "last_page": { + "type": "integer" + }, + "page": { + "type": "integer" + }, + "per_page": { + "type": "integer" + }, + "total": { + "type": "integer" + } + }, + "type": "object" +}
- Changed
rename_image1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "created_at": { + "type": [ + "string", + "null" + ] + }, + "hint": { + "description": "What to do next, when the status alone does not say.", + "type": "string" + }, + "id": { + "description": "The image's id.", + "type": "string" + }, + "name": { + "description": "The name the optimized copy downloads under.", + "type": "string" + }, + "optimized": { + "description": "Null until the image has finished.", + "properties": { + "download_url": { + "description": "Works without a token for an hour.", + "type": "string" + }, + "format": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "size": { + "description": "Bytes.", + "type": "integer" + }, + "width": { + "type": "integer" + } + }, + "required": [ + "name", + "format", + "size", + "width", + "height", + "download_url" + ], + "type": [ + "object", + "null" + ] + }, + "original": { + "properties": { + "download_url": { + "description": "Works without a token for an hour.", + "type": "string" + }, + "format": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "size": { + "description": "Bytes.", + "type": "integer" + }, + "width": { + "type": "integer" + } + }, + "required": [ + "name", + "format", + "size", + "width", + "height", + "download_url" + ], + "type": "object" + }, + "saved_bytes": { + "description": "Negative when the optimized copy is larger.", + "type": [ + "integer", + "null" + ] + }, + "saved_percent": { + "type": [ + "number", + "null" + ] + }, + "scan_id": { + "description": "The page scan that found it, if one did.", + "type": [ + "string", + "null" + ] + }, + "settings": { + "properties": { + "height": { + "type": [ + "integer", + "null" + ] + }, + "keep_metadata": { + "type": "boolean" + }, + "level": { + "enum": [ + "none", + "lossless", + "ultra", + "smart", + null + ], + "type": [ + "string", + "null" + ] + }, + "scale": { + "type": [ + "integer", + "null" + ] + }, + "width": { + "type": [ + "integer", + "null" + ] + } + }, + "required": [ + "level", + "keep_metadata", + "width", + "height", + "scale" + ], + "type": "object" + }, + "share_url": { + "description": "Its public page, once shared.", + "type": [ + "string", + "null" + ] + }, + "status": { + "enum": [ + "queued", + "optimizing", + "completed", + "failed", + "already-optimized", + "cancelled" + ], + "type": "string" + }, + "updated_at": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" +}
- Changed
scan_page1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "created_at": { + "type": [ + "string", + "null" + ] + }, + "hint": { + "description": "What to do next, while the scan or its images are still running.", + "type": "string" + }, + "id": { + "description": "The scan's id.", + "type": "string" + }, + "images": { + "description": "The images the scan found, newest first.", + "items": { + "properties": { + "created_at": { + "type": [ + "string", + "null" + ] + }, + "hint": { + "description": "What to do next, when the status alone does not say.", + "type": "string" + }, + "id": { + "description": "The image's id.", + "type": "string" + }, + "name": { + "description": "The name the optimized copy downloads under.", + "type": "string" + }, + "optimized": { + "description": "Null until the image has finished.", + "properties": { + "download_url": { + "description": "Works without a token for an hour.", + "type": "string" + }, + "format": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "size": { + "description": "Bytes.", + "type": "integer" + }, + "width": { + "type": "integer" + } + }, + "required": [ + "name", + "format", + "size", + "width", + "height", + "download_url" + ], + "type": [ + "object", + "null" + ] + }, + "original": { + "properties": { + "download_url": { + "description": "Works without a token for an hour.", + "type": "string" + }, + "format": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "size": { + "description": "Bytes.", + "type": "integer" + }, + "width": { + "type": "integer" + } + }, + "required": [ + "name", + "format", + "size", + "width", + "height", + "download_url" + ], + "type": "object" + }, + "saved_bytes": { + "description": "Negative when the optimized copy is larger.", + "type": [ + "integer", + "null" + ] + }, + "saved_percent": { + "type": [ + "number", + "null" + ] + }, + "scan_id": { + "description": "The page scan that found it, if one did.", + "type": [ + "string", + "null" + ] + }, + "settings": { + "properties": { + "height": { + "type": [ + "integer", + "null" + ] + }, + "keep_metadata": { + "type": "boolean" + }, + "level": { + "enum": [ + "none", + "lossless", + "ultra", + "smart", + null + ], + "type": [ + "string", + "null" + ] + }, + "scale": { + "type": [ + "integer", + "null" + ] + }, + "width": { + "type": [ + "integer", + "null" + ] + } + }, + "required": [ + "level", + "keep_metadata", + "width", + "height", + "scale" + ], + "type": "object" + }, + "share_url": { + "description": "Its public page, once shared.", + "type": [ + "string", + "null" + ] + }, + "status": { + "enum": [ + "queued", + "optimizing", + "completed", + "failed", + "already-optimized", + "cancelled" + ], + "type": "string" + }, + "updated_at": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "id", + "status", + "name", + "original", + "optimized", + "saved_bytes", + "saved_percent", + "settings", + "scan_id", + "share_url", + "created_at", + "updated_at" + ], + "type": "object" + }, + "type": "array" + }, + "images_count": { + "type": "integer" + }, + "images_finished": { + "type": "integer" + }, + "images_in_progress": { + "type": "integer" + }, + "note": { + "description": "What the scan found, or why it stopped.", + "type": [ + "string", + "null" + ] + }, + "optimized_size": { + "description": "Bytes, over the finished images.", + "type": "integer" + }, + "original_size": { + "description": "Bytes, over the finished images.", + "type": "integer" + }, + "saved_bytes": { + "type": "integer" + }, + "saved_percent": { + "type": [ + "number", + "null" + ] + }, + "settings": { + "properties": { + "format": { + "type": [ + "string", + "null" + ] + }, + "height": { + "type": [ + "integer", + "null" + ] + }, + "keep_metadata": { + "type": "boolean" + }, + "level": { + "enum": [ + "none", + "lossless", + "ultra", + "smart" + ], + "type": "string" + }, + "scale": { + "type": [ + "integer", + "null" + ] + }, + "width": { + "type": [ + "integer", + "null" + ] + } + }, + "required": [ + "level", + "format", + "keep_metadata", + "width", + "height", + "scale" + ], + "type": "object" + }, + "status": { + "enum": [ + "queued", + "scanning", + "completed", + "failed", + "no-image-found", + "cancelled" + ], + "type": "string" + }, + "updated_at": { + "type": [ + "string", + "null" + ] + }, + "url": { + "description": "The page scanned.", + "type": "string" + } + }, + "type": "object" +}
- Changed
share_image1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "created_at": { + "type": [ + "string", + "null" + ] + }, + "hint": { + "description": "What to do next, when the status alone does not say.", + "type": "string" + }, + "id": { + "description": "The image's id.", + "type": "string" + }, + "name": { + "description": "The name the optimized copy downloads under.", + "type": "string" + }, + "optimized": { + "description": "Null until the image has finished.", + "properties": { + "download_url": { + "description": "Works without a token for an hour.", + "type": "string" + }, + "format": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "size": { + "description": "Bytes.", + "type": "integer" + }, + "width": { + "type": "integer" + } + }, + "required": [ + "name", + "format", + "size", + "width", + "height", + "download_url" + ], + "type": [ + "object", + "null" + ] + }, + "original": { + "properties": { + "download_url": { + "description": "Works without a token for an hour.", + "type": "string" + }, + "format": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "size": { + "description": "Bytes.", + "type": "integer" + }, + "width": { + "type": "integer" + } + }, + "required": [ + "name", + "format", + "size", + "width", + "height", + "download_url" + ], + "type": "object" + }, + "saved_bytes": { + "description": "Negative when the optimized copy is larger.", + "type": [ + "integer", + "null" + ] + }, + "saved_percent": { + "type": [ + "number", + "null" + ] + }, + "scan_id": { + "description": "The page scan that found it, if one did.", + "type": [ + "string", + "null" + ] + }, + "settings": { + "properties": { + "height": { + "type": [ + "integer", + "null" + ] + }, + "keep_metadata": { + "type": "boolean" + }, + "level": { + "enum": [ + "none", + "lossless", + "ultra", + "smart", + null + ], + "type": [ + "string", + "null" + ] + }, + "scale": { + "type": [ + "integer", + "null" + ] + }, + "width": { + "type": [ + "integer", + "null" + ] + } + }, + "required": [ + "level", + "keep_metadata", + "width", + "height", + "scale" + ], + "type": "object" + }, + "share_url": { + "description": "Its public page, once shared.", + "type": [ + "string", + "null" + ] + }, + "status": { + "enum": [ + "queued", + "optimizing", + "completed", + "failed", + "already-optimized", + "cancelled" + ], + "type": "string" + }, + "updated_at": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" +}
2 tool updates
- Changed
create_zip2 fields changed- changed
Input schema / properties / ids / descriptionPrevious value: -"The images, by id, up to 150. Send this or scan_id."New value: +"Up to 150 image ids, as compress_images, get_image and list_images return them. Send this or scan_id, not both." - changed
Input schema / properties / scan_id / descriptionPrevious value: -"A page scan's id, to zip every finished image it found. Send this or ids."New value: +"The id scan_page returned, to zip every finished image that scan found. Send this or ids, not both."
- Changed
list_images4 fields changed- changed
Input schema / properties / page / descriptionPrevious value: -"The page to read, from 1."New value: +"The page to read, starting at 1 (the default)." - changed
Input schema / properties / per_page / descriptionPrevious value: -"Images a page. 15 by default."New value: +"Images a page, from 1 to 100. 15 by default." - changed
Input schema / properties / scan / descriptionPrevious value: -"Only the images of this page scan, by its id."New value: +"Only the images one page scan found, by the id scan_page returned." - changed
Input schema / properties / status / descriptionPrevious value: -"Only images with this status."New value: +"Only images with this status. queued and optimizing are still running; completed, already-optimized, failed and cancelled are finished."
11 tool updates
- First observed
compress_images - First observed
create_upload_link - First observed
create_zip - First observed
delete_image - First observed
get_image - First observed
get_scan - First observed
get_usage - First observed
list_images - First observed
rename_image - First observed
scan_page - First observed
share_image
Publisher details
- Operator
- Mozex Labs · Publisher source
- Operator website
- https://www.iminify.com/
- Vendor relationship
- First-party · Publisher source
- Documentation
- https://www.iminify.com/docs/mcp
- Trust center
- Not available
- Restrictions
- Needs a free Iminify account with a verified email. Daily allowances depend on the plan: https://www.iminify.com/pricing · Publisher source
Related MCP Connectors
Download all images from any web page or extract image URLs, with sizes, formats and alt text.
Compress, convert, resize, crop, upscale, OCR and remove backgrounds from images.
Resize, compress, convert, watermark and SEO-tag e-commerce product images from a public URL.
Edit images in one call: resize, convert, compress, crop, metadata, favicons, QR codes, OCR.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables batch image compression and resizing using the TinyPNG API. Supports PNG, JPEG, WebP, and AVIF formats with detailed compression reports and multiple resize modes.10 npm2ISC
- AlicenseAqualityBmaintenanceAudits images on any public web page to detect oversized images, compare natural vs rendered dimensions, and provide format breakdown, helping AI agents check image performance during development.140 npmMIT
- AlicenseAqualityAmaintenanceOptimize, convert and compare images locally with the same engines as cwebp, cjpeg, oxipng, avifenc and cjxl: WebP, AVIF, JPEG XL, JPEG and PNG. Analyze an image, pick the best format at the same perceived quality (SSIMULACRA 2), measure the loss, crop, resize and convert whole folders. Always writes new files, never overwrites or deletes. Free and open source (GPL-3.0).113 npm3GPL 3.0
- AlicenseBqualityDmaintenanceEnables AI assistants to download images from URLs and perform basic image optimization tasks.26 npm17Apache 2.0
Glama MCP Gateway
Add one secure layer between your agents and this server.