Admin enhanced dashboard
const url = 'https://api.deploybase.eu/api/v1/api/v1/admin/dashboard/enhanced';const options = {method: 'GET', headers: {Authorization: '<Authorization>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url https://api.deploybase.eu/api/v1/api/v1/admin/dashboard/enhanced \ --header 'Authorization: <Authorization>'Platform totals, recent deployments and teams, plan distribution, revenue, the activation funnel and this week’s functions block (functions_week, null when the reliability rollup is not wired)
Authorizations
Section titled “ Authorizations ”Responses
Section titled “ Responses ”OK
object
object
object
object
object
FunctionsWeek is filled by the service, not GetEnhancedStats: half of it is the DEP-851 reliability rollup, which belongs to another repository. Null when that repository is not wired.
object
SSRProjectsNew is how many projects got their first SSR function this ISO week.
SSRSitesLive is how many projects serve production from a ready SSR function.
object
object
object
ActivationPendingUntil is set on a team created on a paid plan until its first checkout completes (DEP-766). While set the team cannot create projects, deploy, add hostnames or invite (services.ErrTeamAwaitingPayment); past it, the activation reaper deletes the team. A column, not a Status value: Status is the deletion machine and must never see this.
Bunny.net Pull Zone (lazy-created on first deployment)
DefaultPreviewAccess is the preview access level (models.AccessLevel*) a NEW project starts at (DEP-468). Changing it never touches existing projects.
DeletionKind is which erasure the request asked for (DEP-763). NULL when none is open (cleared on cancel), kept on a purged tombstone; read via models.DeletionKindOrAccount.
DeletionRequestedBy is the requesting owner’s Zitadel subject. Text, not uuid: there is no users table and a subject is a snowflake.
FunctionsBeta is a closed-beta GRANT for HTTP functions (DEP-375), not just an allowlist: when true it overrides the plan gate entirely, serving HTTP functions at the beta profile’s sizing (billing.ApplyFunctionsBetaProfile) even on a plan that excludes them. Flipped by a platform admin. Background functions are never gated by it.
The closed-beta application trail (DEP-378). A team applies for itself and a platform admin approves later, so “applied” and “enrolled” are two different states: FunctionsBetaRequestedAt set with FunctionsBeta still false is the pending queue.
FunctionsBetaRequestedBy is the applicant’s Zitadel subject — the person who clicked apply, not whoever represents the team. Text, not uuid: there is no users table. FunctionsBetaGrantedAt is stamped on the false->true flip and KEPT if the grant is later revoked, so it records when the team was first let in rather than mirroring the flag.
FunctionsBetaRequestedByEmail is the address of the member who applied for the functions closed beta (DEP-378), resolved from Team.FunctionsBetaRequestedBy. Empty when nobody applied or the applicant has since left the team. Deliberately NOT the owner-preference lookup: the admin needs to know who asked, not who represents the team.
LapsedAt is set while this extra team is a second Free team of one of its owners (DEP-889): its sites keep serving, but it cannot deploy or create projects (services.ErrTeamLapsed). Set and cleared by the lapse sweeper, cleared at once by a payment. The team is deleted TeamLapseRemovalAfter after it; the clock resets whenever the column clears.
LastActivityAt is a denormalized timestamp bumped on meaningful team activity (deployment create, build start, domain add, authed API call). Used by the admin dashboard for fast activity-bucket filtering.
Email notifications
NotificationEmailPending is a requested address awaiting confirmation. Never mailed except for the confirmation itself.
Verification state of NotificationEmail (DEP-710). Only verified is mailed (plus a migrated legacy address while pending within NotificationEmailLegacyGraceUntil); anything else falls back to the owners. See RecipientsFor in the repository.
OwnerEmail / OwnerName are the team’s representative identity, resolved by ownerPreferenceOrder: the owner membership (earliest joined if several), falling back to any member. Both empty when the team has no members yet.
PrimaryDomain is the team’s first verified custom domain, if any.
SlugChosenAt is NULL until the owner deliberately saved the slug (DEP-533). Auto-picked slugs at provisioning time and the one-off backfill both leave it NULL, and that NULL is what drives the “name your team” nudge — so it is a record of intent, not of the last write. A rename by the owner stamps it; SetAutoIdentity never does.
Account deletion (DEP-186). The whole 14-day grace period lives in these columns; no job row exists until the purge is claimed (spec D7).
SubscriptionComplimentary marks an admin-granted plan with no payment provider behind it (DEP-482). The service zeroes MRR for these; the admin UI badges them.
Suspension (DEP-299), the abuse kill switch. A sibling of LegalHold, deliberately not a TeamStatus value: the deletion state machine above must never see it, so a suspended team still purges on schedule and a team under a deletion request can still be suspended. SuspendedBy is the admin’s Zitadel subject; text, not uuid, because there is no users table.
SuspensionNotifiedAt is when the statement of reasons for the current suspension went out (DEP-774). NULL on a suspended team means it is still owed.
object
WeeklyFunnel / AllTimeFunnel power the activation funnel chart (DEP-196).
object
Example
{ "data": { "recent_teams": [ { "deletion_kind": "account", "notification_email_status": "none", "plan": "free", "status": "active", "subscription_status": "active" } ] }}Unauthorized
object
object
Example generated
{ "code": "example", "details": "example", "error": "example", "meta": { "request_id": "example", "timestamp": "example", "trace_id": "example" }}Forbidden
object
object
Example generated
{ "code": "example", "details": "example", "error": "example", "meta": { "request_id": "example", "timestamp": "example", "trace_id": "example" }}Internal Server Error
object
object
Example generated
{ "code": "example", "details": "example", "error": "example", "meta": { "request_id": "example", "timestamp": "example", "trace_id": "example" }}Live f79d25b6 built