Merchant API

Integrate with Price History & Schedules using explicit, plan-aware contracts.

The merchant API is designed for external systems that need reliable access to price history, schedules, analytics payloads, and API token lifecycle controls.

Base path

/api/v1

Authentication

Bearer token

Plan requirement

Enterprise

Endpoints

12

Getting started

Generate a token from the embedded app API Access page, apply it as a bearer token, and handle stable JSON errors and X-RateLimit-* headers on every request.

Authentication header

Token secrets are shown once at creation time and can be revoked at any time.

Authorization: Bearer <your_api_token>

Request example

Start with the context endpoint to validate plan and scopes.

curl --request GET \
  --url http://chronos.cymage-labs.com/api/v1/me \
  --header 'Authorization: Bearer <your_api_token>' \
  --header 'Accept: application/json'

Error shape

{
  "error": {
    "code": "AUTH_INVALID",
    "message": "Invalid API token.",
    "requestId": "..."
  }
}

Rate-limit headers

X-RateLimit-Limit: 120
X-RateLimit-Remaining: 119
X-RateLimit-Reset: 1760000000
Retry-After: 60

Auth

1 endpoint

Validate token context and API capability access before starting integration calls.

GET/api/v1/meCurrent API ContextReturns authenticated token, shop, and API capability metadata.

Returns authenticated token, shop, and API capability metadata.

Auth

Bearer token

Plan

ENTERPRISE

Scopes

tokens:manage

Rate limit

120 requests per minute per token

Examples

Response

Response example

{
  "data": {
    "shop": {
      "domain": "demo.myshopify.com",
      "planTier": "ENTERPRISE"
    },
    "token": {
      "id": 42,
      "label": "ERP Sync",
      "prefix": "chrn_ab12cd34",
      "scopes": [
        "price_changes:read",
        "schedules:read",
        "analytics:read"
      ]
    }
  }
}

Common errors

  • AUTH_INVALID Invalid API token.
  • PLAN_REQUIRED Merchant API requires ENTERPRISE.
  • RATE_LIMITED Request rate exceeded.

Price History

2 endpoints

Read store-level and product-level price movement with filters aligned to the app's history views.

GET/api/v1/price-changesList Price ChangesLists price changes using the same filters as the in-app Price History view.

Lists price changes using the same filters as the in-app Price History view.

Auth

Bearer token

Plan

ENTERPRISE

Scopes

price_changes:read

Rate limit

120 requests per minute per token

Examples

Request

Request example

{
  "query": {
    "limit": "50",
    "offset": "0",
    "source": "scheduled",
    "changeType": "decrease"
  }
}

Common errors

  • VALIDATION_ERROR Invalid filter values.
  • AUTH_FORBIDDEN_SCOPE Missing scope price_changes:read.

Key considerations

Notes

  • Maximum limit is capped to 100.
  • Compare-at values are nullable when unset.
GET/api/v1/products/:productId/price-changesList Product Price ChangesLists price history for a single product using the same filtering model as the product detail view.

Lists price history for a single product using the same filtering model as the product detail view.

Auth

Bearer token

Plan

ENTERPRISE

Scopes

price_changes:read

Rate limit

120 requests per minute per token

Examples

Request

Request example

{
  "query": {
    "limit": "25",
    "offset": "0",
    "search": "Blue variant",
    "changeType": "decrease",
    "source": "scheduled",
    "dateFrom": "2026-03-01",
    "dateTo": "2026-03-31",
    "minPrice": "10.00",
    "maxPrice": "99.00"
  }
}

Common errors

  • NOT_FOUND Product not found.
  • AUTH_FORBIDDEN_SCOPE Missing scope price_changes:read.

Key considerations

Notes

  • Supports changeType=all|increase|decrease and source=all|scheduled|manual.
  • Supports search, dateFrom/dateTo, and minPrice/maxPrice filters.
  • limit is capped to 100.

Scheduling

4 endpoints

Create price and compare-at schedules, inspect execution state, and cancel pending runs when workflows change.

GET/api/v1/schedulesList SchedulesLists schedules with optional status/search/date filtering.

Lists schedules with optional status/search/date filtering.

Auth

Bearer token

Plan

ENTERPRISE

Scopes

schedules:read

Rate limit

120 requests per minute per token

Examples

Request

Request example

{
  "query": {
    "limit": "25",
    "offset": "0",
    "status": "SCHEDULED",
    "search": "weekend",
    "dateFrom": "2026-03-01",
    "dateTo": "2026-03-31"
  }
}

Common errors

  • AUTH_FORBIDDEN_SCOPE Missing scope schedules:read.
  • VALIDATION_ERROR Unsupported status filter.

