multipart/form-data | Bearer token | optional header X-Enforce-Paywall: truefile - palm/hand photo (JPEG/PNG/WebP, max 5 MB)200 - image accepted and analysis started. Returns a confirmation message. Then poll GET /palm/family/{family_key}. Also returns 200 with success: false and code: PLAN_LIMIT (not an HTTP error) when X-Enforce-Paywall: true is sent and no unconsumed palm-reading purchase exists (get one via POST /subscriptions/checkout with slug palm-read first - checkout never generates the reading itself, this endpoint is always the separate step-2 call, paid or free-via-coupon) for this family member. If a purchase is still pending (paid moments ago, webhook not yet processed), this call reconciles it against Razorpay live before deciding - if confirmed paid the credit activates and generation proceeds normally; if not, the message is "We're still verifying your payment..." instead of the plain "this report needs to be purchased" text shown when no attempt exists at allfailed reading doesn't block re-upload and reuses the same already-paid credit automatically. See POST /palm/user's description for the full explanation; it's always safe to call POST /subscriptions/checkout again before retrying, it will never charge twice for the same undelivered report.401 - invalid/expired token404 - family member not found for this user409 - a palm analysis already exists for this member (pending/processing/done); re-upload is blocked only while one of those is in flight or complete422 - no hand detected by MediaPipe, unsupported format, or file > 5 MB