Skip to content
Skip article header Engineering

Web Scraping API: Designing Reliable Public-Web Data Collection

A record acceptance matrix separates successful page retrieval from usable data. Specify freshness, partial results and ownership before buying collection.

8 min read 12 views

A web scraping API lets an application request data from web pages through a programmatic interface. Depending on the service, that can mean retrieving HTML, rendering a page or returning extracted fields. The purchasing decision changes when the requirement is a usable dataset rather than a successful page request.

Define the record your application will accept before choosing a web scraper API. That contract gives the collection service and the receiving product a common way to explain incomplete data, changes in the source and failed refreshes.

A successful retrieval can still produce an unusable record

Suppose a product collects publicly listed offers. Its illustrative schema requires a title and a price state. If the price state is listed, both an amount and a currency are required. A source that explicitly does not list a price is allowed to produce an unknown amount; a parser that fails to interpret a displayed price is a different outcome. The table uses synthetic records and a proposed schema. An amount of 19 USD is an arbitrary example, not a price observed on a real website.

Case Retrieved data Acceptance decision
W1 HTTP 200, known schema, listed amount 19 with USD currency Accept the record
W2 HTTP 200, listed amount 19, required currency missing Hold the incomplete record for review
W3 HTTP 200, source explicitly has no listed price Accept the explicit absence under the agreed schema
W4 HTTP 502 during a refresh attempt Retry or investigate; preserve the last successful observation's age
W5 HTTP 200, unexpected schema version with an unknown field mapping Hold the schema change
W6 The same observation as W1 is delivered again Ignore the duplicate delivery

The record acceptance matrix preserves the fields and expected outcomes. It illustrates why transport success, extraction completeness and record acceptance need separate meanings in a web data extraction product.

W2 and W3 are particularly easy to confuse. Both can display a blank amount in a spreadsheet. Only one is an accepted statement about what the source provides. Replacing either blank with zero would change the meaning of the record.

Choose the collection layer that matches the source

An HTTP response body, a browser-rendered page and a structured record are different deliverables. A service may offer more than one of them, but the integration should state which deliverable the application consumes.

Zyte's usage documentation separates HTTP access, browser usage and extraction capabilities. That separation is useful when writing requirements. Requesting a rendered page does not, on its own, define which fields should be extracted or how incomplete records should be handled.

Start with representative sources and identify where the required data appears. Some workflows can consume the initial response. Others need browser execution before the relevant content is available. A page can also display only part of a collection until pagination or another interaction occurs.

Keep those behaviors within the agreed source scope. The collector needs a clear stopping rule: which pages belong to the requested job, what counts as the last page and what happens if the expected continuation is unavailable.

Search engine output is another kind of source. If the application needs search listings rather than destination-page content, use a SERP API contract that identifies the query context and result collection. A generic website data extraction contract should not silently inherit search ranking semantics.

Specify fields as evidence, not just column names

A field specification should describe how the value is interpreted. For a price, that includes the amount's unit and currency, plus the distinction between a value that is absent at the source and a value that could not be extracted. Record the source URL and observation time with each accepted observation. Where the collector resolves several source URLs into one entity, preserve enough of that relationship to investigate a disputed value. A normalized entity identifier and an observation identifier serve different jobs: the entity can persist while its observed values change.

Keep source-provided dates separate from collection timestamps. A page's published date does not establish when your collector last saw its contents. Conversely, a new retrieval does not prove that every value on the page was recently updated by its publisher.

Document the interpretation of unavailable fields. A consumer should not have to guess whether null means not listed, not requested or parsing failed. The chosen schema may use explicit states or another documented representation, but that distinction needs to survive delivery.

Make freshness depend on accepted observations

Scheduled web scraping creates an expectation about how recently data has been checked. A new attempt is not necessarily a successful refresh.

Imagine an accepted record at time t0 and a failed retrieval at t1. The application now knows about a recent failure. Its last successful observation is still from t0. Updating the record's freshness timestamp to t1 would describe an old value as newly verified. Preserve both events. A customer-facing view can show the last accepted observation and a separate indication that a more recent attempt failed. Define the behavior when the last accepted value becomes too old for the product's decision: it might remain visible with its age or be withheld from a calculation.

The acceptable age depends on the use case. A market research dataset and a user-facing offer comparison can have different requirements. Set the freshness target as part of the product contract rather than borrowing a collection interval from a provider's example.

Contain schema changes before they spread

A source can change while requests continue to return successful HTTP responses. A field may move or disappear, and a value may arrive in a different representation. Treating every parsed object as accepted data lets those changes become silent changes in the application. Define the checks that make a record eligible for its destination. Required fields, conditional requirements and allowed value states are useful starting points. Validate them before updating a published dataset or triggering a downstream action.

