OVH is rejecting your INVITE because it expects an active SIP REGISTER binding, and (today) Vapi’s BYO SIP trunk flow does not send SIP REGISTER packets—so sipRegisterPlan won’t make OVH “see” a registration and you’ll keep getting 403 not registered.
What to do (real working options)
Option A (recommended): put a PBX/SBC in the middle to handle REGISTER
Run 3CX / Asterisk / FreeSWITCH / Kamailio that REGISTERs to OVH (like your 3CX test does).
Configure that PBX to accept IP-auth SIP from Vapi (or a trunk from Vapi) and route calls out via OVH.
In OVH, allowlist Vapi’s SIP signaling IPs (required for trunking): 44.229.228.186 and 44.238.177.138.
Option B: use a carrier/SIP trunk that does NOT require REGISTER (or supports IP-auth / unique termination URI)
Vapi’s SIP trunking docs explicitly steer toward trunks that work with IP-based auth/termination (e.g., Telnyx/Plivo patterns) rather than “must REGISTER” trunks.
Also verify these basics (even with Option A/B)
In Vapi BYO SIP trunk credentials, gateways[].ip should be a numeric IPv4, not a hostname (SBC rejects hostnames).
If you keep siptrunk.ovh.net, resolve it to OVH’s IPv4(s) and use those as gateways.
Make sure your OVH side isn’t expecting IP/port pinning beyond what Vapi provides.
Bottom line: If the provider requires REGISTER-before-INVITE (OVH in your case), you can’t do it directly with Vapi BYO SIP today—use a PBX/SBC that registers to OVH, or switch to a trunk that supports non-REGISTER/IP-auth.