Skip to content

Enterprise endpoints

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}

ParameterInTypeRequired
quoteIdpathstringYes
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

ParameterInTypeRequired
quoteIdpathstringYes
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

ParameterInTypeRequired
orgIdpathstringYes
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

ParameterInTypeRequired
orgIdpathstringYes
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}

ParameterInTypeRequired
subdomainpathstringYes
Response 200

No body.

GET /enterprise/org/{orgId}/usage

ParameterInTypeRequired
orgIdpathstringYes
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

ParameterInTypeRequired
orgIdpathstringYes
daysquerystringNo
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

ParameterInTypeRequired
orgIdpathstringYes
Response 200 (application/json)
{
  projectId: string;
  projectName: string;
  apiRequests: number;
  storageBytes: number;
  aiCreditsUsed: number;
}[]

GET /enterprise/org/{orgId}/onboarding

ParameterInTypeRequired
orgIdpathstringYes
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

ParameterInTypeRequired
orgIdpathstringYes
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

ParameterInTypeRequired
orgIdpathstring (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.