Bird vs Twilio Lookup for phone-number lookup
Compare the answers your application needs, their meaning and their cost. A field-by-field decision test is more useful than counting data packages.
Where Twilio Lookup fits
Twilio Lookup v2 provides phone-number information with optional intelligence packages. Package selection and returned fields should be mapped individually when changing a lookup integration.
Read Twilio Lookup documentation ↗Where Bird fits
Bird returns base phone-number data and requested optional properties. Each optional property has a status, so your application can preserve the difference between an answer and an unavailable signal.
Explore Bird Lookup ↗Compare the integration you will operate
| Capability | Bird | Twilio Lookup |
|---|---|---|
| Basic result | Read base fields such as country and line type. | Review the base response used by the current Lookup v2 integration. |
| Additional signals | Request the properties used by your application and inspect their status. | Map the selected intelligence packages and the fields your rules consume. |
| Decision handling | Keep unanswered properties distinct from negative values. | Identify how the current application treats missing or failed package results. |
Run the same customer journey
Replay a permitted sample of representative inputs through a staging integration. Compare the resulting application decisions, not just JSON names. Include unavailable signals and corrected customer input.
Start the working example ↗Make the switch deliberately
Create a mapping for each consumed field and add an explicit unknown branch. Move traffic after the new rules produce the intended routing or verification decision.
Migrate from Twilio Lookup ↗Inspect the number before you act.
Run the receiving lookup and map the returned fields to your application. Number metadata does not by itself establish reachability, customer identity or permission to message.
Run the complete quickstart ↗npm install @messagebird/sdkconst answer = await bird.lookup.phoneNumber({
phone_number: "+31612345678",
type: ["classification", "score"],
});
console.log(answer.country_code, answer.line_type);
// Only a block whose status is ok carries a value, and only that one is billed.
if (answer.score?.status === "ok") console.log(answer.score.value);Questions before switching
Does a lookup verify who owns the number?
How should I handle an unavailable property?
Choose your next step
Test it with your own workflow.
Start with the guide, or bring your integration and migration requirements to our team.