lovable supabase mindee v2 from mindee v1
Hi Mindee team,
I’m integrating the expense_receipts model via the V2 API from a Supabase Edge Function and I’m consistently receiving 401 Unauthorized.
Endpoint being called
POST https://api.mindee.net/v1/products/mindee/expense_receipts/v5.3/predict Authorization: Token md_******************** Content-Type: image/jpeg Accept: application/json (body: raw JPEG bytes) What I’ve verified
Using a V2 key (prefix
md_…), trimmed (no whitespace/newlines).Same key tested via
curlreturns 401 as well.Model path uses path segment versioning (
/v5.3/), not@v5.3.Also tried
predict_async; falls back topredictwhen not supported.Content types tried:
image/jpegandimage/png.No proxy; requests originate from Supabase Edge (Deno) and from local
curl.
Recent logs (redacted)
Mindee base: https://api.mindee.net/v1/products/mindee/expense_receipts/v5.3 Mindee response (sync) 401 Mindee error 401 … Questions / help requested
Is the expense_receipts v5.3 public model accessible with standard V2 keys, or is a specific entitlement/workspace toggle required?
Do V2 keys need to be created inside the same workspace/project where the receipts model is enabled? (Could a key from another workspace cause 401?)
Can you confirm the correct product path for the receipts model in V2 (
/v1/products/mindee/expense_receipts/v5.3/predict) and that raw binary (not multipart) withContent-Type: image/jpegis acceptable?Are there any IP restrictions or organization settings that would return 401 instead of 403?
If possible, could you check this key’s scope/status on your side (last 24h) to see why auth fails?
Repro with curl
export MINDEE_API_KEY='md_xxxREDACTEDxxx' curl -i -X POST \ -H "Authorization: Token $MINDEE_API_KEY" \ -H "Content-Type: image/jpeg" \ -H "Accept: application/json" \ --data-binary @sample.jpg \ "https://api.mindee.net/v1/products/mindee/expense_receipts/v5.3/predict" Thank you! Happy to provide full timestamps, workspace name, and any additional headers privately if that helps you trace the request.
Log in to comment and vote
Comments7
chanua4 johnson
Oct 1, 2025
i tried this am again. see console log below, how am I calling the Mindee API? : How the call is made (step-by-step)
Source of the call (client): src/utils/receipt/ocrProcessing.ts
In demo mode (your logs show blob: URLs), we:
Read the blob and convert it to base64
Call the Supabase Edge Function with supabase.functions.invoke('process-receipt', { body })
Edge Function: supabase/functions/process-receipt/index.ts
Reads env secrets: MINDEE_API_KEY (md_…) and MINDEE_MODEL_ID (UUID)
Decodes the base64 into a Blob
Calls mindeeClient(apiKey, blob)
Actual HTTP requests to Mindee (server-side): supabase/functions/process-receipt/mindee.ts
Enqueue (v2): POST https://api-v2.mindee.net/v2/inferences/enqueue
Headers:
Authorization: md_… (no Bearer)
Accept: application/json
Body: multipart/form-data
model_id: <your v2 model UUID>
file: File([blob], "receipt.jpg", { type: "image/jpeg" })
Poll job: GET https://api-v2.mindee.net/v2/jobs/{job_id}
Headers: Authorization: md_…, Accept: application/json, redirect: manual
Repeats until Mindee returns 302 with a Location header
Fetch result: GET <Location URL from the 302> with Authorization: md_…
Normalize the result into the shape your UI expects (amount, date, supplier, lineItems, confidence)
What the logs say right now
Edge logs for process-receipt show:
🔧 Using v2 model_id: 63f56d0d-73b2-4239-91a3-9b4cd14cd1d3
📥 Mindee enqueue raw response: {"status":402,"detail":"No active subscription."}
❌ Mindee enqueue failed: 402 { status: 402, detail: "No active subscription." }
So the endpoint, headers, and payload are all v2-correct. The failure is Mindee returning 402 Payment Required with “No active subscription. console log: 3851-612cfa8921ee1db9.js:1 Initializing RudderStack Analytics
VM20182:2
⠀⠀#######
##########
#############
##############
##############
###################
#####################
#######################
#######################
#######################
######################
###################
We're hiring!https://lovable.dev/careers
ff2c0863-6570a9614b6871f5.js:1 Unrecognized feature: 'vr'.
e4 @ ff2c0863-6570a9614b6871f5.js:1
sc @ ff2c0863-6570a9614b6871f5.js:1
sd @ ff2c0863-6570a9614b6871f5.js:1
(anonymous) @ ff2c0863-6570a9614b6871f5.js:1
ix @ ff2c0863-6570a9614b6871f5.js:1
ik @ ff2c0863-6570a9614b6871f5.js:1
(anonymous) @ ff2c0863-6570a9614b6871f5.js:1
iu @ ff2c0863-6570a9614b6871f5.js:1
iX @ ff2c0863-6570a9614b6871f5.js:1
A @ 1689-6933b1316fa878df.js:11
ff2c0863-6570a9614b6871f5.js:1 Unrecognized feature: 'ambient-light-sensor'.
e4 @ ff2c0863-6570a9614b6871f5.js:1
sc @ ff2c0863-6570a9614b6871f5.js:1
sd @ ff2c0863-6570a9614b6871f5.js:1
(anonymous) @ ff2c0863-6570a9614b6871f5.js:1
ix @ ff2c0863-6570a9614b6871f5.js:1
ik @ ff2c0863-6570a9614b6871f5.js:1
(anonymous) @ ff2c0863-6570a9614b6871f5.js:1
iu @ ff2c0863-6570a9614b6871f5.js:1
iX @ ff2c0863-6570a9614b6871f5.js:1
A @ 1689-6933b1316fa878df.js:11
ff2c0863-6570a9614b6871f5.js:1 Unrecognized feature: 'battery'.
e4 @ ff2c0863-6570a9614b6871f5.js:1
sc @ ff2c0863-6570a9614b6871f5.js:1
sd @ ff2c0863-6570a9614b6871f5.js:1
(anonymous) @ ff2c0863-6570a9614b6871f5.js:1
ix @ ff2c0863-6570a9614b6871f5.js:1
ik @ ff2c0863-6570a9614b6871f5.js:1
(anonymous) @ ff2c0863-6570a9614b6871f5.js:1
iu @ ff2c0863-6570a9614b6871f5.js:1
iX @ ff2c0863-6570a9614b6871f5.js:1
A @ 1689-6933b1316fa878df.js:11
ff2c0863-6570a9614b6871f5.js:1 An iframe which has both allow-scripts and allow-same-origin for its sandbox attribute can escape its sandboxing.
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
ub @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
ff2c0863-6570a9614b6871f5.js:1 An iframe which has both allow-scripts and allow-same-origin for its sandbox attribute can escape its sandboxing.
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
un @ ff2c0863-6570a9614b6871f5.js:1
ub @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
uv @ ff2c0863-6570a9614b6871f5.js:1
ug @ ff2c0863-6570a9614b6871f5.js:1
index-CdmaIcUX.js:3999 📍 ScrollToTop: Reset scroll position for route: /?__lovable_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiUjlrdkZJZXB0N2dyUlNkQmdqaldJN09IMWpIMyIsInByb2plY3RfaWQiOiIwNzM5Y2MwNC1jZWVjLTQzMzktOTZmOS1lYzVhMmQ0NGYzNjQiLCJub25jZSI6IjUxYTMzZDEwZjZmYjYyNTNhYjQ3YjY5ZmM4YmNhMWFkIiwiaXNzIjoibG92YWJsZS1hcGkiLCJzdWIiOiIwNzM5Y2MwNC1jZWVjLTQzMzktOTZmOS1lYzVhMmQ0NGYzNjQiLCJhdWQiOlsibG92YWJsZS1hcHAiXSwiZXhwIjoxNzU5OTM0MTY0LCJuYmYiOjE3NTkzMjkzNjQsImlhdCI6MTc1OTMyOTM2NH0._XGzditW8cuXhWSgHEoqv8mK1QUVf0fymucEUkUKshM
index-CdmaIcUX.js:3765 🎯 OnboardingService shouldShowOnboarding: {currentPath: '/', isOnBudgetRoute: false, isCompleted: false, isSkipped: false}
index-CdmaIcUX.js:3765 🎯 Onboarding Debug: {currentStep: null, isActive: false, pathname: '/', shouldShow: false, nextStep: 'about_you_next', …}
index-CdmaIcUX.js:3765 🔄 Checking onboarding conditions for route: /
index-CdmaIcUX.js:3765 🎯 OnboardingService shouldShowOnboarding: {currentPath: '/', isOnBudgetRoute: false, isCompleted: false, isSkipped: false}
index-CdmaIcUX.js:3765 📋 Onboarding check result: {shouldStart: false, nextStep: 'about_you_next', currentlyActive: false, forceTour: false, pathname: '/', …}
index-CdmaIcUX.js:584 ExpenseContext: No family selected
lovable.js:1 Warning: Missing
Descriptionoraria-describedby={undefined}for {DialogContent}.console.<computed> @ lovable.js:1
(anonymous) @ index-CdmaIcUX.js:588
g6 @ index-CdmaIcUX.js:40
o1 @ index-CdmaIcUX.js:40
NAe @ index-CdmaIcUX.js:40
hf @ index-CdmaIcUX.js:40
t$ @ index-CdmaIcUX.js:40
wp @ index-CdmaIcUX.js:38
NAe @ index-CdmaIcUX.js:40
hf @ index-CdmaIcUX.js:40
gK @ index-CdmaIcUX.js:40
y @ index-CdmaIcUX.js:25
E @ index-CdmaIcUX.js:25
lovable.js:1 🚀 Landing: File selected for processing File {name: 'IMG_2266.HEIC', lastModified: 1756063405000, lastModifiedDate: Sun Aug 24 2025 15:23:25 GMT-0400 (Atlantic Standard Time), webkitRelativePath: '', size: 2114592, …}
lovable.js:1 📸 Landing: Starting OCR processing...
lovable.js:1 📤 Landing: Uploading receipt to storage...
lovable.js:1 🎯 Demo mode: Creating blob URL for direct OCR processing
lovable.js:1 📄 Demo mode processing receipt: blob:https://id-preview--0739cc04-ceec-4339-96f9-ec5a2d44f364.lovable.app/e605f3a4-20f0-48f6-b2e3-03cce09a4ff7
lovable.js:1 ✅ Landing: Receipt uploaded successfully blob:https://id-preview--0739cc04-ceec-4339-96f9-ec5a2d44f364.lovable.app/e605f3a4-20f0-48f6-b2e3-03cce09a4ff7
lovable.js:1 🔍 Landing: Processing with OCR...
lovable.js:1 📄 Processing receipt: blob:https://id-preview--0739cc04-ceec-4339-96f9-ec5a2d44f364.lovable.app/e605f3a4-20f0-48f6-b2e3-03cce09a4ff7 for family: undefined
lovable.js:1 🎯 Demo mode: Converting blob to base64 for OCR processing
lovable.js:1 🎯 Demo mode: Base64 conversion complete, content type: image/jpeg
lovable.js:1 ❌ Edge Function returned error: {error: "We're having technical difficulties", type: 'SERVER_ERROR', message: 'Please try again in a moment'}
console.<computed> @ lovable.js:1
lne @ index-CdmaIcUX.js:653
await in lne
w @ index-CdmaIcUX.js:3667
await in w
c @ index-CdmaIcUX.js:3645
Qfe @ index-CdmaIcUX.js:37
Kfe @ index-CdmaIcUX.js:37
ehe @ index-CdmaIcUX.js:37
DO @ index-CdmaIcUX.js:37
_J @ index-CdmaIcUX.js:37
(anonymous) @ index-CdmaIcUX.js:37
d9 @ index-CdmaIcUX.js:40
ZQ @ index-CdmaIcUX.js:37
pD @ index-CdmaIcUX.js:37
LN @ index-CdmaIcUX.js:37
Ahe @ index-CdmaIcUX.js:37
lovable.js:1 ❌ Landing: OCR processing error: We're having technical difficulties
lovable.js:1 ❌ Landing: Error processing receipt: Error: We're having technical difficulties
at w (index-CdmaIcUX.js:3667:56174)
console.<computed> @ lovable.js:1
w @ index-CdmaIcUX.js:3667
await in w
c @ index-CdmaIcUX.js:3645
Qfe @ index-CdmaIcUX.js:37
Kfe @ index-CdmaIcUX.js:37
ehe @ index-CdmaIcUX.js:37
DO @ index-CdmaIcUX.js:37
_J @ index-CdmaIcUX.js:37
(anonymous) @ index-CdmaIcUX.js:37
d9 @ index-CdmaIcUX.js:40
ZQ @ index-CdmaIcUX.js:37
pD @ index-CdmaIcUX.js:37
LN @ index-CdmaIcUX.js:37
Ahe @ index-CdmaIcUX.js:37
chanua4 johnson
Sep 30, 2025
🚨 Error processing receipt: Mindee enqueue did not return job_id: {
"event_message": "🚨 Error processing receipt: Mindee enqueue did not return job_id\n",
"id": "dcc93674-4f11-4bed-906c-8e879f607f59",
"metadata": [
{
"boot_time": null,
"cpu_time_used": null,
"deployment_id": "fjrxqeyexlusjwzzecal_7ad0fdbe-c701-4a5d-841f-2e8ee03a8535_139",
"event_type": "Log",
"execution_id": "6b000b58-8236-4248-ac32-fd5b6273fc70",
"function_id": "7ad0fdbe-c701-4a5d-841f-2e8ee03a8535",
"level": "error",
"memory_used": [],
"project_ref": "fjrxqeyexlusjwzzecal",
"reason": null,
"region": "us-east-1",
"served_by": "supabase-edge-runtime-1.69.4 (compatible with Deno v2.1.4)",
"timestamp": "2025-09-30T10:57:11.100Z",
"version": "139"
}
],
"timestamp": 1759229831100000
}
Ianaré Sévi
Oct 1, 2025
Hi,
Not sure what’s going there, how are you calling the Mindee API?
Also there were some problems with Supabase yesterday, are you still getting this error?
Thanks
chanua4 johnson
Oct 1, 2025
help from Chat GPT says: This was an excellent breakdown you just made of your app’s end-to-end call flow. You’ve got it exactly right:
Your code path is correct (base64 → Supabase Edge →
mindeeClient→ enqueue/poll/fetch/normalize).The failure isn’t technical anymore—it’s account state. Mindee is literally returning
402 Payment Requiredwith"No active subscription".Why You Still See the Generic “Technical Difficulties” Message
In your edge handler (
index.ts), you catch unknown errors and translate them into a user-friendly fallback:❌ Edge Function returned error: {error: "We're having technical difficulties"}Since you haven’t explicitly handled
402, the UI always shows the generic fallback.So:
Under the hood, everything is working fine.
Mindee is saying: pay or activate plan/credits.
What Needs to Change on Your Side
UI messaging improvement
Add a
402branch inindex.ts.Example:
if (result.status === 402) { return new Response(JSON.stringify({ error: "Subscription required", type: 'SERVER_ERROR', message: "Mindee requires an active subscription to process receipts. Please check your plan." }), { status: 200, headers: corsHeaders }); }That way, your user sees a precise, actionable message instead of “technical difficulties”.
Keep detailed logs
Keep
status: 402anddetail: "No active subscription"in the server logs.In
mkErr, append status codes to the error string so your handler can branch on them.What Needs to Change on Mindee’s Side
Activate a plan or top up credits for v2.
Make sure the
md_API key belongs to the same workspace where your v2model_idlives.Verify billing isn’t paused or expired.
Next Steps You Can Take
Immediate: Add the
402branch to your edge handler so your UI surfaces the real cause.Verify: Run the
curltest they suggested with yourmd_key andmodel_id→ you should see the exact same402.Account action: Log into the Mindee console and check your plan sta
chanua4 johnson
Oct 1, 2025
this is crazy my free trial expired before i could even set it up can i have an extension to test and make sure it works?
Ianaré Sévi
Oct 1, 2025
The failure isn’t technical anymore—it’s account state. Mindee is literally returning
402 Payment Requiredwith"No active subscription".Is your plan enabled in the Mindee platform?
Ianaré Sévi
Sep 23, 2025
Hi,
Thanks for the detailed report.
You cannot use a V2 key with the v1 API, anything that starts with:
https://api.mindee.net/v1/…when given a v2 key will result in a 401 error.If you already have a v1 (legacy) account you can get the API key as described here:
https://developers.mindee.com/docs/create-api-key
However, we strongly recommend using a v2 model rather than a legacy model. We will not be improving legacy models.
To set up your v2 model, we suggest following the quickstart instructions here:
https://docs.mindee.com/getting-started/quickstart
You can then use your v2 key with your v2 model.
Also, we recommend using one of our client libraries for an easier integration:
https://docs.mindee.com/integrations/client-libraries-sdk
(you should be able to install a node.js package in the edge function)
Hope this helps