Skip to content

Errors

Every non-2xx response from the API returns the same envelope:

JSON
{
  "error": {
    "code": "invalid_category",
    "message": "Unknown category 'women-kurti'. Use GET /api/v1/categories to browse.",
    "correlation_id": "0192a8d4-...",
    "docs_url": "https://meeship.in/for-integrations/docs/errors",
    "suggestions": ["womens-kurtis", "mens-kurtis"],
    "retry_after_seconds": 30
  }
}

Where:

  • code is a stable, machine-readable string. Pin your error handling

to code, not the HTTP status (some codes share a status).

  • message is human-readable. Never contains internal IDs or stack traces.
  • correlation_id uniquely identifies the request. Include it in support

tickets — it's also returned as the X-Correlation-Id header.

  • docs_url, suggestions, retry_after_seconds are optional; present

only when relevant.

Code reference#

Authentication & authorization#

StatusCodeWhenFix
401unauthorizedMissing or non-Bearer Authorization header.Send Authorization: Bearer meeship_<token>.
401invalid_api_keyUnknown / revoked / wrong-format token.Generate a fresh key from the dashboard.
402subscription_expiredSubscription is cancelled or past grace period.Buy another credit pack.
403ip_not_allowedCaller IP isn't in this key's allowlist.Update the allowlist or use a key without one.

Quota & rate limits#

StatusCodeWhenFix
402quota_exhaustedCredit balance is 0.Buy another pack.
429rate_limitedExceeded per-minute submit (or polling) cap.Wait Retry-After seconds; back off polling.

Input validation#

StatusCodeWhenFix
400missing_imageEmpty image part.Upload a real image file.
400invalid_imageUnsupported format, decoding failed, or below 400×400 px.Use JPEG/PNG/WebP at ≥ 400×400 px.
413image_too_largeImage exceeds 10 MB.Resize / re-encode before upload.
400invalid_categorySlug/id not in catalogue. Response includes suggestions.Use one of the suggested slugs, or GET /api/v1/categories?search=….

Jobs#

StatusCodeWhenFix
404job_not_foundUnknown job_id or not owned by your subscription.Check the id; ensure you're using the same API key.

Server / upstream#

StatusCodeWhenFix
500internal_errorUnexpected MeeShip-side fault.Retry; include correlation_id if it persists.
502upstream_unavailableMeesho shipping API returned no valid data.The job ends in failed with no credit charged. Retry safely.
502razorpay_error(billing endpoints only) Razorpay API call failed.Retry; check the dashboard for partial state.

Retrying safely#

All 4xxs except 429 are client errors — retrying won't help unless you change the request. 429 always returns Retry-After; respect it. 5xxs are safe to retry with exponential backoff — and because credits are only charged when a job reaches complete, you'll never be billed twice.

For POST /optimizations, set an Idempotency-Key header (any client-chosen string, max 255 chars). Repeated submits with the same key within 24 hours return the same job_id — perfect for retrying after a network blip without enqueueing a duplicate job.