Documentation

Programmatic mode

Call solve(), reset(), and listen to widget events when your form flow needs explicit JavaScript control.

When to use it

Use programmatic mode when you need to solve during a custom submit flow, enable a disabled button only after verification, coordinate multiple form steps, or render an invisible widget that has no direct click target.

Example

<script src="https://humanproof.eu/widget.js" defer></script>

<form id="signup" method="POST" action="/signup">
  <input type="email" name="email" required>
  <human-proof
    data-api-endpoint="https://humanproof.eu/api/captcha/site_your_public_key"
    data-variant="invisible"
  ></human-proof>
  <button type="submit">Create account</button>
</form>

<script>
const form = document.querySelector('#signup');
const widget = form.querySelector('human-proof');
const token = () => form.querySelector('[name="humanproof-token"]')?.value;

form.addEventListener('submit', async (event) => {
  if (token()) return;

  event.preventDefault();

  try {
    const result = await widget.solve();

    if (result.success) {
      form.requestSubmit();
    }
  } catch (error) {
    console.warn('HumanProof failed', error);
  }
});
</script>

Methods

solve()Starts or reuses the current challenge solve and resolves with the token result.
reset()Clears the token and returns the widget to the idle state.

Events

widget.addEventListener('solve', (event) => {
  console.log(event.detail.token);
});

widget.addEventListener('expired', () => {
  submit.disabled = true;
});

widget.addEventListener('error', (event) => {
  console.warn(event.detail);
});