Key considerations

Notes

  • Supported status values: all, SCHEDULED, RUNNING, IN_FLIGHT_ON_SHOPIFY, SHOPIFY_FINISHED, PROCESSING_RESULTS, COMPLETED, COMPLETED_SUCCESS, COMPLETED_PARTIAL, FAILED, CANCELLED, EXPIRED, PARTIALLY_FAILED.
  • dateTo is inclusive by day (server includes the full end date window).
POST/api/v1/schedulesCreate ScheduleCreates a schedule using the same validation, conflict checks, and plan-limit enforcement used by the in-app schedule builder.

Creates a schedule using the same validation, conflict checks, and plan-limit enforcement used by the in-app schedule builder.

Auth

Bearer token

Plan

ENTERPRISE

Scopes

schedules:write

Rate limit

Shared merchant API limiter: 120 requests/minute per token and 600 requests/minute per shop.

Examples

Request

Price-only schedule (PRICE)

{
  "body": {
    "name": "Weekend promo",
    "scheduleType": "SINGLE",
    "priceField": "PRICE",
    "scheduledAt": "2026-03-29T08:00:00.000Z",
    "timezone": "UTC",
    "items": [
      {
        "shopifyVariantId": "gid://shopify/ProductVariant/44893011122420",
        "newPrice": "17.99"
      }
    ]
  }
}

Request fields

  • nameOptional

    Optional label (max 255 chars). Must be unique per shop after normalization.

  • notesOptional

    Optional operator note saved to schedule audit trail.

  • scheduleTypeRequired

    SINGLE or EXPIRES_AT. EXPIRES_AT requires expiresAt.

  • priceFieldRequired

    PRICE, COMPARE_AT_PRICE, or BOTH. Controls required item fields and execution behavior.

  • scheduledAtRequired

    ISO-8601 datetime. Must satisfy minimum future buffer unless executeImmediately=true.

  • expiresAtOptional

    ISO-8601 datetime required for EXPIRES_AT; must be after scheduledAt and at least 2 hours later.

  • timezoneOptional

    Optional timezone label (defaults to UTC).

  • discountWarningThresholdOptional

    Non-negative number used for large-discount warning checks.

  • requiresApprovalOptional

    Flag recorded on schedule for operator workflows.

  • executeImmediatelyOptional

    Enterprise-only acceleration flag. Runs as soon as possible and bypasses future-time buffer checks.

  • confirmLargeItemCountOptional

    Set true to acknowledge large item-count validation gate.

  • confirmLargeDiscountsOptional

    Set true after reviewing warning-level discount/item warnings from prior validation attempts.

  • items[]Required

    At least one target item. Each item must resolve to a variant owned by the authenticated shop.

  • items[].variantId | items[].shopifyVariantIdRequired

    Provide at least one identifier. If both are provided, they must point to the same shop-owned variant.

  • items[].newPriceOptional

    Required for PRICE and BOTH. Not accepted for COMPARE_AT_PRICE.

  • items[].newCompareAtPriceOptional

    Required for COMPARE_AT_PRICE and BOTH. Not accepted for PRICE.

Common errors

  • AUTH_FORBIDDEN_SCOPE Missing scope: schedules:write.
  • VALIDATION_ERROR Schedule payload or validation checks failed (field, item, conflict, timing, or warning-confirmation gates).
  • PLAN_REQUIRED Merchant API access requires ENTERPRISE plan.
  • RATE_LIMITED Rate limit exceeded. Retry after the reset window.
  • PAYLOAD_TOO_LARGE Body too large.
  • VALIDATION_ERROR Plan quota/limit conflict while reserving schedule usage (HTTP 409).

Key considerations

Targeting and ownership

  • Variant resolution is shop-scoped. Cross-shop targets are rejected with validation issues.
  • Use items[].shopifyVariantId (GID or numeric id) or items[].variantId. If both are sent, they must match the same variant.
  • COMPARE_AT_PRICE mode preserves the current variant price while applying compare-at updates.

Validation and confirmation

  • The endpoint reuses the in-app validation path: money normalization, time/expiry checks, compare-at consistency checks, and conflict detection.
  • Large item counts and warning-level discount checks can require confirmLargeItemCount/confirmLargeDiscounts acknowledgements.
  • Validation errors can be returned as HTTP 400 (request/validation issues) or HTTP 409 (quota/limit conflict).

Execution and lifecycle

  • EXPIRES_AT schedules apply at scheduledAt and later revert to captured prior values at expiresAt.
  • executeImmediately is capability-gated and bypasses the future-time buffer check.
  • Plan and monthly quota checks are enforced before and during transaction commit for concurrency safety.
