| 1 | Generating JWT in the browser | JWT must be signed on the backend — the API key must never ship to the client. See form-builder-jwt-token.md / signing-form-completed-preview-jwt-token.md. |
| 2 | Passing the API key as data-token | data-token is a JWT signed with the API key, not the key itself. |
| 3 | Missing host/data-host on EU or self-hosted | Set data-host="cdn.docuseal.eu" for EU Cloud or your own hostname for self-hosted. See signing-form-hosts.md / form-builder-hosts.md. |
| 4 | Confusing /d/{slug} vs /s/{slug} | /d/{slug} is the template URL (single-party templates). /s/{slug} is an individual signer URL created via the /submissions API. |
| 5 | Multi-party template via data-src URL | Templates with multiple signing parties must be initiated via the /submissions API — the direct /d/{slug} URL only works for single-party templates. |
| 6 | camelCase props in HTML | The web component uses data-* kebab-case attributes. Only React/Vue/Angular use camelCase props. |
| 7 | Expecting a native mobile SDK | None exists. Embed via WebView — see signing-form-mobile-integration.md. |
| 8 | Passing customCss as a stylesheet link | customCss / data-custom-css takes a CSS string, not a URL. See signing-form-custom-css.md / form-builder-custom-css.md. |
| 9 | Embedding signing forms behind enumerable URLs | DocuSeal slugs are random, but an embedding page like https://yourapp.com/contracts/123/sign lets an attacker iterate integer IDs to reach other users' signing forms. Put the DocuSeal slug or a UUID in your URL, or require auth on the embedding page. See signing-form-security-recommendations.md. |
| 10 | Exposing the Form Builder without auth | The page that renders <docuseal-builder> must be gated by your app's authentication. The JWT-issuing endpoint must verify the requesting user owns the template referenced by external_id. Otherwise any logged-in user can edit any template. See form-builder-security-recommendations.md. |
| 11 | Acting on client-side completed events | Browser events can be forged. Drive state changes from form.completed webhooks with HMAC verification, not from <docuseal-form> JavaScript callbacks. See signing-form-security-recommendations.md. |