1. Call screening
CallerAPI Documentation
  • Quickstart
  • Use cases
    • For carriers (MNOs/MVNOs)
    • CPaaS platforms
    • Cloud communications providers
    • SIP trunking providers
    • PBX/Cloud PBX
    • UCaaS vendors
  • Account
    • Balance and email
      GET
  • Spam protection
    • Daily spam reports
      • Webhook
        • Subscribe to daily reports
        • Unsubscribe from daily reports
        • List webhook subscriptions
        • Manual dispatch of reports
        • Test webhook
      • REST
        • Fetch daily spam reports
    • Spam score + HLR
      GET
    • 15 days spam CSV snapshot
      GET
  • Mobile SDK
    • Get started
    • Quickstart
      • What you get
      • Get your keys
      • Android
      • iOS
      • Flutter
      • React Native
      • Check it works
    • Call screening
      • What each platform can do
      • Android call screening
      • iOS prerequisites
      • iOS add the extension
      • iOS test on device
    • Reference
      • Methods
      • Errors
      • Limits and billing
      • Troubleshooting
  • Data partners
    • Partner tems & docs
    • Upload spam reports
      POST
    • Upload contacts
      POST
  • Fraud prevention
    • Ported date
      GET
    • Porting history
      GET
    • Online presence
      GET
    • KYC user identity
      POST
  • Schemas
    • Spam protection
      • Spam score request
      • Business info
      • Carrier info
      • Complaint (without number)
      • Daily spam reports request
      • Complaint (with phone)
  1. Call screening

iOS test on device

iOS step 3: test on a device#

About 30 minutes. You need two phones: an iPhone on iOS 18 or later, and anything that can call it.

Step 1: install on the phone from Xcode#

Select your phone as the run destination and run the app. Install from Xcode for this first test, because a build from Xcode reaches our servers directly and needs no relay enrollment.
If the install fails, read the error before changing anything:
ErrorCauseFix
missing or invalid CFBundleExecutableThe extension Info.plist is incompleteStep 6 of the previous page
amfid ... -413The entitlements file is not emptyStep 5 of the previous page
No matching provisioning profileThe App ID is not registeredPrerequisites

Step 2: turn your app on in Settings#

iOS never enables this by itself. The user has to allow it, and so do you.
On the phone, open Settings > Apps > Phone > Call Blocking & Identification.
Call blocking & Identification settings
Your app must be listed. Switch it on.
If your app is not listed, stop here. Nothing else works, and no log tells you why. Check these four things, in this order:
1.
The phone runs iOS 18 or later. Check Settings > General > About.
2.
LiveLookup.appex exists inside your installed app. See step 11 of the previous page.
3.
The extension bundle identifier starts with your app's bundle identifier.
4.
The extension Info.plist has EXExtensionPointIdentifier set to com.apple.live-lookup.
The third item is the most common cause.

Step 3: open your app once#

Open your app and leave it open for a few seconds.
This lets bootstrap run. It fetches the encryption keys the extension needs. Without this, your first test call has to do that setup while the phone rings, and it can miss.

Step 4: make a test call#

Call the iPhone from your second phone, using a number that has a name in our data. Ask us for a current test number if you do not have one.
The name appears on the incoming call screen, under the number.
CallerAPI SDK Caller ID demo

What you cannot see#

iOS gives your app no callback for a screened call. There is no delegate, no notification, and nothing in your logs.
Real calls to real hardware are the only way to confirm this works. Plan for that.

Checking the state from your app#

You can read whether the user has enabled your extension, and send them to the right Settings screen:
Show your own screen before you send the user to Settings. A user dropped into Settings with no explanation usually comes straight back.

When it works from Xcode but not from TestFlight#

This is expected until your relay enrollment is finished, and it is the single most common surprise on this path.
A build from Xcode talks to our servers directly. A TestFlight or App Store build goes through Apple's relay, and Apple only routes to a service it has on record.
Two things must be true for a TestFlight build:
1.
Your relay enrollment is complete, and the URLs are registered in the CloudKit Console. See Prerequisites.
2.
Your extension has the Live Caller ID Lookup capability. Add it in Signing & Capabilities for the extension target, for App Store builds only.
Adding that capability breaks local Xcode installs, so keep it out of your Debug configuration.

After you change extension code#

iOS caches extensions harder than apps. If a change appears to do nothing, delete the app from the phone and install it again.

Before you submit to the App Store#

Relay enrollment is complete and registered with Apple.
The Live Caller ID Lookup capability is on the extension, for release builds.
Your app has its own privacy manifest. The SDK ships one, and your app needs one too.
In the review notes, state that caller lookup uses Apple's Live Caller ID Lookup, and that the service never receives the phone number.

Next#

All methods
Troubleshooting
Modified at 2026-07-29 22:01:52
Previous
iOS add the extension
Next
Methods
Built with