Skip to main content

Overview

When a user opens a magic link and their data is incomplete for CIP verification, M2M sends a user.data_request webhook to your server. This gives you an opportunity to provide the missing data before M2M asks the user directly.
Data requests are non-blocking. The user continues through the widget while you fetch and send data. If you respond before they reach the CIP step, they skip data entry entirely.

The webhook

When M2M needs user data, you receive this webhook:

Key fields

Possible required fields

Responding to the request

Make a PUT request to the replyEndpoint with the user data:

Request body

string
required
Your user identifier. Must match the referenceId in the webhook.
object
required
Object containing the requested fields. You only need to include fields from requiredFields, but you can include additional fields.

Success response

Error handling

Reference ID mismatch (400)

The referenceId in your request doesn’t match the data request:

Data request not found (404)

The dataRequestId doesn’t exist:

Data request expired (409)

The data request (and link) has expired:

Implementation guide

Complete webhook handler

Node.js

Best practices

The faster you respond, the smoother the user experience. Aim to respond within a few seconds:
  • Pre-fetch user data when you create links
  • Use a fast database with indexed queries
  • Consider caching frequently accessed data
If you don’t have all requested fields, send what you have. Partial data still reduces friction:
Ensure data matches expected formats before sending:
  • Dates: YYYY-MM-DD format
  • CURP: 18 characters, uppercase
  • Names: Use legal names, not nicknames
Log webhook receipt and your responses for troubleshooting:
Data requests are idempotent - you can respond multiple times safely. M2M only processes the first successful response.

What if you don’t respond?

If you don’t respond (or can’t provide data), M2M gracefully falls back:
  1. User reaches the CIP step in the widget
  2. M2M shows a form for the missing fields
  3. User enters the data manually
  4. Transaction continues normally
Not responding doesn’t break the flow - it just increases friction for the user. Implement data requests when you’re ready, but don’t let it block your initial integration.

Testing

Sandbox testing

  1. Create a link in sandbox with incomplete data:
  2. Configure your webhook endpoint in Partner Portal
  3. Open the link in your browser
  4. Verify you receive the user.data_request webhook
  5. Send a response and verify it’s accepted
  6. Check that the widget shows pre-filled data

Testing without webhooks

If you’re not ready to implement webhooks:
  1. Create a link with minimal data
  2. Open it and complete the full CIP flow manually
  3. Understand what users experience
  4. Use this to prioritize which data to provide upfront

Next steps

User Data Guide

Understand the friction vs. integration trade-off.

Webhook Security

Implement secure webhook handling.