GET /recaptcha-v2-invisible · verify: POST /recaptcha-v2-invisible/submit · verified via: google
Invisible badge (explicit render, bottom-right). Submit runs grecaptcha.execute(); the callback fills g-recaptcha-response and auto-submits. Same siteverify endpoint as v2.
sitekey: 6LdAo8EtAAAAAMGVeOQ_c5O2Dcdpv080t_eXd4mG
# reCAPTCHA v2 Invisible (badge) — verify a solver token via curl
curl -X POST https://captcha.csdrama.com/recaptcha-v2-invisible/submit \
-H "Content-Type: application/json" \
-d '{"g-recaptcha-response": "TOKEN_FROM_SOLVER"}'
# form-encoded alternative:
curl -X POST https://captcha.csdrama.com/recaptcha-v2-invisible/submit \
-d "g-recaptcha-response=TOKEN_FROM_SOLVER"
Unlike the checkbox, the invisible badge needs grecaptcha.execute() to produce a token. Copy-paste starter:
<!-- reCAPTCHA v2 Invisible — render, execute, get the token, verify it -->
<script src="https://www.google.com/recaptcha/api.js?onload=onInvisibleLoad&render=explicit" async defer></script>
<div id="rc-invisible"></div>
<script>
var rcInvWidget = null;
function onInvisibleLoad() {
rcInvWidget = grecaptcha.render('rc-invisible', {
sitekey: '6LdAo8EtAAAAAMGVeOQ_c5O2Dcdpv080t_eXd4mG',
size: 'invisible',
callback: onInvisibleToken, // <-- token arrives here
'expired-callback': function () { console.warn('token expired — execute again'); }
});
}
function onInvisibleToken(token) {
console.log('TOKEN:', token);
// Verify it (same as the curl docs):
fetch('https://captcha.csdrama.com/recaptcha-v2-invisible/submit', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ 'g-recaptcha-response': token })
}).then((r) => r.json()).then(console.log);
}
// Run the invisible check, e.g. on your form's submit:
function runCheck() { grecaptcha.execute(rcInvWidget); }
</script>
<!-- Solver-service params (e.g. 2captcha recaptchaV2Invisible):
sitekey = 6LdAo8EtAAAAAMGVeOQ_c5O2Dcdpv080t_eXd4mG
pageurl = https://captcha.csdrama.com/recaptcha-v2-invisible -->