Pricing Endpoints
Reference for Sails pricing APIs, including price prediction and appraisal workflows with request and response examples.
/api/v1/predict-price
10 creditsPredict Price
Analyze a publicly accessible image URL and return visually similar product listings with price data. The response always includes an error object (empty on success), a results array, and a normalized price range (price_lower/price_upper).
Request Body
Publicly accessible image URL to analyze. JPG, PNG, and WebP formats are supported.
Optional text description of the item to improve matching.
ISO 3166-1 alpha-2 country code used for localization and currency normalization. Defaults to au.
Maximum number of product results to return (capped at 60). Omit to return all available matches.
Response Example
{
"price_lower": 120.0,
"price_upper": 180.0,
"price_currency": "AUD",
"results": [
{
"title": "Nike Air Max 90",
"price": "120.00",
"url": "https://www.nike.com/...",
"image": "https://img.example.com/...",
"vendor": "Nike"
},
{
"title": "Air Max 90 - White/Black",
"price": "",
"url": "https://www.example-retailer.com/...",
"image": "",
"vendor": "Example Retailer"
}
],
"error": {}
}Response Fields
Lower bound of the price range in the currency implied by the request country (default au -> AUD). Null when no prices can be normalized.
Upper bound of the price range in the currency implied by the request country (default au -> AUD). Null when no prices can be normalized.
ISO 4217 currency code derived from the request country (default au -> AUD).
List of product matches. Empty when no matches or on error.
Product title from the listing; may include variant details.
Normalized price string in the request currency. Empty string when unavailable.
Listing URL for the product; may include tracking parameters.
Image URL for the listing. Empty string when unavailable.
Retailer name; empty string when unavailable.
Empty object on success. On error, contains code/message and optional url/httpStatus.
Stable error identifier (e.g. BAD_REQUEST, RATE_LIMIT). Present only on error.
Human-readable error details. Present only on error.
URL that failed during navigation, when available.
Upstream HTTP status encountered (e.g. 429). Optional.
Non-fatal image normalization failures for results[].image. Empty or omitted when none occur.
Index of the result item whose image failed to normalize.
Listing URL associated with the failed image.
Original image payload that failed to parse.
Reason the image failed to parse or upload.
Errors
Missing or invalid Authorization header or API key.
Out of credits.
Missing image_url or invalid limit.
Upstream navigation failed while fetching results.
Upstream rate limit encountered.
Server misconfiguration or missing required credentials.
Unexpected error.
Example Error Response
{
"error": {
"code": "BAD_REQUEST",
"message": "Missing image_url."
},
"results": []
}curl -X POST https://sails.live/api/v1/predict-price \-H "Authorization: Bearer sails_sk_..." \-H "Content-Type: application/json" \-d '{"image_url": "https://example.com/sneakers.jpg","description": "Black Nike Air Max 90 on a white background","country": "au","limit": 10}'
Customise Example
/api/v1/appraise-product
10 creditsAppraise Product
Appraise an item from a public image URL and return an authoritative price range, best match (if any), defect hints, and enriched comparable listings.
Request Body
Publicly accessible image URL to appraise. JPG, PNG, and WebP formats are supported.
Optional text description of the item to guide appraisal.
ISO 3166-1 alpha-2 country code used for localization and currency normalization. Defaults to au.
Maximum number of similar items to enrich and return (1-10, default 10).
Response Example
{
"similar_items": [
{
"title": "Polaroid SX-70",
"price": 265.0,
"currency": "GBP",
"url": "https://example.com/listing",
"image": "https://img.example.com/...",
"vendor": "Example Retailer"
}
],
"appraisal": {
"price_lower": 240.0,
"price_upper": 300.0,
"price_currency": "GBP",
"best_match": {
"title": "Polaroid SX-70",
"price": 265.0,
"currency": "GBP",
"url": "https://example.com/listing",
"image": "https://img.example.com/...",
"vendor": "Example Retailer"
},
"reasoning": [
"Recent UK listings for similar SX-70 models cluster between 240-300 GBP.",
"Light cosmetic wear supports a mid-range appraisal."
],
"defects": [
"Minor scuffing visible on leather panel."
]
},
"error": {
"discovery_error": null,
"image_upload_errors": [],
"price_enrichment_errors": [],
"appraisal_error": null,
"defect_error": null
}
}Response Fields
Comparable listings enriched with numeric prices in the target currency.
Title of the comparable listing.
Normalized numeric price in the target currency (null if unavailable).
ISO 4217 currency code for the normalized price.
Listing URL.
Image URL for the listing (empty string when unavailable).
Retailer or marketplace name.
Appraisal output including authoritative range, best match, and reasoning.
Lower bound of the appraisal range.
Upper bound of the appraisal range.
ISO 4217 currency code for the appraisal.
Best comparable listing when an exact match is found, otherwise null.
Bullet reasoning for the appraisal range.
Defect hints derived from the image.
Non-fatal warnings and pipeline errors (empty fields on success).
Discovery failure with code/message when no similar items can be found.
Image normalization failures (empty when none occur).
Per-item enrichment errors with index/url/message.
Appraisal stage errors; fallback appraisal is returned when set.
Defect stage errors; defects array will be empty when set.
Errors
Missing or invalid Authorization header or API key.
Out of credits.
Missing image_url or invalid request fields.
Upstream navigation failed while fetching results.
Upstream rate limit encountered.
Server misconfiguration or missing required credentials.
Unexpected error.
Example Error Response
{
"similar_items": [],
"appraisal": {
"price_lower": null,
"price_upper": null,
"price_currency": null,
"best_match": null,
"reasoning": [],
"defects": []
},
"error": {
"discovery_error": {
"code": "BAD_REQUEST",
"message": "Missing image_url."
},
"image_upload_errors": [],
"price_enrichment_errors": [],
"appraisal_error": null,
"defect_error": null
}
}curl -X POST https://sails.live/api/v1/appraise-product \-H "Authorization: Bearer sails_sk_..." \-H "Content-Type: application/json" \-d '{"image_url": "https://example.com/vintage-camera.jpg","description": "Vintage Polaroid SX-70, light wear on leather body","country": "au","limit": 10}'