# Make Me Look > Restyle a photo of a person from a text prompt: same face, any style you can > describe ("a viking warrior", "a LEGO minifigure", "a film noir detective"). > One 1024x1024 PNG per generation, for 0.03 USD in USDC on Base, or > a short looping GIF of a photo for 0.15 USD - paid per request with > x402. No account, no API key, no sign-up. ## Buy one generation POST https://makemelook.app/x402/generations Content-Type: application/json {"prompt": "a viking warrior", "image": ""} - prompt: what the person should become, at most 1000 characters - image: the reference photo, PNG, JPEG or WebP, at most 4MB decoded. A clear photo of one face works best. Image URLs are not accepted. ## Buy one GIF POST https://makemelook.app/x402/gifs Content-Type: application/json {"prompt": "waves hello and laughs", "generation_id": ""} {"prompt": "waves hello and laughs", "image": ""} - prompt: how the picture should move, at most 1000 characters - exactly one of generation_id (a generation you bought above, once it has succeeded: make a picture, then animate it) or image (any photo of a person; square works best) - A GIF usually takes about a minute, occasionally ten or more. Poll its status_url (https://makemelook.app/x402/gifs/{id}) the same way; result.media_type is image/gif. Its authorization window (maxTimeoutSeconds) is 30 minutes. ## The 402 flow (x402 v2, "exact" scheme) The same for both. Generations shown; GIFs differ only in the path and price. 1. POST without payment → 402. The body (and the base64 PAYMENT-REQUIRED header) is a PaymentRequired: {"x402Version": 2, "accepts": [{"scheme": "exact", "network", "amount", "asset", "payTo", "maxTimeoutSeconds", "extra"}], "extensions": {"bazaar": ...}}. A GET answers the same 402. The 402 comes before validation, so a bare probe sees the price. 2. Sign an EIP-3009 transferWithAuthorization of USDC for accepts[0] (any x402 client does this) and repeat the POST with the base64 PaymentPayload in the PAYMENT-SIGNATURE header (X-PAYMENT is accepted too). Echo "extensions". Let the authorization stay valid for accepts[0].maxTimeoutSeconds: it is settled after the picture is made, not during this request. 3. 202 {"id", "status": "queued", "status_url"}, with Location and Retry-After. Your payment is verified and reserved, not yet charged. 4. GET status_url every few seconds (free, no payment header). A generation takes 20-40 seconds: queued → processing → succeeded | failed. 5. succeeded: {"result": {"image_url", "expires_at", "media_type": "image/png"}, "payment": {"status": "settled", "transaction", "network"}} and a base64 PAYMENT-RESPONSE header. image_url lasts an hour; poll again for a fresh one. Results are kept for a week. You are only charged for a picture you get: - invalid input → 400/413/415 before anything is verified - the generation fails → status failed, payment.status "not_charged", and the same signed payment can be sent again - settlement is refused → status failed, error.code "payment_failed", no picture - a payment can be used once; a replay answers 402 ## Discovery - OpenAPI: https://makemelook.app/openapi.json - This guide: https://makemelook.app/llms.txt ## For people The same restyling is a Slack app: https://makemelook.app/