Esivaatimukset ja turvallisuus
Ratkaise kanoninen tuotetunniste ja tarkista sen nykyiset tarjoukset. Aloita sandbox-avaimella, jolla on catalog:read-oikeus. Selainharjoitus käyttää eristettyä esimerkkiaineistoa eikä tarvitse avainta.
Suorita eristetty harjoitus
- 1Hylkää virheellinen raja
- 2Hae tuotetunnisteet
- 3Tarkista löydetty tuote
Suorita omalta palvelimeltasi
set -euo pipefail
# Requires bash, curl and jq. Use an isolated sandbox API key.
DOCS_BASE_URL="${DOCS_BASE_URL:-https://hintadata.fi}"
: "${HINTADATA_API_KEY:?Set a sandbox API key privately}"
DOCS_VARIABLES=$(jq -cn '{}')
DOCS_RESPONSE_FILE=$(mktemp)
trap 'rm -f -- "$DOCS_RESPONSE_FILE"' EXIT
# invalid: expected HTTP 400
DOCS_PATH="$(jq -cnr --argjson vars "$DOCS_VARIABLES" '"/v1/search?q=sony&limit=0"')"
DOCS_STATUS=$(curl --silent --show-error --max-time 20 --output "$DOCS_RESPONSE_FILE" --write-out '%{http_code}' -X 'GET' "$DOCS_BASE_URL$DOCS_PATH" -H "Authorization: Bearer $HINTADATA_API_KEY")
[[ "$DOCS_STATUS" == '400' ]] || { printf '%s\n' 'Unexpected HTTP status at invalid' >&2; exit 1; }
DOCS_RESPONSE=$(jq -c . "$DOCS_RESPONSE_FILE")
jq -en --argjson vars "$DOCS_VARIABLES" --argjson response "$DOCS_RESPONSE" --argjson status "$DOCS_STATUS" '((($response | if type == "object" or type == "array" then has("error") else false end) and ($response["error"] | if type == "object" or type == "array" then has("code") else false end))) and ($response["error"]["code"] == ("invalid_request"))' >/dev/null
printf '%s\n' 'invalid: verified'
# search: expected HTTP 200
DOCS_PATH="$(jq -cnr --argjson vars "$DOCS_VARIABLES" '"/v1/search?q=sony&limit=2"')"
DOCS_STATUS=$(curl --silent --show-error --max-time 20 --output "$DOCS_RESPONSE_FILE" --write-out '%{http_code}' -X 'GET' "$DOCS_BASE_URL$DOCS_PATH" -H "Authorization: Bearer $HINTADATA_API_KEY")
[[ "$DOCS_STATUS" == '200' ]] || { printf '%s\n' 'Unexpected HTTP status at search' >&2; exit 1; }
DOCS_RESPONSE=$(jq -c . "$DOCS_RESPONSE_FILE")
jq -en --argjson vars "$DOCS_VARIABLES" --argjson response "$DOCS_RESPONSE" --argjson status "$DOCS_STATUS" '((($response | if type == "object" or type == "array" then has("query") else false end))) and ($response["query"] == ("sony"))' >/dev/null
jq -en --argjson vars "$DOCS_VARIABLES" --argjson response "$DOCS_RESPONSE" --argjson status "$DOCS_STATUS" '((($response | if type == "object" or type == "array" then has("items") else false end) and ($response["items"] | if type == "object" or type == "array" then has(0) else false end) and ($response["items"][0] | if type == "object" or type == "array" then has("canonical_product_id") else false end)) == true)' >/dev/null
DOCS_VARIABLES=$(jq -cn --argjson vars "$DOCS_VARIABLES" --argjson response "$DOCS_RESPONSE" '$vars + {"productId":$response["items"][0]["canonical_product_id"],"secondId":$response["items"][1]["canonical_product_id"]}')
printf '%s\n' 'search: verified'
# inspect: expected HTTP 200
jq -e 'has("productId")' <<< "$DOCS_VARIABLES" >/dev/null
DOCS_PATH="$(jq -cnr --argjson vars "$DOCS_VARIABLES" '"/v1/products/" + ($vars["productId"] | tostring | @uri) + ""')"
DOCS_STATUS=$(curl --silent --show-error --max-time 20 --output "$DOCS_RESPONSE_FILE" --write-out '%{http_code}' -X 'GET' "$DOCS_BASE_URL$DOCS_PATH" -H "Authorization: Bearer $HINTADATA_API_KEY")
[[ "$DOCS_STATUS" == '200' ]] || { printf '%s\n' 'Unexpected HTTP status at inspect' >&2; exit 1; }
DOCS_RESPONSE=$(jq -c . "$DOCS_RESPONSE_FILE")
jq -en --argjson vars "$DOCS_VARIABLES" --argjson response "$DOCS_RESPONSE" --argjson status "$DOCS_STATUS" '((($response | if type == "object" or type == "array" then has("canonical_product_id") else false end))) and ($response["canonical_product_id"] == ($vars["productId"]))' >/dev/null
jq -en --argjson vars "$DOCS_VARIABLES" --argjson response "$DOCS_RESPONSE" --argjson status "$DOCS_STATUS" '((($response | if type == "object" or type == "array" then has("offers") else false end) and ($response["offers"] | if type == "object" or type == "array" then has(0) else false end) and ($response["offers"][0] | if type == "object" or type == "array" then has("delivered_price") else false end)) == true)' >/dev/null
jq -en --argjson vars "$DOCS_VARIABLES" --argjson response "$DOCS_RESPONSE" --argjson status "$DOCS_STATUS" '((($response | if type == "object" or type == "array" then has("canonical_product_id") else false end))) and ($response["canonical_product_id"] == ($vars["productId"]))' >/dev/null
printf '%s\n' 'inspect: verified'Varmista tulos
Odotettu vastaus on HTTP 200 ja kentät query, items, total ja next_offset. Tallenna canonical_product_id, älä näyttönimeä. Tyhjä items on kelvollinen hakutulos: tarkenna q ennen tunnisteen lukemista. X-Data-Mode: demo ei ole näyttöä tuotantodatasta.
Palautuminen ja siivous
400 invalid_request: aseta q:n pituudeksi 1–120 merkkiä ja limit-arvoksi 1–100. 401: vaihda virheellinen avain; 403: tarkista oikeudet ja tilaus. 503 source_unavailable/source_stale: pyydä lähteen omistajaa julkaisemaan tuore aineisto. Älä esitä esimerkkiaineistoa tuotantodatan korvikkeena.
Noudata 429- ja tilapäisissä 5xx-virheissä Retry-After-ohjetta ja rajaa uudelleenyritykset. Älä vie API-avaimia tai vastausrunkoja lokeihin tai tukipyyntöihin.
Vapaaehtoinen tuotantotehtävän mittaus
Nimenomainen suostumus tallentaa aloituksen ja ensimmäisen onnistuneen tuotantohaun samassa tunnistetussa työtilassa ja ympäristössä. Kuitti vanhenee 30 minuutissa eikä anna API-oikeuksia. Lukeminen, selainharjoitukset ja testiavainten pyynnöt eivät ole tuotanto-onnistumisia. Analytiikkaan menevät vain tehtävä, kieli, julkaisu, aikaleimat ja satunnainen korrelaatiotunniste; ei hakutekstiä, sähköpostia, avainta eikä vastausrunkoa. Jätä molemmat mittausotsakkeet pois, jos et halua osallistua. Jos mittaus ei ole käytettävissä, jatka yllä olevalla tavallisella hakukomennolla.
set -euo pipefail
# Optional: explicit analytics consent; use a LIVE key only when ready for live data.
ATTEMPT=$(curl --fail-with-body --silent --show-error https://hintadata.fi/api/docs/tasks \
-H "Authorization: Bearer $HINTADATA_API_KEY" -H 'X-Analytics-Consent: granted' \
-H 'Content-Type: application/json' \
--data '{"task":"first-product-search","locale":"fi"}' | jq -er '.receipt')
curl --fail-with-body --silent --show-error --get https://hintadata.fi/v1/search \
-H "Authorization: Bearer $HINTADATA_API_KEY" -H 'X-Analytics-Consent: granted' \
-H "X-Docs-Attempt: $ATTEMPT" --data-urlencode 'q=sony' --data 'limit=2' | jq .
unset ATTEMPT