Pricing
Pricing
Extract published rate cards from each point of interest's website. The module walks a cascade of structured sources (JSON-LD, Microdata, Open Graph, dedicated pricing routes, homepage fallbacks) and returns a normalized amount, currency, and billing period per site.
It is an enrichment step, not a discovery step. It expects a prior list of POIs with a resolved site_web: typically the output of a scrap job.
Inputs
Items missing site_web are silently dropped at validation time.
| Field | Type | Required | Notes |
|---|---|---|---|
items |
array | yes | 1 to 10,000 points of interest |
items[].site_web |
string | yes | Absolute URL of the vendor's main site |
source_job_id |
string | no | ID of the upstream job that produced the list |
Outputs
Each input row keeps its original columns and gains the columns below. Rows without a price are kept with these columns empty, so input cardinality is preserved.
| Column | Description |
|---|---|
pricing_min_eur |
Lowest price found, as a number with two decimals. Despite the name, the amount is given in the detected currency, without conversion. |
pricing_max_eur |
Highest price found, same rule. |
pricing_currency |
EUR, USD or GBP. |
pricing_period |
mois (monthly) or an (yearly) when a period is attached to the price, empty otherwise. |
pricing_source |
Where the price was read: json_ld, microdata, og, pricing_page or homepage_regex. |
pricing_source_url |
URL of the page the price was read from. |
pricing_confidence |
high, medium or low. |
The registry lists price_amount, price_currency, price_period and price_confidence under produces: these are signal names that correspond to the columns above.
Lifecycle
Standard outsend job lifecycle; see /docs/concepts/jobs-lifecycle. Pricing jobs are serialized against other network-heavy jobs on the same account.
Pipeline
needs: [site_web]
produces: [price_amount, price_currency, price_period, price_confidence]
Typical chain: scrap -> pricing -> filter, with a category rule on pricing_confidence (values high, medium) to keep the vendors whose price was read reliably.
Endpoints
| Method | Path | Purpose |
|---|---|---|
POST |
/api/jobs/pricing |
Create a pricing job |
GET |
/api/jobs |
List the caller's jobs |
GET |
/api/jobs/{id} |
Fetch a single job and its progress |
GET |
/api/jobs/{id}/download |
Stream results as JSON or CSV |
POST |
/api/jobs/{id}/cancel |
Stop a running job |
Create a job
POST /api/jobs/pricing
Content-Type: application/json
{
"items": [
{ "site_web": "https://example-saas.com" },
{ "site_web": "https://another-vendor.io" }
],
"source_job_id": "job_01HX..."
}
Limits
See /docs/concepts/limits. One concurrent pricing job per account.
Errors
Per-item outcomes rather than whole-job failure.
| Condition | Behavior |
|---|---|
| No pricing page found | Row returned with empty pricing_* columns. Job still completes done. |
| Login wall | Row returned with empty pricing_* columns. |
Job-level errors (invalid payload, empty input after filtering, quota exceeded) surface as 400 from POST /api/jobs/pricing with a JobValidationError message.
What's next
- Tech stack: detect the technologies behind the same sites to pair price with build profile.
- Ads intelligence: see which of the priced vendors are actively spending on paid acquisition.