Skip to main content
Glama

Server Details

Compress, convert and resize images, and scan web pages for every image they load.

Ownership verified
Status
Healthy
Uptime
99.4% over 42 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
ChatGPT
–
Claude
–

TDQS

A4.3/5.0

Scored across 19 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count4/5

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.

Completeness4/5

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 tools
compress_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.

NameRequiredDescriptionDefault
urlsNoPublic http or https addresses of images to fetch. Iminify refuses private networks, follows up to five redirects and names each file after its address.
filesNoSmall files sent inline, up to 4 MB each. Use create_upload_link for anything bigger.
levelNoHow 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.
scaleNoResize 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.
widthNoResize 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.
folderNoPaid 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.
formatNoConvert 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).
heightNoResize to this height in pixels, the same way as width.
alt_textNoWrite 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_limitNoThe 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_idsNoUpload ids from create_upload_link whose file has been sent. Each upload can be compressed once.
keep_metadataNoKeep the EXIF metadata (camera, date, location). Off by default, which strips it; the orientation is applied to the pixels first.
alt_text_languageNoThe 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_widthsNoPaid 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_nameNoRename 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

NameRequiredDescription
nextNo
imagesNoThe images queued.
refusedNoThe sources refused, each with the reason.
not_startedNoAddresses not fetched because the call ran out of time.
not_started_noteNo

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

NameRequiredDescriptionDefault
levelNoHow 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.
pagesNoThe pages to crawl, all on one site. https:// can be left out. Send this or sitemap, not both.
scaleNoResize 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.
widthNoResize 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.
formatNoConvert 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).
heightNoResize to this height in pixels, the same way as width.
sitemapNoThe 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_textNoWrite 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_metadataNoKeep the EXIF metadata (camera, date, location). Off by default, which strips it; the orientation is applied to the pixels first.
alt_text_languageNoThe 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

NameRequiredDescription
idNoThe crawl's id.
urlNoThe sitemap read, or the first page listed.
hintNoWhat to do next: poll again while pages or images are at work, then where each page's images and report are.
noteNoWhy the crawl failed.
auditNoThe site's report, an image the pages share counted once. Null until the crawl is done.
pagesNoEach page, in the order the crawl took them.
sourceNo
statusNocompleted once every page and its images have finished. failed: the crawl could not start its pages; note says why.
settingsNo
created_atNo
monitor_idNoThe weekly site check this crawl is a run of, or null.
updated_atNo
pages_countNo
saved_bytesNo
images_countNo
pages_failedNo
original_sizeNoBytes, over the finished images.
saved_percentNo
optimized_sizeNoBytes, over the finished images.
pages_left_outNoPages past the plan's pages per crawl, not scanned.
images_finishedNo
pages_in_progressNo
images_in_progressNo

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_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.

NameRequiredDescriptionDefault
idsNoUp to 150 image ids, as compress_images, get_image and list_images return them. Send one of ids, scan_id and crawl_id.
scan_idNoThe id scan_page returned, to zip every finished image that scan found. Send one of ids, scan_id and crawl_id.
crawl_idNoThe id crawl_site returned, to zip every page of a finished site crawl. Send one of ids, scan_id and crawl_id.

Output Schema

NameRequiredDescription
imagesNoHow many images the zip holds.
left_outNoThe ids of the images left out because they had not finished.
expires_atNo
download_urlNoWorks without a token until expires_at.

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 imageA
Destructive
Inspect

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.

NameRequiredDescriptionDefault
idYesThe image's id.

Output Schema

NameRequiredDescription
deletedNoThe id of the image deleted.

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 reportA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
idYesThe scan's id, as scan_page returned it.
formatYescsv or pdf.

Output Schema

NameRequiredDescription
formatNo
file_nameNoThe name the file downloads with.
expires_atNo
download_urlNoWorks without a token until expires_at.

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 crawlA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
idYesThe crawl's id, as crawl_site returned it.

Output Schema

NameRequiredDescription
idNoThe crawl's id.
urlNoThe sitemap read, or the first page listed.
hintNoWhat to do next: poll again while pages or images are at work, then where each page's images and report are.
noteNoWhy the crawl failed.
auditNoThe site's report, an image the pages share counted once. Null until the crawl is done.
pagesNoEach page, in the order the crawl took them.
sourceNo
statusNocompleted once every page and its images have finished. failed: the crawl could not start its pages; note says why.
settingsNo
created_atNo
monitor_idNoThe weekly site check this crawl is a run of, or null.
updated_atNo
pages_countNo
saved_bytesNo
images_countNo
pages_failedNo
original_sizeNoBytes, over the finished images.
saved_percentNo
optimized_sizeNoBytes, over the finished images.
pages_left_outNoPages past the plan's pages per crawl, not scanned.
images_finishedNo
pages_in_progressNo
images_in_progressNo

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 imageA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
idYesThe image's id.

Output Schema

NameRequiredDescription
idNoThe image's id.
hintNoWhat to do next, when the status alone does not say.
nameNoThe name the optimized copy downloads under.
folderNoThe folder it was sent with, which a zip puts it in. Null for an image on its own.
statusNo
scan_idNoThe page scan that found it, if one did.
alt_textNoThe AI alt text, or null when none was asked for.
originalNo
settingsNo
optimizedNoNull until the image has finished.
share_urlNoIts public page, once shared.
created_atNo
responsiveNoThe responsive sizes (paid plans), or null when none were asked for. list_images carries only their status.
source_urlNoThe address it was fetched from: its address on the scanned page, or the url it was sent as. Null for a file.
updated_atNo
saved_bytesNoNegative when the optimized copy is larger.
saved_percentNo
size_limit_statusNoAgainst settings.size_limit: under, resized (made smaller in pixels to fit) or over. Null without a limit, and until the image has finished.
content_credentialsNoThe 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

