There is no dry-run mode
Notti has no test or dry_run flag on POST /v1/apps/{app_id}/notifications - every send attempts real delivery through FCM or APNs. If you're looking for a way to "simulate" a send without it reaching a device, it doesn't exist today. Testing means sending a real notification to a real, registered test device and checking the result.
The test loop
- Register a real device - install your app on a physical device or simulator/emulator with real push credentials, obtain a token from FCM/APNs, and call
POST /v1/apps/{app_id}/deviceswith it using the Client key. - Send - call
POST /v1/apps/{app_id}/notificationstargeting that Device'sid(target_type: "device_ids"). - Check the outcome -
GET /v1/apps/{app_id}/notifications/{id}/deliveriesreturns one Delivery per targeted Device, with its ownsent/failed/pendingstatus andlast_errorwhen something went wrong. Poll this rather than assuming the201from step 2 means the push actually arrived - that response only confirms the Notification was accepted, not delivered.
iOS: sandbox vs production builds
An App's APNs credentials carry one environment value - "sandbox" or "production" - set on POST /v1/apps/{app_id}/credentials/apns. Notti sends every push for that App through whichever gateway matches this one stored value; it does not inspect the token or infer environment per Device.
This means: a device token from a debug/Xcode-run build is only valid against Apple's sandbox gateway. If your App's environment is set to "production" (the default when omitted), sending to a debug-build device token fails with BadDeviceToken - not because the token is wrong, but because you're testing against the wrong gateway for that credential. Set environment: "sandbox" on the App you use for development/testing, and use a separate App (or credential set) with "production" for TestFlight/App Store builds.
Android/FCM
FCM has no separate sandbox concept - a device token from a debug build works against the same FCM endpoint as a release build, as long as the google-services.json/service account matches the app package used to build the client. There's no environment field to configure for FCM credentials.
What "it didn't arrive" usually means
If a Delivery shows sent but nothing appeared on the device, the issue is almost always device-side (OS notification permissions, Do Not Disturb, app not in foreground on some Android OEM skins that kill background delivery) - not something the Notti API surfaces. If the Delivery instead shows failed, see Troubleshooting for what the common last_error values mean.