/* ⭐ Переключатель языка. Скромный намеренно: это служебная кнопка, а не содержание страницы. */ .langbar{display:flex;gap:2px;justify-content:flex-end;margin:0 0 18px} .langbar button{border:1px solid var(--line);background:none;color:var(--mute);cursor:pointer; padding:4px 11px;font:13px/1 inherit;border-radius:6px} .langbar button.on{background:var(--ink);color:#fff;border-color:var(--ink)} .langbar button:hover{color:var(--ink)} [data-lang][hidden]{display:none}
Одноразовые почтовые адреса с готовым кодом. Формат вызовов — ваш собственный: менять у себя ничего не нужно, достаточно поменять адрес сервера и ключ.
| Адрес | https://api.inboxotp.online |
|---|---|
| Метод | GET или POST — как удобнее. Ответ JSON в UTF-8 |
| Ключ | параметр api_key, параметр key или заголовок
X-Api-Key — принимаем любой |
| Домен адресов | icloud.com, он один и не выбирается |
| Проверка связи | /ping — без ключа, отвечает {"status":"ok"} |
getActivation.getCode, пока код не придёт.setStatus&status=3. Не понадобилось —
status=2, и денег не спишем.Все на пути /api/mail/…, ответ вида {"status":1,…} при
успехе и {"status":0,"error":"…"} при отказе.
| getActivation | ?api_key=КЛЮЧ&service=drвзять адрес. → {"status":1,"mail":"…@icloud.com","mailId":123}Деньги здесь ещё не списываются. |
|---|---|
| getCode | ?api_key=КЛЮЧ&mailId=123забрать код. → {"status":1,"code":"505254"}Спрашивать повторно, раз в 3–5 секунд. В этот момент списываются деньги. |
| setStatus | ?api_key=КЛЮЧ&id=123&status=3 — закрыть успешно,
адрес сразу освобождается…&status=2 — отменить…&status=5 — жду ещё один код, заказ остаётся открытым |
| getLetter | ?api_key=КЛЮЧ&mailId=123письмо целиком — наше дополнение сверх вашего описания, в том же формате. &raw=1 добавит исходник со служебными строками. |
| getPriceRests | ?api_key=КЛЮЧ&service=drцена и остаток. → {"status":1,"data":{"dr":{"icloud.com":{"price":0.1,"count":5087}}}} |
| getMailServicesList | /stubs/handler_api.php?api_key=КЛЮЧ&action=getMailServicesListсписок сервисов с названиями |
| getBalance | /stubs/handler_api.php?api_key=КЛЮЧ&action=getBalance→ ACCESS_BALANCE:9.10 |
mailId или
id, принимаем и сам адрес: mail=имя@icloud.com. Хранить наш номер у себя
не обязательно.Нужно, когда подтверждение приходит ссылкой, а не кодом, или когда важны детали письма.
GET /api/mail/getLetter?api_key=КЛЮЧ&mailId=123
{"status":1,
"mail":"sequent_patron6h@icloud.com",
"subject":"тема письма",
"from":"noreply@verify.proton.me",
"from_domain":"verify.proton.me",
"received_at":"2026-09-03 04:47:04",
"text":"весь читаемый текст письма",
"code":"505254"}
from — настоящий отправитель, полным адресом. В самом письме
он спрятан за служебной маской пересылки вида
"noreply@verify.proton.me" <noreply_at_verify_proton_me_zwmpd61@icloud.com> —
мы её разворачиваем и отдаём то, что отправитель написал бы у себя:
noreply@verify.proton.me. Рядом, в from_domain, лежит только домен —
если вы сверяете отправителя по домену, берите это поле.То же самое можно получить вместе с кодом, одним ответом:
getCode&mailId=123&full=1 добавит поле letter.
getActivation -> mailId
getCode раз в 3-5 секунд -> пришёл? setStatus status=3
нет? ждать, окно 25 минут
Сайты часто присылают код повторно: «не пришло? отправить ещё раз». Чтобы дождаться второго письма, не покупая новый адрес, поставьте статус 5 вместо 3.
getCode -> первый код получен setStatus id=123&status=5 -> жду ещё один getCode раз в 3-5 секунд -> вернётся САМЫЙ СВЕЖИЙ код setStatus id=123&status=3 -> всё получил, закрываем
| Окно | 25 минут суммарно на активацию, на любое число писем |
|---|---|
| Что вернёт getCode | самый свежий код из пришедших. Пока нового письма нет — прежний код, тот же самый |
| Когда закрывать | статусом 3, когда получили всё нужное. Не закрыли — адрес освободится сам по истечении окна |
getPriceRests
показывает, сколько адресов на этот сервис ещё не уходило. Общее число было бы завышенным:
адрес, уже сходивший на ig, для ig больше не товар. Спросили один сервис —
ответим про него; не спросили — отдадим весь список целиком (все сервисы, что у нас есть).Незнакомый код сервиса не отвергаем — принимаем как есть. Список у вас пополняется без нашего участия.
| Pass service | не указан сервис |
|---|---|
| Pass mail id | не указан номер заказа |
| No activation found with such id | такого заказа у вас нет — проверьте номер |
| Code has not been received yet… | письмо ещё не пришло, спросите позже |
| Activation is already canceled | заказ отменён или срок вышел |
| Bad actual activation status | сейчас так делать нельзя (например, отмена после письма) |
| No mails yet | свободных адресов под этот сервис нет |
| Insufficient balance | не хватает средств на счету |
| No such domain | запрошен домен, которого у нас нет |
| Bad api key | ключ не признан |
У сервиса две равноправные двери, и вы выбираете любую. Выше — путь
/api/mail/…, привычный тем, кто уже работал с похожими сервисами. Ниже — короткий
путь: всё в одном адресе, действие задаётся словом action. Механизм ОДИН и тот
же, отличаются только названия. Смешивать в одном цикле не нужно — выберите что удобнее.
| взять адрес | /?api_key=КЛЮЧ&action=getMail&service=ig→ {"status":"ok","id":123,"mail":"…@icloud.com","expires_in":1500,"price":0.003}Номер заказа здесь называется id. |
|---|---|
| спросить код | /?api_key=КЛЮЧ&action=getStatus&id=123→ {"status":"waiting",…} пока письма нет, потом — кодСпрашивать раз в 3–5 секунд. |
| письмо целиком | /?api_key=КЛЮЧ&action=getLetter&id=123 |
| закрыть успешно | /?api_key=КЛЮЧ&action=finish&id=123
→ {"status":"done",…} |
| отменить | /?api_key=КЛЮЧ&action=cancel&id=123
→ {"status":"canceled",…} |
| остаток | /?api_key=КЛЮЧ&action=balance
→ {"status":"ok","balance":5.03,"today":17099} |
Номер заказа можно передавать как id, так и mailId —
обе двери понимают оба названия, перепутать нельзя.
Если в ответ приходит пустота — ни текста, ни ошибки, а браузер пишет
«не удаётся получить доступ к сайту» — это почти всегда ключ не передан или ошибка в адресе,
а не сбой сервиса. Запросы без ключа мы намеренно оставляем без ответа. Проверить, что сервис жив:
/?api_key=КЛЮЧ&action=balance — ответил, значит всё работает.
GET /api/mail/getActivation?api_key=КЛЮЧ&service=dr
{"status":1,"mail":"09.ninths_least@icloud.com","mailId":7}
GET /api/mail/getCode?api_key=КЛЮЧ&mailId=7
{"status":0,"error":"Code has not been received yet, please try again later"}
… через несколько секунд …
GET /api/mail/getCode?api_key=КЛЮЧ&mailId=7
{"status":1,"code":"577221"}
GET /api/mail/setStatus?api_key=КЛЮЧ&id=7&status=3
{"status":1,"message":"Success"}
Три способа, все ведут к одному и тому же счёту: USDT в сети BEP20 (BSC) переводится прямо на наш кошелёк, без посредников. Каждый счёт получает свою точную сумму с центами — по ней мы и узнаём ваш перевод. Зачисление автоматическое, обычно через минуту-две.
Одна ссылка — человек нажимает и попадает на страницу оплаты с готовым адресом и суммой.
/?api_key=КЛЮЧ&action=pay_link&usd=100&net=bep20
Без usd откроется короткая страница выбора суммы и сети.
/?api_key=КЛЮЧ&action=pay_invoice&usd=100&net=bep20
| addr | адрес, куда отправлять |
|---|---|
| pay_amount | сколько отправить — ровно, до цента (заказали 100 — например, 100.37) |
| usd | сколько ляжет на ваш счёт — та же сумма, вместе с центами |
| txn | номер счёта, по нему спрашивают состояние |
| expire | до какого времени счёт жив (30 минут) |
| qr | картинка кода — только если добавить &qr=1 |
Дальше проверяйте состояние, пока не увидите credited:
/?api_key=КЛЮЧ&action=pay_status&txn=НОМЕР
| paid / expected | сколько пришло и сколько ждём |
|---|---|
| confirmations / confirmations_needed | подтверждения сети |
| tx_url | ссылка на перевод в блокчейне — проверяется без нас |
| credited | деньги уже на счету |
Передумали — счёт можно закрыть:
/?api_key=КЛЮЧ&action=pay_cancel&txn=НОМЕР
app.inboxotp.online/cab — вкладка «Пополнение». Там же вся история платежей со
ссылками на переводы в блокчейне. Тот же список отдаёт запрос:
/?api_key=КЛЮЧ&action=pay_history
Disposable mail addresses that receive verification codes. The call format is your own: nothing to rewrite on your side — just change the server address and the key.
| Base | https://api.inboxotp.online |
|---|---|
| Method | GET or POST, whichever suits you. Response is JSON in UTF-8 |
| Key | api_key, key or the X-Api-Key header —
any of them works |
| Address domain | icloud.com. There is one and it is not selectable |
| Liveness | /ping — no key needed, answers {"status":"ok"} |
getActivation.getCode until the code arrives.setStatus&status=3. Not needed — status=2,
and you are not charged.All under /api/mail/…. Success is {"status":1,…},
failure is {"status":0,"error":"…"}.
| getActivation | ?api_key=KEY&service=drtake an address. → {"status":1,"mail":"…@icloud.com","mailId":123}No charge at this point. |
|---|---|
| getCode | ?api_key=KEY&mailId=123fetch the code. → {"status":1,"code":"505254"}Poll every 3–5 seconds. This is where you are charged. |
| setStatus | ?api_key=KEY&id=123&status=3 — close as successful,
the address is released immediately…&status=2 — cancel…&status=5 — waiting for one more code, the order stays open |
| getLetter | ?api_key=KEY&mailId=123the whole letter — our addition on top of your spec, in the same format. &raw=1 adds the original source with service headers. |
| getPriceRests | ?api_key=KEY&service=drprice and stock. → {"status":1,"data":{"dr":{"icloud.com":{"price":0.1,"count":5087}}}} |
| getMailServicesList | /stubs/handler_api.php?api_key=KEY&action=getMailServicesListthe service list with names |
| getBalance | /stubs/handler_api.php?api_key=KEY&action=getBalance→ ACCESS_BALANCE:9.10 |
mailId or id we also accept the address itself:
mail=name@icloud.com. You do not have to store our ids.Useful when confirmation arrives as a link rather than a code, or when the details matter.
GET /api/mail/getLetter?api_key=KEY&mailId=123
{"status":1,
"mail":"sequent_patron6h@icloud.com",
"subject":"letter subject",
"from":"noreply@verify.proton.me",
"from_domain":"verify.proton.me",
"received_at":"2026-09-03 04:47:04",
"text":"full readable body of the letter",
"code":"505254"}
from is the real sender, as a full address. Inside the letter it
is hidden behind a forwarding mask such as
"noreply@verify.proton.me" <noreply_at_verify_proton_me_zwmpd61@icloud.com> — we
unwrap it and return what the sender itself would write:
noreply@verify.proton.me. Next to it, from_domain holds the domain only —
use that field if you match senders by domain.The same can be returned together with the code in one response:
getCode&mailId=123&full=1 adds a letter field.
getActivation -> mailId
getCode every 3-5 seconds -> arrived? setStatus status=3
not yet? wait, window is 25 minutes
Sites often send the code again — “didn’t arrive? resend”. To wait for that second letter without buying a new address, set status 5 instead of 3.
getCode -> first code received setStatus id=123&status=5 -> waiting for one more getCode every 3-5 seconds -> returns the FRESHEST code setStatus id=123&status=3 -> got everything, close it
| Window | 25 minutes per activation in total, any number of letters |
|---|---|
| What getCode returns | the freshest code received. While no new letter has arrived — the previous code, unchanged |
| When to close | status 3 once you have everything. If you don’t, the address frees itself when the window runs out |
getPriceRests shows
how many addresses have never been used for that service. A total figure would be inflated: an
address already used on ig is no longer stock for ig. Ask about one
service and we answer about it; ask about none and we return the whole list — every service
we carry.Unknown service codes are not rejected — we accept them as they are. Your list grows without our involvement.
| Pass service | service not specified |
|---|---|
| Pass mail id | order id not specified |
| No activation found with such id | no such order of yours — check the id |
| Code has not been received yet… | the letter has not arrived, ask again later |
| Activation is already canceled | the order was cancelled or expired |
| Bad actual activation status | not allowed right now (e.g. cancelling after a letter) |
| No mails yet | no free addresses for this service |
| Insufficient balance | not enough funds on the account |
| No such domain | a domain we do not have was requested |
| Bad api key | key not recognised |
The service has two equal doors; pick either. Above is the /api/mail/…
path, familiar to anyone who has used similar services. Below is the short path: everything in
one address, with the step named by action. The mechanism is THE SAME — only the
names differ. No need to mix them in one loop; use whichever suits you.
| take an address | /?api_key=KEY&action=getMail&service=ig→ {"status":"ok","id":123,"mail":"…@icloud.com","expires_in":1500,"price":0.003}The order number is called id here. |
|---|---|
| ask for the code | /?api_key=KEY&action=getStatus&id=123→ {"status":"waiting",…} while no letter yet, then the codePoll every 3–5 seconds. |
| the whole letter | /?api_key=KEY&action=getLetter&id=123 |
| close as success | /?api_key=KEY&action=finish&id=123
→ {"status":"done",…} |
| cancel | /?api_key=KEY&action=cancel&id=123
→ {"status":"canceled",…} |
| stock | /?api_key=KEY&action=balance
→ {"status":"ok","balance":5.03,"today":17099} |
The order number may be passed as id or as mailId —
both doors accept both names, so you cannot get it wrong.
If the reply is empty — no text, no error, and the browser says the site
cannot be reached — that almost always means the key was not passed or the address has a typo,
not that the service is down. Requests without a key are deliberately left unanswered. To check the
service is alive: /?api_key=KEY&action=balance — if it answers, all is well.
GET /api/mail/getActivation?api_key=KEY&service=dr
{"status":1,"mail":"09.ninths_least@icloud.com","mailId":7}
GET /api/mail/getCode?api_key=KEY&mailId=7
{"status":0,"error":"Code has not been received yet, please try again later"}
… a few seconds later …
GET /api/mail/getCode?api_key=KEY&mailId=7
{"status":1,"code":"577221"}
GET /api/mail/setStatus?api_key=KEY&id=7&status=3
{"status":1,"message":"Success"}
Three ways, all leading to the same invoice: USDT on the BEP20 (BSC) network goes straight to our wallet, no middlemen. Every invoice gets its own exact amount with cents — that is how we recognise your transfer. Crediting is automatic, usually within a minute or two.
One link — the person clicks and lands on the payment page with the address and amount ready.
/?api_key=KEY&action=pay_link&usd=100&net=bep20
Without usd a short amount-and-network picker opens instead.
/?api_key=KEY&action=pay_invoice&usd=100&net=bep20
| addr | address to send to |
|---|---|
| pay_amount | how much to send — exactly, to the cent (order 100 — e.g. 100.37) |
| usd | what lands on your balance — the same amount, cents included |
| txn | invoice number, used to ask for its state |
| expire | how long the invoice lives (30 minutes) |
| qr | QR image — only if you add &qr=1 |
Then poll the state until you see credited:
/?api_key=KEY&action=pay_status&txn=NUMBER
| paid / expected | how much arrived and how much is expected |
|---|---|
| confirmations / confirmations_needed | network confirmations |
| tx_url | link to the transfer on the blockchain — verifiable without us |
| credited | the money is already on your balance |
Changed your mind — the invoice can be closed:
/?api_key=KEY&action=pay_cancel&txn=NUMBER
app.inboxotp.online/cab — the "Top-up" tab. The full payment history with blockchain
links lives there too. The same list is returned by:
/?api_key=KEY&action=pay_history
一次性邮箱地址,直接返回验证码。调用格式沿用你原有的一套:你那边不用改任何代码, 只需换掉服务器地址和密钥。
| 地址 | https://api.inboxotp.online |
|---|---|
| 方法 | GET 或 POST,随你方便。返回 UTF-8 编码的 JSON |
| 密钥 | 参数 api_key、参数 key 或请求头
X-Api-Key — 三种都接受 |
| 邮箱域名 | icloud.com,只有这一个,不可选择 |
| 连通性检查 | /ping — 无需密钥,返回 {"status":"ok"} |
getActivation。getCode,直到验证码到达。setStatus&status=3;用不上了 —
status=2,不会扣费。全部位于 /api/mail/… 路径下,成功返回 {"status":1,…},
失败返回 {"status":0,"error":"…"}。
| getActivation | ?api_key=密钥&service=dr取一个地址。 → {"status":1,"mail":"…@icloud.com","mailId":123}此时尚未扣费。 |
|---|---|
| getCode | ?api_key=密钥&mailId=123取验证码。 → {"status":1,"code":"505254"}每 3–5 秒轮询一次。扣费发生在这一步。 |
| setStatus | ?api_key=密钥&id=123&status=3 — 成功关闭,
地址立即释放…&status=2 — 取消…&status=5 — 还要再收一条,订单保持打开 |
| getLetter | ?api_key=密钥&mailId=123整封邮件 — 这是我们在你原有规范之外的补充,格式一致。 加上 &raw=1 会附带含邮件头的原文。 |
| getPriceRests | ?api_key=密钥&service=dr价格与库存。 → {"status":1,"data":{"dr":{"icloud.com":{"price":0.1,"count":5087}}}} |
| getMailServicesList | /stubs/handler_api.php?api_key=密钥&action=getMailServicesList带名称的服务列表 |
| getBalance | /stubs/handler_api.php?api_key=密钥&action=getBalance→ ACCESS_BALANCE:9.10 |
mailId 或 id
的地方,也可以直接传地址:mail=name@icloud.com。你不必在自己那边保存我们的订单号。当确认是以链接而非验证码形式发来,或者你需要邮件细节时使用。
GET /api/mail/getLetter?api_key=密钥&mailId=123
{"status":1,
"mail":"sequent_patron6h@icloud.com",
"subject":"邮件主题",
"from":"noreply@verify.proton.me",
"from_domain":"verify.proton.me",
"received_at":"2026-09-03 04:47:04",
"text":"邮件的全部可读正文",
"code":"505254"}
from 是真实发件人的完整地址。 在邮件本身里,它被转发掩码
挡住,形如
"noreply@verify.proton.me" <noreply_at_verify_proton_me_zwmpd61@icloud.com> —
我们会把它还原,交还发件人自己写的那个地址:noreply@verify.proton.me。旁边的
from_domain 只放域名 — 如果你是按域名核对发件人,就用这个字段。同样的内容也可以和验证码一次返回:
getCode&mailId=123&full=1 会增加 letter 字段。
getActivation -> mailId
getCode 每 3-5 秒一次 -> 到了吗? setStatus status=3
没有? 继续等,窗口 25 分钟
网站常常会重发验证码:「没收到?再发一次」。想等这第二封而又不必另买地址, 把状态设为 5,而不是 3。
getCode -> 收到第一条验证码 setStatus id=123&status=5 -> 还要再收一条 getCode 每 3-5 秒一次 -> 返回最新的那条验证码 setStatus id=123&status=3 -> 都拿到了,关闭
| 窗口 | 每次激活共 25 分钟,邮件数量不限 |
|---|---|
| getCode 返回什么 | 已收到的验证码中最新的一条。在新邮件到来之前, 返回的仍是先前那条 |
| 何时关闭 | 拿到所需内容后用状态 3 关闭。不关也可以 — 窗口到期地址会自行释放 |
getPriceRests
显示的是还没有用于该服务的地址数量。总数会虚高:已经用过 ig 的地址,
对 ig 来说不再是货。查询某个服务就返回该服务的数字;不指定服务则返回整个列表
(我们拥有的全部服务)。不认识的服务代码我们不会拒绝,照单接受。你那边的列表增加时无需知会我们。
| Pass service | 未指定服务 |
|---|---|
| Pass mail id | 未指定订单号 |
| No activation found with such id | 你名下没有这个订单 — 请检查订单号 |
| Code has not been received yet… | 邮件尚未到达,请稍后再查 |
| Activation is already canceled | 订单已取消或已过期 |
| Bad actual activation status | 当前状态不允许该操作(例如邮件到达后再取消) |
| No mails yet | 该服务暂无可用地址 |
| Insufficient balance | 账户余额不足 |
| No such domain | 请求了我们没有的域名 |
| Bad api key | 密钥未被识别 |
本服务有两扇同等的门,任选其一。上面是 /api/mail/… 那条路,
用过同类服务的人会很熟悉。下面是简短的一条:全部集中在同一个地址上,
动作由 action 指定。机制完全一样,只是名字不同。不需要在同一个循环里混用 —
挑顺手的那种即可。
| 取地址 | /?api_key=密钥&action=getMail&service=ig→ {"status":"ok","id":123,"mail":"…@icloud.com","expires_in":1500,"price":0.003}这里订单号叫 id。 |
|---|---|
| 查验证码 | /?api_key=密钥&action=getStatus&id=123→ 邮件未到时是 {"status":"waiting",…},之后是验证码每 3–5 秒查一次。 |
| 整封邮件 | /?api_key=密钥&action=getLetter&id=123 |
| 成功关闭 | /?api_key=密钥&action=finish&id=123
→ {"status":"done",…} |
| 取消 | /?api_key=密钥&action=cancel&id=123
→ {"status":"canceled",…} |
| 余额 | /?api_key=密钥&action=balance
→ {"status":"ok","balance":5.03,"today":17099} |
订单号既可以写成 id,也可以写成 mailId —
两扇门都认这两个名字,不会弄混。
如果返回的是一片空白 — 既无文本也无错误,浏览器显示「无法访问此网站」 —
那几乎总是没有传密钥或者地址写错了,而不是服务故障。不带密钥的请求我们是有意不作应答的。
想确认服务是否正常:/?api_key=密钥&action=balance — 有回应就说明一切正常。
GET /api/mail/getActivation?api_key=密钥&service=dr
{"status":1,"mail":"09.ninths_least@icloud.com","mailId":7}
GET /api/mail/getCode?api_key=密钥&mailId=7
{"status":0,"error":"Code has not been received yet, please try again later"}
… 几秒钟后 …
GET /api/mail/getCode?api_key=密钥&mailId=7
{"status":1,"code":"577221"}
GET /api/mail/setStatus?api_key=密钥&id=7&status=3
{"status":1,"message":"Success"}
三种方式,最终都指向同一张账单:BEP20(BSC)网络上的 USDT 直接转入我们的钱包, 没有中间方。每张账单都有自己精确到分的金额 — 我们靠它识别你的转账。到账是自动的,通常一两分钟。
一条链接 — 用户点击后直接进入付款页,地址和金额都已备好。
/?api_key=密钥&action=pay_link&usd=100&net=bep20
不带 usd 时,会打开一个简短的金额与网络选择页。
/?api_key=密钥&action=pay_invoice&usd=100&net=bep20
| addr | 汇款地址 |
|---|---|
| pay_amount | 应汇金额 — 精确到分(下单 100,例如 100.37) |
| usd | 将计入余额的金额 — 同一金额,含零头 |
| txn | 账单号,用于查询状态 |
| expire | 账单有效期(30 分钟) |
| qr | 二维码图片 — 仅在加上 &qr=1 时返回 |
随后轮询状态,直到看到 credited:
/?api_key=密钥&action=pay_status&txn=账单号
| paid / expected | 已到账多少、期待多少 |
|---|---|
| confirmations / confirmations_needed | 网络确认数 |
| tx_url | 区块链上的转账链接 — 无需经过我们即可核实 |
| credited | 款项已计入余额 |
改变主意时,账单可以关闭:
/?api_key=密钥&action=pay_cancel&txn=账单号
app.inboxotp.online/cab — 「充值」标签页。完整的付款记录(含区块链链接)也在那里。
同一份列表也可以用请求取得:
/?api_key=密钥&action=pay_history