A4.3/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines5/5

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 scanA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
idYesThe scan's id.
audit_imagesNoAdd 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

NameRequiredDescription
idNoThe scan's id.
urlNoThe page scanned.
hintNoWhat to do next: poll again while the scan or its images are still running, then where to read its images.
noteNoWhat the scan found, or why it stopped.
auditNoThe 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.
statusNo
skippedNoThe images the scan found and did not compress, each with why.
crawl_idNoThe site crawl this scan is a page of, for get_crawl, or null.
settingsNo
share_urlNoThe page report's public link while it is shared; it answers only while the account is on a paid plan.
created_atNo
updated_atNo
saved_bytesNo
images_countNo
original_sizeNoBytes, over the finished images.
saved_percentNo
optimized_sizeNoBytes, over the finished images.
images_finishedNo
images_in_progressNo
alt_texts_in_progressNoFinished images whose AI alt text for the audit's suggested_alt is still being written.

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 usageA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
planNopro 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.
usageNo
limitsNo
plan_ends_atNoWhen a cancelled paid plan or a trial ends.

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 imagesA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
pageNoThe page to read, starting at 1 (the default).
scanNoOnly the images one page scan found, by the id scan_page returned.
sourceNo"upload" for images that were sent, "scan" for the ones page scans found.
statusNoOnly images with this status. queued and optimizing are still running; completed, already-optimized, failed and cancelled are finished.
per_pageNoImages a page, from 1 to 50. 15 by default.

Output Schema

NameRequiredDescription
pageNo
totalNo
imagesNo
per_pageNo
last_pageNo

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 checksA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
hintNoWhere to read a run, or how to start a check when there is none.
monitorsNo

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 weekA
Idempotent
Inspect

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

NameRequiredDescriptionDefault
crawl_idYesThe id of a site crawl on the account, as crawl_site returned it.

Output Schema

NameRequiredDescription
idNoThe check's id, for stop_monitor.
urlNoThe sitemap each run reads again, or the first of the pages it takes.
hintNoWhen the first check runs, and how to read what it finds.
emailsNoWhether a run that finds new or changed images emails the account.
pausedNoTrue 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.
sourceNo
crawl_idNoThe site crawl the check was made from, or null once that crawl is deleted.
last_runNoThe 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.
settingsNo
created_atNo
next_run_atNoWhen the next run is due.

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 imageA
Idempotent
Inspect

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.

NameRequiredDescriptionDefault
idYesThe image's id.
nameYesThe new name, without an extension.

Output Schema

NameRequiredDescription
idNoThe image's id.
hintNoWhat to do next, when the status alone does not say.
nameNoThe name the optimized copy downloads under.
folderNoThe folder it was sent with, which a zip puts it in. Null for an image on its own.
statusNo
scan_idNoThe page scan that found it, if one did.
alt_textNoThe AI alt text, or null when none was asked for.
originalNo
settingsNo
optimizedNoNull until the image has finished.
share_urlNoIts public page, once shared.
created_atNo
responsiveNoThe responsive sizes (paid plans), or null when none were asked for. list_images carries only their status.
source_urlNoThe address it was fetched from: its address on the scanned page, or the url it was sent as. Null for a file.
updated_atNo
saved_bytesNoNegative when the optimized copy is larger.
saved_percentNo
size_limit_statusNoAgainst settings.size_limit: under, resized (made smaller in pixels to fit) or over. Null without a limit, and until the image has finished.
content_credentialsNoThe 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

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

NameRequiredDescriptionDefault
urlYesThe page to scan. https:// can be left out.
levelNoHow 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.
scaleNoResize 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.
widthNoResize 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.
formatNoConvert 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).
heightNoResize to this height in pixels, the same way as width.
alt_textNoWrite 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_metadataNoKeep the EXIF metadata (camera, date, location). Off by default, which strips it; the orientation is applied to the pixels first.
alt_text_languageNoThe 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

NameRequiredDescription
idNoThe scan's id.
urlNoThe page scanned.
hintNoWhat to do next: poll again while the scan or its images are still running, then where to read its images.
noteNoWhat the scan found, or why it stopped.
auditNoThe 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.
statusNo
skippedNoThe images the scan found and did not compress, each with why.
crawl_idNoThe site crawl this scan is a page of, for get_crawl, or null.
settingsNo
share_urlNoThe page report's public link while it is shared; it answers only while the account is on a paid plan.
created_atNo
updated_atNo
saved_bytesNo
images_countNo
original_sizeNoBytes, over the finished images.
saved_percentNo
optimized_sizeNoBytes, over the finished images.
images_finishedNo
images_in_progressNo
alt_texts_in_progressNoFinished images whose AI alt text for the audit's suggested_alt is still being written.

TDQS

A4.1/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

share_imageShare an imageA
Idempotent
Inspect

Give a finished image a public page, returned as share_url, where anyone with the link can see the optimized copy, compare it with the original and download either. The page is kept out of search engines. Sharing an image that is already shared keeps its link. The link can be switched off from the website's results table or the API.

NameRequiredDescriptionDefault
idYesThe image's id.

Output Schema

