Protected endpoints
API endpoints that require credentials — a session cookie for the account endpoints, and the HTTP Basic password arranged with the Haszno team for everything else on haszno.com.
The Haszno API is in developer preview. On the hosted demo, every endpoint on this page except the account and session endpoints requires the HTTP Basic password arranged with the Haszno team. See Authentication for the current credential model.
Overview
On the hosted demo at https://haszno.com, the endpoints in the endpoint groups need an HTTP Basic auth header (demo:<password>). The account and session endpoints are the exception: they are not behind the Basic wall and use a session cookie instead. On a self-hosted instance with HASZNO_API_KEY set, send that key in the x-api-key header instead of Basic auth; without it, the routes are open.
Obtain the Basic password by contacting the Haszno team. The examples on this page use the placeholder $HASZNO_BASIC (Basic auth credentials in user:pass form), sourced from your environment. Never hardcode credentials in code.
# Set once in your shell:
export HASZNO_BASIC="demo:your-password-here"
Write endpoints have real side effects. Calls that create or modify data — pricing changes, order submissions, feed imports, rule executions — cannot always be undone. Always verify intent before calling a write endpoint. The automation kill switch (GET /api/automation, PUT /api/automation) must be in a known state before running bulk operations.
Account and session endpoints
These endpoints do not need the HTTP Basic password, not even on haszno.com. They work with a session cookie (haszno_session, valid for 30 days), which register and login set.
| Method | Path | Purpose | What it needs | Mode |
|---|---|---|---|---|
| POST | /api/auth/register |
Create an account, its shop, and a session cookie | Nothing. JSON body {email, password, name, shopName}; the password needs at least 10 characters. Returns 201. |
Write |
| POST | /api/auth/login |
Log in and receive a session cookie | Nothing. JSON body {email, password}. |
Write |
| POST | /api/auth/logout |
Destroy the current session | Nothing. Clears the session cookie if one is sent; always returns {"ok": true}. |
Write |
| GET | /api/auth/me |
Current user and shop | A session cookie or a Bearer token; 401 without either. |
Read-only |
| POST | /api/auth/tokens |
Create an API Bearer token | A session cookie. JSON body {name, scope}; scope is read (default) or write. Returns 201. |
Write |
| GET | /api/auth/tokens |
List active Bearer tokens | A session cookie. | Read-only |
| DELETE | /api/auth/tokens/:id |
Revoke a Bearer token | A session cookie. | Write |
- A session cookie unlocks only these endpoints. It does not open the routes in the endpoint groups on
haszno.com. - The token endpoints accept only the session cookie, so a Bearer token cannot create, list or revoke tokens.
- With a session cookie,
POSTandDELETEon/api/auth/tokensmust come from the site's own origin (CSRF check,403otherwise).register,loginandlogoutare exempt. - On a self-hosted instance with
HASZNO_API_KEYset,register,login,logoutandmeskip the key check, but/api/auth/tokensalso needsx-api-key. - Rate limits for
registerandloginare listed in Errors.
Endpoint groups
On haszno.com, every endpoint in the groups below needs the HTTP Basic password.
Shop settings
| Method | Path | Purpose | Mode |
|---|---|---|---|
| PUT | /api/settings |
Update pricing rules and shipping markets | Write |
Products — own shop
| Method | Path | Purpose | Mode |
|---|---|---|---|
| PATCH | /api/products/:id |
Update market price or set a manual price override | Write |
| POST | /api/products/:id/listing |
List or unlist a product | Write |
| POST | /api/products/:id/ai-description |
Generate a Hungarian product description via AI | Write |
| POST | /api/products/apply-prices |
Apply the recommended price to all or selected products | Write |
| GET | /api/products/:id/offers |
Last 24 h market offers for a product | Read-only |
| GET | /api/products/:id/price-history |
Price change log for a product | Read-only |
Supplier network and catalogue
| Method | Path | Purpose | Mode |
|---|---|---|---|
| GET | /api/network/suppliers |
Network suppliers with connection status | Read-only |
| GET | /api/network/suppliers/:id/products |
Full catalogue for a network supplier | Read-only |
| POST | /api/network/suppliers/:id/connect |
Connect and import a supplier's catalogue | Write |
| POST | /api/network/suppliers/:id/disconnect |
Disconnect a supplier | Write |
| POST | /api/network/suppliers/:id/sync |
Refresh cost and stock from live catalogue | Write |
| GET | /api/network/supplier-view/:supplierId |
Aggregated reseller stats per product (k-anon ≥ 5 shops) | Read-only |
| POST | /api/network/products/:id/import |
Add one network product to the own shop | Write |
| GET | /api/catalogue/products |
Browse the partner catalogue (paginated, search, facets) | Read-only |
| POST | /api/import-list |
Add network products to the import list | Write |
| POST | /api/import-list/push |
Push import list items to a connected webshop | Write |
| POST | /api/import-list/discard |
Discard import list items | Write |
Recommendations and ideas
| Method | Path | Purpose | Mode |
|---|---|---|---|
| GET | /api/recommendations |
Trending and margin-safe product shortlist | Read-only |
| POST | /api/recommendations/ai |
AI-curated shortlist via Claude (cached 24 h) | Read-only |
Orders
| Method | Path | Purpose | Mode |
|---|---|---|---|
| POST | /api/webhooks/order |
Receive a new order from a connected shop | Write |
| POST | /api/demo/order |
Create a random demo order | Write |
| POST | /api/orders/:id/ship |
Mark an order as shipped | Write |
Feeds
| Method | Path | Purpose | Mode |
|---|---|---|---|
| POST | /api/feeds/import |
Import a supplier product feed (CSV or XML, up to 10 MB) | Write |
| POST | /api/market-prices/import |
Import market comparison prices from CSV | Write |
| GET | /feed/arukereso.xml |
Árukereső XML outbound product feed | Read-only |
| GET | /feed/google.xml |
Google Merchant XML outbound product feed | Read-only |
Rules and automation
| Method | Path | Purpose | Mode |
|---|---|---|---|
| GET | /api/rules/templates |
Built-in rule templates | Read-only |
| GET | /api/rules |
List configured rules | Read-only |
| POST | /api/rules |
Create a rule | Write |
| PATCH | /api/rules/:id |
Update a rule | Write |
| DELETE | /api/rules/:id |
Delete a rule permanently | Write |
| POST | /api/rules/:id/run |
Manually run one rule | Write |
| POST | /api/rules/run-all |
Run all manual-trigger rules | Write |
| POST | /api/rules/trigger |
Fire a named event trigger | Write |
| GET | /api/rule-runs |
Rule execution log | Read-only |
| POST | /api/rule-runs/undo |
Undo the last rule run | Write |
| GET | /api/automation |
Automation kill switch state | Read-only |
| PUT | /api/automation |
Set automation paused state | Write |
Price proposals
| Method | Path | Purpose | Mode |
|---|---|---|---|
| POST | /api/proposals/approve |
Approve proposals (all pending, or by ID list) | Write |
| POST | /api/proposals/reject |
Reject proposals | Write |
| POST | /api/proposals/rollback |
Roll back an approved proposal batch | Write |
Peers and sharing
| Method | Path | Purpose | Mode |
|---|---|---|---|
| POST | /api/peers/invites |
Create a peer invite to share a supplier | Write |
| GET | /api/peers/invites/:code |
Get an invite by code | Read-only |
| DELETE | /api/peers/invites/:code |
Delete an invite | Write |
| POST | /api/peers/invites/:code/accept |
Accept a peer invite | Write |
| DELETE | /api/peers/links/:id |
Remove a peer link | Write |
| PUT | /api/peers/suppliers/:id/visibility |
Set supplier visibility (private / network) | Write |
Shop connections and marketplace
| Method | Path | Purpose | Mode |
|---|---|---|---|
| GET | /api/shop-connections |
List shop connections | Read-only |
| POST | /api/shop-connections |
Create a shop connection | Write |
| GET | /api/shop-connections/:id |
Get a connection | Read-only |
| DELETE | /api/shop-connections/:id |
Delete a connection | Write |
| POST | /api/shop-connections/:id/test |
Test a connection | Read-only |
| POST | /api/shop-connections/:id/sync |
Sync products to a connected shop | Write |
| GET | /api/shop-connections/:id/runs |
Sync run log | Read-only |
| GET | /api/shop-connections/:id/pricing |
Per-shop pricing rules | Read-only |
| PUT | /api/shop-connections/:id/pricing |
Update per-shop pricing rules | Write |
| POST | /api/shop-connections/:id/pricing/reprice |
Reprice all products for a shop | Write |
| GET | /api/marketplace/connections |
List marketplace connections | Read-only |
| POST | /api/marketplace/connections |
Create a marketplace connection | Write |
| GET | /api/marketplace/connections/:id |
Get a marketplace connection | Read-only |
| DELETE | /api/marketplace/connections/:id |
Delete a marketplace connection | Write |
| PUT | /api/marketplace/connections/:id/credentials |
Update credentials | Write |
| POST | /api/marketplace/connections/:id/test |
Test connection | Read-only |
| GET | /api/marketplace/connections/:id/listings |
Listings for a connection | Read-only |
| POST | /api/marketplace/listings |
Create a marketplace listing | Write |
| GET | /api/marketplace/listings/:id/preview |
Preview a listing | Read-only |
| POST | /api/marketplace/listings/:id/publish |
Publish a listing | Write |
| POST | /api/marketplace/listings/:id/update |
Update a live listing | Write |
| POST | /api/marketplace/listings/:id/unpublish |
Unpublish a listing | Write |
| GET | /api/marketplace/listings/:id/price-history |
Listing price history | Read-only |
| POST | /api/marketplace/connections/:id/ingest-orders |
Pull orders from marketplace | Write |
Routing
| Method | Path | Purpose | Mode |
|---|---|---|---|
| GET | /api/routing/sources |
All routing sources | Read-only |
| GET | /api/routing/sources/:productId |
Routing sources for a product | Read-only |
| PUT | /api/routing/sources/:productId |
Set routing sources | Write |
| DELETE | /api/routing/sources/:productId/:supplierId |
Remove a routing source | Write |
| GET | /api/routing/decisions |
Recent routing decisions log | Read-only |
Fulfilment
| Method | Path | Purpose | Mode |
|---|---|---|---|
| GET | /api/fulfilment/settings |
Fulfilment provider settings | Read-only |
| GET | /api/fulfilment/invoices |
Invoice list | Read-only |
| GET | /api/fulfilment/shipments |
Shipment list | Read-only |
| GET | /api/fulfilment/orders/:orderId/label/download |
Download shipping label PDF | Read-only |
| GET | /api/fulfilment/orders/:orderId/tracking |
Get tracking status | Read-only |
| GET | /api/fulfilment/settings/notifications |
Notification settings | Read-only |
| PUT | /api/fulfilment/settings/notifications |
Update notification settings | Write |
Insights and reports
| Method | Path | Purpose | Mode |
|---|---|---|---|
| GET | /api/insights/network-signals |
Aggregated keyword signals (k-anon ≥ 5 shops) | Read-only |
| GET | /api/insights/network-signal |
Single keyword signal | Read-only |
| POST | /api/trends/keywords |
Fill missing trend keywords via AI | Write |
| GET | /api/reports |
List reports | Read-only |
| GET | /api/reports/preview |
Preview current report | Read-only |
| GET | /api/reports/:id |
Get a report as JSON | Read-only |
| GET | /api/reports/:id/html |
Get a report as HTML | Read-only |
Partners and metrics
| Method | Path | Purpose | Mode |
|---|---|---|---|
| GET | /api/partners/metrics |
Per-supplier performance metrics | Read-only |
| GET | /api/partners/metrics/:supplierId/history |
Metric history for a supplier | Read-only |
| POST | /api/partners/metrics/compute |
Recompute metrics | Write |
Billing
| Method | Path | Purpose | Mode |
|---|---|---|---|
| GET | /api/billing/summary |
Current billing plan and usage | Read-only |
| GET | /api/billing/history |
Payment history | Read-only |
| POST | /api/billing/plan |
Change billing plan (rate-limited: 5 / min) | Write |
Group buys
| Method | Path | Purpose | Mode |
|---|---|---|---|
| GET | /api/groupbuys |
List group buys | Read-only |
| GET | /api/groupbuys/:id |
Get a group buy | Read-only |
| POST | /api/groupbuys |
Create a group buy | Write |
| POST | /api/groupbuys/:id/commit |
Commit to a group buy | Write |
| POST | /api/groupbuys/:id/close |
Close a group buy | Write |
| POST | /api/groupbuys/:id/cancel |
Cancel a group buy | Write |
Store connect API, search, and analysis
| Method | Path | Purpose | Mode |
|---|---|---|---|
| POST | /api/connect/stores |
Register a store | Write |
| GET | /api/connect/stores |
List stores | Read-only |
| GET | /api/connect/stores/:id |
Get a store | Read-only |
| PUT | /api/connect/stores/:id/domain |
Set the store domain | Write |
| POST | /api/connect/stores/:id/verify-domain |
Verify domain ownership | Write |
| PUT | /api/connect/stores/:id/credentials |
Update credentials | Write |
| POST | /api/connect/stores/:id/test |
Test a store connection | Read-only |
| POST | /api/connect/stores/:id/push |
Push product updates to a store | Write |
| GET | /api/search/suggest |
Autocomplete suggestion for catalogue search | Read-only |
| POST | /api/analysis |
Start a competitor or site analysis job | Write |
| GET | /api/analysis/:id |
Get analysis job result | Read-only |
Shop launcher and onboarding
| Method | Path | Purpose | Mode |
|---|---|---|---|
| GET | /api/launcher/jobs |
List shop build jobs | Read-only |
| POST | /api/launcher/jobs |
Create a shop build job | Write |
| GET | /api/launcher/jobs/:id |
Get job status | Read-only |
| POST | /api/launcher/jobs/:id/generate |
Generate shop content | Write |
| GET | /api/launcher/jobs/:id/plan |
Get build plan | Read-only |
| GET | /api/launcher/jobs/:id/download |
Download build artifact | Read-only |
| GET | /api/launcher/themes |
Available themes | Read-only |
| GET | /api/onboarding |
Current onboarding state | Read-only |
| PUT | /api/onboarding |
Update onboarding step | Write |
| POST | /api/onboarding/complete |
Mark onboarding complete | Write |
Full reference — 10 most useful endpoints
GET/api/recommendations
Returns a shortlist of products from the partner catalogue ranked by trend momentum, margin potential, and market availability. Use this to surface products worth adding to the shop.
Protected Read-only
Parameters
| Name | In | Type | Required | Default | Description |
|---|---|---|---|---|---|
cats |
query | comma-separated string | No | (all) | Filter by category keys, e.g. kert,sport. |
Request
curl --fail-with-body \
-u "$HASZNO_BASIC" \
'https://haszno.com/api/recommendations?cats=kert'
Response (200)
| Field | Type | Description |
|---|---|---|
anchor |
string | Reference keyword used for all trend comparisons. |
geo |
string | Always "HU". |
items |
array | Recommended products — see sub-fields below. |
items sub-fields (selected)
| Field | Type | Description |
|---|---|---|
id |
integer | Product ID. |
name |
string | Product name (Hungarian). |
sku |
string | Supplier SKU. |
supplierName |
string | Supplier display name. |
wholesaleNet |
integer (HUF) | Net wholesale cost. |
rrpGross |
integer | null | Supplier recommended retail price. |
stock |
integer | Available stock. |
marginNet |
integer (HUF) | Net margin at the recommended price. |
marginPct |
number | Margin percentage at the recommended price. |
recommendedPriceGross |
integer (HUF) | Suggested gross selling price. |
keyword |
string | Primary trend keyword. |
interest4w |
number | Trend interest over the last 4 weeks (0–100). |
interest12m |
number | Trend interest over the last 12 months (0–100). |
trend |
string | Trend direction: "up", "down", or "stable". |
momentum |
number | Composite momentum score. |
score100 |
number | Combined rank score out of 100. |
{
"anchor": "kerti napernyő",
"geo": "HU",
"items": [
{
"id": 212,
"name": "Kerti napernyő · Prémium",
"sku": "DEMO-212",
"supplierName": "Példa-partner · Kert és növény",
"wholesaleNet": 3200,
"rrpGross": 7990,
"stock": 15,
"marginNet": 2080,
"marginPct": 32.8,
"recommendedPriceGross": 7490,
"keyword": "kerti napernyő",
"interest4w": 72,
"interest12m": 61,
"trend": "up",
"momentum": 1.18,
"score100": 84
}
]
}
GET/api/catalogue/products
Searches the shared partner product catalogue. Supports free-text search, category and supplier filters, margin and price bands, and pagination. This is the primary discovery endpoint for adding new products to the shop.
Protected Read-only
Parameters
| Name | In | Type | Required | Default | Description |
|---|---|---|---|---|---|
q |
query | string | No | — | Free-text search on product name or category. |
cats |
query | comma-separated string | No | (all) | Category keys to include. |
partner |
query | integer | No | (all) | Supplier ID filter. |
minMarginPct |
query | number | No | — | Minimum margin percentage at the RRP. |
maxPrice |
query | integer (HUF) | No | — | Maximum rrpGross. |
minPrice |
query | integer (HUF) | No | — | Minimum rrpGross. |
inStock |
query | "1" |
No | — | When set, returns only in-stock products. |
hasImage |
query | "1" |
No | — | When set, returns only products with an image. |
country |
query | string (2-char) | No | — | Supplier country code. |
sort |
query | string | No | "name_asc" |
Sort order: "margin_desc", "price_asc", "price_desc", "name_asc". |
page |
query | integer ≥ 1 | No | 1 |
Page number. |
pageSize |
query | integer 1–100 | No | 24 |
Items per page. |
Request
curl --fail-with-body \
-u "$HASZNO_BASIC" \
'https://haszno.com/api/catalogue/products?q=napernyő&inStock=1&sort=margin_desc&pageSize=10'
Response (200)
| Field | Type | Description |
|---|---|---|
items |
array | Products on the current page. |
total |
integer | Total matching products across all pages. |
facets |
object | Aggregated filter counts (categories, suppliers, countries). |
Each item in items: id, name, sku, supplierName, supplierId, category, wholesaleNet (HUF), rrpGross (HUF), stock, imageUrl, country, marginNet (HUF), marginPct.
{
"items": [
{
"id": 212,
"name": "Kerti napernyő · Prémium",
"sku": "SUP-212",
"supplierName": "Minta Kft.",
"supplierId": 7,
"category": "kert",
"wholesaleNet": 3200,
"rrpGross": 7990,
"stock": 15,
"imageUrl": null,
"country": "HU",
"marginNet": 2080,
"marginPct": 32.8
}
],
"total": 142,
"facets": {
"categories": [{"key": "kert", "count": 142}],
"suppliers": [{"id": 7, "name": "Minta Kft.", "count": 142}]
}
}
POST/api/feeds/import
Imports a supplier product feed. Accepts CSV or XML format up to 10 MB. Creates new products and updates existing ones matched by SKU.
Protected Write
This endpoint performs a bulk write. Import replaces cost and stock data for matched SKUs. Verify the feed content before importing to avoid overwriting prices with incorrect wholesale costs.
Request body (Content-Type: application/json)
| Field | Type | Required | Description |
|---|---|---|---|
supplierId |
integer | Yes | ID of the supplier this feed belongs to. |
format |
string | Yes | "csv" or "xml". |
content |
string | Yes | Full feed content as a string (1 byte – 10 MB). |
CSV format: one header row followed by data rows. Required columns: sku, name, costNet, stock. Optional: rrpGross.
sku,name,costNet,stock,rrpGross
ABC-001,Kerti szék,2100,10,4990
ABC-002,Kerti asztal,8500,3,19990
Request
curl --fail-with-body \
-u "$HASZNO_BASIC" \
-X POST https://haszno.com/api/feeds/import \
-H 'Content-Type: application/json' \
-d '{
"supplierId": 3,
"format": "csv",
"content": "sku,name,costNet,stock,rrpGross\nABC-001,Kerti szék,2100,10,4990"
}'
Response (200)
| Field | Type | Description |
|---|---|---|
created |
integer | Number of new products created. |
updated |
integer | Number of existing products updated. |
total |
integer | Total rows processed. |
{"created": 1, "updated": 0, "total": 1}
Error responses
| Status | When |
|---|---|
| 400 | Invalid format, missing required columns, or malformed feed content. |
| 413 | Feed content exceeds 10 MB. |
| 429 | Rate limit exceeded (20 requests per minute). |
POST/api/webhooks/order
Receives a new order from a connected webshop. The API validates the SKUs, checks stock, and creates an order record for processing.
Protected Write
This endpoint creates an order that immediately reserves stock. It is not a dry run. If you receive a 409 (out of stock), you must handle the error on the shop side — the order is not created.
Request body (Content-Type: application/json)
| Field | Type | Required | Description |
|---|---|---|---|
externalId |
string (1–64) | Yes | Unique order ID from the webshop. Must be unique across all orders for this shop. |
customerName |
string (1–120) | Yes | Customer full name. |
customerEmail |
string | No | Customer email address. |
address |
string (1–300) | Yes | Delivery address as a single string. |
items |
array | Yes | Order line items — see below. |
items array item
| Field | Type | Required | Description |
|---|---|---|---|
sku |
string | Yes | Product SKU. Must match an existing product in the shop. |
qty |
integer > 0 | Yes | Quantity ordered. |
Request
curl --fail-with-body \
-u "$HASZNO_BASIC" \
-X POST https://haszno.com/api/webhooks/order \
-H 'Content-Type: application/json' \
-d '{
"externalId": "SHOP-20261112-001",
"customerName": "Kiss Éva",
"address": "1111 Budapest, Példa utca 1.",
"items": [
{"sku": "ABC-001", "qty": 2}
]
}'
Response (201)
| Field | Type | Description |
|---|---|---|
id |
integer | Internal order ID assigned by Haszno. |
{"id": 1047}
Error responses
| Status | Message | When |
|---|---|---|
| 400 | "Ismeretlen cikkszám: ABC-999" |
SKU not found in the shop. |
| 409 | "Elfogyott: ABC-001" |
SKU exists but has zero stock. |
Error messages are returned in Hungarian. See Errors and rate limits for the full error schema.
PUT/api/settings
Updates the shop's global pricing rules. All fields are optional; omit a field to leave its current value unchanged.
Protected Write
Changing shippingMarkets immediately triggers a recomputation of marketMinGross for every product. This may take several seconds on large catalogues. Pricing recommendations update accordingly.
Request body (Content-Type: application/json)
| Field | Type | Required | Description |
|---|---|---|---|
undercutPct |
number 0–50 | No | Percentage to undercut the market minimum when computing the recommended price. |
minMarginPct |
number 0–90 | No | Minimum net margin percentage enforced by the floor price calculation. |
vatPct |
number 0–50 | No | VAT rate used for all gross/net conversions. |
shippingMarkets |
string[] | No | ISO country codes to monitor for market prices. At least one value required if present. Valid codes: HU, SK, DE, AT, CZ, PL, RO. |
Request
curl --fail-with-body \
-u "$HASZNO_BASIC" \
-X PUT https://haszno.com/api/settings \
-H 'Content-Type: application/json' \
-d '{
"undercutPct": 2,
"minMarginPct": 15,
"shippingMarkets": ["HU", "SK"]
}'
Response (200)
Returns the updated settings row. Same schema as GET /api/settings (without the demo field on a real instance).
{
"id": 1,
"undercutPct": 2,
"minMarginPct": 15,
"vatPct": 27,
"shippingMarkets": ["HU", "SK"],
"automationPaused": false
}
PATCH/api/products/:id
Updates market price data or sets a manual gross price override for a single product.
Protected Write
Path parameters
| Name | Type | Description |
|---|---|---|
id |
integer | Product ID. |
Request body (Content-Type: application/json)
All fields are optional. Send only the fields you want to change.
| Field | Type | Description |
|---|---|---|
marketMinGross |
integer > 0 | null | Manually set the cheapest known market price (gross, HUF). Set to null to clear. |
marketShop |
string (max 120) | null | Shop name for the manually set market price. Set to null to clear. |
priceGross |
integer > 0 | Manual gross price override. Must be a positive integer. |
Request
curl --fail-with-body \
-u "$HASZNO_BASIC" \
-X PATCH https://haszno.com/api/products/101 \
-H 'Content-Type: application/json' \
-d '{"priceGross": 2990}'
Response (200)
Returns the updated product row. Same schema as a single item from GET /api/products.
POST/api/products/apply-prices
Applies the recommended price to listed products. By default applies to all listed products. Optionally restricted to a subset by IDs or supplier.
Protected Write
This is a bulk write. It updates priceGross for every matched product to its current recommended.priceGross. Run GET /api/products first to review the recommendations before applying.
Request body (Content-Type: application/json)
All fields are optional.
| Field | Type | Description |
|---|---|---|
ids |
integer[] | Product IDs to apply prices to. If omitted, applies to all listed products. Send [] for a no-op. |
supplier |
integer[] | Restrict to products from these supplier IDs. |
Request
# Apply to all listed products:
curl --fail-with-body \
-u "$HASZNO_BASIC" \
-X POST https://haszno.com/api/products/apply-prices \
-H 'Content-Type: application/json' \
-d '{}'
# Apply to specific products only:
curl --fail-with-body \
-u "$HASZNO_BASIC" \
-X POST https://haszno.com/api/products/apply-prices \
-H 'Content-Type: application/json' \
-d '{"ids": [101, 102, 103]}'
Response (200)
| Field | Type | Description |
|---|---|---|
changed |
integer | Number of products whose price was updated. |
total |
integer | Number of products evaluated. |
{"changed": 847, "total": 1400}
GET/api/rules
Returns all automation rules configured for the shop.
Protected Read-only
Parameters
None.
Request
curl --fail-with-body \
-u "$HASZNO_BASIC" \
https://haszno.com/api/rules
Response (200)
Returns an array of rule objects.
| Field | Type | Description |
|---|---|---|
id |
integer | Rule ID. |
name |
string | Display name. |
enabled |
boolean | Whether the rule is active. |
trigger |
string | When the rule runs — see enum below. |
conditions |
array | Conditions that must all match — see sub-fields below. |
actions |
array | Actions taken when conditions match — see sub-fields below. |
template |
string | null | Built-in template key, if the rule was created from a template. |
createdAt |
ISO-8601 string | Creation timestamp. |
trigger enum
| Value | Meaning |
|---|---|
"feed_import" |
Runs after each feed import. |
"market_price" |
Runs after market prices are refreshed. |
"manual" |
Runs only when triggered manually or via POST /api/rules/:id/run. |
conditions item sub-fields
| Field | Type | Description |
|---|---|---|
field |
string | Product field to evaluate, e.g. "current.marginPct". |
op |
string | Comparison operator: "lt", "lte", "gt", "gte", "eq", "neq", "changed". |
value |
number | string | Threshold value. |
actions item sub-fields
| Field | Type | Description |
|---|---|---|
type |
string | Action type: "unlist", "propose_price", "notify". |
[
{
"id": 5,
"name": "Veszteséges termékek javaslata",
"enabled": true,
"trigger": "market_price",
"conditions": [
{"field": "current.marginPct", "op": "lt", "value": 0}
],
"actions": [
{"type": "propose_price"}
],
"template": "loss-guard",
"createdAt": "2026-10-01T10:00:00.000Z"
}
]
GET/api/network/suppliers
Returns all suppliers available in the Haszno network, together with the shop's connection status for each.
Protected Read-only
Parameters
None.
Request
curl --fail-with-body \
-u "$HASZNO_BASIC" \
https://haszno.com/api/network/suppliers
Response (200)
Returns an array of network supplier objects.
| Field | Type | Description |
|---|---|---|
id |
integer | Supplier ID. |
name |
string | Supplier display name. |
category |
string | Primary category key. |
country |
string | ISO country code. |
productCount |
integer | Total products offered. |
connected |
boolean | Whether the shop is already connected to this supplier. |
avgResellerMarginPct |
number | null | Aggregated average reseller margin across all connected shops (k-anon ≥ 5 shops; null when fewer than 5 shops have connected). |
[
{
"id": 7,
"name": "Minta Kft.",
"category": "kert",
"country": "HU",
"productCount": 340,
"connected": false,
"avgResellerMarginPct": 28.4
}
]
avgResellerMarginPct is an aggregated figure derived from at least 5 shops. Individual shop margins are never exposed through this endpoint.
POST/api/products/:id/listing
Lists or unlists a single product. When listing a product that was previously unlisted, priceGross is automatically set to the current recommended.priceGross.
Protected Write
Path parameters
| Name | Type | Description |
|---|---|---|
id |
integer | Product ID. |
Request body (Content-Type: application/json)
| Field | Type | Required | Description |
|---|---|---|---|
listed |
boolean | Yes | true to list; false to unlist. |
Request
curl --fail-with-body \
-u "$HASZNO_BASIC" \
-X POST https://haszno.com/api/products/101/listing \
-H 'Content-Type: application/json' \
-d '{"listed": true}'
Response (200)
Returns the updated product row. Same schema as a single item from GET /api/products. The listed field reflects the new state and priceGross reflects the auto-applied recommended price when listing.
{
"id": 101,
"listed": true,
"priceGross": 2090,
"recommended": {
"priceGross": 2090,
"status": "versenykepes"
}
}
.com