{"openapi":"3.1.0","info":{"title":"ytemailfinder API","version":"1.0.0","summary":"Wallet-metered YouTube business-email reveals.","description":"ytemailfinder resolves **public YouTube business emails** at scale. Submit a channel,\nwe return the verified business email - and **you only pay for the ones we find**.\n\nThe API is small, predictable, and REST-shaped: JSON in, JSON out, one envelope for\nsuccess and one for errors. Everything below is generated directly from the live API, so\nthese docs always match how it actually behaves.\n\n## Authentication\n\nProgrammatic calls use a **Bearer API key**. Create one from the dashboard, then send it\non every request:\n\n```http\nAuthorization: Bearer yte_live_8f2c…\n```\n\nKeys are tier-scoped (`yte_test_` for trial, `yte_live_` for paid). Dashboard-only\nendpoints (managing keys) instead use your **session cookie**. Every response - success\nor error - carries an `X-Request-Id` you can quote in support.\n\n## Billing & statuses\n\nThere is exactly **one billing rule**:\n\n> `charged = 1` **if and only if** `status === \"resolved\"` (with an email present).\n\nEverything else - no public email, captcha-gated, not found, or any temporary failure on\nour side - is **free and auto-refunded**. Credits are *held* when you submit and *settled* on\ncompletion, so a credit held for a channel that doesn't resolve is always returned.\n\n## Pagination\n\nList endpoints are **cursor-paginated**. Pass `?limit=` (and `?cursor=` from the\nprevious page's `meta.next_cursor`). The response `meta` is a `list` object with\n`has_more` and `next_cursor`.\n\n## Rate limits & quotas\n\nEach key is metered per its tier. Your *own* limits are returned by `GET /api/v1/me`; rate\nlimit headers (`X-RateLimit-*`, `Retry-After`) ride on every response. You only ever see\nyour own limits.\n\n| Tier | Daily deliveries | Concurrent jobs | Channels / job | Req / min |\n| --- | --- | --- | --- | --- |\n| Trial | 5 | 1 | 5 | 60 |\n| Standard | 2,000 | 3 | 5,000 | 60 |\n| Premium | 20,000 | 8 | 50,000 | 120 |\n\n## Errors\n\nErrors use a nested envelope with a stable machine-readable `type`, the HTTP `status`,\na human `message`, the `request_id`, and a `doc_url`. Retry `5xx` / `429` with backoff;\nfix and resubmit `4xx`.","contact":{"name":"ytemailfinder","url":"https://ytemailfinder.com/docs"}},"servers":[{"url":"/api/v1","description":"This host"}],"security":[{"bearerAuth":[]}],"tags":[{"name":"Reveals","description":"Resolve a single channel synchronously (falls back to a job)."},{"name":"Jobs","description":"Submit thousands of channels in one call; poll or get a webhook."},{"name":"Account","description":"Your tier, limits, wallet balance, ledger, and request log."},{"name":"Keys","description":"Create and list API keys. Session-scoped - managed from the dashboard."},{"name":"System","description":"Liveness. Public, unauthenticated."}],"paths":{"/reveal":{"post":{"tags":["Reveals"],"summary":"Reveal a single channel","operationId":"createReveal","description":"Holds **1 credit** and resolves one channel. Each reveal runs in the background, so we return **202** with a single-channel job + a `Location` poll URL. Poll `GET /api/v1/jobs/{id}` for the outcome. Send an `Idempotency-Key` to make retries safe.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Unique key (e.g. a UUID) that makes a retried submit return the original job.","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevealRequest"},"examples":{"handle":{"summary":"By @handle","value":{"channel":"@MrBeast"}},"url":{"summary":"By URL","value":{"channel":"https://youtube.com/@veritasium"}},"id":{"summary":"By channel id","value":{"channel":"UCX6OQ3DkcsbYNE6H8uQQuVA"}}}}}},"responses":{"202":{"description":"Accepted. A 1-channel job was created; poll the `Location` URL.","headers":{"Location":{"description":"Poll URL for the job.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevealJobEnvelope"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"invalid_key","message":"Missing or invalid API key.","status":401,"request_id":"req_9f3c1a7e2b","doc_url":"https://ytemailfinder.com/docs/errors#invalid_key"}}}}},"402":{"description":"Not enough credits to hold for this reveal.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"insufficient_credits","message":"Not enough credits to hold for this reveal.","status":402,"request_id":"req_9f3c1a7e2b","doc_url":"https://ytemailfinder.com/docs/errors#insufficient_credits"}}}}},"422":{"description":"Invalid request body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"invalid_input","message":"Invalid request body.","status":422,"request_id":"req_9f3c1a7e2b","doc_url":"https://ytemailfinder.com/docs/errors#invalid_input"}}}}},"429":{"description":"Daily delivery cap reached. Use a bulk job; it paces across UTC days.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"daily_cap_reached","message":"Daily delivery cap reached. Use a bulk job; it paces across UTC days.","status":429,"request_id":"req_9f3c1a7e2b","doc_url":"https://ytemailfinder.com/docs/errors#daily_cap_reached"}}}}}}}},"/jobs":{"post":{"tags":["Jobs"],"summary":"Create a bulk job","operationId":"createJob","description":"Normalises and **dedupes** the input, holds one credit per *unique* channel, and enqueues the work. Returns **202** with the job resource (or **200** with `Idempotency-Replayed: true` on a replay). Optionally register a `webhook` to be notified instead of polling.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Makes a retried submit return the original job instead of double-charging.","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobRequest"},"example":{"channels":["@MrBeast","UCX6OQ3DkcsbYNE6H8uQQuVA","https://youtube.com/@veritasium"],"webhook":"https://hooks.acme.com/yte","webhook_events":["job.completed","job.failed"]}}}},"responses":{"202":{"description":"Accepted. The job is queued; poll `Location` or wait for the webhook.","headers":{"Location":{"description":"Poll URL for the job.","schema":{"type":"string"}},"Idempotency-Replayed":{"description":"`true` when a prior submit was replayed.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevealJobEnvelope"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"invalid_key","message":"Missing or invalid API key.","status":401,"request_id":"req_9f3c1a7e2b","doc_url":"https://ytemailfinder.com/docs/errors#invalid_key"}}}}},"402":{"description":"Not enough credits to hold for the unique channels.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"insufficient_credits","message":"Not enough credits to hold for the unique channels.","status":402,"request_id":"req_9f3c1a7e2b","doc_url":"https://ytemailfinder.com/docs/errors#insufficient_credits"}}}}},"413":{"description":"More channels than your tier allows in one job.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"too_many_channels","message":"More channels than your tier allows in one job.","status":413,"request_id":"req_9f3c1a7e2b","doc_url":"https://ytemailfinder.com/docs/errors#too_many_channels"}}}}},"422":{"description":"Invalid request body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"invalid_input","message":"Invalid request body.","status":422,"request_id":"req_9f3c1a7e2b","doc_url":"https://ytemailfinder.com/docs/errors#invalid_input"}}}}},"429":{"description":"Too many active jobs for your tier.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"concurrent_jobs_exceeded","message":"Too many active jobs for your tier.","status":429,"request_id":"req_9f3c1a7e2b","doc_url":"https://ytemailfinder.com/docs/errors#concurrent_jobs_exceeded"}}}}}}},"get":{"tags":["Jobs"],"summary":"List your jobs","operationId":"listJobs","description":"A cursor-paginated list of your own jobs, newest first.","parameters":[{"name":"cursor","in":"query","required":false,"description":"Opaque cursor from the previous page's `meta.next_cursor`.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Page size (default 50, capped per endpoint).","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}}],"responses":{"200":{"description":"A page of jobs.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/RevealJob"}},"meta":{"$ref":"#/components/schemas/ListMeta"}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"invalid_key","message":"Missing or invalid API key.","status":401,"request_id":"req_9f3c1a7e2b","doc_url":"https://ytemailfinder.com/docs/errors#invalid_key"}}}}}}}},"/jobs/{id}":{"get":{"tags":["Jobs"],"summary":"Get a job","operationId":"getJob","description":"Status, summary, credits, progress, and a rough estimated-ready time. Shows only your own jobs.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Job id (e.g. `job_…`)."}],"responses":{"200":{"description":"The job resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevealJobEnvelope"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"invalid_key","message":"Missing or invalid API key.","status":401,"request_id":"req_9f3c1a7e2b","doc_url":"https://ytemailfinder.com/docs/errors#invalid_key"}}}}},"404":{"description":"No such job for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"job_not_found","message":"No such job for this account.","status":404,"request_id":"req_9f3c1a7e2b","doc_url":"https://ytemailfinder.com/docs/errors#job_not_found"}}}}}}}},"/jobs/{id}/results":{"get":{"tags":["Jobs"],"summary":"Get per-channel results","operationId":"getJobResults","description":"Cursor-paginated per-channel results - the exact rows billing counts. Optionally filter by `status`.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Job id."},{"name":"status","in":"query","required":false,"description":"Only return results with this per-channel status.","schema":{"type":"string","enum":["pending","resolved","no_business_email","gated","captcha_timeout","account_blocked","not_found","proxy_error","upstream_error","never_attempted","canceled"]}},{"name":"cursor","in":"query","required":false,"description":"Opaque cursor from the previous page's `meta.next_cursor`.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Page size (default 50, capped per endpoint).","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}}],"responses":{"200":{"description":"A page of per-channel results.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/RevealResult"}},"meta":{"$ref":"#/components/schemas/ListMeta"}}},"example":{"data":[{"object":"reveal_result","input":"@MrBeast","channel_id":"UCX6OQ3DkcsbYNE6H8uQQuVA","status":"resolved","email":"business@mrbeast.com","charged":1,"channel":{"name":"MrBeast","description":"…","subscribers":"300M subscribers","videos":"800 videos","views":"60,000,000,000 views","country":"United States","joined":"Feb 20, 2012","links":[{"title":"Instagram","url":"https://instagram.com/mrbeast"}]}},{"object":"reveal_result","input":"@some-channel","channel_id":"UC…","status":"no_business_email","email":null,"charged":0,"channel":{"name":"Some Channel","description":"…","subscribers":"12K subscribers","videos":"40 videos","views":"1,200,000 views","country":null,"joined":"Jan 1, 2020","links":[]}}],"meta":{"object":"list","count":2,"limit":50,"has_more":false,"next_cursor":null}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"invalid_key","message":"Missing or invalid API key.","status":401,"request_id":"req_9f3c1a7e2b","doc_url":"https://ytemailfinder.com/docs/errors#invalid_key"}}}}},"404":{"description":"No such job for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"job_not_found","message":"No such job for this account.","status":404,"request_id":"req_9f3c1a7e2b","doc_url":"https://ytemailfinder.com/docs/errors#job_not_found"}}}}}}}},"/jobs/{id}/cancel":{"post":{"tags":["Jobs"],"summary":"Cancel a job","operationId":"cancelJob","description":"Cancels an active job (`queued`, `running`, or `settling`). Channels not yet processed are refunded; a reveal that's already underway finishes rather than stopping partway. Jobs that have already finished return `409`.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Job id."}],"responses":{"200":{"description":"The canceled job.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevealJobEnvelope"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"invalid_key","message":"Missing or invalid API key.","status":401,"request_id":"req_9f3c1a7e2b","doc_url":"https://ytemailfinder.com/docs/errors#invalid_key"}}}}},"404":{"description":"No such job for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"job_not_found","message":"No such job for this account.","status":404,"request_id":"req_9f3c1a7e2b","doc_url":"https://ytemailfinder.com/docs/errors#job_not_found"}}}}},"409":{"description":"Job is terminal and cannot be canceled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"job_not_cancelable","message":"Job is terminal and cannot be canceled.","status":409,"request_id":"req_9f3c1a7e2b","doc_url":"https://ytemailfinder.com/docs/errors#job_not_cancelable"}}}}}}}},"/me":{"get":{"tags":["Account"],"summary":"Get your account","operationId":"getMe","description":"Your tier, your *own* limits, and a snapshot of your wallet - always just your own numbers.","responses":{"200":{"description":"The account resource.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Account"}}},"example":{"data":{"object":"account","user_id":"usr_8f2c","tier":"standard","limits":{"rpm":60,"daily_cap":2000,"concurrent_jobs":3,"max_channels_per_job":5000},"wallet":{"balance":1842,"held":12,"daily_used":158,"daily_remaining":1842}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"invalid_key","message":"Missing or invalid API key.","status":401,"request_id":"req_9f3c1a7e2b","doc_url":"https://ytemailfinder.com/docs/errors#invalid_key"}}}}}}}},"/wallet":{"get":{"tags":["Account"],"summary":"Get your wallet","operationId":"getWallet","description":"Balance, held, available, and the daily delivery counter.","responses":{"200":{"description":"The wallet resource.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Wallet"}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"invalid_key","message":"Missing or invalid API key.","status":401,"request_id":"req_9f3c1a7e2b","doc_url":"https://ytemailfinder.com/docs/errors#invalid_key"}}}}}}}},"/wallet/transactions":{"get":{"tags":["Account"],"summary":"List ledger entries","operationId":"listTransactions","description":"The financial ledger - holds, charges, refunds, top-ups - newest first.","parameters":[{"name":"cursor","in":"query","required":false,"description":"Opaque cursor from the previous page's `meta.next_cursor`.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Page size (default 50, capped per endpoint).","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}}],"responses":{"200":{"description":"A page of ledger entries.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WalletTransaction"}},"meta":{"$ref":"#/components/schemas/ListMeta"}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"invalid_key","message":"Missing or invalid API key.","status":401,"request_id":"req_9f3c1a7e2b","doc_url":"https://ytemailfinder.com/docs/errors#invalid_key"}}}}}}}},"/usage":{"get":{"tags":["Account"],"summary":"List request log","operationId":"listUsage","description":"Per-request log for your keys. Filter by `method`, `path` prefix, and `status`.","parameters":[{"name":"method","in":"query","required":false,"description":"Filter by HTTP method.","schema":{"type":"string","example":"POST"}},{"name":"path","in":"query","required":false,"description":"Filter by path prefix.","schema":{"type":"string","example":"/api/v1/jobs"}},{"name":"status","in":"query","required":false,"description":"Filter by HTTP status code.","schema":{"type":"integer","example":202}},{"name":"cursor","in":"query","required":false,"description":"Opaque cursor from the previous page's `meta.next_cursor`.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Page size (default 50, max 200).","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}}],"responses":{"200":{"description":"A page of request-log rows.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/RequestLog"}},"meta":{"$ref":"#/components/schemas/ListMeta"}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"invalid_key","message":"Missing or invalid API key.","status":401,"request_id":"req_9f3c1a7e2b","doc_url":"https://ytemailfinder.com/docs/errors#invalid_key"}}}}}}}},"/keys":{"get":{"tags":["Keys"],"summary":"List your API keys","operationId":"listKeys","description":"Lists your API keys. The secret is **never** returned here. Session-scoped (dashboard cookie).","security":[{"cookieAuth":[]}],"responses":{"200":{"description":"Your keys (without secrets).","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ApiKey"}}}}}}},"401":{"description":"Sign in to manage keys.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"invalid_session","message":"Sign in to manage keys.","status":401,"request_id":"req_9f3c1a7e2b","doc_url":"https://ytemailfinder.com/docs/errors#invalid_session"}}}}}}},"post":{"tags":["Keys"],"summary":"Create an API key","operationId":"createKey","description":"Creates a key and returns the **raw secret once**. Store it now - it is never shown again. Session-scoped (dashboard cookie).","security":[{"cookieAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"A label for the key."}}},"example":{"name":"Production server"}}}},"responses":{"201":{"description":"The created key, including the raw `key` (shown once).","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/ApiKey"},{"type":"object","properties":{"key":{"type":"string","description":"The raw secret - shown only here."}}}]}}}}}},"401":{"description":"Sign in to manage keys.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"type":"invalid_session","message":"Sign in to manage keys.","status":401,"request_id":"req_9f3c1a7e2b","doc_url":"https://ytemailfinder.com/docs/errors#invalid_session"}}}}}}}},"/health":{"get":{"tags":["System"],"summary":"Liveness","operationId":"getHealth","description":"Public liveness probe. No auth, no capacity exposure.","security":[],"responses":{"200":{"description":"Service is up.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Health"}}},"example":{"data":{"object":"health","status":"ok","time":"2026-06-26T12:00:00.000Z"}}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"yte_live_…","description":"Your API key, e.g. `Authorization: Bearer yte_live_8f2c…`."},"cookieAuth":{"type":"apiKey","in":"cookie","name":"better-auth.session_token","description":"Dashboard session cookie. Used only by key-management endpoints."}},"schemas":{"RevealRequest":{"type":"object","required":["channel"],"properties":{"channel":{"type":"string","minLength":1,"description":"A channel as `@handle`, bare handle, `UC…` id, or a youtube.com channel URL.","example":"@MrBeast"}}},"JobRequest":{"type":"object","required":["channels"],"properties":{"channels":{"type":"array","minItems":1,"items":{"type":"string","minLength":1},"description":"Channels to resolve. Deduped server-side; one credit held per unique channel."},"webhook":{"type":"string","format":"uri","description":"Optional URL to receive job events."},"webhook_events":{"type":"array","items":{"type":"string","enum":["job.completed","job.failed","job.canceled","job.progress"]},"description":"Events to deliver. Defaults to `job.completed` + `job.failed`."}}},"RevealJob":{"type":"object","description":"A bulk reveal job.","properties":{"object":{"type":"string","const":"reveal_job"},"id":{"type":"string","example":"job_01J…"},"status":{"type":"string","enum":["queued","running","settling","completed","completed_with_errors","canceled","failed","expired"]},"channels_total":{"type":"integer"},"summary":{"type":"object","properties":{"total":{"type":"integer"},"resolved":{"type":"integer"},"no_business_email":{"type":"integer"},"failed":{"type":"integer"},"pending":{"type":"integer"}}},"credits":{"type":"object","properties":{"held":{"type":"integer"},"charged":{"type":"integer"},"refunded":{"type":"integer"}}},"progress":{"type":"object","properties":{"processed":{"type":"integer"},"total":{"type":"integer"},"percent":{"type":"integer"}}},"estimated_ready_at":{"type":["string","null"],"format":"date-time","description":"A rough estimated-ready time (approximate)."},"results_url":{"type":"string"},"poll":{"type":"string"},"expires_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"}}},"RevealJobEnvelope":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/RevealJob"},"usage":{"type":"object","properties":{"credits_held":{"type":"integer"},"credits_remaining":{"type":"integer"}}},"meta":{"type":"object","properties":{"deduped":{"type":"integer","description":"Duplicate channels collapsed."},"rejected":{"type":"array","items":{"type":"object"},"description":"Inputs that failed normalisation."}}}},"example":{"data":{"object":"reveal_job","id":"job_01J8X5Z9QK","status":"queued","channels_total":3,"summary":{"total":3,"resolved":0,"no_business_email":0,"failed":0,"pending":3},"credits":{"held":3,"charged":0,"refunded":0},"progress":{"processed":0,"total":3,"percent":0},"estimated_ready_at":"2026-06-26T12:04:00.000Z","results_url":"/api/v1/jobs/job_01J8X5Z9QK/results","poll":"/api/v1/jobs/job_01J8X5Z9QK","expires_at":null,"created_at":"2026-06-26T12:00:00.000Z"},"usage":{"credits_held":3,"credits_remaining":1839},"meta":{"deduped":0}}},"RevealResult":{"type":"object","description":"A single per-channel outcome.","properties":{"object":{"type":"string","const":"reveal_result"},"input":{"type":"string","description":"The channel as you submitted it."},"channel_id":{"type":["string","null"],"description":"Resolved `UC…` id, when known."},"status":{"type":"string","enum":["pending","resolved","no_business_email","gated","captcha_timeout","account_blocked","not_found","proxy_error","upstream_error","never_attempted","canceled"],"description":"`pending` - awaiting resolution; `resolved` - email found - **charged 1**; `no_business_email` - no public email - free; `gated` - captcha-gated - free; `captcha_timeout` - temporary timeout on our side - free, safe to retry; `account_blocked` - temporarily unavailable - free, safe to retry; `not_found` - channel not resolved - free; `proxy_error` - temporary network issue - free, safe to retry; `upstream_error` - temporary upstream issue - free, safe to retry; `never_attempted` - not attempted - free, safe to retry; `canceled` - canceled before resolution - free"},"email":{"type":["string","null"],"description":"The business email, present only when `status = resolved`."},"charged":{"type":"integer","enum":[0,1],"description":"`1` iff `status = resolved`."}}},"Wallet":{"type":"object","properties":{"object":{"type":"string","const":"wallet"},"balance":{"type":"integer","description":"Available credits (already net of held)."},"held":{"type":"integer","description":"Credits reserved by in-flight jobs."},"available":{"type":"integer"},"daily_used":{"type":"integer","description":"Deliveries charged this UTC day."},"daily_cap":{"type":["integer","null"]},"daily_remaining":{"type":["integer","null"]},"status":{"type":"string","example":"active"}}},"WalletTransaction":{"type":"object","properties":{"object":{"type":"string","const":"wallet_transaction"},"id":{"type":"string"},"type":{"type":"string","description":"hold | charge | refund | topup | …"},"amount":{"type":"integer"},"delta_available":{"type":"integer"},"delta_held":{"type":"integer"},"balance_after":{"type":"integer"},"held_after":{"type":"integer"},"job_id":{"type":["string","null"]},"reason":{"type":["string","null"]},"created_at":{"type":"string","format":"date-time"}}},"Account":{"type":"object","properties":{"object":{"type":"string","const":"account"},"user_id":{"type":"string"},"tier":{"type":"string","example":"standard"},"limits":{"type":"object","properties":{"rpm":{"type":["integer","null"]},"daily_cap":{"type":["integer","null"]},"concurrent_jobs":{"type":["integer","null"]},"max_channels_per_job":{"type":["integer","null"]}}},"wallet":{"type":"object","properties":{"balance":{"type":"integer"},"held":{"type":"integer"},"daily_used":{"type":"integer"},"daily_remaining":{"type":["integer","null"]}}}}},"RequestLog":{"type":"object","properties":{"object":{"type":"string","const":"request_log"},"id":{"type":"string"},"method":{"type":"string"},"path":{"type":"string"},"status":{"type":"integer"},"credits_charged":{"type":"integer"},"latency_ms":{"type":"integer"},"request_id":{"type":"string"},"created_at":{"type":"string","format":"date-time"}}},"ApiKey":{"type":"object","properties":{"object":{"type":"string","const":"api_key"},"id":{"type":"string"},"name":{"type":["string","null"]},"prefix":{"type":["string","null"],"example":"yte_live_"},"start":{"type":["string","null"],"description":"First few chars, for display."},"enabled":{"type":"boolean"},"created_at":{"type":["string","null"],"format":"date-time"},"last_used_at":{"type":["string","null"],"format":"date-time"}}},"Health":{"type":"object","properties":{"object":{"type":"string","const":"health"},"status":{"type":"string","example":"ok"},"time":{"type":"string","format":"date-time"}}},"ListMeta":{"type":"object","description":"Cursor-pagination metadata.","properties":{"object":{"type":"string","const":"list"},"count":{"type":"integer"},"limit":{"type":"integer"},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]}}},"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["type","message","status","request_id"],"properties":{"type":{"type":"string","enum":["malformed_request","invalid_key","invalid_session","insufficient_credits","forbidden_scope","job_not_found","key_not_found","idempotency_conflict","idempotency_in_progress","no_capacity","job_not_cancelable","too_many_channels","invalid_input","rate_limited","daily_cap_reached","concurrent_jobs_exceeded","internal_error","reveal_failed","capacity_unavailable","billing_unavailable"],"description":"Stable machine-readable error code."},"message":{"type":"string"},"status":{"type":"integer"},"request_id":{"type":"string"},"doc_url":{"type":"string","format":"uri"},"details":{"type":"object","additionalProperties":true}}}}}}}}