NameRequiredDescription
idNoThe image's id.
hintNoWhat to do next, when the status alone does not say.
nameNoThe name the optimized copy downloads under.
folderNoThe folder it was sent with, which a zip puts it in. Null for an image on its own.
statusNo
scan_idNoThe page scan that found it, if one did.
alt_textNoThe AI alt text, or null when none was asked for.
originalNo
settingsNo
optimizedNoNull until the image has finished.
share_urlNoIts public page, once shared.
created_atNo
responsiveNoThe responsive sizes (paid plans), or null when none were asked for. list_images carries only their status.
source_urlNoThe address it was fetched from: its address on the scanned page, or the url it was sent as. Null for a file.
updated_atNo
saved_bytesNoNegative when the optimized copy is larger.
saved_percentNo
size_limit_statusNoAgainst settings.size_limit: under, resized (made smaller in pixels to fit) or over. Null without a limit, and until the image has finished.
content_credentialsNoThe 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

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare non-readonly, idempotent, non-destructive and openWorld, so the bar is lower. The description adds genuinely new context: the page is deliberately kept out of search engines (privacy/noindex behavior), what visitors can do (view optimized copy, compare with original, download), and that the link can be revoked via the results table or API. Restating idempotency slightly duplicates the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the outcome ('public page, returned as share_url') followed by visitor capabilities, noindex, idempotency and revocation. Every sentence carries information, though the visitor-capability clause is the most expendable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists so return values needn't be spelled out, yet the description still explains share_url usefully. It covers the mutation's visibility model and revocation path, leaving only edge cases like error behavior unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Single parameter with 100% schema description coverage, so the schema carries the semantics and a 3 is the baseline. The description adds only the hint that the image should be 'finished', not new meaning for the id field itself.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource: 'Give a finished image a public page, returned as share_url' states exactly what is produced. It also distinguishes the resource from siblings like share_scan_report by naming the object (image) and the result (share_url).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies a precondition ('a finished image') and states repeat-call behavior ('Sharing an image that is already shared keeps its link'), which tells the agent it's safe to call again. It does not explicitly name when to use an alternative (e.g., share_scan_report) or state an exclusion, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

share_scan_reportShare a page reportA
Idempotent
Inspect

Give a finished page scan's report a public page, returned as share_url, where anyone with the link can read it, with thumbnails of the compressed images, without signing in. For handing the report to a client or a colleague. The page is kept out of search engines and answers only while the account is on a paid plan. Comes with a paid plan, and is refused with pro_required on other plans. Sharing a report that is already shared keeps its link. The link can be switched off from the website's report or the API.

NameRequiredDescriptionDefault
idYesThe scan's id, as scan_page returned it.

Output Schema

NameRequiredDescription
idNoThe scan's id.
urlNoThe page scanned.
hintNoWhat to do next: poll again while the scan or its images are still running, then where to read its images.
noteNoWhat the scan found, or why it stopped.
auditNoThe 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.
statusNo
skippedNoThe images the scan found and did not compress, each with why.
crawl_idNoThe site crawl this scan is a page of, for get_crawl, or null.
settingsNo
share_urlNoThe page report's public link while it is shared; it answers only while the account is on a paid plan.
created_atNo
updated_atNo
saved_bytesNo
images_countNo
original_sizeNoBytes, over the finished images.
saved_percentNo
optimized_sizeNoBytes, over the finished images.
images_finishedNo
images_in_progressNo
alt_texts_in_progressNoFinished images whose AI alt text for the audit's suggested_alt is still being written.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses that the link is public, readable without sign-in, excluded from search engines, tied to a paid plan, idempotent for already-shared reports, and revocable from the website or API. These are meaningful behavioral traits that an agent would not infer from the annotations alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded and the description is generally efficient. However, the paid-plan requirement is stated twice in adjacent sentences, creating minor redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the rich annotations, complete schema coverage, and an output schema that handles return values, the description covers the remaining behavioral and access requirements. It explains the public exposure, paid-plan gate, idempotency, and revocation path, leaving no significant gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter, id, is already fully documented in the schema as the scan id returned by scan_page. Schema description coverage is 100%, so the description does not need to explain it further and adds no additional parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: giving a finished page scan's report a public page and returning a share_url. It distinguishes itself from share_image by focusing on a page scan report rather than an image, so an agent can select it 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly frames the intended use case as handing a report to a client or colleague, and explains the paid-plan prerequisite with the pro_required refusal. It does not explicitly compare against export_scan_report or share_image, so it lacks full alternative routing guidance.

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 checkA
Destructive
Inspect

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.

NameRequiredDescriptionDefault
idYesThe check's id, from list_monitors.

Output Schema

NameRequiredDescription
stoppedNoThe id of the check stopped.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
idYesThe image's id.
alt_text_languageNoThe 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_nameNoRename 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

NameRequiredDescription
idNoThe image's id.
hintNoWhat to do next, when the status alone does not say.
nameNoThe name the optimized copy downloads under.
folderNoThe folder it was sent with, which a zip puts it in. Null for an image on its own.
statusNo
scan_idNoThe page scan that found it, if one did.
alt_textNoThe AI alt text, or null when none was asked for.
originalNo
settingsNo
optimizedNoNull until the image has finished.
share_urlNoIts public page, once shared.
created_atNo
responsiveNoThe responsive sizes (paid plans), or null when none were asked for. list_images carries only their status.
source_urlNoThe address it was fetched from: its address on the scanned page, or the url it was sent as. Null for a file.
updated_atNo
saved_bytesNoNegative when the optimized copy is larger.
saved_percentNo
size_limit_statusNoAgainst settings.size_limit: under, resized (made smaller in pixels to fit) or over. Null without a limit, and until the image has finished.
content_credentialsNoThe 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

