---
title: "Validate a product feed for Google, Shopify or Meta"
method: POST
path: "/v1/merchant/validate"
tags: ["merchant"]
---

# Validate a product feed for Google, Shopify or Meta

`POST /v1/merchant/validate`

## Request

- Base URL: `https://api.relaex-engineers.de`
- URL: `https://api.relaex-engineers.de/v1/merchant/validate`
- Auth: none declared

Validates a product feed against a platform profile.

**Input:** multipart `file` (CSV, TSV or XLSX up to 20 MiB, 250,000 rows) and optional `options`
as a JSON string following `/v1/schemas/merchant-validate-options`: `profile`
(`google_merchant`, `shopify_products_csv`, `meta_catalog`; default Google), `sheet`,
`column_overrides` (target field → column header), `max_issues` (default 5,000),
`include_info`. The profile may also be sent as its own form field `profile`.

**Behaviour:** the header row and columns are recognised via versioned alias lists; the
profile's rules run per row: required fields, allowed values (with the target value as hint
for synonyms such as `auf Lager` or `en stock`), price format (`12.99 EUR`; Shopify without
currency), GTIN check digit, URLs and https, lengths, unique IDs, Shopify variant options,
Google identifiers. Each issue carries rule code, severity (`error`, `warning`, `info`), row,
column, message, `fix_hint` and a value excerpt. Nothing is changed or guessed.

**Output:** `ApiResponse` with `ValidateResult`: profile, file with column mapping and unchecked
columns, `issues[]`, `issues_truncated`, `summary` (rows, valid rows, rows with
errors/warnings, counts per severity and code, `human_review_required`).

**Errors:** 400 invalid file, 413 too large, 422 no header row, ambiguous column, unknown
profile or invalid options, 429 rate limit, 504 timeout.

**Languages:** responses are in English. Error, warning and rule codes are stable and
language-neutral; agents may translate messages for the user. Column headers and common cell words are recognised in English, German, French, Spanish, Italian, Portuguese, Dutch, Polish, Czech, Turkish, Swedish, Danish, Norwegian, Finnish, Korean, Japanese and Chinese; numbers in both 1.234,56 and 1,234.56 style; any ISO 4217 currency (no conversion).

**Access:** open, rate-limited per IP and per MCP session; an `X-API-Key` header raises the
limit. Uploaded files are processed in memory and never stored. Also available as MCP tool
`merchant_validate` at `/mcp` (Streamable HTTP).

## Response `200`

ApiResponse with ValidateResult

- unknown

## Other responses

- `400`: INVALID_FILE, EMPTY_FILE, UNSUPPORTED_FORMAT, INVALID_ENCODING
- `413`: FILE_TOO_LARGE, ROW_LIMIT_EXCEEDED
- `422`: HEADER_NOT_FOUND, COLUMN_AMBIGUOUS, SHEET_NOT_FOUND, PROFILE_NOT_FOUND, INVALID_OPTIONS
- `429`: RATE_LIMITED
- `504`: ANALYSIS_TIMEOUT

---

[API](https://skmtc.dev/relaex-engineers/apis/boring-api.md) · [All operations](https://skmtc.dev/relaex-engineers/apis/boring-api/llms.txt) · [OpenAPI document](https://skmtc.dev/relaex-engineers/apis/boring-api/revisions/269481105eb2?raw)
