Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.launchmystore.io/llms.txt

Use this file to discover all available pages before exploring further.

Bulk Upsert Metafields

This endpoint is available on the Admin API (merchant JWT) only. It is not exposed to OAuth-scoped apps. Apps must call POST /api/v1/metafields.json once per field.
Upsert N metafields in a single request. This is what powers the TeamInfra “Save” button on resource detail pages — when a merchant edits multiple metafields and clicks save, the editor sends one bulk request instead of N individual calls.

Request

curl -X POST "https://api.launchmystore.io/metafields/bulk" \
  -H "Authorization: Bearer <merchant-jwt>" \
  -H "Content-Type: application/json" \
  -d '{
    "metafields": [
      { "namespace": "custom", "key": "badge",          "type": "single_line_text_field", "value": "BESTSELLER",        "ownerType": "product", "ownerId": "..." },
      { "namespace": "custom", "key": "warranty_years", "type": "number_integer",         "value": 5,                   "ownerType": "product", "ownerId": "..." },
      { "namespace": "custom", "key": "care",           "type": "rich_text_field",        "value": "<p>Hand wash.</p>", "ownerType": "product", "ownerId": "..." }
    ]
  }'

Auth

Merchant JWT (MERCHANT, STAFF_ADMIN, SUPER_ADMIN, MANAGER).

Body

metafields
array
required
Array of metafield objects. Each item has the same shape as POST /metafields.
Each item is upserted independently using the unique constraint (storeId, ownerType, namespace, key, ownerId). If one item fails validation, the others still proceed (per-item error reporting in the response).

Response

{
  "status": 200,
  "state": "success",
  "data": {
    "results": [
      { "ok": true, "metafield": { "id": "...", "key": "badge", ... } },
      { "ok": true, "metafield": { "id": "...", "key": "warranty_years", ... } },
      { "ok": false, "error": { "field": "value", "message": "value must be valid hex color" } }
    ],
    "succeeded": 2,
    "failed": 1
  }
}

Cache invalidation

The cache invalidation chain fires once after the whole batch completes — not once per row. This avoids 50× SCAN+DEL round trips for a 50-item save. The bulk call is a single Redis invalidation followed by a single fire-and-forget POST to the LaunchMyStore frontend’s /api/internal/invalidate-page-cache endpoint.

Error codes

CodeDescription
UNAUTHORIZEDInvalid or missing JWT
FORBIDDENWrong store / insufficient role
VALIDATION_ERRORTop-level body shape is wrong (per-row errors are returned in results[])