Upload an Excel file (first sheet only) and updates existing locations belonging to the authenticated account — matching each row by location_id against the location's saucode, then writing the store name/storeid plus the location-account company's name/address/city/zip. Returns a success message plus a list of per-row errors that were skipped (state/city/store not found in the account).
Auth: Account — authentication (route is inside the authenticated group). Requires the user's company bundle_id === 3 (ACCOUNT); a non-account user gets 403. Scope is the caller's own account: each matched store is INNER-joined store, then company (location-account), then company brand and filtered to brand.bundle_id = 3, brand.deleted_at IS NULL, and brand.id = <auth user's company id>.
Rate limit: No rate limit.
Request
- Body (
multipart/form-data):
| Field | Type | Required | Notes |
|---|---|---|---|
excel_file | file (xlsx/xls) | Yes | mimetypes:application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, max:101376 KB (~99 MB). First worksheet only. |
Per-row columns validated inside the controller (each row of the sheet): location_id (required, must be a known location), country_code (required, must be a known country code), state_code (required string), city_name (required string), zip_code (required), store_name (required string). Optional row columns also read: store_id, address. Any row-level validation failure returns a 400 with the full list of messages and processes nothing.
Response — { data. } envelope.
data.status(string) —"success".data.message(string) —"File has been uploaded.".data.errors(array) — per-row skip messages (e.g. "Row #N - State code not found","Row #N - City name not found","Row #N - Location not found in your brand"). Empty when all rows applied.
| Time | Status | User Agent | |
|---|---|---|---|
Retrieving recent requests… | |||
