FR
Copied
Modules

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