Dropto · Schema

MeResponse

Response of `GET /me`.

HostingArtificial IntelligenceStatic SitesDeveloper ToolsCloud

Properties

Name Type Description
accountId nullstring The account this session is acting on.
accountName nullstring What the account is called, or null for a personal one nobody has named. Sent because every screen under `/account` is now about an account rather than about the person reading it, and a page headed w
email string Email from Google.
grants array Extra quota this account holds outside its tier, one entry each, oldest first. The figures in Plan already include these — every one of them is the effective number the server enforces — so this is no
name nullstring Display name from Google, if any.
onboarding string `pending` while this person has neither answered nor skipped the first-visit questions, and `done` once they have. On the person rather than the account, like the name and the address beside it: someb
overLimitUntil nullstring When the account's grace for being over its plan runs out, or null while it fits. Non-null means something will be cut on that date — the oldest sites are put to sleep and the oldest custom domains ar
plan object The quota tier currently applied to this user.
recoveryCodesLeft nullintegerstring How many unused two-factor recovery codes this person has, or null while two-factor is off. On the session rather than only on the profile because the reminder it drives — three or fewer — is shown on
role string What the signed-in person may do on that account: `Owner` or `Member`. Served so the dashboard can leave out controls the caller cannot use — a delete button, the billing pages — rather than showing t
seats integerstring How many seats the account is paying for, which is what its raised ceilings were computed from. One on every tier not sold by the seat, where it is a constant rather than a measurement. It is not the
usage object How much of the plan is currently used.
userId string ULID of the signed-in user.
View JSON Schema on GitHub

JSON Schema