Use representative saved examples to review extractor changes. Include explicit absence and incomplete records alongside the populated example. If the schema changes, decide whether old and new records can be interpreted together or need a recorded mapping.

A hold state needs an operational owner. State who investigates the source change, who approves the new interpretation and whether previously collected records need reprocessing. A collection service can own some of that work, but ownership should be part of the engagement.

This acquisition boundary ends with an interpretable record. If the product later feeds a retrieval system, the RAG data pipeline article addresses the different problem of keeping a changing corpus and its derived representations consistent.

Treat retries and repeated delivery separately

Retry policy should distinguish a failed attempt from another successful observation of the source. A job that delivers the same record twice should not create two source events merely because the network required another delivery attempt. Decide which identifiers the receiver uses to recognize a repeated observation. The W6 example uses the same observation identifier as W1. A newer observation of the same entity would need its own identity even if the extracted values happened to be unchanged.

Batch delivery also needs a completeness account. A dataset should be able to identify its requested scope, accepted records and unresolved work. A file containing only accepted rows may be useful, but it is not evidence that every requested source completed.

For incremental collection, define how the system discovers what to revisit. Do not assume that a source's visible update date is complete change tracking. If the product needs to detect removals, specify that requirement separately from refreshing records that are still returned.

Choose API access or managed collection by ownership

An API can be a good fit when the product team owns source selection, extraction rules and the receiving application. The provider supplies a documented collection capability while the team remains responsible for the record contract and downstream behavior.

Managed web scraping changes the ownership discussion. A delivery agreement can include a defined source set, field interpretation and maintenance when sources change. The useful comparison is what each party will investigate and deliver, not whether one offer uses the word managed.

Purchasing question Decision to put in the agreement
Who selects and approves sources? The source list, permitted access method and scope-change process
Who maintains extraction rules? Ownership of source changes and the evidence used to approve a fix
What is an accepted record? Field requirements, unknown-value states and validation behavior
What does fresh mean? Last accepted observation, attempted refresh and the agreed age policy
How is delivery checked? Record identity, duplicates and incomplete batch reporting
What happens after failure? Retry limits, investigation ownership and delivery expectations

Estimate the workload from those responsibilities. Browser execution, extraction maintenance and unresolved source changes can affect the work even when the nominal request count stays the same. Obtain current provider terms and an estimate against the agreed scope; there is no universal cost per useful record.

Pharos developed a platform combining public-web collection and data APIs as part of a wider search intelligence product. That case describes the delivered scope. The acceptance matrix here is a separate planning aid for a similar system, helping turn a request for web data into a defined collection and delivery contract.

I work with startup founders who need a dedicated software development team but don’t want to gamble on hiring, random outsourcing, or opaque delivery.
Most founders face the same problem sooner or later.
Early technical and team decisions lock the product into tech debt, slow delivery, missed milestones and constant re-hiring. By the time this becomes visible, fixing it is already expensive.

As a CTO and software architect, I help founders design, build and run dedicated development teams that work as a true extension of the startup. Not as a black-box vendor.

My focus is on complex products where mistakes are costly:

  • Web3 and blockchain platforms
  • FinTech and regulated products
  • High-load startup systems
  • MVP → scale transitions

We don’t do body-shopping.
We don’t sell generic outsourcing.

Instead, we help founders:

  • build the right team structure from day one
  • keep technical ownership and transparency
  • scale delivery without losing control
  • avoid vendor lock-in and hidden risks

Teams are aligned with the product roadmap, business goals and long-term architecture. Not just short-term velocity.

Dmytro Nasyrov, Founder and CTO at Pharos Production
Dmytro Nasyrov Founder & CTO Let's work together!

Your business results matter

Achieve them with minimized risk through our bespoke innovation capabilities

Your contact details
Please enter your name
Please enter a valid email address
Please enter your message

We use your details only to reply to your request. Data Privacy and Legal Notice

We typically reply within 24 hours

What happens next?

  1. Contact us

    Contact us today to discuss your project. We're ready to review your request promptly and guide you on the best next steps for collaboration

    Same day
  2. NDA

    We're committed to keeping your information confidential, so we'll sign a Non-Disclosure Agreement

    1 day
  3. Plan the Goals

    After we chat about your goals and needs, we'll craft a comprehensive proposal detailing the project scope, team, timeline and budget

    3-5 days
  4. Finalize the Details

    Let's connect on Google Meet to go through the proposal and confirm all the details together!

    1-2 days
  5. Sign the Contract

    As soon as the contract is signed, our dedicated team will jump into action on your project!

    Same day