13 endpoints at https://api.vaif.studio, generated from the API's OpenAPI document. The REST API page covers authentication, and All endpoints lists every group.
POST /enterprise/inquire
Request body (application/json, required)
{
companyName: string;
contactName: string;
contactEmail: string (email);
contactPhone?: string;
companySize?: "1-10" | "11-50" | "51-200" | "201-500" | "500+";
estimatedProjects?: number;
useCase?: string;
currentPlan?: "free" | "entry" | "entry_plus" | "starter" | "pro" | "agency" | "studio_plus" | "enterprise";
requirements?: {
dedicatedDb?: boolean;
sso?: boolean;
saml?: boolean;
customRetention?: boolean;
dedicatedSupport?: boolean;
customSla?: boolean;
hipaaCompliance?: boolean;
soc2Compliance?: boolean;
// and 2 more fields, not listed here
};
source?: string;
website?: string;
}
Response 200 (application/json)
{
ok: true;
message: string;
inquiryId: string;
}
Errors: 429, 500, with the error body.
GET /enterprise/quotes/{quoteId}
| Parameter | In | Type | Required |
|---|
quoteId | path | string | Yes |
Response 200 (application/json)
{
ok: true;
quote: {
id: string;
quoteNumber: string;
status: string;
preparedFor: string;
billingCycle: "monthly" | "quarterly" | "annually";
finalPriceCents: number;
currency: string;
contractLengthMonths: number;
paymentTermsDays: number;
specialTerms: string | null;
validUntil: string | null;
expired: boolean;
acceptedAt: string | null;
};
}
Errors: 403, 404, with the error body.
POST /enterprise/quotes/{quoteId}/accept
| Parameter | In | Type | Required |
|---|
quoteId | path | string | Yes |
Response 200 (application/json)
{
ok: true;
message: string;
quoteNumber: string;
acceptedAt: string;
}
Errors: 400, 403, 404, 409, 422, with the error body.
GET /enterprise/org/{orgId}/contract
| Parameter | In | Type | Required |
|---|
orgId | path | string | Yes |
Response 200 (application/json)
{
ok: true;
contract: {
id: string;
contractNumber: string;
status: string;
startDate: string;
endDate: string;
renewalDate: string | null;
autoRenew: boolean;
billingCycle: string;
priceCents: number;
currency: string;
paymentTermsDays: number;
supportTier: string;
accountManagerEmail: string | null;
accountManager: {
name: string | null;
email: string;
} | null;
renewsOn: string | null;
} | null;
}
Errors: 401, 403, with the error body.
GET /enterprise/org/{orgId}/invoices
| Parameter | In | Type | Required |
|---|
orgId | path | string | Yes |
Response 200 (application/json)
{
ok: boolean;
invoices: {
contractId: string;
createdAt: string (date-time);
currency: string;
discountCents: number;
dueDate: string (date-time);
id: string;
invoiceDate: string (date-time);
invoiceNumber: string;
lineItems: any;
notes: null | string;
orgId: string;
paidAt: null | string (date-time);
paymentMethod: null | string;
paymentReference: null | string;
periodEnd: string (date-time);
periodStart: string (date-time);
sentAt: null | string (date-time);
status: string;
stripeInvoiceId: null | string;
subtotalCents: number;
taxCents: number;
totalCents: number;
updatedAt: string (date-time);
}[];
}
GET /enterprise/pricing
Response 200 (application/json)
{
ok: true;
tiers: {
key: string;
name: string;
price: string;
period: string;
mau: string;
popular?: boolean;
highlights: string[];
annual: {
price: string;
aiCredits: string;
};
color: string;
}[];
}
GET /enterprise/subdomain/{subdomain}
| Parameter | In | Type | Required |
|---|
subdomain | path | string | Yes |
Response 200
No body.
GET /enterprise/org/{orgId}/usage
| Parameter | In | Type | Required |
|---|
orgId | path | string | Yes |
Response 200 (application/json)
{
period: {
start: string;
end: string;
};
usage: {
mau: {
current: number;
limit: number;
percent: number;
};
apiRequests: {
current: number;
limit: number;
percent: number;
};
dbStorageGB: {
current: number;
limit: number;
percent: number;
};
fileStorageGB: {
current: number;
limit: number;
percent: number;
};
realtimeConnections: {
current: number;
limit: number;
percent: number;
};
fnInvocations: {
current: number;
limit: number;
percent: number;
};
aiCredits: {
current: number;
limit: number;
percent: number;
};
};
}
GET /enterprise/org/{orgId}/usage/history
| Parameter | In | Type | Required |
|---|
orgId | path | string | Yes |
days | query | string | No |
Response 200 (application/json)
{
date: string;
mau: null | number;
apiRequests: null | number;
dbStorageBytes: null | number;
fileStorageBytes: null | number;
realtimePeakConnections: null | number;
fnInvocations: null | number;
aiCreditsUsed: null | number;
}[]
GET /enterprise/org/{orgId}/usage/projects
| Parameter | In | Type | Required |
|---|
orgId | path | string | Yes |
Response 200 (application/json)
{
projectId: string;
projectName: string;
apiRequests: number;
storageBytes: number;
aiCreditsUsed: number;
}[]
GET /enterprise/org/{orgId}/onboarding
| Parameter | In | Type | Required |
|---|
orgId | path | string | Yes |
Response 200 (application/json)
{
steps: {
invite_team: boolean;
configure_sso: boolean;
create_project: boolean;
setup_ip_allowlist: boolean;
connect_domain: boolean;
review_alerts: boolean;
};
dismissed: boolean;
completedAt: null;
} | {
steps: {
invite_team: boolean;
configure_sso: boolean;
create_project: boolean;
setup_ip_allowlist: boolean;
connect_domain: boolean;
review_alerts: boolean;
};
dismissed: boolean;
completedAt: null | string;
}
PATCH /enterprise/org/{orgId}/onboarding
| Parameter | In | Type | Required |
|---|
orgId | path | string | Yes |
Request body (application/json, required)
{
steps?: {
[key: string]: boolean;
};
dismissed?: boolean;
}
Response 200 (application/json)
{
steps: {
[key: string]: boolean;
};
dismissed: boolean;
completedAt: string | null;
}
Errors: 403, with the error body.
GET /enterprise/org/{orgId}/spend
| Parameter | In | Type | Required |
|---|
orgId | path | string (uuid) | Yes |
Response 200 (application/json)
{
currency: string;
term: {
start: string;
end: string;
daysLeft: number;
};
contractValueCents: number;
billedToDateCents: number;
billedInvoiceCount: number;
unbilledOverageCents: number;
commitment: {
minimumCents: number | null;
amountCents: number;
source: "minimum" | "contract_value";
spentCents: number;
remainingCents: number;
burn: {
month: string;
spentCents: number;
}[];
forecast: {
method: "scheduled_plus_last_overage";
termEndSpendCents: number;
scheduledCents: number;
overageAheadCents: number;
differenceCents: number;
scheduledCycles: number;
overageMonth: string;
monthsAhead: number;
} | null;
};
credits: {
period: {
start: string;
end: string;
source: "calendar";
};
allowance: number;
overageCap: number;
used: number;
forecast: {
method: "run_rate_7d";
ratePerDay: number;
projectedUsed: number;
runsOutOn: string | null;
} | null;
};
}
Errors: 403, 404, with the error body.