Compare Two Webpages for Meaningful Changes avatar

Compare Two Webpages for Meaningful Changes

Pricing

from $0.04 / webpages compared

Go to Apify Store
Compare Two Webpages for Meaningful Changes

Compare Two Webpages for Meaningful Changes

Compare two public static HTTPS pages or HTML docs for price, date, and availability changes. Read the default dataset. Set maxTotalChargeUsd above $0.04.

Pricing

from $0.04 / webpages compared

Rating

0.0

(0)

Developer

Dravara LLC

Dravara LLC

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 days ago

Last modified

Share

Separate meaningful page changes from static HTML noise.

Compare two public pages, two inline HTML documents, or one of each. Fixed rules identify changed prices, dates, availability wording, calls to action, links, and visible values. Optional formatting-only reporting is used only when normalized visible text is unchanged but the raw HTML differs.

This Actor is self-service. Normal runs return one structured dataset item; handled failures return one safe failure item without requiring a Dravara account, operator, or support fulfillment.

Pricing and charge controls

The live Apify Store pricing section is authoritative. This Pay per event + usage product can charge the customer for (1) one Dravara apify-actor-start event per Actor run, (2) one Dravara product result event only after a chargeable success, and (3) customer-paid Apify platform usage. The underlying Apify platform usage remains separate. Dravara does not reduce its event charge to absorb the underlying Apify platform usage. Before running, set Apify's maxTotalChargeUsd option to a limit you accept.

The custom result event is charged only for a success result. Approved partial and failed paths do not create that custom event. Each Actor run can still record the separate one-time apify-actor-start creator event, and the underlying Apify platform usage can still apply. The apify-default-dataset-item event is configured at $0 for this release.

Input

For each side, provide exactly one source:

  • before_url or before_html
  • after_url or after_html

The flat input is converted into the service's before/after contract. Mixing a URL on one side with inline HTML on the other is supported. Supplying both sources for one side, neither source for one side, or nested and flat source fields together is rejected.

{
"before_url": "https://example.com/old",
"after_url": "https://example.com/new",
"include_formatting": false,
"include_evidence": true,
"idempotency_key": "550e8400-e29b-41d4-a716-446655440000"
}

include_evidence remains accepted for compatibility, but evidence can no longer be disabled: both true and false return it.

Each URL is limited to 4,096 characters. Each inline HTML document is limited to 1,000,000 characters.

idempotency_key is optional. It accepts 1-128 ASCII letters, digits, periods, underscores, tildes, or hyphens. Dravara HMAC-scopes it to the authenticated Apify customer and this product. While the replay record remains retained, reusing the same key with the same canonical input can return the exact durable result in a later Actor run; reusing it with changed input is rejected. Other customers and products have separate namespaces. A confirmed terminal replay does not create another Dravara result event or result artifact, but the new Actor run can still incur its separate Actor-start event and Apify platform usage. Dravara does not store or return the raw key. Use a unique opaque job ID, such as a UUID—not a secret or personal identifier.

Use cases

  • Compare pricing-page versions for displayed price, plan, or call-to-action changes.
  • Check product pages for availability, date, link, or visible-value differences.
  • Compare saved release-pipeline HTML while separating optional formatting-only edits.

Output and evidence

The default dataset receives one status-bearing item. Each change contains a category, concise summary, bounded before and after text, deterministic materiality, and mandatory non-empty source evidence. URL comparisons include distinct before_retrieval and after_retrieval records plus final source URLs; inline HTML sides have no fabricated retrieval metadata. An empty changes array is a valid successful no-change result.

An Apify run can complete while this item has status: failed. Integrations must inspect the dataset item's status and errors, not the Actor run status alone.

Failures and retries

Read the dataset item's status, errors, and each error's retryable value. The same idempotency key and canonical input replay the same terminal failure; changed input with that key is rejected. Inspect the original dataset and Charged events before starting another run. Correct nonretryable input first. For a retryable fetch or capacity failure, wait for recovery and use a new unique key only when billing is clear. That new run can incur its Actor-start event, Apify platform usage, and a result event after a chargeable success.

If the Actor itself fails after a dataset item appears, do not start another run yet. Compare that run's default dataset with its Charged events first.

Evidence excerpts are whitespace-normalized, bounded to 4,000 characters, and include selectors and source URLs when available. They are not byte-for-byte HTML quotes. A formatting-only change has no changed visible excerpt, so its evidence contains the distinct before and after document SHA-256 digests instead. The comparison reports what changed; it does not verify that either publisher's statement is factually correct.

