Request a Strategic-tier intro from sales
const url = 'http://localhost:8000/api/billing/strategic-request/';const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url http://localhost:8000/api/billing/strategic-request/ \ --header 'Authorization: Bearer <token>'Owner-only POST that fires off a sales-notification email for teams interested in the Strategic tier. Strategic has no Stripe SKU (display_mode="custom" in /api/plans/); the engagement is sales-managed off-platform.
Flow
- Owner clicks the ‘Contact sales’ CTA on the pricing page or the Strategic SubscriptionPanel.
- FE POSTs here (no body required — the BE derives the team + owner from the JWT).
- BE sends an email to
settings.sales_emailwith the team name, team UUID, and owner email so sales can route the lead. - FE shows a ‘thanks, we’ll be in touch’ confirmation.
Idempotency
Cached per (team_id, YYYY-MM-DD UTC) for 24 h. A double-click within the window returns 202 again but does NOT re-send the email — sales gets one intro per team per day even if the owner mashes the button.
Failure handling
The Resend email send is best-effort — a Resend 5xx is logged but does NOT 5xx the request (the cache key is still claimed). If a daily ops sweep finds no email delivered for a team that successfully POSTed, follow up manually from the admin’s logged team_id.
Authorizations
Section titled “Authorizations”Responses
Section titled “Responses”object
Always accepted on success. The FE shows a ‘thanks, we’ll be in touch’ toast and disables the CTA for 24 h so duplicate clicks don’t re-fire (matching the BE-side idempotency window).
accepted- Lead enqueued — sales will follow up
Examples
Lead accepted (first POST of the day)
{ "status": "accepted"}Lead accepted (duplicate within 24 h — same response shape, but no email re-sent)
{ "status": "accepted"}object
Human-readable message, or a stable machine code for the cases a client branches on. The standard envelope for 400 (validation — a field-keyed object may appear instead), 401 (missing / invalid credentials), 403 (authenticated but not permitted), and 404 (absent — cross-team records are collapsed to 404 so the API never leaks the existence of another team’s data).
Examplegenerated
{ "detail": "example"}Caller is not the team owner. Members + non-owners get this — the request is treated as a billing-grade decision and owner-scoped. Also returned to a partner aik_… API key: billing writes require the Firebase scheme (billing is read-only for keys).