Enrich CRM company records from supplied domains
Scope CRM company enrichment from supplied domains with source URLs, timestamps, and a review queue for ambiguous matches. Includes a synthetic JSON check.
Read guideA record contract for research agents, retrieval-augmented generation pipelines, and source monitors, with failures visible before ingestion

An AI retrieval pilot should return each passage with its source URL, retrieval time, content hash, and fetch status. Accept records only after source and freshness checks pass; review failed or changed pages before ingestion. The sample is synthetic and does not demonstrate a ProxyLane retrieval API.
List URLs or domains, intended use, geography, refresh interval, and expected volume before any feasibility decision
Set required fields, freshness rules, failed and changed page handling, and cases that need human review
Check the sample schema and acceptance worksheet; no managed retrieval API or delivery result is promised
Synthetic records show a fetched passage and a failed page that must stay in review. These fictional records demonstrate the format, not measured service output.
{
"source_url": "https://example.com/retrieval-guide",
"retrieved_at": "2026-09-17T10:00:00Z",
"text": "Synthetic guidance: keep retrieval time separate from page publication time.",
"content_hash": "sha256:b6386f800e0d671f16feecb72d366f00a7d9fe52e6325f14389f5736bbfc31eb",
"fetch_status": "fetched",
"published_at": "2026-08-01"
}
Use this record contract when a research agent, retrieval-augmented generation pipeline, or source monitor needs to trace each passage to a source and observation time. It keeps retrieval evidence visible to the system deciding whether text can enter a later answer.
The local check accepts only the synthetic hosts in the download. Replace that allowlist with an approved source set during a scoped pilot. The check makes no network requests and cannot determine whether a source permits fetching, storage, redistribution, or model training.
| Field | Acceptance check |
|---|---|
source_url |
HTTPS URL on the approved source list; no embedded credentials |
retrieved_at |
Parseable timestamp with a timezone |
text |
Non-empty for an accepted record |
content_hash |
SHA-256 hash matches the exact UTF-8 text |
fetch_status |
fetched may pass local checks; any other value stays in review |
published_at |
Optional page date; never use it in place of retrieved_at |
A matching hash shows that the checked text matches the recorded digest. It does not establish that the page is current, authoritative, permitted for reuse, or sufficient to support an answer. Keep changed, ambiguous, and failed pages out of automatic ingestion until the review rule resolves them.
Important: Public access does not establish permission to fetch, retain, redistribute, or train on page content. Record the allowed purpose and retention boundary for each source before use.
Download the synthetic JSON sample or CSV sample. For implementation planning, use the pilot brief. Save the JSON as sample.json, then save the following code as validate-sample.py beside it. Run it with Python 3.12.0, the version used for this local check. The official Python downloads page provides installation files; Python's JSON documentation describes file parsing.
python3 --version
python3 validate-sample.py
The validator uses only the Python standard library. It checks required fields, synthetic HTTPS hosts, timezone-aware timestamps, content hash, and fetch status. It does not compare record age with a freshness threshold or detect page changes; define those checks for the scoped pilot. The validator sends malformed URLs and values of the wrong type to review rather than treating them as accepted. It still checks only this synthetic record contract; it does not verify a live source or make a service request.
import hashlib
import json
from datetime import datetime
from pathlib import Path
from urllib.parse import urlsplit
SAMPLE_PATH = Path("sample.json")
ALLOWED_HOSTS = {"example.com", "example.org"}
def is_synthetic_https_url(value):
if not isinstance(value, str):
return False
try:
parsed_url = urlsplit(value)
hostname = parsed_url.hostname
parsed_url.port
username = parsed_url.username
password = parsed_url.password
except ValueError:
return False
return (parsed_url.scheme == "https"
and hostname in ALLOWED_HOSTS
and username is None
and password is None)
REQUIRED_FIELDS = {
"source_url",
"retrieved_at",
"text",
"content_hash",
"fetch_status",
}
sample = json.loads(SAMPLE_PATH.read_text(encoding="utf-8"))
if sample.get("sample_type") != "synthetic":
raise ValueError("Expected a synthetic schema example")
records = sample.get("records")
if not isinstance(records, list) or not records:
raise ValueError("Expected at least one record")
for index, record in enumerate(records, start=1):
issues = []
if not isinstance(record, dict):
print(f"record {index}: review; row is not an object")
continue
missing = sorted(REQUIRED_FIELDS - record.keys())
if missing:
issues.append("missing " + ", ".join(missing))
source_url = record.get("source_url")
if not isinstance(source_url, str):
issues.append("source_url must be text")
else:
if not is_synthetic_https_url(source_url):
issues.append("source_url is outside the synthetic HTTPS hosts")
retrieved_at = record.get("retrieved_at")
try:
if not isinstance(retrieved_at, str):
raise ValueError
timestamp = datetime.fromisoformat(retrieved_at.replace("Z", "+00:00"))
if timestamp.tzinfo is None or timestamp.utcoffset() is None:
issues.append("retrieved_at needs a timezone")
except ValueError:
issues.append("retrieved_at is not a timezone-aware ISO timestamp")
text_value = record.get("text")
digest = record.get("content_hash")
if not isinstance(text_value, str) or not text_value.strip():
issues.append("text is empty")
elif digest != "sha256:" + hashlib.sha256(text_value.encode("utf-8")).hexdigest():
issues.append("content_hash does not match text")
if record.get("fetch_status") != "fetched":
issues.append("fetch_status is not fetched")
outcome = "accepted" if not issues else "review"
print(f"record {index}: {outcome}")
for issue in issues:
print(f" reason: {issue}")
Expected output for the unchanged synthetic sample:
record 1: accepted
record 2: review
reason: text is empty
reason: fetch_status is not fetched
A local pass means only that the example meets these checks; it says nothing about answer quality, source rights, live retrieval, or ProxyLane service coverage. Python's datetime documentation distinguishes aware and naive timestamps, URL parsing documentation warns that parsing is not validation, and hashlib documentation describes SHA-256 digests.
Write down the source list, allowed purpose, required fields, geography, refresh interval, expected volume, output format, freshness threshold, and exception budget. Define whether a page change requires a new record, a human review, or both.
Use a review worksheet to estimate work from expected retrievals and exceptions. Replace every estimate with an agreed assumption after feasibility review. The synthetic sample contains no measured retrieval time, source coverage, or labor savings.
Retrieval returns source text to an application for a particular request. Training adds material to a model's training process. The sample covers only a record shape for retrieval; it grants no reuse rights or training consent.
For a scoped request, include the source list, intended use, fields, refresh interval, volume, format, and acceptance rules in the workflow email draft addressed to hello@proxylane.dev. Opening the draft sends nothing. A human must confirm feasibility, scope, price, and acceptance before any work or purchase terms are agreed.
Run this workflow with the tools you already use. Rotating or sticky sessions up to 72 hours.

Scope CRM company enrichment from supplied domains with source URLs, timestamps, and a review queue for ambiguous matches. Includes a synthetic JSON check.
Read guide
Plan competitor price and stock checks around exact variants, currency, region, and failed-page handling. Includes a synthetic JSON validator.
Read guide
Scope public professional profile sourcing with source evidence, timestamps, and human identity review. Includes privacy limits and a synthetic sample validator.
Read guide