dropto-run-me-response-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/dropto-run/json-schema/dropto-run-me-response-schema.json",
  "title": "MeResponse",
  "description": "Response of `GET /me`.",
  "x-generated": "2026-11-06",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/dropto-run-openapi.json#/components/schemas/MeResponse",
  "properties": {
    "accountId": {
      "description": "The account this session is acting on.",
      "type": [
        "null",
        "string"
      ]
    },
    "accountName": {
      "description": "What the account is called, or null for a personal one nobody has named.\n\nSent because every screen under `/account` is now about an account rather than about the person\nreading it, and a page headed with somebody's own name while describing a shared tier is the exact\nconfusion the team screens were redesigned to remove.",
      "type": [
        "null",
        "string"
      ]
    },
    "email": {
      "description": "Email from Google.",
      "type": "string"
    },
    "grants": {
      "description": "Extra quota this account holds outside its tier, one entry each, oldest first.\n\nThe figures in Plan already include these — every one of them is the effective\nnumber the server enforces — so this is not a second set of limits to add up. It is what lets a page\nsay why a figure is larger than the tier it names, which is the difference between a benefit and an\napparent bug in the dashboard. Empty for almost every account.",
      "items": {
        "$ref": "#/$defs/GrantResponse"
      },
      "type": "array"
    },
    "name": {
      "description": "Display name from Google, if any.",
      "type": [
        "null",
        "string"
      ]
    },
    "onboarding": {
      "description": "`pending` while this person has neither answered nor skipped the first-visit questions, and\n`done` once they have.\n\nOn the person rather than the account, like the name and the address beside it: somebody in two\naccounts is asked once. Everybody who had an account before the questions existed reads as\n`done`, because the migration that added the table gave them a skipped row (A14).",
      "type": "string"
    },
    "overLimitUntil": {
      "description": "When the account's grace for being over its plan runs out, or null while it fits.\n\nNon-null means something will be cut on that date — the oldest sites are put to sleep and the\noldest custom domains are removed, only as far as it takes to fit. It is served so the dashboard\ncan say so beforehand: nobody should learn about this from a site going quiet.",
      "format": "date-time",
      "type": [
        "null",
        "string"
      ]
    },
    "plan": {
      "$ref": "#/$defs/PlanResponse",
      "description": "The quota tier currently applied to this user.",
      "__uniqueRefKey": "#/components/schemas/PlanResponse__4"
    },
    "recoveryCodesLeft": {
      "description": "How many unused two-factor recovery codes this person has, or null while two-factor is off. On the\nsession rather than only on the profile because the reminder it drives — three or fewer — is shown on\nthe site list, which does not read the profile.",
      "format": "int32",
      "pattern": "^-?(?:0|[1-9]\\d*)$",
      "type": [
        "null",
        "integer",
        "string"
      ]
    },
    "role": {
      "description": "What the signed-in person may do on that account: `Owner` or `Member`.\n\nServed so the dashboard can leave out controls the caller cannot use — a delete button, the billing\npages — rather than showing them and reporting a refusal afterwards. It is <b>not</b> the\npermission: every one of those actions is refused at the handler regardless of what the page drew,\nand a client that ignored this field would gain nothing but a worse error message.",
      "type": "string"
    },
    "seats": {
      "description": "How many seats the account is paying for, which is what its raised ceilings were computed from.\n\nOne on every tier not sold by the seat, where it is a constant rather than a measurement. It is not\nthe number of members: seats are bought and members are people, and the two moving independently is\nthe whole reason inviting somebody does not silently change an invoice.",
      "format": "int32",
      "pattern": "^-?(?:0|[1-9]\\d*)$",
      "type": [
        "integer",
        "string"
      ]
    },
    "usage": {
      "$ref": "#/$defs/UsageResponse",
      "description": "How much of the plan is currently used.",
      "__uniqueRefKey": "#/components/schemas/UsageResponse__5"
    },
    "userId": {
      "description": "ULID of the signed-in user.",
      "type": "string"
    }
  },
  "required": [
    "userId",
    "email",
    "name",
    "plan",
    "usage",
    "overLimitUntil",
    "accountId",
    "role",
    "accountName",
    "seats",
    "grants",
    "onboarding",
    "recoveryCodesLeft"
  ],
  "type": "object",
  "$defs": {
    "FunctionsUsageResponse": {
      "description": "How much of its function allowance an account is using.",
      "properties": {
        "callsThisMonth": {
          "description": "Function calls this calendar month across every site, up to about an hour and a half behind. Resets with `filesResetAt`.",
          "format": "int64",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "integer",
            "string"
          ]
        },
        "maxCallsPerMonth": {
          "description": "Calls the account's sites may make together each calendar month, seats included.",
          "format": "int32",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "integer",
            "string"
          ]
        },
        "maxSites": {
          "description": "Sites that may run functions at once. A deploy that would add one past it is refused.",
          "format": "int32",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "integer",
            "string"
          ]
        },
        "sites": {
          "description": "Sites whose live version has functions, which is what `maxSites` bounds.",
          "format": "int32",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "integer",
            "string"
          ]
        },
        "suspended": {
          "description": "Whether this month's calls are spent and every function of the account answers 429.",
          "type": "boolean"
        }
      },
      "required": [
        "sites",
        "maxSites",
        "callsThisMonth",
        "maxCallsPerMonth",
        "suspended"
      ],
      "type": "object"
    },
    "GrantResponse": {
      "description": "One piece of extra quota this account holds on top of its tier.",
      "properties": {
        "accountBytes": {
          "description": "Extra storage it adds, in bytes, or null when it adds none.",
          "format": "int64",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "null",
            "integer",
            "string"
          ]
        },
        "allowsFeedback": {
          "description": "Whether it switches on comments, for the same reason.",
          "type": "boolean"
        },
        "allowsInvitedViewers": {
          "description": "Whether it switches on private sharing by email, so the page can say where that came from on a tier\nthat does not include it.",
          "type": "boolean"
        },
        "allowsPasswordProtection": {
          "description": "Whether it switches on password protection, for the same reason.",
          "type": "boolean"
        },
        "expiresAt": {
          "description": "When it runs out, or null when it does not.",
          "format": "date-time",
          "type": [
            "null",
            "string"
          ]
        },
        "maxCustomDomains": {
          "description": "Extra custom domains it adds.",
          "format": "int32",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "integer",
            "string"
          ]
        },
        "maxSites": {
          "description": "Extra sites it adds, or null when it adds none.",
          "format": "int32",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "null",
            "integer",
            "string"
          ]
        },
        "name": {
          "description": "What to call it. The campaign's name where it came from one, and a generic label otherwise — never\nthe administrator's own note, which is written for the console.",
          "type": "string"
        },
        "suppressesBadge": {
          "description": "Whether it takes the Drop2Run badge off this account's sites.",
          "type": "boolean"
        },
        "writeOpsPerMonth": {
          "description": "Extra publishing operations a month, or null.",
          "format": "int64",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "null",
            "integer",
            "string"
          ]
        }
      },
      "required": [
        "name",
        "maxSites",
        "accountBytes",
        "writeOpsPerMonth",
        "maxCustomDomains",
        "suppressesBadge",
        "allowsInvitedViewers",
        "allowsFeedback",
        "allowsPasswordProtection",
        "expiresAt"
      ],
      "type": "object"
    },
    "PlanResponse": {
      "description": "One quota tier. Field for field the `plans` row, so no mapping table is needed anywhere.",
      "properties": {
        "allowAnalyticsExport": {
          "description": "Whether the dashboard offers to save this tier's traffic figures as files.\n\nAnother statement about what the tier is sold with rather than a lock: the files are assembled in\nthe browser from the traffic response the page already holds, so a reader who can see the page can\nread the same numbers off it — see bool Plan.AllowAnalyticsExport.",
          "type": "boolean"
        },
        "allowBrowserEdit": {
          "description": "Whether the dashboard lets an owner edit a file of their site in the browser.\n\nA gate rather than packaging, like the flag above: the endpoint the editor reads a file through is\nrefused outright for a tier without it.",
          "type": "boolean"
        },
        "allowFeedback": {
          "description": "Whether a site on this tier can take comments on its pages (docs/IMPLEMENTATION-PLAN.md §16.7).\n\nServed so the pricing page and the marketing pages say which tiers include comments from the table,\nnever from a sentence: the tiers that carry it are set in the admin console and change without a release.",
          "type": "boolean"
        },
        "allowInvitedViewers": {
          "description": "Whether a site on this tier may be shared with named people, each signing in with their own account.\nA capability beside AllowPasswordProtection — the two are the paid answers to \"who\ncan see this site\" — and served for the same reason: the pricing page lists it beside the password.",
          "type": "boolean"
        },
        "allowPasswordProtection": {
          "description": "Whether a site on this tier may be put behind a password. The first capability on this record rather\nthan a quantity, so it reads as a boolean instead of a limit of zero: the tier either offers the\nfeature or does not, and \"0 passwords\" would describe a countable resource nobody has any of.\n\nServed here for the same reason every number above is — the pricing page and the site settings form\nboth have to know, and a client that hardcoded which tiers had it would be wrong the first time an\noperator flipped the column.",
          "type": "boolean"
        },
        "allowQrCode": {
          "description": "Whether the dashboard offers a QR code for the addresses of sites on this tier.\n\nServed rather than decided in the browser for the same reason the flag above is, and for one more:\nthis is the only thing that decides the feature at all. The code is drawn from an address that is\nalready public, so the tier's answer is a statement about what the tier is sold with, not a lock —\nsee bool Plan.AllowQrCode.",
          "type": "boolean"
        },
        "allowScheduledExpiry": {
          "description": "Whether an owner on this tier may schedule when one of their sites comes down.\n\nUnlike the two flags above, this one is a real gate rather than a statement about packaging: the\nserver refuses to set a date for a tier without it. Served all the same, so the pricing page can\nlist it and the dashboard can explain the absence rather than failing on submit.",
          "type": "boolean"
        },
        "allowTrafficBreakdown": {
          "description": "Whether this tier's traffic page lists top pages, referrers, countries and broken links, and filters\nby them. Served so the pricing page and the locked panels can name the tier that includes them.",
          "type": "boolean"
        },
        "allowTrafficDetail": {
          "description": "Whether this tier's traffic page splits people from bots and AI, and shows devices, browsers,\ncampaigns and edge speed.",
          "type": "boolean"
        },
        "analyticsDays": {
          "description": "How many days of a site's own traffic this tier lets its owner see, or zero when it includes none.\n\nA count where bool PlanResponse.AllowPasswordProtection is a flag, because there is something to meter\nhere: the difference between tiers is how far back the history reaches, and a boolean would need a\nsecond field to say that. Zero reads as \"not on this tier\" rather than as a quantity nobody has,\nwhich is why the pricing page renders it as words rather than as the number.",
          "format": "int32",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "integer",
            "string"
          ]
        },
        "badgeText": {
          "description": "Short label shown against the tier, or null for none. See string? Plan.BadgeText.",
          "type": [
            "null",
            "string"
          ]
        },
        "currency": {
          "description": "ISO 4217 code the two price fields are counted in.",
          "type": "string"
        },
        "displayOrder": {
          "description": "Where the tier sits on the pricing page, lowest first.",
          "format": "int32",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "integer",
            "string"
          ]
        },
        "id": {
          "description": "Plan id, as stored.",
          "type": "string"
        },
        "isExclusive": {
          "description": "Whether this tier is not on the pricing page, and reaches the caller only because it was agreed with\nthem.\n\nAlways false on the anonymous route, which returns the listed tiers and therefore has nothing to say\nhere. It exists so the dashboard can label the card: a reader meeting a price nobody else is offered,\nbeside prices everybody is, would otherwise have no way to tell which is which — and would reasonably\nwonder why they cannot find it on the pricing page.\n\nNot the same question as bool PlanResponse.IsPurchasable. A tier can be agreed before its prices are set,\nwhich is exclusive and not yet buyable, and the card has to say both.",
          "type": "boolean"
        },
        "isPurchasable": {
          "description": "Whether the tier can be bought right now. Separate from being listed: a tier that is listed and not\npurchasable shows its price and its limits with no button, which is how a tier is announced before\nthere is a checkout behind it. See bool Plan.IsPurchasable.",
          "type": "boolean"
        },
        "isTeam": {
          "description": "Whether the two prices are the cost of one seat rather than of one period.\n\nServed publicly because the pricing page cannot render the tier without it: fifteen dollars a seat\nand fifteen dollars a period are the same number in the same field and three times apart in what a\ncustomer pays. A page that showed the column would put this tier beside the one above it at an\nidentical price.",
          "type": "boolean"
        },
        "lifetimeDays": {
          "description": "Days before the site is deleted, or null when it is kept for good.",
          "format": "int32",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "null",
            "integer",
            "string"
          ]
        },
        "maxAccountBytes": {
          "description": "Maximum bytes the account may hold across every site and every kept version, or null when the tier\nhas no total. Null on the anonymous tier, which has no owner to total by. See\nlong? Plan.MaxAccountBytes.",
          "format": "int64",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "null",
            "integer",
            "string"
          ]
        },
        "maxAccountWriteOpsPerMonth": {
          "description": "New or changed files the account may publish in a calendar month, or null when the tier is not\nbounded by month. The one limit on this page that is a cost rather than a capacity: republishing a\nfile that has not changed spends nothing against it.",
          "format": "int64",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "null",
            "integer",
            "string"
          ]
        },
        "maxCustomDomains": {
          "description": "Maximum hostnames of the customer's own that one account may be served on, counted across every site\nit owns. Zero means the tier does not include the feature, which is what both free tiers are seeded\nwith — so the pricing page reads this as a capability rather than as a quantity. Never null, unlike\nthe quotas above it: there is no unlimited version of a resource billed monthly per unit. Distinct\nfrom int? PlanResponse.MaxCustomSubdomains, which counts names on our own content domain. See\nint Plan.MaxCustomDomains.",
          "format": "int32",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "integer",
            "string"
          ]
        },
        "maxCustomSubdomains": {
          "description": "Maximum sites one owner may have picked their own subdomain for, or null when the tier does not limit\nthat at all. See int? Plan.MaxCustomSubdomains.",
          "format": "int32",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "null",
            "integer",
            "string"
          ]
        },
        "maxFileBytes": {
          "description": "Maximum size of a single file, in bytes.",
          "format": "int64",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "integer",
            "string"
          ]
        },
        "maxFiles": {
          "description": "Maximum files in one deploy.",
          "format": "int32",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "integer",
            "string"
          ]
        },
        "maxFormSubmissionsPerMonth": {
          "description": "Maximum form submissions one account may take in a calendar month, across every site it owns. Zero\nmeans the tier does not include the feature, and every tier is seeded zero — the figure worth selling\nis not known yet, so it ships off and an operator raises it per row once the counter has something to\nread. The pricing page therefore renders this as a capability until somebody sets a number. See\nint Plan.MaxFormSubmissionsPerMonth.",
          "format": "int32",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "integer",
            "string"
          ]
        },
        "maxFunctionInvocationsPerMonth": {
          "description": "Function calls one account's sites may make together in a calendar month, before seats. Zero means the tier\ndoes not include functions. See int Plan.MaxFunctionInvocationsPerMonth.",
          "format": "int32",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "integer",
            "string"
          ]
        },
        "maxFunctionSites": {
          "description": "Sites of one account that may run functions at once (docs/briefs/FUNCTIONS-BRIEF.md D18). Zero, with\nMaxFunctionInvocationsPerMonth, means the tier does not include functions — every tier sold\ntoday, until an operator sets a figure on the row. See int Plan.MaxFunctionSites.",
          "format": "int32",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "integer",
            "string"
          ]
        },
        "maxProxyRequestsPerMonth": {
          "description": "Requests one account's sites may proxy to their owners' upstreams in a calendar month. Zero means the tier\ndoes not include the proxy. See int Plan.MaxProxyRequestsPerMonth.",
          "format": "int32",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "integer",
            "string"
          ]
        },
        "maxSeats": {
          "description": "Most seats it can be held with, or null for no ceiling.",
          "format": "int32",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "null",
            "integer",
            "string"
          ]
        },
        "maxSiteBytes": {
          "description": "Maximum total size of one deploy of one site, in bytes, or null when the tier does not bound a single\npublish and lets the account total do it instead. Not a storage limit either way: it is weighed\nagainst a single publish, and every kept version is stored whole. MaxAccountBytes\nis the storage one.",
          "format": "int64",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "null",
            "integer",
            "string"
          ]
        },
        "maxSiteComments": {
          "description": "The most comments one site on this tier may hold, deleted ones not counted. Only meaningful where\nAllowFeedback is on; served on every tier like the other ceilings.",
          "format": "int32",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "integer",
            "string"
          ]
        },
        "maxSiteViewers": {
          "description": "How many people one invite-only site may list, its owner included. Read only where\nAllowInvitedViewers is on; a figure on a tier without the feature describes nothing.",
          "format": "int32",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "integer",
            "string"
          ]
        },
        "maxSites": {
          "description": "Maximum sites one owner may have, or null when the tier has no owner to count by — the anonymous tier,\nwhose sites belong to nobody.",
          "format": "int32",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "null",
            "integer",
            "string"
          ]
        },
        "minSeats": {
          "description": "Fewest seats the tier is sold with, which is what turns a seat price into an entry price.",
          "format": "int32",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "integer",
            "string"
          ]
        },
        "name": {
          "description": "What the tier is called on screen, falling back to the id when a row has never been named. Served\nrather than written into the pricing page so that a tier added to the table appears with its own name\ninstead of an id, which is what makes a new tier a database insert rather than a release.",
          "type": "string"
        },
        "parentPlanId": {
          "description": "The tier this one is built on, or null when it stands alone.\n\nEvery quota above is already the effective one — inheritance is materialised on the row, so nothing\nreading this response has to resolve anything. This field is here for what the pricing page says\nrather than for what it computes: a tier built on another is listed as everything that one includes\nplus what it adds, and the rows that repeat the parent's figures are left off the card. Without the\nlink the page would have to guess that relationship from the numbers, and two tiers that happen to\nshare a figure are not the same claim as one built on the other.\n\nNull on the card when the parent is not itself public: there is no listed tier to name, so the card\nfalls back to listing every row.",
          "type": [
            "null",
            "string"
          ]
        },
        "perSeatAccountBytes": {
          "description": "Storage each seat past the minimum adds, or null when storage does not scale with seats.\n\nThe per-seat figures are served for one reason, and it is not decoration. This endpoint is\npublic, so it has no account and therefore no seat count — it can only state the tier's base. The\ndashboard states the effective figure for the account reading it. Without the delta beside the base,\nthe two pages say different numbers for the same plan and the promise that the pricing page shows\nwhat the service enforces stops being true.",
          "format": "int64",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "null",
            "integer",
            "string"
          ]
        },
        "perSeatMaxCustomDomains": {
          "description": "Hostnames of the customer's own each seat past the minimum adds. Zero says a seat buys none, which\nis where every tier starts and what the free tiers stay at.",
          "format": "int32",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "integer",
            "string"
          ]
        },
        "perSeatMaxFormSubmissionsPerMonth": {
          "description": "Form submissions a month each seat past the minimum adds to the account's allowance. Zero says a\nseat buys none, which is every tier but Team.",
          "format": "int32",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "integer",
            "string"
          ]
        },
        "perSeatMaxFunctionInvocationsPerMonth": {
          "description": "Function calls a month each seat past the minimum adds. Zero says a seat buys none.",
          "format": "int32",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "integer",
            "string"
          ]
        },
        "perSeatMaxProxyRequestsPerMonth": {
          "description": "Proxied requests a month each seat past the minimum adds. Zero says a seat buys none.",
          "format": "int32",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "integer",
            "string"
          ]
        },
        "perSeatMaxSites": {
          "description": "Sites each seat past the minimum adds, or null when they do not scale.",
          "format": "int32",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "null",
            "integer",
            "string"
          ]
        },
        "perSeatWriteOpsPerDay": {
          "description": "Daily budget each seat adds, or null when it does not scale.",
          "format": "int64",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "null",
            "integer",
            "string"
          ]
        },
        "perSeatWriteOpsPerMonth": {
          "description": "Monthly budget each seat adds, or null when it does not scale.",
          "format": "int64",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "null",
            "integer",
            "string"
          ]
        },
        "priceCentsMonth": {
          "description": "Price of one month in the smallest unit of Currency, or null when the tier is not\nsold by the month. Null rather than zero on the free tiers: they are not priced at zero, they are not\non sale.",
          "format": "int32",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "null",
            "integer",
            "string"
          ]
        },
        "priceCentsYear": {
          "description": "Price of one year, or null when the tier is not sold by the year.",
          "format": "int32",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "null",
            "integer",
            "string"
          ]
        },
        "prioritySupport": {
          "description": "Whether support requests from accounts on this tier are answered ahead of the queue.\n\nServed because the pricing page lists it, and for no other reason: nothing in the API branches on\nit. It is the one field here that no endpoint enforces, because what it describes is a promise kept\nby whoever answers the mail — see bool Plan.PrioritySupport.",
          "type": "boolean"
        },
        "retainedDeploys": {
          "description": "How many recent deploys stay available.",
          "format": "int32",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "integer",
            "string"
          ]
        },
        "showsBadge": {
          "description": "Whether sites on this tier carry the Drop2Run badge in their served HTML.\n\nThe one field on this record that describes something the platform does *to* a site rather than\nsomething the site is allowed to do, which is why it reads as \"shows\" rather than \"allows\". The\npricing page states it as a row like any other limit, because it is a difference between the tiers a\nreader has to know before they upload rather than after.",
          "type": "boolean"
        },
        "sitesPerIpPerDay": {
          "description": "Maximum new sites one network may create per day, or null when the tier is not counted by address.\nAbuse protection rather than a product limit, so nothing is expected to display it.",
          "format": "int32",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "null",
            "integer",
            "string"
          ]
        },
        "tagline": {
          "description": "One line under the name, or null to show none. See string? Plan.Tagline.",
          "type": [
            "null",
            "string"
          ]
        }
      },
      "required": [
        "id",
        "maxSites",
        "maxSiteBytes",
        "maxAccountBytes",
        "maxAccountWriteOpsPerMonth",
        "maxFiles",
        "maxFileBytes",
        "retainedDeploys",
        "lifetimeDays",
        "sitesPerIpPerDay",
        "maxCustomSubdomains",
        "maxCustomDomains",
        "maxFormSubmissionsPerMonth",
        "maxProxyRequestsPerMonth",
        "allowPasswordProtection",
        "allowInvitedViewers",
        "maxSiteViewers",
        "allowQrCode",
        "allowAnalyticsExport",
        "allowScheduledExpiry",
        "allowBrowserEdit",
        "allowFeedback",
        "maxSiteComments",
        "showsBadge",
        "prioritySupport",
        "analyticsDays",
        "allowTrafficBreakdown",
        "allowTrafficDetail",
        "name",
        "tagline",
        "badgeText",
        "priceCentsMonth",
        "priceCentsYear",
        "currency",
        "isPurchasable",
        "displayOrder",
        "parentPlanId",
        "isTeam",
        "minSeats",
        "maxSeats",
        "perSeatAccountBytes",
        "perSeatMaxSites",
        "perSeatWriteOpsPerMonth",
        "perSeatWriteOpsPerDay",
        "perSeatMaxCustomDomains",
        "perSeatMaxFormSubmissionsPerMonth",
        "perSeatMaxProxyRequestsPerMonth",
        "isExclusive",
        "maxFunctionSites",
        "maxFunctionInvocationsPerMonth",
        "perSeatMaxFunctionInvocationsPerMonth"
      ],
      "type": "object"
    },
    "UsageResponse": {
      "description": "How much of a plan's quota a user is currently using.",
      "properties": {
        "bytes": {
          "description": "What the account is holding on storage — every deploy of every site whose files have not been\nremoved, not just the version currently serving. The same total `prepare` weighs against\nlong? PlanResponse.MaxAccountBytes, so the page can say how much room is left and be right.",
          "format": "int64",
          "pattern": "^-?(?:0|[1-9]\\d*)$",
          "type": [
            "integer",
            "string"
          ]
        },
        "countedSites": {
          "description": "How many of those the site allowance is measured against: the ones the account holds, which is\n`Active` plus `Paused`. `CreateSite` and `ClaimSites` refuse against exactly\nthis set. A site an administrator suspended or the quota job cut is exclude

# --- truncated at 32 KB (36 KB total) ---
# Full source: https://artifacts.apis.io/dropto-run/json-schema/dropto-run-me-response-schema.json

Work with this as data

Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for schemas

4 MCP tools reach this
  • find_json_schemasBrowse and filter every JSON Schema in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/dropto-run-me-response"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.