A4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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. 1 tool update
    • Changedget_usage4 fields changed
      • addedOutput schema / properties / limits / properties / files_per_day
        Added value: +{
        +  "description": "Files the API's upload groups make, which this server never opens. null on max, which is unlimited.",
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
      • changedOutput schema / properties / limits / required
        Previous 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"
        +]
      • addedOutput schema / properties / usage / properties / files
        Added 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"
        +}
      • changedOutput schema / properties / usage / required
        Previous value: -[
        -  "images",
        -  "scans",
        -  "crawls",
        -  "alt_texts"
        -]New value: +[
        +  "images",
        +  "scans",
        +  "crawls",
        +  "alt_texts",
        +  "files"
        +]
  2. 1 tool update
    • Changedget_usage7 fields changed
      • changedOutput schema / properties / limits / properties / alt_texts_per_day / description
        Previous 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."
      • changedOutput schema / properties / limits / properties / images_per_day / description
        Previous value: -"On max, which is sold as unlimited, the fair-use line."New value: +"null on max, which is unlimited."
      • changedOutput schema / properties / limits / properties / scans_per_day / description
        Previous value: -"On max, the fair-use line."New value: +"null on max, which is unlimited."
      • changedOutput schema / properties / usage / properties / alt_texts / properties / remaining / description
        Previous value: -"On max, what is left of the fair-use line."New value: +"null where the daily limit is null."
      • changedOutput schema / properties / usage / properties / crawls / properties / remaining / description
        Previous value: -"On max, what is left of the fair-use line."New value: +"null where the daily limit is null."
      • changedOutput schema / properties / usage / properties / images / properties / remaining / description
        Previous value: -"On max, what is left of the fair-use line."New value: +"null where the daily limit is null."
      • changedOutput schema / properties / usage / properties / scans / properties / remaining / description
        Previous value: -"On max, what is left of the fair-use line."New value: +"null where the daily limit is null."
  3. 12 tool updates
    • Changedcompress_images3 fields changed
      • changedInput schema / properties / folder / description
        Previous 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."
      • changedInput schema / properties / responsive_widths / description
        Previous 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."
      • changedOutput schema / properties / images / items / properties / responsive / description
        Previous 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."
    • Changedget_image1 field changed
      • changedOutput schema / properties / responsive / description
        Previous 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."
    • Changedget_scan1 field changed
      • changedOutput schema / properties / share_url / description
        Previous 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."
    • Changedget_usage10 fields changed
      • changedOutput schema / properties / limits / properties / alt_texts_per_day / description
        Previous 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."
      • changedOutput schema / properties / limits / properties / crawls_per_day / description
        Previous value: -"Site crawls. 0 means the plan has none, null no daily cap."New value: +"Site crawls. 0 means the plan has none."
      • changedOutput schema / properties / limits / properties / images_per_day / description
        Previous value: -"Null means no daily cap."New value: +"On max, which is sold as unlimited, the fair-use line."
      • changedOutput schema / properties / limits / properties / scans_per_day / description
        Previous value: -"Null means no daily cap."New value: +"On max, the fair-use line."
      • changedOutput schema / properties / plan / description
        Previous 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."
      • changedOutput schema / properties / plan / enum
        Previous value: -[
        -  "guest",
        -  "free",
        -  "trial",
        -  "pro"
        -]New value: +[
        +  "guest",
        +  "free",
        +  "trial",
        +  "pro",
        +  "max"
        +]
      • changedOutput schema / properties / usage / properties / alt_texts / properties / remaining / description
        Previous value: -"Null on a plan without a daily cap."New value: +"On max, what is left of the fair-use line."
      • changedOutput schema / properties / usage / properties / crawls / properties / remaining / description
        Previous value: -"Null on a plan without a daily cap."New value: +"On max, what is left of the fair-use line."
      • changedOutput schema / properties / usage / properties / images / properties / remaining / description
        Previous value: -"Null on a plan without a daily cap."New value: +"On max, what is left of the fair-use line."
      • changedOutput schema / properties / usage / properties / scans / properties / remaining / description
        Previous value: -"Null on a plan without a daily cap."New value: +"On max, what is left of the fair-use line."
    • Changedlist_images1 field changed
      • changedOutput schema / properties / images / items / properties / responsive / description
        Previous 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."
    • Changedlist_monitors1 field changed
      • changedOutput schema / properties / monitors / items / properties / paused / description
        Previous 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."
    • Changedmonitor_site1 field changed
      • changedOutput schema / properties / paused / description
        Previous 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."
    • Changedrename_image1 field changed
      • changedOutput schema / properties / responsive / description
        Previous 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."
    • Changedscan_page1 field changed
      • changedOutput schema / properties / share_url / description
        Previous 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."
    • Changedshare_image1 field changed
      • changedOutput schema / properties / responsive / description
        Previous 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."
    • Changedshare_scan_report1 field changed
      • changedOutput schema / properties / share_url / description
        Previous 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."
    • Changedwrite_alt_text1 field changed
      • changedOutput schema / properties / responsive / description
        Previous 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."
  4. 16 tool updates
    • Changedcompress_images12 fields changed
      • addedInput schema / properties / folder
        Added 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"
        +}
      • changedInput schema / properties / level / description
        Previous 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."
      • addedInput schema / properties / responsive_widths
        Added 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"
        +}
      • addedInput schema / properties / size_limit
        Added 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"
        +}
      • addedOutput schema / properties / images / items / properties / content_credentials
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / images / items / properties / folder
        Added value: +{
        +  "description": "The folder it was sent with, which a zip puts it in. Null for an image on its own.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / images / items / properties / responsive
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / images / items / properties / settings / properties / responsive_widths
        Added value: +{
        +  "description": "The responsive widths asked for, or null.",
        +  "items": {
        +    "type": "integer"
        +  },
        +  "type": [
        +    "array",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / images / items / properties / settings / properties / size_limit
        Added value: +{
        +  "description": "The most the optimized copy may weigh, in KB of 1,000 bytes, or null.",
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
      • changedOutput schema / properties / images / items / properties / settings / required
        Previous value: -[
        -  "level",
        -  "format",
        -  "keep_metadata",
        -  "width",
        -  "height",
        -  "scale"
        -]New value: +[
        +  "level",
        +  "format",
        +  "keep_metadata",
        +  "width",
        +  "height",
        +  "scale",
        +  "size_limit",
        +  "responsive_widths"
        +]
      • addedOutput schema / properties / images / items / properties / size_limit_status
        Added 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"
        +  ]
        +}
      • changedOutput schema / properties / images / items / required
        Previous 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"
        +]
    • Addedcrawl_site
    • Changedcreate_zip3 fields changed
      • addedInput schema / properties / crawl_id
        Added 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"
        +}
      • changedInput schema / properties / ids / description
        Previous 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."
      • changedInput schema / properties / scan_id / description
        Previous 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."
    • Addedget_crawl
    • Changedget_image7 fields changed
      • addedOutput schema / properties / content_credentials
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / folder
        Added value: +{
        +  "description": "The folder it was sent with, which a zip puts it in. Null for an image on its own.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / responsive
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / settings / properties / responsive_widths
        Added value: +{
        +  "description": "The responsive widths asked for, or null.",
        +  "items": {
        +    "type": "integer"
        +  },
        +  "type": [
        +    "array",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / settings / properties / size_limit
        Added value: +{
        +  "description": "The most the optimized copy may weigh, in KB of 1,000 bytes, or null.",
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
      • changedOutput schema / properties / settings / required
        Previous value: -[
        -  "level",
        -  "format",
        -  "keep_metadata",
        -  "width",
        -  "height",
        -  "scale"
        -]New value: +[
        +  "level",
        +  "format",
        +  "keep_metadata",
        +  "width",
        +  "height",
        +  "scale",
        +  "size_limit",
        +  "responsive_widths"
        +]
      • addedOutput schema / properties / size_limit_status
        Added 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"
        +  ]
        +}
    • Changedget_scan3 fields changed
      • changedOutput schema / properties / audit / properties / images / items / properties / skip_reason / enum
        Previous 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
        +]
      • addedOutput schema / properties / crawl_id
        Added value: +{
        +  "description": "The site crawl this scan is a page of, for get_crawl, or null.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedOutput schema / properties / skipped / items / properties / reason / enum
        Previous 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"
        +]
    • Changedget_usage9 fields changed
      • addedOutput schema / properties / limits / properties / crawls_per_day
        Added value: +{
        +  "description": "Site crawls. 0 means the plan has none, null no daily cap.",
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / limits / properties / monitors
        Added value: +{
        +  "description": "Sites checked weekly at once. 0 means the plan has no weekly checks.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / limits / properties / pages_per_crawl
        Added value: +{
        +  "description": "0 means the plan has no site crawls.",
        +  "type": "integer"
        +}
      • changedOutput schema / properties / limits / required
        Previous 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"
        +]
      • addedOutput schema / properties / plan / description
        Added 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."
      • changedOutput schema / properties / plan / enum
        Previous value: -[
        -  "guest",
        -  "free",
        -  "pro"
        -]New value: +[
        +  "guest",
        +  "free",
        +  "trial",
        +  "pro"
        +]
      • changedOutput schema / properties / plan_ends_at / description
        Previous value: -"When a cancelled paid plan ends."New value: +"When a cancelled paid plan or a trial ends."
      • addedOutput schema / properties / usage / properties / crawls
        Added 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"
        +}
      • changedOutput schema / properties / usage / required
        Previous value: -[
        -  "images",
        -  "scans",
        -  "alt_texts"
        -]New value: +[
        +  "images",
        +  "scans",
        +  "crawls",
        +  "alt_texts"
        +]
    • Changedlist_images8 fields changed
      • addedOutput schema / properties / images / items / properties / content_credentials
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / images / items / properties / folder
        Added value: +{
        +  "description": "The folder it was sent with, which a zip puts it in. Null for an image on its own.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / images / items / properties / responsive
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / images / items / properties / settings / properties / responsive_widths
        Added value: +{
        +  "description": "The responsive widths asked for, or null.",
        +  "items": {
        +    "type": "integer"
        +  },
        +  "type": [
        +    "array",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / images / items / properties / settings / properties / size_limit
        Added value: +{
        +  "description": "The most the optimized copy may weigh, in KB of 1,000 bytes, or null.",
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
      • changedOutput schema / properties / images / items / properties / settings / required
        Previous value: -[
        -  "level",
        -  "format",
        -  "keep_metadata",
        -  "width",
        -  "height",
        -  "scale"
        -]New value: +[
        +  "level",
        +  "format",
        +  "keep_metadata",
        +  "width",
        +  "height",
        +  "scale",
        +  "size_limit",
        +  "responsive_widths"
        +]
      • addedOutput schema / properties / images / items / properties / size_limit_status
        Added 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"
        +  ]
        +}
      • changedOutput schema / properties / images / items / required
        Previous 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"
        +]
    • Addedlist_monitors
    • Addedmonitor_site
    • Changedrename_image7 fields changed
      • addedOutput schema / properties / content_credentials
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / folder
        Added value: +{
        +  "description": "The folder it was sent with, which a zip puts it in. Null for an image on its own.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / responsive
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / settings / properties / responsive_widths
        Added value: +{
        +  "description": "The responsive widths asked for, or null.",
        +  "items": {
        +    "type": "integer"
        +  },
        +  "type": [
        +    "array",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / settings / properties / size_limit
        Added value: +{
        +  "description": "The most the optimized copy may weigh, in KB of 1,000 bytes, or null.",
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
      • changedOutput schema / properties / settings / required
        Previous value: -[
        -  "level",
        -  "format",
        -  "keep_metadata",
        -  "width",
        -  "height",
        -  "scale"
        -]New value: +[
        +  "level",
        +  "format",
        +  "keep_metadata",
        +  "width",
        +  "height",
        +  "scale",
        +  "size_limit",
        +  "responsive_widths"
        +]
      • addedOutput schema / properties / size_limit_status
        Added 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"
        +  ]
        +}
    • Changedscan_page4 fields changed
      • changedInput schema / properties / level / description
        Previous 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."
      • changedOutput schema / properties / audit / properties / images / items / properties / skip_reason / enum
        Previous 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
        +]
      • addedOutput schema / properties / crawl_id
        Added value: +{
        +  "description": "The site crawl this scan is a page of, for get_crawl, or null.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedOutput schema / properties / skipped / items / properties / reason / enum
        Previous 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"
        +]
    • Changedshare_image7 fields changed
      • addedOutput schema / properties / content_credentials
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / folder
        Added value: +{
        +  "description": "The folder it was sent with, which a zip puts it in. Null for an image on its own.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / responsive
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / settings / properties / responsive_widths
        Added value: +{
        +  "description": "The responsive widths asked for, or null.",
        +  "items": {
        +    "type": "integer"
        +  },
        +  "type": [
        +    "array",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / settings / properties / size_limit
        Added value: +{
        +  "description": "The most the optimized copy may weigh, in KB of 1,000 bytes, or null.",
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
      • changedOutput schema / properties / settings / required
        Previous value: -[
        -  "level",
        -  "format",
        -  "keep_metadata",
        -  "width",
        -  "height",
        -  "scale"
        -]New value: +[
        +  "level",
        +  "format",
        +  "keep_metadata",
        +  "width",
        +  "height",
        +  "scale",
        +  "size_limit",
        +  "responsive_widths"
        +]
      • addedOutput schema / properties / size_limit_status
        Added 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"
        +  ]
        +}
    • Changedshare_scan_report3 fields changed
      • changedOutput schema / properties / audit / properties / images / items / properties / skip_reason / enum
        Previous 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
        +]
      • addedOutput schema / properties / crawl_id
        Added value: +{
        +  "description": "The site crawl this scan is a page of, for get_crawl, or null.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedOutput schema / properties / skipped / items / properties / reason / enum
        Previous 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"
        +]
    • Addedstop_monitor
    • Changedwrite_alt_text7 fields changed
      • addedOutput schema / properties / content_credentials
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / folder
        Added value: +{
        +  "description": "The folder it was sent with, which a zip puts it in. Null for an image on its own.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / responsive
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / settings / properties / responsive_widths
        Added value: +{
        +  "description": "The responsive widths asked for, or null.",
        +  "items": {
        +    "type": "integer"
        +  },
        +  "type": [
        +    "array",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / settings / properties / size_limit
        Added value: +{
        +  "description": "The most the optimized copy may weigh, in KB of 1,000 bytes, or null.",
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
      • changedOutput schema / properties / settings / required
        Previous value: -[
        -  "level",
        -  "format",
        -  "keep_metadata",
        -  "width",
        -  "height",
        -  "scale"
        -]New value: +[
        +  "level",
        +  "format",
        +  "keep_metadata",
        +  "width",
        +  "height",
        +  "scale",
        +  "size_limit",
        +  "responsive_widths"
        +]
      • addedOutput schema / properties / size_limit_status
        Added 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"
        +  ]
        +}
  5. 4 tool updates
    • Changedget_scan2 fields changed
      • changedOutput schema / properties / hint / description
        Previous 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."
      • removedOutput schema / properties / images
        Removed 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"
        -}
    • Changedlist_images2 fields changed
      • changedInput schema / properties / per_page / description
        Previous value: -"Images a page, from 1 to 100. 15 by default."New value: +"Images a page, from 1 to 50. 15 by default."
      • changedInput schema / properties / per_page / maximum
        Previous value: -100New value: +50
    • Changedscan_page2 fields changed
      • changedOutput schema / properties / hint / description
        Previous 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."
      • removedOutput schema / properties / images
        Removed 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"
        -}
    • Changedshare_scan_report2 fields changed
      • changedOutput schema / properties / hint / description
        Previous 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."
      • removedOutput schema / properties / images
        Removed 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"
        -}
  6. 2 tool updates
    • Changedcompress_images2 fields changed
      • changedInput schema / properties / scale / description
        Previous 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."
      • changedInput schema / properties / width / description
        Previous 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."
    • Changedscan_page2 fields changed
      • changedInput schema / properties / scale / description
        Previous 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."
      • changedInput schema / properties / width / description
        Previous 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."
  7. 10 tool updates
    • Changedcompress_images5 fields changed
      • addedInput schema / properties / alt_text
        Added 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"
        +}
      • addedInput schema / properties / alt_text_language
        Added 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"
        +}
      • addedInput schema / properties / use_suggested_name
        Added 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"
        +}
      • addedOutput schema / properties / images / items / properties / alt_text
        Added 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"
        +  ]
        +}
      • changedOutput schema / properties / images / items / required
        Previous 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"
        +]
    • Changedget_image1 field changed
      • addedOutput schema / properties / alt_text
        Added 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"
        +  ]
        +}
    • Changedget_scan5 fields changed
      • addedOutput schema / properties / alt_texts_in_progress
        Added value: +{
        +  "description": "Finished images whose AI alt text for the audit's suggested_alt is still being written.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / audit / properties / images / items / properties / suggested_alt
        Added 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"
        +  ]
        +}
      • changedOutput schema / properties / audit / properties / images / items / required
        Previous 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"
        +]
      • addedOutput schema / properties / images / items / properties / alt_text
        Added 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"
        +  ]
        +}
      • changedOutput schema / properties / images / items / required
        Previous 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"
        +]
    • Changedget_usage4 fields changed
      • addedOutput schema / properties / limits / properties / alt_texts_per_day
        Added value: +{
        +  "description": "AI alt texts. Null means no daily cap.",
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
      • changedOutput schema / properties / limits / required
        Previous 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"
        +]
      • addedOutput schema / properties / usage / properties / alt_texts
        Added 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"
        +}
      • changedOutput schema / properties / usage / required
        Previous value: -[
        -  "images",
        -  "scans"
        -]New value: +[
        +  "images",
        +  "scans",
        +  "alt_texts"
        +]
    • Changedlist_images2 fields changed
      • addedOutput schema / properties / images / items / properties / alt_text
        Added 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"
        +  ]
        +}
      • changedOutput schema / properties / images / items / required
        Previous 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"
        +]
    • Changedrename_image1 field changed
      • addedOutput schema / properties / alt_text
        Added 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"
        +  ]
        +}
    • Changedscan_page7 fields changed
      • addedInput schema / properties / alt_text
        Added 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"
        +}
      • addedInput schema / properties / alt_text_language
        Added 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"
        +}
      • addedOutput schema / properties / alt_texts_in_progress
        Added value: +{
        +  "description": "Finished images whose AI alt text for the audit's suggested_alt is still being written.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / audit / properties / images / items / properties / suggested_alt
        Added 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"
        +  ]
        +}
      • changedOutput schema / properties / audit / properties / images / items / required
        Previous 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"
        +]
      • addedOutput schema / properties / images / items / properties / alt_text
        Added 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"
        +  ]
        +}
      • changedOutput schema / properties / images / items / required
        Previous 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"
        +]
    • Changedshare_image1 field changed
      • addedOutput schema / properties / alt_text
        Added 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"
        +  ]
        +}
    • Changedshare_scan_report5 fields changed
      • addedOutput schema / properties / alt_texts_in_progress
        Added value: +{
        +  "description": "Finished images whose AI alt text for the audit's suggested_alt is still being written.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / audit / properties / images / items / properties / suggested_alt
        Added 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"
        +  ]
        +}
      • changedOutput schema / properties / audit / properties / images / items / required
        Previous 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"
        +]
      • addedOutput schema / properties / images / items / properties / alt_text
        Added 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"
        +  ]
        +}
      • changedOutput schema / properties / images / items / required
        Previous 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"
        +]
    • Addedwrite_alt_text
  8. 4 tool updates
    • Addedexport_scan_report
    • Changedget_scan1 field changed
      • addedOutput schema / properties / share_url
        Added value: +{
        +  "description": "The page report's public link while it is shared; it answers only while the account has Pro.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedscan_page1 field changed
      • addedOutput schema / properties / share_url
        Added value: +{
        +  "description": "The page report's public link while it is shared; it answers only while the account has Pro.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Addedshare_scan_report
  9. 2 tool updates
    • Changedget_scan2 fields changed
      • addedInput schema / properties / audit_images
        Added 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"
        +}
      • addedOutput schema / properties / audit
        Added 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"
        +  ]
        +}
    • Changedscan_page1 field changed
      • addedOutput schema / properties / audit
        Added 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"
        +  ]
        +}
  10. 7 tool updates
    • Changedcompress_images2 fields changed
      • addedOutput schema / properties / images / items / properties / source_url
        Added 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"
        +  ]
        +}
      • changedOutput schema / properties / images / items / required
        Previous 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"
        +]
    • Changedget_image1 field changed
      • addedOutput schema / properties / source_url
        Added 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"
        +  ]
        +}
    • Changedget_scan2 fields changed
      • addedOutput schema / properties / images / items / properties / source_url
        Added 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"
        +  ]
        +}
      • changedOutput schema / properties / images / items / required
        Previous 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"
        +]
    • Changedlist_images2 fields changed
      • addedOutput schema / properties / images / items / properties / source_url
        Added 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"
        +  ]
        +}
      • changedOutput schema / properties / images / items / required
        Previous 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"
        +]
    • Changedrename_image1 field changed
      • addedOutput schema / properties / source_url
        Added 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"
        +  ]
        +}
    • Changedscan_page2 fields changed
      • addedOutput schema / properties / images / items / properties / source_url
        Added 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"
        +  ]
        +}
      • changedOutput schema / properties / images / items / required
        Previous 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"
        +]
    • Changedshare_image1 field changed
      • addedOutput schema / properties / source_url
        Added 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"
        +  ]
        +}
  11. 7 tool updates
    • Changedcompress_images2 fields changed
      • addedOutput schema / properties / images / items / properties / settings / properties / format
        Added 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"
        +  ]
        +}
      • changedOutput schema / properties / images / items / properties / settings / required
        Previous value: -[
        -  "level",
        -  "keep_metadata",
        -  "width",
        -  "height",
        -  "scale"
        -]New value: +[
        +  "level",
        +  "format",
        +  "keep_metadata",
        +  "width",
        +  "height",
        +  "scale"
        +]
    • Changedget_image2 fields changed
      • addedOutput schema / properties / settings / properties / format
        Added 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"
        +  ]
        +}
      • changedOutput schema / properties / settings / required
        Previous value: -[
        -  "level",
        -  "keep_metadata",
        -  "width",
        -  "height",
        -  "scale"
        -]New value: +[
        +  "level",
        +  "format",
        +  "keep_metadata",
        +  "width",
        +  "height",
        +  "scale"
        +]
    • Changedget_scan3 fields changed
      • addedOutput schema / properties / images / items / properties / settings / properties / format
        Added 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"
        +  ]
        +}
      • changedOutput schema / properties / images / items / properties / settings / required
        Previous value: -[
        -  "level",
        -  "keep_metadata",
        -  "width",
        -  "height",
        -  "scale"
        -]New value: +[
        +  "level",
        +  "format",
        +  "keep_metadata",
        +  "width",
        +  "height",
        +  "scale"
        +]
      • addedOutput schema / properties / skipped
        Added 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"
        +}
    • Changedlist_images2 fields changed
      • addedOutput schema / properties / images / items / properties / settings / properties / format
        Added 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"
        +  ]
        +}
      • changedOutput schema / properties / images / items / properties / settings / required
        Previous value: -[
        -  "level",
        -  "keep_metadata",
        -  "width",
        -  "height",
        -  "scale"
        -]New value: +[
        +  "level",
        +  "format",
        +  "keep_metadata",
        +  "width",
        +  "height",
        +  "scale"
        +]
    • Changedrename_image2 fields changed
      • addedOutput schema / properties / settings / properties / format
        Added 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"
        +  ]
        +}
      • changedOutput schema / properties / settings / required
        Previous value: -[
        -  "level",
        -  "keep_metadata",
        -  "width",
        -  "height",
        -  "scale"
        -]New value: +[
        +  "level",
        +  "format",
        +  "keep_metadata",
        +  "width",
        +  "height",
        +  "scale"
        +]
    • Changedscan_page3 fields changed
      • addedOutput schema / properties / images / items / properties / settings / properties / format
        Added 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"
        +  ]
        +}
      • changedOutput schema / properties / images / items / properties / settings / required
        Previous value: -[
        -  "level",
        -  "keep_metadata",
        -  "width",
        -  "height",
        -  "scale"
        -]New value: +[
        +  "level",
        +  "format",
        +  "keep_metadata",
        +  "width",
        +  "height",
        +  "scale"
        +]
      • addedOutput schema / properties / skipped
        Added 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"
        +}
    • Changedshare_image2 fields changed
      • addedOutput schema / properties / settings / properties / format
        Added 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"
        +  ]
        +}
      • changedOutput schema / properties / settings / required
        Previous value: -[
        -  "level",
        -  "keep_metadata",
        -  "width",
        -  "height",
        -  "scale"
        -]New value: +[
        +  "level",
        +  "format",
        +  "keep_metadata",
        +  "width",
        +  "height",
        +  "scale"
        +]
  12. 11 tool updates
    • Changedcompress_images1 field changed
      • changedOutput 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"
        +}
    • Changedcreate_upload_link1 field changed
      • changedOutput 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"
        +}
    • Changedcreate_zip1 field changed
      • changedOutput 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"
        +}
    • Changeddelete_image1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "deleted": {
        +      "description": "The id of the image deleted.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedget_image1 field changed
      • changedOutput 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"
        +}
    • Changedget_scan1 field changed
      • changedOutput 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"
        +}
    • Changedget_usage1 field changed
      • changedOutput 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"
        +}
    • Changedlist_images1 field changed
      • changedOutput 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"
        +}
    • Changedrename_image1 field changed
      • changedOutput 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"
        +}
    • Changedscan_page1 field changed
      • changedOutput 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"
        +}
    • Changedshare_image1 field changed
      • changedOutput 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"
        +}
  13. 2 tool updates
    • Changedcreate_zip2 fields changed
      • changedInput schema / properties / ids / description
        Previous 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."
      • changedInput schema / properties / scan_id / description
        Previous 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."
    • Changedlist_images4 fields changed
      • changedInput schema / properties / page / description
        Previous value: -"The page to read, from 1."New value: +"The page to read, starting at 1 (the default)."
      • changedInput schema / properties / per_page / description
        Previous value: -"Images a page. 15 by default."New value: +"Images a page, from 1 to 100. 15 by default."
      • changedInput schema / properties / scan / description
        Previous 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."
      • changedInput schema / properties / status / description
        Previous 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."
  14. 11 tool updates
    • First observedcompress_images
    • First observedcreate_upload_link
    • First observedcreate_zip
    • First observeddelete_image
    • First observedget_image
    • First observedget_scan
    • First observedget_usage
    • First observedlist_images
    • First observedrename_image
    • First observedscan_page
    • First observedshare_image

Publisher details

Operator
Mozex Labs · Publisher source
Operator website
https://www.iminify.com/
Vendor relationship
First-party · Publisher source
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

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Optimize, 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).
    11
    3 npm
    3
    GPL 3.0
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources