MyFloridaMarketPlace Bids Scraper & Monitor avatar

MyFloridaMarketPlace Bids Scraper & Monitor

Pricing

from $3.00 / 1,000 record (full detail)s

Go to Apify Store
MyFloridaMarketPlace Bids Scraper & Monitor

MyFloridaMarketPlace Bids Scraper & Monitor

Scrape and monitor Florida state-agency solicitations on MyFloridaMarketPlace (MFMP VBS): ITB, RFP, ITN, RFI, RSQ, single source and intent-to-award notices with UNSPSC codes, contacts, documents. Server-side filters, delta mode for new, amended and closed ads, normalised dates. Pay per result.

Pricing

from $3.00 / 1,000 record (full detail)s

Rating

0.0

(0)

Developer

Stefano Seggio

Stefano Seggio

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

15 hours ago

Last modified

Share

MyFloridaMarketPlace Bids Scraper & Monitor — Apify Store Overview

Actor ID: afSZyXLVcgnLpucyo · Store URL: https://apify.com/stefano_seggio/florida-tenders-monitor · Version: 2.0


Executive Summary & Business Use Case

The MyFloridaMarketPlace Bids Scraper & Monitor extracts every advertisement posted on the Vendor Information Portal of MyFloridaMarketPlace (MFMP VBS, vendor.myfloridamarketplace.com) — the statutory posting site, operated by Florida's Department of Management Services, where every State of Florida agency is required by section 287.042(3)(b) of the Florida Statutes and Rule 60A-1 F.A.C. to advertise its competitive solicitations and intended awards. The Actor talks directly to the same unauthenticated JSON endpoints (/mfmp/pub/search/bids, /count, /detail) that the portal's own Angular front end calls, so it needs no login, no CAPTCHA and no proxy. It covers all ten advertisement types the portal recognises — Invitation to Bid (ITB), Request for Proposals (RFP), Invitation to Negotiate (ITN), Request for Information (RFI), Request for Statement of Qualifications (RSQ), Single Source notices, Agency Decisions (intent to award), Grant Opportunities, Public Meeting Notices and Informational Notices — across all four statuses the portal tracks (OPEN, CLOSED, WITHDRAWN, PREVIEW).

What makes this more than a one-shot scrape is the delta engine: MFMP keeps an advertisement's original publishDate unchanged even when an agency posts an addendum, extends a deadline, or answers a Q&A, so any monitor keyed on publish date is blind to that activity. This Actor instead keys change detection on the portal's own amendment version counter and on status, so a schedule run with onlyNew on reliably surfaces new postings (NEW_LISTING), edits to known postings (UPDATED), and status flips such as OPEN → CLOSED (STATUS_CHANGE) — including the addenda that publish-date-based alerts miss entirely.

Three concrete business use cases follow directly from the fields the Actor actually returns. First, Florida government contractors and SMEs (IT, construction, health and social services) use type, commodityCodeIds/commodityCodesText, closeDateLocal, daysUntilClose and contactEmail to build a bid/no-bid pipeline and a proposal calendar without checking the portal by hand. Second, capture teams and incumbents working an active solicitation watch for event_type: UPDATED together with version/previousVersion, lastUpdateDateUtc and a fresh entry in documents[] (an addendum or Q&A) so they never miss a close-date extension. Third, bid-protest counsel and competitive-intelligence teams filter types: ["1"] (Agency Decision) with onlyNew on a tight schedule to catch intent-to-award notices the moment isAwardNotice: true appears, using linkedAdNumber/linkedAdUrl to trace the notice back to the original solicitation inside the 72-hour protest window under s. 120.57(3) F.S. Because MFMP has no structured contract-value field, the data does not support a "largest active contract value" style use case out of the box — amountsUsd/maxAmountUsd are figures mined from free-text descriptions and are documented as sparse (mostly present on single-source and award notices, rarely on solicitations).

Technical Features & V2 Architecture Highlights

Named, per-filter-set delta memory. When onlyNew is enabled, the Actor writes a private, named key-value store called florida-tenders-monitor-state-<deltaStateName> that remembers, for every advertisement it has delivered, its advertisementId, version and status. deltaStateName defaults to a fingerprint of the run's own filters, so unrelated schedules never collide; setting the same name on two tasks makes them share one memory on purpose. resetState: true forgets everything for that name and re-baselines. The store is documented to hold up to 50,000 advertisements — larger than the entire CLOSED register (13,027 records as of the README's 8 September 2026 count).

Why version, not publishDate. The delta engine's change key is the portal's own amendment version counter, specifically because MFMP does not move publishDate when an agency edits a live advertisement. The CHANGELOG's own worked example: grant opportunity GO-14963 published 23 January 2026, edited seven times with six addenda through September, publish date never moved — invisible to a date-keyed monitor, but a same-day UPDATED event on a version-keyed one.

Real event-type set — three values, not the generic fleet default. event_type on this actor is NEW_LISTING, UPDATED, or STATUS_CHANGE (per dataset_schema.json's own enum and the eventTypes input's enum). There is no separate CLOSED event type here: a solicitation closing is represented as STATUS_CHANGE with status moving from OPEN to CLOSED (visible only if CLOSED is also included in the statuses filter, since an advertisement that leaves the walked statuses simply disappears from the walk).

onlyNew — exact behavior per this actor's own input schema. Per its own description text: "Remembers every advertisement it has delivered (id, version, status - per filter set, in a named key-value store) and returns only what is new, amended or status-changed since. The portal has no timestamp sort, so every listing page is re-read on each run (cheap: OPEN is 2 pages, fetched in parallel); detail is fetched only for records that will be delivered. The first run is the baseline: with a small 'Max records' it delivers the most recently published advertisements and treats everything older as history." In practice: a quiet daily run against OPEN costs three listing requests plus the start fee, because detail is never fetched for a row that will not be delivered.

Crash-safe delta writes. The CHANGELOG documents a v1 bug that this v2 fixes directly: the seen-set used to be persisted before records were pushed to the dataset, so a spending-limit stop, timeout, or platform migration mid-run could mark an undelivered advertisement as "seen" forever. In v2, state is written only for records actually stored in the dataset, delivery happens oldest-first within a run (so a gap always sits at the point the next walk resumes from), and state is flushed periodically (every 50 records) plus on migrating/aborting events and in a finally block.

Standard integration envelope, not a documented "18-field" baseline. Every record carries six envelope fields — record_id, event_type, scraped_at, is_new, source_url, data_source — described in the README as identical across this developer's public-register Actors, so one webhook parser serves all of them. Beyond the envelope, dataset_schema.json documents roughly 60 advertisement-specific fields (identity, agency, three date families, amendment tracking, detail-only fields, commodity codes, documents, and contact), and the README states the total as "70+ fields." Neither the schema file nor the README states an "18 base field" figure for this actor, so that number is not used here.

Concurrency and server-side filtering. maxConcurrency (default 5, max 10) governs in-flight listing-page and detail requests; the README and input schema both note the listing endpoint starts returning HTTP 429 above roughly 8 concurrent requests, so the Actor backs off and retries with jittered, Retry-After-aware backoff rather than failing. Nearly every filter (statuses, types, agencyIds, commodityCodes, adNumber, agencyAdNumberContains, openBefore, closesAfter, a one-day dateFrom/dateTo) is pushed to MFMP's own search endpoint server-side; only agencyNameContains and wider date windows are applied client-side after the listing has already been walked (which the README notes is "cheap - the listing is walked in full anyway").

Input Schema & JSON Configuration Example

All fields below are copied verbatim from .actor/input_schema.json.

FieldTypeDefaultDescription
statusesarray (string enum: OPEN, CLOSED, WITHDRAWN, PREVIEW)["OPEN"]Which advertisement statuses to walk. OPEN is small and cheap (2 pages). Add CLOSED to track awards and to receive STATUS_CHANGE events when an open solicitation closes (131 pages, fetched in parallel; only new or changed records cost anything).
typesarray (string enum "1""10")[]The portal's 10 advertisement types. Select several to get their union. Agency Decision = intent-to-award / award notice (starts the 72-hour protest clock); Single Source = non-competitive purchase notice.
agencyIdsarray of string (pattern ^\d{4,12}$)[]MFMP organization ids, e.g. 30000021 (FDOT), 30000023 (DCF), 30000029 (AHCA), 30000032 (DMS), 30000026 (DOH), 30000031 (FDLE), 30000018 (DOE), 30000011 (DEP), 30000015 (FDACS), 30000012 (DOC), 30000036 (FWC), 30000039 (DJJ), 30000034 (REV), 30000019 (FSDB), 30000030 (FDC), 30000020 (FDVA), 30000025 (DMA), 30000013 (DLA), 30000033 (DOAH). Every record carries its organizationId, so run once without this filter to discover the rest (the portal has no public agency list).
agencyNameContainsstringCase-insensitive substring on the agency name or short name, e.g. 'Transportation' or 'AHCA'. Applied client-side after the listing is read (cheap - the listing is walked in full anyway).
titleContainsstringCase-insensitive substring on the advertisement title, e.g. 'software' or 'construction'.
commodityCodesarray of string (pattern ^\d{8}$)[]Exact 8-digit UNSPSC codes, e.g. 83112200 (Enhanced telecommunications services), 43230000 (Software). Several codes = union. The portal matches exact codes only - a prefix such as '43' returns nothing.
adNumberstring (pattern ^\s*([A-Za-z]{2,3}-?)?\d+\s*$)One specific advertisement, e.g. 16672 or AD-16672 (the numeric part is used).
agencyAdNumberContainsstringSubstring on the agency's own reference, e.g. 'DOT-ITB-27' or 'RFP 2526'.
dateFromstring (absolute or relative date)Only advertisements first published on or after this UTC calendar day: absolute (2026-09-01) or relative ('7 days', '3 months' back from today). A one-day window (from = to) is pushed to the portal; wider windows are applied client-side on the listing. Note: amendments keep the original publish date - use delta mode to catch them.
dateTostring (absolute or relative date)Upper bound of the publish window (inclusive). Leave empty for 'today'.
openBeforestring (absolute or relative date)Server-side: only advertisements whose open date is on or before this day (absolute or relative). Useful to skip solicitations that have not started accepting responses yet.
closesAfterstring (absolute or relative date)Server-side: only advertisements whose close date is on or after this day (absolute, or relative such as '0 days' for 'still open today'). Great for 'give me only what I can still bid on'.
eventTypesarray (string enum: NEW_LISTING, UPDATED, STATUS_CHANGE)["NEW_LISTING", "UPDATED", "STATUS_CHANGE"]NEW_LISTING = an advertisement never delivered before; UPDATED = a known advertisement whose version counter rose (addendum, Q&A, close-date extension, new document); STATUS_CHANGE = a known advertisement whose status changed (e.g. OPEN -> CLOSED; only visible if that status is in 'Statuses').
onlyNewbooleanfalse (prefill true)Remembers every advertisement it has delivered (id, version, status - per filter set, in a named key-value store) and returns only what is new, amended or status-changed since. The portal has no timestamp sort, so every listing page is re-read on each run (cheap: OPEN is 2 pages, fetched in parallel); detail is fetched only for records that will be delivered. The first run is the baseline: with a small 'Max records' it delivers the most recently published advertisements and treats everything older as history.
deltaStateNamestring (pattern ^[A-Za-z0-9-]{1,30}$)Optional label for the memory of a monitoring task. Defaults to a fingerprint of your filters, so different schedules never interfere. Set the same name on two tasks to make them share one memory.
resetStatebooleanfalseForget every previously delivered advertisement for this delta state and re-baseline (the run then returns up to 'Max records' of the most recently published advertisements).
maxItemsinteger (1–50000)100Hard cap on delivered records (and therefore on cost: you pay per record). Newest-published first; amendments and status changes to known records always come first. In delta mode anything beyond the cap stays unseen and is delivered by the next run.
fetchDetailbooleantrueOne extra request per delivered record for the description (HTML + plain text), UNSPSC commodity codes, documents with download links, response contact, response due date, last-update timestamp, linked solicitation and indicator flags. Off = listing-only summary records (cheaper 'result-summary' price).
maxConcurrencyinteger (1–10)5How many listing pages / detail requests are in flight at once. Detail pages tolerate 10; the listing endpoint starts returning HTTP 429 above about 8 in flight (the Actor backs off and retries), so keep 5 for large backfills.
dateRangestring (pattern ^(24h|7d|30d)$, hidden editor)Kept for tasks created with version 1: '24h', '7d' or '30d' are interpreted as 'Published from'.

Example configuration — monitor RFPs and ITNs, delta mode on

This configuration is valid against the schema above: types uses two of the ten allowed enum values, statuses and eventTypes use only enum members, agencyIds matches the required digit pattern, and maxItems is within [1, 50000].

{
"statuses": ["OPEN", "CLOSED"],
"types": ["5", "6"],
"agencyIds": ["30000021"],
"titleContains": "software",
"eventTypes": ["NEW_LISTING", "UPDATED", "STATUS_CHANGE"],
"onlyNew": true,
"deltaStateName": "fdot-software-rfps",
"maxItems": 200,
"fetchDetail": true,
"maxConcurrency": 5
}

Output Dataset Sample & Data Dictionary

All field names and descriptions below are copied from .actor/dataset_schema.json.

Integration envelope

FieldTypeDescription
record_idstringadvertisementId as a string - stable across runs (e.g. "16672").
event_typestring (enum: NEW_LISTING, UPDATED, STATUS_CHANGE)NEW_LISTING, UPDATED (version counter rose: addendum, extension, new document) or STATUS_CHANGE (e.g. OPEN -> CLOSED).
scraped_atstringISO-8601 UTC timestamp of this extraction.
is_newbooleantrue when this advertisement was never delivered by a previous run of this delta memory.
source_urlstringThe advertisement's page on the portal.
data_sourcestringAttribution string.

Advertisement fields

FieldTypeDescription
advertisementIdintegerExample: 16672.
uniqueNamestringDisplay ID, e.g. AD-16672, GO-14963.
agencyAdNumberstring | nullThe agency's own reference.
titlestringAdvertisement title.
typestringAgency Decision, Grant Opportunities, Informational Notice, Invitation to Bid, Invitation to Negotiate, Request for Proposals, Public Meeting Notice, Request for Information, Request for Statement of Qualifications, Single Source.
typeIdstringThe types filter value ("1"–"10").
statusstring (enum: OPEN, CLOSED, WITHDRAWN, PREVIEW)Current advertisement status.
agencystringAgency name.
organizationIdinteger | nullStable agency id - the agencyIds filter value.
organizationShortNamestring | nullExample: FDOT.
organizationEntitystring | nullExample: 550000.
openDatestringOpen date (raw), e.g. "2026-09-03T20:30:00.000+00:00".
closeDatestringClose date (raw).
publishDatestringPublish date (raw).
publishDateUtcstring | nullCanonical ISO-8601 Z form.
openDateUtcstring | nullOpens (UTC).
closeDateUtcstring | nullCloses (UTC).
publishDateLocalstring | nullPublished (Florida time), e.g. "2026-08-13 13:39 EDT".
openDateLocalstring | nullOpens (Florida time).
closeDateLocalstring | nullWhat the vendor reads on the portal: Eastern time with EST/EDT.
publishDaystring | nullYYYY-MM-DD (UTC) - the granularity of the portal's own date filter.
closeDaystring | nullClose day.
responseWindowDaysinteger | nullWhole days between open and close.
daysUntilCloseinteger | nullNegative once closed.
isOpenForResponsesbooleanstatus OPEN and close date still in the future at scrape time.
versionintegerThe portal's amendment counter - rises on every agency edit. The delta engine's change key.
isAmendedbooleanversion > 1.
previousVersioninteger | nullVersion at the previous delivery (UPDATED / STATUS_CHANGE events).
previousStatusstring | nullPrevious status.
isAwardNoticebooleantype = Agency Decision (intent to award / agency decision - starts the 72-hour protest window).
isSingleSourcebooleanSingle source flag.
detailFetchedbooleanfalse when fetchDetail was off or the detail could not be retrieved (see detailError).
detailErrorstring | nullNOT_FOUND when the portal has no detail for the id; otherwise the failure message.
descriptionstring | nullRaw HTML from the portal.
descriptionTextstring | nullPlain-text rendering with line breaks - ready for search, summarisation or e-mail.
amountsUsdarray of numberEvery $ figure found in the description (the portal has no structured value field).
maxAmountUsdnumber | nullLargest amount (USD).
currencystringExample: USD.
lastUpdateDatestring | nullLast updated (raw).
lastUpdateDateUtcstring | nullWhen the agency last edited the advertisement - amendments do NOT change publishDate.
responseDatestring | nullResponse due (raw).
responseDateUtcstring | nullProposal / response due date - can differ from closeDate (e.g. a grant RFA closing months after the application deadline).
responseDateLocalstring | nullResponse due (Florida time).
linkedAdNumberstring | nullFor an Agency Decision: the advertisementId of the original solicitation being awarded.
linkedAdUrlstring | nullLinked advertisement URL.
publishOptionstring | nullExample: "Start Immediately".
withdrawnboolean | nullThe portal's own flag (observed false even on WITHDRAWN records - prefer status).
timeRemainingMsinteger | nullMilliseconds until closeDate as computed by the portal at fetch time (negative once closed).
indicatorsobject | nullminorityEncouraged, preSolicitationConference, disabilitiesAct, rightToReject, agencyContactPeriod.
minorityEncouragedboolean | nullMinority participation encouraged.
preSolicitationConferenceboolean | nullPre-solicitation conference.
disabilitiesActboolean | nullADA notice.
rightToRejectboolean | nullRight to reject.
agencyContactPeriodboolean | nullAgency contact period.
commodityCodesarray of object ({id, value})UNSPSC codes with labels.
commodityCodeIdsarray of stringCommodity code IDs.
commodityCodesTextstring | nullExample: "83112200 Enhanced telecommunications services; 83112403 Point to point digital telecommunications circuit".
documentsarray of object (fileName, downloadUrl, attachmentId, description, date, dateUtc, version, docFor)Attachments with direct download links (the endpoint needs an Accept: application/json header) and posting dates - addenda appear here with their title.
documentCountinteger | nullDocument count.
latestDocumentDateUtcstring | nullWhen the most recent attachment (typically the latest addendum) was posted.
responseContactobject | nullRaw: responseContact, email, ph, address1, address2, city, state, zip.
contactNamestring | nullContact name.
contactEmailstring | nullContact e-mail.
contactPhonestring | nullContact phone.
contactAddressstring | nullContact address.
contactCitystring | nullContact city.
contactStatestring | nullContact state.
contactZipstring | nullContact ZIP.

Sample dataset record

Field names below are all real (dataset_schema.json); the description text is trimmed for length, matching the README's own convention.

{
"record_id": "16861",
"event_type": "NEW_LISTING",
"scraped_at": "2026-09-08T08:20:11.402Z",
"is_new": true,
"source_url": "https://vendor.myfloridamarketplace.com/search/bids/detail/16861",
"data_source": "MyFloridaMarketPlace Vendor Information Portal (vendor.myfloridamarketplace.com), Florida Department of Management Services - public records under Florida Statutes ch. 119",
"advertisementId": 16861,
"uniqueName": "RFP-16861",
"agencyAdNumber": "DOT-RFP-27-9018-SJ",
"title": "Commercial Driver's License (CDL) Training and Testing Services",
"type": "Request for Proposals",
"typeId": "6",
"status": "OPEN",
"agency": "Florida Department of Transportation (FDOT)",
"organizationId": 30000021,
"organizationShortName": "FDOT",
"organizationEntity": "550000",
"openDate": "2026-09-03T20:06:37.000+00:00",
"closeDate": "2026-09-21T14:00:00.000+00:00",
"publishDate": "2026-09-03T20:06:37.000+00:00",
"publishDateUtc": "2026-09-03T20:06:37.000Z",
"closeDateUtc": "2026-09-21T14:00:00.000Z",
"publishDateLocal": "2026-09-03 16:06 EDT",
"closeDateLocal": "2026-09-21 10:00 EDT",
"publishDay": "2026-09-03",
"closeDay": "2026-09-21",
"responseWindowDays": 17,
"daysUntilClose": 13,
"isOpenForResponses": true,
"version": 1,
"isAmended": false,
"previousVersion": null,
"previousStatus": null,
"isAwardNotice": false,
"isSingleSource": false,
"detailFetched": true,
"detailError": null,
"descriptionText": "The Florida Department of Transportation requests competitive sealed bids/proposals/replies for the procurement of: Commercial Driver's License (CDL) Training and Testing Services. All Bidders, Proposers, and Respondents must be registered in the State of Florida's MyFloridaMarketplace system...",
"amountsUsd": [],
"maxAmountUsd": null,
"currency": "USD",
"lastUpdateDate": "2026-09-03T20:06:37.000+00:00",
"lastUpdateDateUtc": "2026-09-03T20:06:37.000Z",
"responseDate": "2026-09-21T14:00:00.000+00:00",
"responseDateLocal": "2026-09-21 10:00 EDT",
"linkedAdNumber": null,
"publishOption": "Start Immediately",
"withdrawn": false,
"commodityCodes": [
{ "id": "86101715", "value": "Road or rail transportation vocational training services" },
{ "id": "86131701", "value": "Vehicle driving schools services" }
],
"commodityCodeIds": ["86101715", "86131701"],
"documents": [
{
"fileName": "9018 - Solicitation Document.pdf",
"downloadUrl": "https://vendor.myfloridamarketplace.com/mfmp/bids/detail/attachment/download?attachmentId=40095",
"attachmentId": 40095,
"description": "SOLICITATION DOCUMENT",
"date": "2026-09-03T20:06:24.000+00:00",
"dateUtc": "2026-09-03T20:06:24.000Z",
"version": null,
"docFor": "advertisementDocuments"
}
],
"documentCount": 1,
"latestDocumentDateUtc": "2026-09-03T20:06:24.000Z",
"contactName": "SHERILL JOHNSON",
"contactEmail": "CO.Purch@dot.state.fl.us",
"contactPhone": "(000) 000-0000",
"contactAddress": "FDOT PROCUREMENT OFFICE, 605 SUWANNEE STREET",
"contactCity": "TALLAHASSEE",
"contactState": "FL",
"contactZip": "32399-0450",
"minorityEncouraged": false,
"preSolicitationConference": false
}

On a later run, the same advertisement amended by the agency arrives with "event_type": "UPDATED", "is_new": false, an incremented "version" (e.g. 2), "previousVersion": 1, a fresh lastUpdateDateUtc, and a new addendum entry inside documents[].

Multi-language Integration Snippets

All three snippets call the same endpoint and use only real input field names from this actor's input_schema.json.

cURL

curl -X POST "https://api.apify.com/v2/acts/stefano_seggio~florida-tenders-monitor/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"types": ["5", "6"],
"agencyIds": ["30000021"],
"onlyNew": true,
"maxItems": 200,
"fetchDetail": true
}'

Python (apify-client)

from apify_client import ApifyClient
client = ApifyClient(token="YOUR_APIFY_TOKEN")
run_input = {
"types": ["5", "6"],
"agencyIds": ["30000021"],
"onlyNew": True,
"maxItems": 200,
"fetchDetail": True,
}
run = client.actor("stefano_seggio/florida-tenders-monitor").call(run_input=run_input)
for ad in client.dataset(run["defaultDatasetId"]).iterate_items():
print(ad["event_type"], ad["uniqueName"], ad["agency"], ad["title"], ad["closeDateLocal"], ad["contactEmail"])

Node.js (apify-client)

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('stefano_seggio/florida-tenders-monitor').call({
types: ['5', '6'],
agencyIds: ['30000021'],
onlyNew: true,
maxItems: 200,
fetchDetail: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems({ desc: true });
for (const ad of items) {
console.log(ad.event_type, ad.uniqueName, ad.agency, ad.title, ad.closeDateLocal, ad.contactEmail);
}

Pricing Model Explanation

Verified-live pricing for this actor, pay-per-event with platform usage included:

EventPriceWhen it fires on this actor
result$0.003 per recordA delivered advertisement with full detail attached — one extra request per record fetched the description (HTML + plain text), UNSPSC commodity codes, documents[] with download links, response contact, response due date, last-update timestamp, linked solicitation and indicator flags. This is the tier used whenever fetchDetail: true (the default) successfully retrieves detail for that record.
result-summary$0.001 per recordA delivered advertisement as a listing-only summary — either because fetchDetail was set to false, so only the fields already present on the search-results row are returned (no description, no documents, no contact), or because a detail request failed for a transient reason after retries: the record is still delivered, detailFetched is false and detailError carries the failure reason, but it is billed at the cheaper summary rate rather than being dropped or double-charged.
apify-actor-start$0.00005Once per run, regardless of how many (or how few) records it delivers.

The tier this actor bills at is therefore purely a function of whether full detail was actually attached to that specific record — not a "new vs. previously seen" distinction. In delta mode (onlyNew: true), the two tiers apply on top of the delta filter, not instead of it: enabling onlyNew means an advertisement that is already known and unchanged (same version, same status as last delivered) is never delivered at all — it produces no result or result-summary event and is not billed at $0, it simply never becomes a chargeable event in the first place. Only advertisements that are new, whose version rose, or whose status changed reach the dataset (and therefore reach a billing event), which is what keeps a quiet daily monitoring run down to the $0.00005 start fee plus, at most, a handful of result/result-summary charges for whatever actually moved on the portal that day.