# Screenshot Comparison for QA - DiffShot (`dravara/diffshot`) Actor

Upload a before screenshot and an after screenshot. Get structured text, price, control, and layout changes plus an annotated visual comparison for QA review.

- **URL**: https://apify.com/dravara/diffshot.md
- **Developed by:** [Dravara LLC](https://apify.com/dravara) (community)
- **Categories:** AI, Developer tools, Automation
- **Stats:** 1 total users, 0 monthly users, 93.1% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.12 / image pair compared

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## DiffShot

**Compare the before and after screenshots for meaningful changes.**

DiffShot compares a before screenshot with an after screenshot and reports what
changed in human terms. It is not another website-change monitor: its job is to
separate substantive changes from pixel or formatting noise.

### Changes it can explain

- Added, removed, or revised text
- Changed numbers, dates, and prices
- Added, removed, or changed controls
- Changed obligations or policy language visible in the images
- Moved elements
- Formatting-only changes when explicitly requested

The result includes structured before/after regions, severity, an explanation,
a deterministic pixel-change ratio, and a side-by-side annotated PNG.

### Output example

This sanitized example shows the complete dataset contract. The adapter stores
the comparison PNG in the run's key-value store and returns its storage key.

```json
{
  "summary": "The renewal price increased and the call-to-action label changed.",
  "changes": [
    {
      "change_type": "price",
      "severity": "high",
      "title": "Annual renewal price increased",
      "before_text": "$99 per year",
      "after_text": "$129 per year",
      "explanation": "The visible annual price increased by $30.",
      "regions": {
        "before": {"x": 0.61, "y": 0.24, "width": 0.18, "height": 0.06},
        "after": {"x": 0.61, "y": 0.24, "width": 0.18, "height": 0.06}
      }
    }
  ],
  "limitations": [],
  "comparison_image": {
    "filename": "diffshot-comparison.png",
    "mime_type": "image/png",
    "storage_key": "diffshot-comparison.png",
    "sha256": "1111111111111111111111111111111111111111111111111111111111111111",
    "width": 2400,
    "height": 900
  },
  "before_sha256": "2222222222222222222222222222222222222222222222222222222222222222",
  "after_sha256": "3333333333333333333333333333333333333333333333333333333333333333",
  "pixel_change_ratio": 0.0342,
  "ci_gate": {
    "status": "not_evaluated",
    "passed": null,
    "policy": null,
    "checks": [],
    "decision_summary": "No CI gate policy was supplied. The comparison was not used to pass or fail a build.",
    "evidence_notice": "The pixel-change ratio is deterministic; review model-produced findings against the numbered evidence."
  },
  "review_notice": "Verify each claimed change against its numbered before/after region."
}
```

### Optional CI gate

Add `ci_gate_policy` when the comparison should pass or fail a build. Supported
criteria are:

- Maximum pixel-change ratio
- Maximum meaningful-change count
- Blocked severities
- Blocked change types
- Any reported limitation

At least one criterion is required. A value exactly equal to a maximum passes.
The result always includes `ci_gate`: `not_evaluated` when no policy was
supplied, otherwise `passed` or `failed` with one check per criterion and the
numbered changes that caused a failure.

The gate evaluation itself is deterministic. The pixel ratio is computed by
image code. Meaningful-change count, severity, type, and limitations depend on
model-produced findings. Review the numbered regions and comparison PNG before
accepting a baseline.

A failed CI gate is still a completed comparison and successful result event;
it does not turn the Actor run into a provider failure or remove the creator
charge.

### Supported input

Exactly two PNG, JPEG, or WebP images per run; each at most 12 MB, 8,192 pixels
per side, and 20 megapixels. Images selected with the Apify Console file
uploader are read inside this limited Actor with its scoped storage access.
Direct inline data URLs should stay at or below 6 MB of raw image bytes each
because Apify run-input requests have a smaller limit than uploaded or remote
files. Image order is always before, then after.
Identical normalized images skip model analysis and return an exact no-change result.

### Automation boundary

API and CI callers should keep approved baseline images under their own review
and start one Actor run for each before-and-after pair. This Actor does not
replace baselines or combine several pairs under one result event. Each pair
therefore keeps the same input limits, result contract, and creator charge as a
console run.

For API starts, check the live Actor pricing first and send an explicit Apify
`maxTotalChargeUsd` ceiling for each run. Do not rely on a client default.

This Actor accepts images, not page URLs. Reliable URL capture requires a
separate hardened browser Actor with private-network blocking, redirect
revalidation, navigation limits, and browser isolation. That Actor is not part
of this release.

### Self-service run and recovery

No separate Dravara account, API key, integration, or support handoff is
required. Upload the before image first and the after image second, start one
run, read the default-dataset item, and open `diffshot-comparison.png` from the
run's key-value store. Review reported limitations before acting on the
comparison.

If input validation fails, correct the files or named field and start a new
run. If the analysis service is temporarily unavailable, wait a few minutes
and start one new run; a failed run does not continue in the background. If a
charge, dataset, or artifact state ever looks unclear, do not loop automatic
retries: inspect that run's **Charges**, default dataset, and key-value store
first. The **Self-service failure details** output opens the sanitized
key-value-store `OUTPUT` record with the stable error code, retry guidance,
and next action.

### Billing

Dravara's creator charge for a successful run is $0.40005: the $0.00005
`apify-actor-start` event plus $0.40 for `image-pair-compared`. Apify
separately passes its variable platform usage to the customer and determines
the final displayed total; Dravara does not reduce its creator charge to absorb
that usage. The result event is captured only after the comparison artifact and
dataset item exist. Validation or provider failures skip the result charge,
but the Actor-start charge and Apify platform usage can still apply. The
synthetic sample input is billed like any other run.

### Privacy

Both images and optional context are processed by Dravara, LLC's private
service and the OpenAI API using `store: false`; applicable provider
abuse-monitoring retention may still apply. Apify retains normal run storage
under the runner's settings. Remove credentials and unrelated personal or
regulated information before upload.

Optional defect contact:
<support@dravarahq.com>. Send only the Apify run
ID and safe error text, never the input. Support does not complete or deliver
failed runs.

# Actor input Schema

## `before_image` (type: `string`):

Apify Console file upload or public HTTPS URL up to 12 MB; inline data URL up to 6 MB raw. Maximum 20 megapixels.

## `after_image` (type: `string`):

Apify Console file upload or public HTTPS URL up to 12 MB; inline data URL up to 6 MB raw. Maximum 20 megapixels.

## `context` (type: `string`):

Explain what changed or what reviewers should pay particular attention to.

## `include_formatting` (type: `boolean`):

Include changes that appear to affect only layout, spacing, typography, color, or other formatting.

## `ci_gate_policy` (type: `object`):

Apply one or more deterministic pass/fail rules to this finished comparison. The policy does not change what the model reports.

## Actor input object example

```json
{
  "before_image": "data:image/webp;base64,UklGRnQEAABXRUJQVlA4TGgEAAAvf8JZAAfmsG0bSXLfW/lzMbHIXA8O27aRJGP77/feiAjatk24nj+Dr55/AkmbBHePcb9+IAEYBCAgAEAyAOZmBQbpDQBEwAACASzp9z/zPwaIVVk+31qBtEOgDQmggIC0aewABI2502YTpmkEQNpAxIDf75sbQwA0NMRoaH7/06bN4TUgIHOHBGBZKDSCr+0/27KszZ1Gc7S2aWgaYEBvNp4YZ24DMkibM3yPuJ4H1K5tOx5XZ/O2Gc/Utm3btm17bBtvktq222eQpN36b+/zjD7t9WzcEf2HxEaSIsnLHMt8t/T60/oNxH/iP/Gf+E/8J/4T/4n/xH9/I2D9BuI/8Z/4T1T1l30Z/CedRbmSIv4T/4n/rJuw23BjImE3cH8Gm+/dvrexlRiUbuvPPhBpAJSVomD8XW11jxfc6E73G3PNGFPxmc2gQjMtFr55unyvnQJMrTFjDPG1owpAzQ5YLHNqPQvy3scCse/NGMPyfdzzowjMslTCbqBkMGH35ve+mrh3Zowh9eGdj/NQzAxarBmg4MDBmqnAtCozRufcggUXUNAw23KZUDj/Rgrdb8xpy/RLEP/UMz1kucS/8G25f/veJloRvnHjxumzq4DAGAXURezf7d7iP/Gf+E/8J/4T//2vtYOWT/LRX0dioHtqIwypckv7aK76OnIkUZZJ2Y7GQxcgtEtBzRzmXPLEXKLdlH3yLVHFb4e+KPjq4DzzLFwNqGsvt2W+2kPf8mB5X9SJwKPlHPu92it4vNwiyctt6QngqVvOSuU5nwJEJw/8Y9KgD2RtYEMm4T0MfaPVRfYw8o1F4t/126eVhiFFDXu/aIsAhB2iPhTvY4h5T7Q7NHr0Aqu0MjXuteGwnxE3gLF7AZQx64OmySzRCywS16+6PzcULuPEDuDAqNZlrWNdFkrX5ENZJisCv0JzDcNv3L7oA67Quv4VwYp+prJS26Sdh+HF9u9+P/Gf+E/8J/4T/4n//oeb6lCGasO8V657vD0mbWzrVVRYLBu20SkDZWEYLymhZ6Fb3RsFSqvpUxJKVfTIrA1OYteD+/PhwFIz9UwoOAR1fbf+ihSMOj382O/VXqVdYbykhLS1bL7UCjLWsSzKlckMfMiXpNHpcP7yjZJhnsga1hcRWWC8IgWl15nhWqVlEe0Ojbzz46SYmngbQ9cW3rqu+9xJLZoHnNvBinpP2E/MJ5p9xitSUEadGe5VWhZNgOJjTCsZdI/yOQZ/mI+x+KbD9MLrMNjB+eppdoh5jYIPOr3ODNcqbcvcmuLVbD3peTuOHRGKVrMmQv5aFlWkBLolfIbspUzVxqJLWJ+KwnxFCnqdEd7Uw6u0Moa5gZLu3D3E8icNpxVDgsFTigEVgbqh7L/3YCeMuOFWanOr1GBJLxTGK1Iw6ozwslKv0nLd7q1ofeD8aNft3lZNTpb9u99P/Cf+E/+J/8R/4j/xn/hP/Cf+E/+J/8R/4r//vLN/v7uf/wizfgPxn/hP/Cf+E/+JygA=",
  "after_image": "data:image/webp;base64,UklGRnoEAABXRUJQVlA4TG4EAAAvf8JZAPflsG0bSXLD1z/2iYm9TBEM2jaSVP4Il8neM1MjaNs24c/1DL56/gkkbXgB9xjX/YEEIBCAgAAASQCYnRUIJGgBgAgIsxPAit45M0cABYC0E0g+31qB1AQEZieAAgLSzidZAAQts6edbZgOgQBIOwDw/t+7Z7WgU7TMnHbe+Q6uAAF55wQgOVNbAgFaVtCOZFGbOh3Y1F3LzAEBugMEAiKcsS2Q8I88/PvD7zygv23b8Ua6JuwwY9u2bdu2WdtuNLbtmbdIsv7j8r1vmv62x7t4IvrvCJIkRcl94YU7HPL60/oN8Z/4T/wn/hP/if/Ef+I/8d/fCFi/If4T/4n/RFV/2Zfxn3QW5UqK+E/8J/6zbmLBpugkYsHQg1lsu3/7/pYUMSjdjl/6QbwJUFaKggl3tdU9WRTtSc/ofDPGVH5+G6jIbIuF745OPxqmAtPqzRhDl4bRxUlzQxbLvAbHosIPGUDGBzPGsPIQ930oQnMslVgwVDGMWPDmj/6azu/NGEPmozufFiTNDlusGaDgyNH6acD0WjNG574Fiy6hoGmu5TKxZGE0QM/ovPbMvAJdnjtmRiyXLi9d2x/cvr+VFGLRaPTshTVAaKwCGuP273Zv8Z/4T/wn/hP/if/+19pRy6fHiV+P+2F75NFCx5K45pqrI0cSZZlU7W4+dok+IdeY50D3Wy0O/xXSpuyT791Ul12MWUPXr8DltcqxeC2grr/amft6P/2rw9X9UadCj1dy8vc6p+DJSouksKCtNwBbrsGMUjQXA0BiypA/Jg/9SN5mNucS28+It6Agvp9Rby0S397fPq8GRj7tg//OQN01gJibhAvFBz/+DyR6QrNDL7BKK1Pj30C3e1Ngw7Ng8PdsGHcQQBmzPmpazBK9wCIJ+lTPF3QqXp/iig0cGZ1a3kY25qF0LS6UZbIq9GtkPttag8HKFK6S2sCacM0AU1WlbZLmYXiZ/bvfT/wn/hP/if/Ef+K//+GmOpSh2tMzsxkCZdGyQDomb2lvWirslMheBecOcPAMHR/KqjAmKaF3SbCuLwqUVtOvIpKp6JXbEJ7M3ocPFgL9SXo6kEFPtODzkfBw1I19+nQpGI16/snf65xWW8KYpISs9Wy7kgI5G1mR4OoUhjzia/cx2WbkNxeur474OjaVEl9kTJeC0hvNfK3Vmkj0hGbe+3AHTC288+Np410wGHzhzixdQBpiPvyfaXUZ06WgjEYz32m1JloAxSd/igx6JvjixxfjUwaumTCz5IajnRmtbvxvUPBRpzea+VqrPZlbU76WHacd78azO07pWtbFKVrP0ppAyNv1i8ZYyllHYjmbMpPM6VLQG438ll5Oq2UxMhiq6MndY6x81nRWMTwcPqMYXBNqHMHh+w/36FKukcoMV/RJMqZLwWg08qsqnVbLdbu3IvVw/0zrdm+rJj/P/t3vJ/4T/4n/xH/iP/Gf+E/8J/4T/4n/xH/iP/Hff9jZv//dz3+EWb8h/hP/if/Ef+I/URk=",
  "context": "Compare customer-visible plan changes.",
  "include_formatting": false
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `files` (type: `string`):

No description

## `failure` (type: `string`):

On a failed run, open the sanitized machine-readable error, retry guidance, and next action.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "before_image": "data:image/webp;base64,UklGRnQEAABXRUJQVlA4TGgEAAAvf8JZAAfmsG0bSXLfW/lzMbHIXA8O27aRJGP77/feiAjatk24nj+Dr55/AkmbBHePcb9+IAEYBCAgAEAyAOZmBQbpDQBEwAACASzp9z/zPwaIVVk+31qBtEOgDQmggIC0aewABI2502YTpmkEQNpAxIDf75sbQwA0NMRoaH7/06bN4TUgIHOHBGBZKDSCr+0/27KszZ1Gc7S2aWgaYEBvNp4YZ24DMkibM3yPuJ4H1K5tOx5XZ/O2Gc/Utm3btm17bBtvktq222eQpN36b+/zjD7t9WzcEf2HxEaSIsnLHMt8t/T60/oNxH/iP/Gf+E/8J/4T/4n/xH9/I2D9BuI/8Z/4T1T1l30Z/CedRbmSIv4T/4n/rJuw23BjImE3cH8Gm+/dvrexlRiUbuvPPhBpAJSVomD8XW11jxfc6E73G3PNGFPxmc2gQjMtFr55unyvnQJMrTFjDPG1owpAzQ5YLHNqPQvy3scCse/NGMPyfdzzowjMslTCbqBkMGH35ve+mrh3Zowh9eGdj/NQzAxarBmg4MDBmqnAtCozRufcggUXUNAw23KZUDj/Rgrdb8xpy/RLEP/UMz1kucS/8G25f/veJloRvnHjxumzq4DAGAXURezf7d7iP/Gf+E/8J/4T//2vtYOWT/LRX0dioHtqIwypckv7aK76OnIkUZZJ2Y7GQxcgtEtBzRzmXPLEXKLdlH3yLVHFb4e+KPjq4DzzLFwNqGsvt2W+2kPf8mB5X9SJwKPlHPu92it4vNwiyctt6QngqVvOSuU5nwJEJw/8Y9KgD2RtYEMm4T0MfaPVRfYw8o1F4t/126eVhiFFDXu/aIsAhB2iPhTvY4h5T7Q7NHr0Aqu0MjXuteGwnxE3gLF7AZQx64OmySzRCywS16+6PzcULuPEDuDAqNZlrWNdFkrX5ENZJisCv0JzDcNv3L7oA67Quv4VwYp+prJS26Sdh+HF9u9+P/Gf+E/8J/4T/4n//oeb6lCGasO8V657vD0mbWzrVVRYLBu20SkDZWEYLymhZ6Fb3RsFSqvpUxJKVfTIrA1OYteD+/PhwFIz9UwoOAR1fbf+ihSMOj382O/VXqVdYbykhLS1bL7UCjLWsSzKlckMfMiXpNHpcP7yjZJhnsga1hcRWWC8IgWl15nhWqVlEe0Ojbzz46SYmngbQ9cW3rqu+9xJLZoHnNvBinpP2E/MJ5p9xitSUEadGe5VWhZNgOJjTCsZdI/yOQZ/mI+x+KbD9MLrMNjB+eppdoh5jYIPOr3ODNcqbcvcmuLVbD3peTuOHRGKVrMmQv5aFlWkBLolfIbspUzVxqJLWJ+KwnxFCnqdEd7Uw6u0Moa5gZLu3D3E8icNpxVDgsFTigEVgbqh7L/3YCeMuOFWanOr1GBJLxTGK1Iw6ozwslKv0nLd7q1ofeD8aNft3lZNTpb9u99P/Cf+E/+J/8R/4j/xn/hP/Cf+E/+J/8R/4r//vLN/v7uf/wizfgPxn/hP/Cf+E/+JygA=",
    "after_image": "data:image/webp;base64,UklGRnoEAABXRUJQVlA4TG4EAAAvf8JZAPflsG0bSXLD1z/2iYm9TBEM2jaSVP4Il8neM1MjaNs24c/1DL56/gkkbXgB9xjX/YEEIBCAgAAASQCYnRUIJGgBgAgIsxPAit45M0cABYC0E0g+31qB1AQEZieAAgLSzidZAAQts6edbZgOgQBIOwDw/t+7Z7WgU7TMnHbe+Q6uAAF55wQgOVNbAgFaVtCOZFGbOh3Y1F3LzAEBugMEAiKcsS2Q8I88/PvD7zygv23b8Ua6JuwwY9u2bdu2WdtuNLbtmbdIsv7j8r1vmv62x7t4IvrvCJIkRcl94YU7HPL60/oN8Z/4T/wn/hP/if/Ef+I/8d/fCFi/If4T/4n/RFV/2Zfxn3QW5UqK+E/8J/6zbmLBpugkYsHQg1lsu3/7/pYUMSjdjl/6QbwJUFaKggl3tdU9WRTtSc/ofDPGVH5+G6jIbIuF745OPxqmAtPqzRhDl4bRxUlzQxbLvAbHosIPGUDGBzPGsPIQ930oQnMslVgwVDGMWPDmj/6azu/NGEPmozufFiTNDlusGaDgyNH6acD0WjNG574Fiy6hoGmu5TKxZGE0QM/ovPbMvAJdnjtmRiyXLi9d2x/cvr+VFGLRaPTshTVAaKwCGuP273Zv8Z/4T/wn/hP/if/+19pRy6fHiV+P+2F75NFCx5K45pqrI0cSZZlU7W4+dok+IdeY50D3Wy0O/xXSpuyT791Ul12MWUPXr8DltcqxeC2grr/amft6P/2rw9X9UadCj1dy8vc6p+DJSouksKCtNwBbrsGMUjQXA0BiypA/Jg/9SN5mNucS28+It6Agvp9Rby0S397fPq8GRj7tg//OQN01gJibhAvFBz/+DyR6QrNDL7BKK1Pj30C3e1Ngw7Ng8PdsGHcQQBmzPmpazBK9wCIJ+lTPF3QqXp/iig0cGZ1a3kY25qF0LS6UZbIq9GtkPttag8HKFK6S2sCacM0AU1WlbZLmYXiZ/bvfT/wn/hP/if/Ef+K//+GmOpSh2tMzsxkCZdGyQDomb2lvWirslMheBecOcPAMHR/KqjAmKaF3SbCuLwqUVtOvIpKp6JXbEJ7M3ocPFgL9SXo6kEFPtODzkfBw1I19+nQpGI16/snf65xWW8KYpISs9Wy7kgI5G1mR4OoUhjzia/cx2WbkNxeur474OjaVEl9kTJeC0hvNfK3Vmkj0hGbe+3AHTC288+Np410wGHzhzixdQBpiPvyfaXUZ06WgjEYz32m1JloAxSd/igx6JvjixxfjUwaumTCz5IajnRmtbvxvUPBRpzea+VqrPZlbU76WHacd78azO07pWtbFKVrP0ppAyNv1i8ZYyllHYjmbMpPM6VLQG438ll5Oq2UxMhiq6MndY6x81nRWMTwcPqMYXBNqHMHh+w/36FKukcoMV/RJMqZLwWg08qsqnVbLdbu3IvVw/0zrdm+rJj/P/t3vJ/4T/4n/xH/iP/Gf+E/8J/4T/4n/xH/iP/Hff9jZv//dz3+EWb8h/hP/if/Ef+I/URk=",
    "context": "Compare customer-visible plan changes."
};

// Run the Actor and wait for it to finish
const run = await client.actor("dravara/diffshot").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "before_image": "data:image/webp;base64,UklGRnQEAABXRUJQVlA4TGgEAAAvf8JZAAfmsG0bSXLfW/lzMbHIXA8O27aRJGP77/feiAjatk24nj+Dr55/AkmbBHePcb9+IAEYBCAgAEAyAOZmBQbpDQBEwAACASzp9z/zPwaIVVk+31qBtEOgDQmggIC0aewABI2502YTpmkEQNpAxIDf75sbQwA0NMRoaH7/06bN4TUgIHOHBGBZKDSCr+0/27KszZ1Gc7S2aWgaYEBvNp4YZ24DMkibM3yPuJ4H1K5tOx5XZ/O2Gc/Utm3btm17bBtvktq222eQpN36b+/zjD7t9WzcEf2HxEaSIsnLHMt8t/T60/oNxH/iP/Gf+E/8J/4T/4n/xH9/I2D9BuI/8Z/4T1T1l30Z/CedRbmSIv4T/4n/rJuw23BjImE3cH8Gm+/dvrexlRiUbuvPPhBpAJSVomD8XW11jxfc6E73G3PNGFPxmc2gQjMtFr55unyvnQJMrTFjDPG1owpAzQ5YLHNqPQvy3scCse/NGMPyfdzzowjMslTCbqBkMGH35ve+mrh3Zowh9eGdj/NQzAxarBmg4MDBmqnAtCozRufcggUXUNAw23KZUDj/Rgrdb8xpy/RLEP/UMz1kucS/8G25f/veJloRvnHjxumzq4DAGAXURezf7d7iP/Gf+E/8J/4T//2vtYOWT/LRX0dioHtqIwypckv7aK76OnIkUZZJ2Y7GQxcgtEtBzRzmXPLEXKLdlH3yLVHFb4e+KPjq4DzzLFwNqGsvt2W+2kPf8mB5X9SJwKPlHPu92it4vNwiyctt6QngqVvOSuU5nwJEJw/8Y9KgD2RtYEMm4T0MfaPVRfYw8o1F4t/126eVhiFFDXu/aIsAhB2iPhTvY4h5T7Q7NHr0Aqu0MjXuteGwnxE3gLF7AZQx64OmySzRCywS16+6PzcULuPEDuDAqNZlrWNdFkrX5ENZJisCv0JzDcNv3L7oA67Quv4VwYp+prJS26Sdh+HF9u9+P/Gf+E/8J/4T/4n//oeb6lCGasO8V657vD0mbWzrVVRYLBu20SkDZWEYLymhZ6Fb3RsFSqvpUxJKVfTIrA1OYteD+/PhwFIz9UwoOAR1fbf+ihSMOj382O/VXqVdYbykhLS1bL7UCjLWsSzKlckMfMiXpNHpcP7yjZJhnsga1hcRWWC8IgWl15nhWqVlEe0Ojbzz46SYmngbQ9cW3rqu+9xJLZoHnNvBinpP2E/MJ5p9xitSUEadGe5VWhZNgOJjTCsZdI/yOQZ/mI+x+KbD9MLrMNjB+eppdoh5jYIPOr3ODNcqbcvcmuLVbD3peTuOHRGKVrMmQv5aFlWkBLolfIbspUzVxqJLWJ+KwnxFCnqdEd7Uw6u0Moa5gZLu3D3E8icNpxVDgsFTigEVgbqh7L/3YCeMuOFWanOr1GBJLxTGK1Iw6ozwslKv0nLd7q1ofeD8aNft3lZNTpb9u99P/Cf+E/+J/8R/4j/xn/hP/Cf+E/+J/8R/4r//vLN/v7uf/wizfgPxn/hP/Cf+E/+JygA=",
    "after_image": "data:image/webp;base64,UklGRnoEAABXRUJQVlA4TG4EAAAvf8JZAPflsG0bSXLD1z/2iYm9TBEM2jaSVP4Il8neM1MjaNs24c/1DL56/gkkbXgB9xjX/YEEIBCAgAAASQCYnRUIJGgBgAgIsxPAit45M0cABYC0E0g+31qB1AQEZieAAgLSzidZAAQts6edbZgOgQBIOwDw/t+7Z7WgU7TMnHbe+Q6uAAF55wQgOVNbAgFaVtCOZFGbOh3Y1F3LzAEBugMEAiKcsS2Q8I88/PvD7zygv23b8Ua6JuwwY9u2bdu2WdtuNLbtmbdIsv7j8r1vmv62x7t4IvrvCJIkRcl94YU7HPL60/oN8Z/4T/wn/hP/if/Ef+I/8d/fCFi/If4T/4n/RFV/2Zfxn3QW5UqK+E/8J/6zbmLBpugkYsHQg1lsu3/7/pYUMSjdjl/6QbwJUFaKggl3tdU9WRTtSc/ofDPGVH5+G6jIbIuF745OPxqmAtPqzRhDl4bRxUlzQxbLvAbHosIPGUDGBzPGsPIQ930oQnMslVgwVDGMWPDmj/6azu/NGEPmozufFiTNDlusGaDgyNH6acD0WjNG574Fiy6hoGmu5TKxZGE0QM/ovPbMvAJdnjtmRiyXLi9d2x/cvr+VFGLRaPTshTVAaKwCGuP273Zv8Z/4T/wn/hP/if/+19pRy6fHiV+P+2F75NFCx5K45pqrI0cSZZlU7W4+dok+IdeY50D3Wy0O/xXSpuyT791Ul12MWUPXr8DltcqxeC2grr/amft6P/2rw9X9UadCj1dy8vc6p+DJSouksKCtNwBbrsGMUjQXA0BiypA/Jg/9SN5mNucS28+It6Agvp9Rby0S397fPq8GRj7tg//OQN01gJibhAvFBz/+DyR6QrNDL7BKK1Pj30C3e1Ngw7Ng8PdsGHcQQBmzPmpazBK9wCIJ+lTPF3QqXp/iig0cGZ1a3kY25qF0LS6UZbIq9GtkPttag8HKFK6S2sCacM0AU1WlbZLmYXiZ/bvfT/wn/hP/if/Ef+K//+GmOpSh2tMzsxkCZdGyQDomb2lvWirslMheBecOcPAMHR/KqjAmKaF3SbCuLwqUVtOvIpKp6JXbEJ7M3ocPFgL9SXo6kEFPtODzkfBw1I19+nQpGI16/snf65xWW8KYpISs9Wy7kgI5G1mR4OoUhjzia/cx2WbkNxeur474OjaVEl9kTJeC0hvNfK3Vmkj0hGbe+3AHTC288+Np410wGHzhzixdQBpiPvyfaXUZ06WgjEYz32m1JloAxSd/igx6JvjixxfjUwaumTCz5IajnRmtbvxvUPBRpzea+VqrPZlbU76WHacd78azO07pWtbFKVrP0ppAyNv1i8ZYyllHYjmbMpPM6VLQG438ll5Oq2UxMhiq6MndY6x81nRWMTwcPqMYXBNqHMHh+w/36FKukcoMV/RJMqZLwWg08qsqnVbLdbu3IvVw/0zrdm+rJj/P/t3vJ/4T/4n/xH/iP/Gf+E/8J/4T/4n/xH/iP/Hff9jZv//dz3+EWb8h/hP/if/Ef+I/URk=",
    "context": "Compare customer-visible plan changes.",
}

# Run the Actor and wait for it to finish
run = client.actor("dravara/diffshot").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "before_image": "data:image/webp;base64,UklGRnQEAABXRUJQVlA4TGgEAAAvf8JZAAfmsG0bSXLfW/lzMbHIXA8O27aRJGP77/feiAjatk24nj+Dr55/AkmbBHePcb9+IAEYBCAgAEAyAOZmBQbpDQBEwAACASzp9z/zPwaIVVk+31qBtEOgDQmggIC0aewABI2502YTpmkEQNpAxIDf75sbQwA0NMRoaH7/06bN4TUgIHOHBGBZKDSCr+0/27KszZ1Gc7S2aWgaYEBvNp4YZ24DMkibM3yPuJ4H1K5tOx5XZ/O2Gc/Utm3btm17bBtvktq222eQpN36b+/zjD7t9WzcEf2HxEaSIsnLHMt8t/T60/oNxH/iP/Gf+E/8J/4T/4n/xH9/I2D9BuI/8Z/4T1T1l30Z/CedRbmSIv4T/4n/rJuw23BjImE3cH8Gm+/dvrexlRiUbuvPPhBpAJSVomD8XW11jxfc6E73G3PNGFPxmc2gQjMtFr55unyvnQJMrTFjDPG1owpAzQ5YLHNqPQvy3scCse/NGMPyfdzzowjMslTCbqBkMGH35ve+mrh3Zowh9eGdj/NQzAxarBmg4MDBmqnAtCozRufcggUXUNAw23KZUDj/Rgrdb8xpy/RLEP/UMz1kucS/8G25f/veJloRvnHjxumzq4DAGAXURezf7d7iP/Gf+E/8J/4T//2vtYOWT/LRX0dioHtqIwypckv7aK76OnIkUZZJ2Y7GQxcgtEtBzRzmXPLEXKLdlH3yLVHFb4e+KPjq4DzzLFwNqGsvt2W+2kPf8mB5X9SJwKPlHPu92it4vNwiyctt6QngqVvOSuU5nwJEJw/8Y9KgD2RtYEMm4T0MfaPVRfYw8o1F4t/126eVhiFFDXu/aIsAhB2iPhTvY4h5T7Q7NHr0Aqu0MjXuteGwnxE3gLF7AZQx64OmySzRCywS16+6PzcULuPEDuDAqNZlrWNdFkrX5ENZJisCv0JzDcNv3L7oA67Quv4VwYp+prJS26Sdh+HF9u9+P/Gf+E/8J/4T/4n//oeb6lCGasO8V657vD0mbWzrVVRYLBu20SkDZWEYLymhZ6Fb3RsFSqvpUxJKVfTIrA1OYteD+/PhwFIz9UwoOAR1fbf+ihSMOj382O/VXqVdYbykhLS1bL7UCjLWsSzKlckMfMiXpNHpcP7yjZJhnsga1hcRWWC8IgWl15nhWqVlEe0Ojbzz46SYmngbQ9cW3rqu+9xJLZoHnNvBinpP2E/MJ5p9xitSUEadGe5VWhZNgOJjTCsZdI/yOQZ/mI+x+KbD9MLrMNjB+eppdoh5jYIPOr3ODNcqbcvcmuLVbD3peTuOHRGKVrMmQv5aFlWkBLolfIbspUzVxqJLWJ+KwnxFCnqdEd7Uw6u0Moa5gZLu3D3E8icNpxVDgsFTigEVgbqh7L/3YCeMuOFWanOr1GBJLxTGK1Iw6ozwslKv0nLd7q1ofeD8aNft3lZNTpb9u99P/Cf+E/+J/8R/4j/xn/hP/Cf+E/+J/8R/4r//vLN/v7uf/wizfgPxn/hP/Cf+E/+JygA=",
  "after_image": "data:image/webp;base64,UklGRnoEAABXRUJQVlA4TG4EAAAvf8JZAPflsG0bSXLD1z/2iYm9TBEM2jaSVP4Il8neM1MjaNs24c/1DL56/gkkbXgB9xjX/YEEIBCAgAAASQCYnRUIJGgBgAgIsxPAit45M0cABYC0E0g+31qB1AQEZieAAgLSzidZAAQts6edbZgOgQBIOwDw/t+7Z7WgU7TMnHbe+Q6uAAF55wQgOVNbAgFaVtCOZFGbOh3Y1F3LzAEBugMEAiKcsS2Q8I88/PvD7zygv23b8Ua6JuwwY9u2bdu2WdtuNLbtmbdIsv7j8r1vmv62x7t4IvrvCJIkRcl94YU7HPL60/oN8Z/4T/wn/hP/if/Ef+I/8d/fCFi/If4T/4n/RFV/2Zfxn3QW5UqK+E/8J/6zbmLBpugkYsHQg1lsu3/7/pYUMSjdjl/6QbwJUFaKggl3tdU9WRTtSc/ofDPGVH5+G6jIbIuF745OPxqmAtPqzRhDl4bRxUlzQxbLvAbHosIPGUDGBzPGsPIQ930oQnMslVgwVDGMWPDmj/6azu/NGEPmozufFiTNDlusGaDgyNH6acD0WjNG574Fiy6hoGmu5TKxZGE0QM/ovPbMvAJdnjtmRiyXLi9d2x/cvr+VFGLRaPTshTVAaKwCGuP273Zv8Z/4T/wn/hP/if/+19pRy6fHiV+P+2F75NFCx5K45pqrI0cSZZlU7W4+dok+IdeY50D3Wy0O/xXSpuyT791Ul12MWUPXr8DltcqxeC2grr/amft6P/2rw9X9UadCj1dy8vc6p+DJSouksKCtNwBbrsGMUjQXA0BiypA/Jg/9SN5mNucS28+It6Agvp9Rby0S397fPq8GRj7tg//OQN01gJibhAvFBz/+DyR6QrNDL7BKK1Pj30C3e1Ngw7Ng8PdsGHcQQBmzPmpazBK9wCIJ+lTPF3QqXp/iig0cGZ1a3kY25qF0LS6UZbIq9GtkPttag8HKFK6S2sCacM0AU1WlbZLmYXiZ/bvfT/wn/hP/if/Ef+K//+GmOpSh2tMzsxkCZdGyQDomb2lvWirslMheBecOcPAMHR/KqjAmKaF3SbCuLwqUVtOvIpKp6JXbEJ7M3ocPFgL9SXo6kEFPtODzkfBw1I19+nQpGI16/snf65xWW8KYpISs9Wy7kgI5G1mR4OoUhjzia/cx2WbkNxeur474OjaVEl9kTJeC0hvNfK3Vmkj0hGbe+3AHTC288+Np410wGHzhzixdQBpiPvyfaXUZ06WgjEYz32m1JloAxSd/igx6JvjixxfjUwaumTCz5IajnRmtbvxvUPBRpzea+VqrPZlbU76WHacd78azO07pWtbFKVrP0ppAyNv1i8ZYyllHYjmbMpPM6VLQG438ll5Oq2UxMhiq6MndY6x81nRWMTwcPqMYXBNqHMHh+w/36FKukcoMV/RJMqZLwWg08qsqnVbLdbu3IvVw/0zrdm+rJj/P/t3vJ/4T/4n/xH/iP/Gf+E/8J/4T/4n/xH/iP/Hff9jZv//dz3+EWb8h/hP/if/Ef+I/URk=",
  "context": "Compare customer-visible plan changes."
}' |
apify call dravara/diffshot --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dravara/diffshot"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/RaxntnhGehDqnQBqx/builds/JYQMpYBacxU0LYpqD/openapi.json
