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
Rows without signal are kept and flagged with price_confidence = low so input cardinality is preserved.
| Column | Type | Description |
|---|---|---|
price_amount |
number | Lowest visible published price for the vendor, as a numeric value |
price_currency |
string | ISO-4217 currency code, typically EUR or USD |
price_period |
string | Billing period attached to the amount: month, year, one_time, or unknown |
price_confidence |
string | Extraction confidence: high, medium, or low |
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("price_amount >= 1000").
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 blank price_amount and price_confidence = low. Job still completes done. |
| Login wall | Row returned with blank price_amount and price_confidence = low. |
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.