Dashboard Plans
12 endpoints from the published OpenAPI import.
Get My Subscriptions
The caller's active/trialing/past_due subscriptions + per-service monthly usage bars. Empty list when the caller has no client scope.
Try it
Examples
cURL
curl -X GET 'https://spideriq.ai/api/v1/dashboard/plans/me' \
-H 'Authorization: Bearer <token>'Python
import httpx
resp = httpx.get(
"https://spideriq.ai/api/v1/dashboard/plans/me",
headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/dashboard/plans/me", {
method: "GET",
headers: { "Authorization": "Bearer <token>" }
});
const data = await resp.json();
console.log(data);Go
package main
import (
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "https://spideriq.ai/api/v1/dashboard/plans/me", nil)
req.Header.Set("Authorization", "Bearer <token>")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
}Responses
| Status | Description |
|---|---|
200 | Successful Response |
Get My Entitlements
The caller's owner-granted per-client feature entitlements (client_service_plans rows with enabled=true), translated to client-facing feature flags. Drives the flow-config UI's active-vs-upsell rendering (e.g. the Social Media Enrichment block). Defaults every feature to false when the caller has no client scope.
Try it
Examples
cURL
curl -X GET 'https://spideriq.ai/api/v1/dashboard/plans/entitlements' \
-H 'Authorization: Bearer <token>'Python
import httpx
resp = httpx.get(
"https://spideriq.ai/api/v1/dashboard/plans/entitlements",
headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/dashboard/plans/entitlements", {
method: "GET",
headers: { "Authorization": "Bearer <token>" }
});
const data = await resp.json();
console.log(data);Go
package main
import (
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "https://spideriq.ai/api/v1/dashboard/plans/entitlements", nil)
req.Header.Set("Authorization", "Bearer <token>")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
}Responses
| Status | Description |
|---|---|
200 | Successful Response |
Browse Tariffs
All active tariffs (latest version each) the caller can subscribe to. Includes the Stripe Price ids + cents so the UI computes the annual gate + savings client-side. is_current marks the caller's existing tariffs.
Try it
Examples
cURL
curl -X GET 'https://spideriq.ai/api/v1/dashboard/plans/browse' \
-H 'Authorization: Bearer <token>'Python
import httpx
resp = httpx.get(
"https://spideriq.ai/api/v1/dashboard/plans/browse",
headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/dashboard/plans/browse", {
method: "GET",
headers: { "Authorization": "Bearer <token>" }
});
const data = await resp.json();
console.log(data);Go
package main
import (
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "https://spideriq.ai/api/v1/dashboard/plans/browse", nil)
req.Header.Set("Authorization", "Bearer <token>")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
}Responses
| Status | Description |
|---|---|
200 | Successful Response |
Browse Bundles
Active bundle offerings with pre/post-discount pricing. Empty when no bundles are defined.
Try it
Examples
cURL
curl -X GET 'https://spideriq.ai/api/v1/dashboard/plans/browse/bundles' \
-H 'Authorization: Bearer <token>'Python
import httpx
resp = httpx.get(
"https://spideriq.ai/api/v1/dashboard/plans/browse/bundles",
headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/dashboard/plans/browse/bundles", {
method: "GET",
headers: { "Authorization": "Bearer <token>" }
});
const data = await resp.json();
console.log(data);Go
package main
import (
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "https://spideriq.ai/api/v1/dashboard/plans/browse/bundles", nil)
req.Header.Set("Authorization", "Bearer <token>")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
}Responses
| Status | Description |
|---|---|
200 | Successful Response |
List Invoices
The caller's recent Stripe invoices (last 20). Empty when the client has no Stripe Customer yet (never subscribed).
Try it
Examples
cURL
curl -X GET 'https://spideriq.ai/api/v1/dashboard/plans/invoices' \
-H 'Authorization: Bearer <token>'Python
import httpx
resp = httpx.get(
"https://spideriq.ai/api/v1/dashboard/plans/invoices",
headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/dashboard/plans/invoices", {
method: "GET",
headers: { "Authorization": "Bearer <token>" }
});
const data = await resp.json();
console.log(data);Go
package main
import (
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "https://spideriq.ai/api/v1/dashboard/plans/invoices", nil)
req.Header.Set("Authorization", "Bearer <token>")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
}Responses
| Status | Description |
|---|---|
200 | Successful Response |
Create Billing Portal
Create a Stripe Billing Portal session and return its URL. The client manages payment methods, invoices, and cancellation there.
Try it
Examples
cURL
curl -X POST 'https://spideriq.ai/api/v1/dashboard/plans/billing-portal' \
-H 'Authorization: Bearer <token>'Python
import httpx
resp = httpx.post(
"https://spideriq.ai/api/v1/dashboard/plans/billing-portal",
headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/dashboard/plans/billing-portal", {
method: "POST",
headers: { "Authorization": "Bearer <token>" }
});
const data = await resp.json();
console.log(data);Go
package main
import (
"net/http"
)
func main() {
req, _ := http.NewRequest("POST", "https://spideriq.ai/api/v1/dashboard/plans/billing-portal", nil)
req.Header.Set("Authorization", "Bearer <token>")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
}Responses
| Status | Description |
|---|---|
200 | Successful Response |
Upgrade Preview
Proration preview for switching the caller's current subscription to a different tariff version. Resolves the target Stripe Price (raises 409 if annual is requested but unminted, 404 if the version is unknown), then asks Stripe for the upcoming prorated invoice. Falls back to a no-proration estimate when the caller has no active subscription to migrate.
Try it
Examples
cURL
curl -X POST 'https://spideriq.ai/api/v1/dashboard/plans/upgrade-preview' \
-H 'Authorization: Bearer <token>' \
-H 'Content-Type: application/json' \
-d '{
"from_tariff_version_id": 0,
"to_tariff_version_id": 0,
"billing_interval": "month"
}'Python
import httpx
resp = httpx.post(
"https://spideriq.ai/api/v1/dashboard/plans/upgrade-preview",
headers={"Authorization": "Bearer <token>", "Content-Type": "application/json"},
json={"from_tariff_version_id": 0, "to_tariff_version_id": 0, "billing_interval": "month"},
)
resp.raise_for_status()
print(resp.json())JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/dashboard/plans/upgrade-preview", {
method: "POST",
headers: { "Authorization": "Bearer <token>", "Content-Type": "application/json" },
body: JSON.stringify({"from_tariff_version_id": 0, "to_tariff_version_id": 0, "billing_interval": "month"})
});
const data = await resp.json();
console.log(data);Go
package main
import (
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{"from_tariff_version_id": 0, "to_tariff_version_id": 0, "billing_interval": "month"}`)
req, _ := http.NewRequest("POST", "https://spideriq.ai/api/v1/dashboard/plans/upgrade-preview", body)
req.Header.Set("Authorization", "Bearer <token>")
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
}Responses
| Status | Description |
|---|---|
200 | Successful Response |
422 | Validation Error |
Recent Denies
The caller's recently DENIED dispatch decisions (last 30 days, 20 max) — what the customer can act on (rate / cost / quota). Partition-pruned by the decided_at predicate.
Try it
Examples
cURL
curl -X GET 'https://spideriq.ai/api/v1/dashboard/plans/recent-denies' \
-H 'Authorization: Bearer <token>'Python
import httpx
resp = httpx.get(
"https://spideriq.ai/api/v1/dashboard/plans/recent-denies",
headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/dashboard/plans/recent-denies", {
method: "GET",
headers: { "Authorization": "Bearer <token>" }
});
const data = await resp.json();
console.log(data);Go
package main
import (
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "https://spideriq.ai/api/v1/dashboard/plans/recent-denies", nil)
req.Header.Set("Authorization", "Bearer <token>")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
}Responses
| Status | Description |
|---|---|
200 | Successful Response |
Subscribe
Create a Stripe-hosted Checkout Session for the caller to subscribe to a tariff version. Returns the hosted checkout URL the frontend redirects to. 404 unknown tariff · 409 annual-not-available (both via the typed exceptions' handlers in app/main.py).
Try it
Examples
cURL
curl -X POST 'https://spideriq.ai/api/v1/dashboard/plans/subscribe' \
-H 'Authorization: Bearer <token>' \
-H 'Content-Type: application/json' \
-d '{
"tariff_version_id": 0,
"billing_interval": "month",
"success_url": "string",
"cancel_url": "string"
}'Python
import httpx
resp = httpx.post(
"https://spideriq.ai/api/v1/dashboard/plans/subscribe",
headers={"Authorization": "Bearer <token>", "Content-Type": "application/json"},
json={"tariff_version_id": 0, "billing_interval": "month", "success_url": "string", "cancel_url": "string"},
)
resp.raise_for_status()
print(resp.json())JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/dashboard/plans/subscribe", {
method: "POST",
headers: { "Authorization": "Bearer <token>", "Content-Type": "application/json" },
body: JSON.stringify({"tariff_version_id": 0, "billing_interval": "month", "success_url": "string", "cancel_url": "string"})
});
const data = await resp.json();
console.log(data);Go
package main
import (
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{"tariff_version_id": 0, "billing_interval": "month", "success_url": "string", "cancel_url": "string"}`)
req, _ := http.NewRequest("POST", "https://spideriq.ai/api/v1/dashboard/plans/subscribe", body)
req.Header.Set("Authorization", "Bearer <token>")
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
}Responses
| Status | Description |
|---|---|
200 | Successful Response |
422 | Validation Error |
Change Plan
Switch the caller's existing subscription item to a new tariff_version and/or billing interval — IN PLACE on the same Stripe subscription (no new sub, no double-billing). Prorations are invoiced immediately (always_invoice) so the customer is charged the difference today, per the upgrade-preview copy.
404 if the caller holds no active item for from_tariff_version_id; 409 if the target requires annual billing but has no annual Price (both via the typed exceptions' handlers in app/main.py).
Try it
Examples
cURL
curl -X POST 'https://spideriq.ai/api/v1/dashboard/plans/change' \
-H 'Authorization: Bearer <token>' \
-H 'Content-Type: application/json' \
-d '{
"from_tariff_version_id": 0,
"to_tariff_version_id": 0,
"billing_interval": "month"
}'Python
import httpx
resp = httpx.post(
"https://spideriq.ai/api/v1/dashboard/plans/change",
headers={"Authorization": "Bearer <token>", "Content-Type": "application/json"},
json={"from_tariff_version_id": 0, "to_tariff_version_id": 0, "billing_interval": "month"},
)
resp.raise_for_status()
print(resp.json())JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/dashboard/plans/change", {
method: "POST",
headers: { "Authorization": "Bearer <token>", "Content-Type": "application/json" },
body: JSON.stringify({"from_tariff_version_id": 0, "to_tariff_version_id": 0, "billing_interval": "month"})
});
const data = await resp.json();
console.log(data);Go
package main
import (
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{"from_tariff_version_id": 0, "to_tariff_version_id": 0, "billing_interval": "month"}`)
req, _ := http.NewRequest("POST", "https://spideriq.ai/api/v1/dashboard/plans/change", body)
req.Header.Set("Authorization", "Bearer <token>")
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
}Responses
| Status | Description |
|---|---|
200 | Successful Response |
422 | Validation Error |
Cancel Subscription
Schedule the caller's active subscription to cancel at the end of the current billing period. The customer keeps access until current_period_end; no item is deleted, so /resume can un-cancel. No body — a client has exactly one active parent subscription.
404 if the caller has no active subscription (via the typed exception's handler in app/main.py).
Try it
Examples
cURL
curl -X POST 'https://spideriq.ai/api/v1/dashboard/plans/cancel' \
-H 'Authorization: Bearer <token>'Python
import httpx
resp = httpx.post(
"https://spideriq.ai/api/v1/dashboard/plans/cancel",
headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/dashboard/plans/cancel", {
method: "POST",
headers: { "Authorization": "Bearer <token>" }
});
const data = await resp.json();
console.log(data);Go
package main
import (
"net/http"
)
func main() {
req, _ := http.NewRequest("POST", "https://spideriq.ai/api/v1/dashboard/plans/cancel", nil)
req.Header.Set("Authorization", "Bearer <token>")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
}Responses
| Status | Description |
|---|---|
200 | Successful Response |
Resume Subscription
Un-cancel the caller's active subscription (clear cancel_at_period_end) — the correct "changed my mind before the period rolls" path, instead of minting a new subscription. No body.
404 if no active subscription; 409 if the subscription is not currently scheduled to cancel (both via the typed exceptions' handlers in app/main.py).
Try it
Examples
cURL
curl -X POST 'https://spideriq.ai/api/v1/dashboard/plans/resume' \
-H 'Authorization: Bearer <token>'Python
import httpx
resp = httpx.post(
"https://spideriq.ai/api/v1/dashboard/plans/resume",
headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/dashboard/plans/resume", {
method: "POST",
headers: { "Authorization": "Bearer <token>" }
});
const data = await resp.json();
console.log(data);Go
package main
import (
"net/http"
)
func main() {
req, _ := http.NewRequest("POST", "https://spideriq.ai/api/v1/dashboard/plans/resume", nil)
req.Header.Set("Authorization", "Bearer <token>")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
}Responses
| Status | Description |
|---|---|
200 | Successful Response |