GET/api/v1/schedules/:scheduleIdGet Schedule DetailReturns detail for a single schedule owned by the authenticated shop.

Returns detail for a single schedule owned by the authenticated shop.

Auth

Bearer token

Plan

ENTERPRISE

Scopes

schedules:read

Rate limit

120 requests per minute per token

Examples

Request

Request example

{
  "headers": {
    "Authorization": "Bearer <your_api_token>"
  }
}

Common errors

  • NOT_FOUND Schedule not found.
  • AUTH_FORBIDDEN_SCOPE Missing scope: schedules:read.
  • PLAN_REQUIRED Merchant API access requires ENTERPRISE plan.
  • RATE_LIMITED Rate limit exceeded. Retry after the reset window.

Key considerations

Ownership and access

  • Lookup is constrained to the authenticated shop. Foreign schedule ids are returned as NOT_FOUND.
  • This endpoint requires schedules:read scope and Enterprise API access.

Lifecycle visibility

  • status reflects end-to-end execution lifecycle (for example: SCHEDULED, RUNNING, IN_FLIGHT_ON_SHOPIFY, SHOPIFY_FINISHED, PROCESSING_RESULTS, COMPLETED_*, FAILED, CANCELLED, EXPIRED).
  • Bulk-operation and result-processing metadata fields are included when relevant and null/absent otherwise.
  • items[] includes per-variant execution status, applied values, and any failure/warning payloads.

Audit and limits

  • auditLogs are returned newest-first and capped to the latest 50 entries.
  • Shop-scoped schedule numbering is available via shopScheduleNumber for operator-facing references.
POST/api/v1/schedules/:scheduleId/cancelCancel ScheduleCancels a schedule if it is still in SCHEDULED state.

Cancels a schedule if it is still in SCHEDULED state.

Auth

Bearer token

Plan

ENTERPRISE

Scopes

schedules:write

Rate limit

Shared merchant API limiter: 120 requests/minute per token and 600 requests/minute per shop.

Examples

Request

Request example

{
  "body": {
    "note": "Cancelled by ERP workflow"
  }
}

Request fields

  • noteOptional

    Optional cancellation reason stored in schedule audit history.

Common errors

  • NOT_FOUND Schedule not found.
  • AUTH_FORBIDDEN_SCOPE Missing scope: schedules:write.
  • SCHEDULE_STATE_INVALID Schedule cannot be cancelled in current state (response includes current status).
  • PLAN_REQUIRED Merchant API access requires ENTERPRISE plan.
  • RATE_LIMITED Rate limit exceeded. Retry after the reset window.

Key considerations

Cancellation rules

  • Only SCHEDULED schedules can be cancelled. RUNNING, completed, failed, expired, and already-cancelled schedules return SCHEDULE_STATE_INVALID.
  • Cancellation updates the schedule state, marks pending schedule jobs as cancelled, and writes an audit log entry.

Ownership and response behavior

  • Cancellation is shop-scoped. Unknown/foreign schedule ids return NOT_FOUND.
  • cancelledAt is an acknowledgement timestamp in the API response; use schedule detail/audit logs for complete historical context.

Analytics

2 endpoints

Fetch overview and product analytics payloads for reporting and downstream decision systems.

GET/api/v1/analytics/overviewGet Analytics OverviewReturns overview analytics payload equivalent to the UI analytics page.

Returns overview analytics payload equivalent to the UI analytics page.

Auth

Bearer token

Plan

ENTERPRISE

Scopes

analytics:read

Rate limit

120 requests per minute per token

Examples

Request

Request example

{
  "query": {
    "requestedDays": "30",
    "topProductsPage": "1",
    "topProductsPageSize": "10",
    "topProductsQuery": "tee"
  }
}

Common errors

  • AUTH_FORBIDDEN_SCOPE Missing scope analytics:read.

Key considerations

Notes

  • requestedDays is clamped to 1..365 (default 30).
  • topProductsPage is clamped to 1..100 (default 1).
  • topProductsPageSize is clamped to 1..50 (default 5).
  • topProductsQuery applies server-side filtering to top-products slices.
GET/api/v1/products/:productId/analyticsGet Product AnalyticsReturns product-level analytics for a single Shopify product.

Returns product-level analytics for a single Shopify product.

Auth

Bearer token

Plan

ENTERPRISE

Scopes

analytics:read

Rate limit

120 requests per minute per token

Examples

Request

Request example

{
  "query": {
    "variantId": "gid://shopify/ProductVariant/44893011122420"
  }
}

