Getting User Names from Facebook Messages: A Graph API Workaround


When building applications that handle Facebook messages, you'll quickly run into a pretty frustrating limitation: the messages webhook doesn't include the sender's name. This seems like a weird oversight since if a user has messaged your application, you should reasonably have access to their basic information like their name, right? Here's how we solved this problem without going through the lengthy app review process.
The Problem
Facebook's Messages Webhook gives you plenty of useful information when someone sends a message to your page or app:
Message content
Timestamp
Message ID
Sender ID (PSID - Page Scoped ID)
But what's notably missing? The sender's name! This creates a pretty poor user experience since you can't personalise responses or properly identify who you're talking to in your system.
The Obvious Solution (That We Wanted to Avoid)
The most straightforward approach would be to use the User Profile API:
GET /{user-id}?fields=first_name,last_name
However, this API requires the user_profile
permission, which is not available by default. To get this permission, Facebook requires you to go through their App Review process. This means:
Submitting detailed documentation explaining why you need user profile data
Waiting weeks (sometimes months) for approval
Providing screencasts and detailed use case justifications
Risk of rejection if Facebook doesn't deem your use case valid
Since users are actively messaging us, requiring an extensive app review process just to get their names felt excessive and time-consuming. We needed a solution that worked immediately without bureaucratic delays.
Our Workaround: The Conversations API
After some digging around, we discovered a neat workaround using the Conversations API. Here's how it works:
Step 1: Use the Conversations API with Filters
Instead of trying to get user details directly, we queried the conversations endpoint with specific parameters:
GET /{page-id}/conversations?platform=messenger&user_id={sender_id}
This approach filters conversations by:
platform=messenger
- Only messenger conversations (or you can useplatform=instagram
for Instagram messages!)user_id={sender_id}
- Only conversations with the specific user who sent the message
This successfully returned conversation data that included the user's name! And here's a bonus: this same approach works for Instagram messages too - just change the platform parameter to instagram
and you'll get Instagram usernames.
Step 2: Alternative Approach Using Message ID
We also found another path that worked pretty well. Using the message ID from the webhook, we could get detailed information:
GET /{message-id}?fields=to,from
The fields=to,from
parameter returns sender and recipient information, including names. This gave us another solid way to extract user names from the conversation data.
Implementation Strategy
Once you have the user's name through either method, the implementation is pretty straightforward:
Extract the name from the API response
Map the sender_id to the name in your database
Cache this mapping for future messages from the same user
This way, you only need to make the API call once per user, and subsequent messages can use the cached name data.
Why This Works
This approach works because:
No special permissions required - The conversations API is available with basic page access tokens
Logical data access - If someone messages you, you should be able to see who they are
Efficient - You only need to fetch the name once per user
User-initiated - The user has already engaged with your application
Cross-platform - Works for both Facebook Messenger and Instagram messages
Conclusion
While Facebook's webhook design choice to exclude sender names is pretty puzzling, the Conversations API provides a legit workaround. This solution lets you provide a personalised experience without the overhead of app review, while still respecting user privacy since you're only accessing names of users who have actively messaged your application.
The key insight here is that Facebook's Graph API often has multiple paths to the same data - sometimes the direct route requires more permissions, but alternative endpoints can give you the same information through the relationships between different objects in the social graph.
Just remember to always respect user privacy and only collect the data you actually need for your application's functionality. In this case, knowing who is messaging you is totally reasonable for providing good customer service and user experience.
Subscribe to my newsletter
Read articles from Vivek Khatri directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by

Vivek Khatri
Vivek Khatri
I am still deciding what should I write here.