- Shipped
- September 6, 2026 at 10:28 PM UTC
- Author
- Kamo
- Commit
- 9e9e814
Telnyx is both a phone server and a carrier, and a Telnyx messaging profile has exactly one webhook URL. So an organization that added Telnyx as a PHONE SERVER and no text provider still had its inbound delivered to /api/bulktext/inbound/telnyx — where the only thing that endpoint could resolve was a BulkTextProviderInstance. There is none, so every reply was dropped at the "matches no active provider instance" warning. That org could text customers and never see an answer, which is the exact failure this whole area exists to end. The endpoint now recognises a number whose texts ride on a phone server, verifies it through **************** — the seam that interface already had, so this is not Telnyx-specific — and hands it to the shared ingest. The rail had to grow a constant, and that is the interesting part. InboundRail says which factory may reply, and these two rails share a URL while disagreeing about it: filing this as BULK_TEXT would hand a VoipProviderInstance id to BulkTextProviderFactory, which fails as "no such instance", so the HELP reply would never be sent and nothing would say why. CARRIER_TO_PHONE_SERVER names the difference. SmsKeywordService's reply switch has no default arm precisely so a new constant cannot be forgotten there — it was a compile error until it was handled, which is the design working. Once a number is known to be routed at a phone server, a bad signature 403s rather than falling through to the scan below, which could otherwise match a different instance entirely.