Common errors

  • NOT_FOUND Product analytics not found.
  • AUTH_FORBIDDEN_SCOPE Missing scope analytics:read.

Key considerations

Notes

  • Optional variantId narrows analytics to a specific variant under the product.
  • When variantId is omitted (or does not match a variant under that product), analytics defaults to the first product variant.
  • Returns NOT_FOUND only when the product is not found for the authenticated shop.

Tokens

3 endpoints

Manage shop-scoped API credentials for external systems without exposing stored secrets.

GET/api/v1/api-tokensList API TokensLists token metadata for the current shop without exposing secrets.

Lists token metadata for the current shop without exposing secrets.

Auth

Bearer token

Plan

ENTERPRISE

Scopes

tokens:manage

Rate limit

Shared merchant API limiter: 120 requests/minute per token and 600 requests/minute per shop.

Examples

Response

Response example

{
  "data": {
    "items": [
      {
        "id": 1,
        "label": "ERP Sync",
        "tokenPrefix": "chrn_ab12cd34",
        "last4": "Qe7m",
        "revokedAt": null
      }
    ]
  }
}

Common errors

  • AUTH_FORBIDDEN_SCOPE Missing scope tokens:manage.
POST/api/v1/api-tokensCreate API TokenCreates a new API token. Secret is returned once and never stored in plaintext.

Creates a new API token. Secret is returned once and never stored in plaintext.

Auth

Bearer token

Plan

ENTERPRISE

Scopes

tokens:manage

Rate limit

Shared merchant API limiter: 120 requests/minute per token and 600 requests/minute per shop.

Examples

Request

Request example

{
  "body": {
    "label": "Data Warehouse",
    "scopes": [
      "price_changes:read",
      "schedules:read",
      "analytics:read"
    ]
  }
}

Common errors

  • TOKEN_LIMIT_REACHED Token limit reached for this shop.
  • VALIDATION_ERROR Invalid token label or scopes.

Key considerations

Notes

  • If scopes is omitted, the API applies default scopes: price_changes:read, schedules:read, analytics:read, tokens:manage.
  • TOKEN_LIMIT_REACHED is returned when the shop's active-token cap is exceeded (default cap is 25, environment-configurable).
POST/api/v1/api-tokens/:tokenId/revokeRevoke API TokenRevokes an existing token for the authenticated shop.

Revokes an existing token for the authenticated shop.

Auth

Bearer token

Plan

ENTERPRISE

Scopes

tokens:manage

Rate limit

Shared merchant API limiter: 120 requests/minute per token and 600 requests/minute per shop.

Examples

Response

Response example

{
  "data": {
    "tokenId": 11,
    "revoked": true,
    "alreadyRevoked": false
  }
}

Common errors

  • NOT_FOUND Token not found.
  • AUTH_FORBIDDEN_SCOPE Missing scope tokens:manage.

Key considerations

Notes

  • Revocation is permanent. Create a new token if the integration still needs access.

Plans and access

Merchant API endpoints require Enterprise access. Plan changes, feature gates, and token controls are managed from the embedded billing and API Access pages.

Starter

Entry tier

$29.99/month

Reliable price tracking and core scheduling for teams getting their pricing workflow in place.

Switch to annual billing anytime to save 20% over 12 monthly cycles.

7-day free trial (one-time per store)

  • Up to 500 price changes/month
  • Up to 25 schedule events/month
  • 1 month data retention
  • Email notifications
Coming soon on Shopify App Store

Growth

$69.99/month

The mainstream plan for merchants running recurring pricing work and wanting analytics in the loop.

Switch to annual billing anytime to save 20% over 12 monthly cycles.

7-day free trial (one-time per store)

  • Up to 5,000 price changes/month
  • Up to 250 schedule events/month
  • 6 months data retention
  • Price Analytics
  • Schedule Analytics
  • Email notifications
Coming soon on Shopify App Store

Enterprise

Best for scale

$119.99/month

Full-platform control for high-volume operations, scheduled exports, API workflows, and priority support.

Switch to annual billing anytime to save 20% over 12 monthly cycles.

7-day free trial (one-time per store)

  • Unlimited price changes
  • Unlimited schedule events
  • 1 year data retention
  • Price Analytics
  • Schedule Analytics
  • Scheduled Exports
  • Execute Immediately
  • Email notifications
  • Priority support
  • API access and support
Coming soon on Shopify App Store

Install the app to start a one-time 7-day trial, then choose Enterprise when your team needs API workflows.

Coming soon on Shopify App Store

Installation starts from Shopify App Store after approval.