Complete output example

This example compares the inline HTML prefilled in the input form. URL comparisons additionally populate source URLs and retrieval records. Actual identifiers and timing vary.

{
"run_id": "778a1865-478c-4734-9174-6e4af36e8fc5",
"status": "success",
"next_action": null,
"warnings": [
"This result does not include the final Apify platform-usage amount. Check this run's Usage and Charged events for final billing.",
"Evidence excerpts normalize whitespace and are bounded to 4,000 characters; use the returned source URL for verbatim review."
],
"errors": [],
"usage": {
"duration_ms": 9,
"bytes_processed": 142,
"extraction_attempts": 2
},
"cost": {
"currency": "USD",
"total_cost_usd": null,
"billable_events": []
},
"before_source_url": null,
"after_source_url": null,
"before_retrieval": null,
"after_retrieval": null,
"changes": [
{
"change_type": "price_changed",
"summary": "Displayed price values changed.",
"before_text": "10 USD",
"after_text": "12 USD",
"materiality": 0.9,
"evidence": [
{"text": "Price: 10 USD", "selector": "main > p", "source_url": null},
{"text": "Price: 12 USD", "selector": "main > p", "source_url": null}
]
},
{
"change_type": "availability_changed",
"summary": "Availability wording changed.",
"before_text": "In stock",
"after_text": "Out of stock",
"materiality": 0.8,
"evidence": [
{"text": "In stock", "selector": "main > p", "source_url": null},
{"text": "Out of stock", "selector": "main > p", "source_url": null}
]
},
{
"change_type": "value_changed",
"summary": "Visible page content changed.",
"before_text": "Starter plan\nPrice: 10 USD\nIn stock\nStarter plan Price: 10 USD In stock",
"after_text": "Starter plan\nPrice: 12 USD\nOut of stock\nStarter plan Price: 12 USD Out of stock",
"materiality": 0.5,
"evidence": [
{"text": "Starter plan", "selector": "main > h1", "source_url": null},
{"text": "Starter plan", "selector": "main > h1", "source_url": null}
]
}
],
"missing_fields": [],
"materiality_score": 0.9
}

Expected runtime

Inline HTML comparisons usually finish in seconds. URL comparisons depend on two sequential remote fetches and can take longer. Each fetch uses an 8-second connect timeout and a 12-second read timeout; the Actor has a five-minute default run timeout.

Durable replay and retention

Paid launch fails closed unless Dravara's durable result store is enabled. For a paid run, the validated result JSON is stored as a compressed canonical response envelope in a private R2 bucket and becomes eligible for deletion after 365 days. PostgreSQL stores bounded run, settlement, artifact-reference, quota, retention-claim, cost/revenue, and replay-identity metadata; it does not store the full fetched pages, submitted inline HTML, or raw request body. This persistence supports exact result replay; it is not change monitoring. When supplied, idempotency_key is stored by Dravara only through the namespaced HMAC replay identity and the request digest, not as raw text.

Apify separately retains normal run input and dataset output under the runner's storage settings. Deleting that Apify storage does not itself delete Dravara's durable records. After a terminal run is at least 365 days old, Dravara's retention worker can irreversibly minimize its platform identity, replay identity, input digest, and free-form run metadata only when its artifacts have been deleted, reconciliation is final, and no hold or failed retention claim remains. Run status, timestamps, result-integrity hash, economic records, and settlement evidence remain under a separate accounting and dispute-retention policy; not all PostgreSQL data expires after 365 days. Customer-key replay is no longer available after those replay identities and result artifacts are minimized. See Dravara Privacy for the complete boundary.

Version 1 limits

  • URL sources are static public HTTPS only, on port 443.
  • Each fetched page is limited to 2 MB of decoded HTML and up to three redirects; every redirect destination is revalidated.
  • Each inline HTML document is limited to 1,000,000 characters.
  • There is no login support, JavaScript execution, browser rendering, proxy support, CAPTCHA bypass, access-control bypass, or form submission.
  • Exactly two single documents are compared. There is no crawl, screenshot or DOM rendering, semantic model analysis, alerting, or scheduled monitoring.

Do not put passwords, session tokens, API keys, or private customer data in a URL, inline HTML, or idempotency_key. URL credentials and fragments are rejected. Content is processed by Dravara, LLC's private gateway using deterministic comparison rules. When a URL is fetched, the destination site receives a request from that gateway and may retain it under the site's own logging and privacy practices.

Support: support@dravarahq.com