Skip to content

Request a Strategic-tier intro from sales

POST
/api/billing/strategic-request/
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

  1. Owner clicks the ‘Contact sales’ CTA on the pricing page or the Strategic SubscriptionPanel.
  2. FE POSTs here (no body required — the BE derives the team + owner from the JWT).
  3. BE sends an email to settings.sales_email with the team name, team UUID, and owner email so sales can route the lead.
  4. 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.

Media typeapplication/json
object
status
required

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
string
Allowed values: accepted
Examples

Lead accepted (first POST of the day)

{
"status": "accepted"
}
Media typeapplication/json
object
detail
required

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).

string
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).