PageSourceSearch

https://geomi.dev/_next/static/chunks/pages/docs/admin/billing-802e45627c484954.js

js geomi.dev collected 2026-10-09 22:43:20 UTC 41,514 bytes, 1 lines download raw bytes

1(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6201],{3415:(e,s,t)=>{"use strict";t.d(s,{n:()=>r});var i=t(21188);function r(){return i.i.admin.getDefaultOrganizationConfigs.useQuery({body:{_dummy:""}})}},9387:(e,s,t)=>{"use strict";t.r(s),t.d(s,{default:()=>S});var i=t(23798),r=t(64927),n=t(64407),a=t(71602),o=t(41008),l=t(59354),c=t(90514),d=t(68006),h=t(12131),u=t(85096),p=t(55498),m=t(45592),g=t(21462),x=t(46636),f=t(35296),j=t(76281);let y={transform(e){let{direction:s,align:t,justify:i,wrap:r,basis:n,grow:a,shrink:o,...l}=e;return{display:"flex",flexDirection:s,alignItems:t,justifyContent:i,flexWrap:r,flexBasis:n,flexGrow:a,flexShrink:o,...l}}},k=(e={})=>{let s=(0,f.HZ)(y,e);return y.transform(s,f.Ek)},b=e=>(0,j.AH)(k(e));b.raw=k;let T=(0,g.forwardRef)((e,s)=>{var{className:t}=e,r=(0,p.T)(e,["className"]);return(0,i.jsx)(m.X.div,{ref:s,className:(0,x.cx)(b({align:"center",justify:"center",textAlign:"center",maxW:"[200px]",px:"8",py:"8",gap:"8",textStyle:"body.sm",color:"tooltip.text",bg:"tooltip.background",rounded:"300"}),t),...r})});T.displayName="TooltipContent";var w=t(11743);function v(e,s){switch(e){case"ComputeUnits":return{name:"Compute Units",unitName:"CU",pluralUnitName:"CUs",priceCents:s.compute_units,multiplier:1,tooltip:(0,i.jsx)(T,{children:"Each API request is charged in terms of compute units."})};case"EgressBytes":return{name:"Data Egress",unitName:"MiB",priceCents:null,multiplier:1048576,tooltip:(0,i.jsx)(T,{children:"Download traffic is measured in bytes. Pricing is determined by your organization's Metronome contract, not the global price schedule."})};case"StreamBytes":return{name:"Transaction Stream",unitName:"MiB",priceCents:s.stream_bytes,multiplier:1048576,tooltip:(0,i.jsxs)(T,{children:["This is what it costs to stream 1 ","MiB"," of data."]})};case"StreamMinutes":return{name:"Transaction Stream Time",unitName:"hour",pluralUnitName:"hours",priceCents:s.stream_minutes,multiplier:60,tooltip:(0,i.jsx)(T,{children:"This is what it costs to keep a transaction stream open for 1 hour."})};case"ProcessorMinutes":return{name:"Processor Time",unitName:"hour",pluralUnitName:"hours",priceCents:s.processor_minutes,multiplier:60,tooltip:(0,i.jsx)(T,{children:"Each hour a processor runs it accrues this cost. Paused processors are exempt."})};case"ProcessorWriteBytes":return{name:"Processor Writes",unitName:"MiB",priceCents:s.processor_write_bytes,multiplier:1048576,tooltip:(0,i.jsxs)(T,{children:["This is what it costs to write 1 ","MiB"," of data with a processor (including upserts)."]})};case"ProcessorStorageKibibyteMinutes":return{name:"Processor Storage",unitName:"".concat("GiB"," hour"),pluralUnitName:"".concat("GiB"," hours"),priceCents:s.processor_storage_kibibyte_minutes,multiplier:0x3c00000,tooltip:(0,i.jsxs)(T,{children:["This is what it costs to store 1 ","GiB"," of data for 1 hour."]})};case"StorageMebibyteHours":return{name:"Storage",unitName:"GiB hour",pluralUnitName:"GiB hours",priceCents:null,multiplier:1024,tooltip:(0,i.jsx)(T,{children:"Managed Shelby account storage is measured in MiB-hours. Pricing is determined by your organization's Metronome contract, not the global price schedule."})};case"GasNanoCents":return{name:"Gas Spend",unitName:"USD",priceCents:1/1e9,multiplier:100*1e9,tooltip:(0,i.jsx)(T,{children:"This is the amount of gas used as US dollars. The value is determined based on the APT price at the time the transaction was sponsored by the gas station."})};default:return(0,w.d)(e,"Unrecognized price type received")}}var E=t(21188),C=t(75828);function S(){let{data:e,isLoading:s,error:t}=E.i.admin.getPriceSchedule.useQuery({body:{_dummy:""}});if(t)return(0,i.jsx)(r.F,{heading:"Error loading price schedule",variant:"error",children:(0,C.g)(t,"Unknown error loading price schedule")});if(s)return(0,i.jsx)("div",{className:(0,u.t$)({gap:"8"}),children:(0,i.jsx)(P,{})});if(!e)return(0,i.jsx)(r.F,{heading:"Error loading price schedule",variant:"error",children:(0,C.g)(t,"Unknown error loading price schedule, data missing.")});let n=e.enabled_price_types.filter(e=>"GasNanoCents"!==e).sort((e,s)=>e.localeCompare(s));return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(a.X,{children:[(0,i.jsx)("br",{}),(0,i.jsx)("thead",{children:(0,i.jsxs)(o.Tr,{children:[(0,i.jsx)(l.Th,{children:"Dimension"}),(0,i.jsx)(l.Th,{children:"Price"})]})}),(0,i.jsx)("tbody",{children:n.map(s=>(0,i.jsx)(U,{schedule:e,priceType:s},s))})]}),n.some(s=>null===v(s,e).priceCents)&&(0,i.jsxs)(c.P,{type:"info",children:[(0,i.jsx)("strong",{children:"Contract-specific prices:"}),' Data egress and managed Shelby storage are priced by your organization\'s Metronome contract, not this global schedule. When a local price is unavailable, Usage shows "Not available" for the cost and total; this does not mean the usage is free.']}),(0,i.jsxs)(c.P,{type:"info",children:[(0,i.jsx)("strong",{children:"Gas Station Costs:"})," Transactions sponsored by gas stations are charged based on the gas used and the APT price at previous close-of-day (UTC). Since APT price fluctuates, gas costs are not shown as a fixed rate above. See the"," ",(0,i.jsx)("a",{href:"#cost-dimensions",className:(0,h.AH)({textDecoration:"underline!"}),children:"Cost Dimensions"})," ","section below for more details."]})]})}function U(e){let{schedule:s,priceType:t}=e,{name:r,unitName:n,priceCents:a,multiplier:l}=v(t,s),c=null===a?null:a/100*l;return(0,i.jsxs)(o.Tr,{children:[(0,i.jsx)(d.Td,{children:r}),(0,i.jsx)(d.Td,{className:(0,h.AH)({textStyle:"mono.md"}),children:null===c?"Contract-specific":"$".concat(c.toLocaleStr
1ing(void 0,{maximumFractionDigits:18})," / ").concat(n)})]})}function P(){return(0,i.jsx)("div",{className:(0,h.AH)({w:"full"}),children:(0,i.jsx)(n.E,{className:(0,h.AH)({height:"[150px]",w:"full",my:"[2px]"})})})}},27902:(e,s,t)=>{"use strict";t.r(s),t.d(s,{AppliesTo:()=>p,default:()=>x,useTOC:()=>m});var i=t(23798),r=t(60686),n=t(35999),a=t(4964),o=t(90514),l=t(28541),c=t(73792),d=t(85221),h=t(9387),u=t(78475);function p(e){let{services:s}=e,t={b:"b",div:"div",span:"span",...(0,a.R)()};return(0,i.jsx)(t.div,{children:(0,i.jsx)(o.P,{type:"info",children:(0,i.jsxs)(t.span,{children:[(0,i.jsx)(t.b,{children:"Applicable Services:"})," ",s.join(", "),"."]})})})}function m(e){return[{value:"Definitions",id:"definitions",depth:2},{value:"Billing",id:"billing",depth:2},{value:"System Limits",id:"system-limits",depth:2},{value:"Cost Dimensions",id:"cost-dimensions",depth:2}]}function g(e,s){throw Error("Expected "+(s?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}let x=(0,r.e)(function(e){let{toc:s=m(e)}=e,t={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return l.t||g("Tabs",!1),l.t.Tab||g("Tabs.Tab",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o.P,{type:"info",children:(0,i.jsxs)(t.p,{children:["To see your current or past usage, navigate to the ",(0,i.jsx)(t.strong,{children:"Usage"})," tab using the button in the side nav\npanel. To see the price schedule and add, modify, or remove a payment method, navigate to the\n",(0,i.jsx)(t.strong,{children:"Billing"})," tab."]})}),"\n",(0,i.jsx)(t.h2,{id:s[0].id,children:s[0].value}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"User"}),": Someone with a Geomi account (e.g. ",(0,i.jsx)(t.code,{children:"[email protected]"}),")."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Organization:"})," This is what actually owns projects and resources. Organizations have many members and admins but just one owner. Payment methods are attached to organizations, not users. For example ",(0,i.jsx)(t.code,{children:"stable-labs"}),"."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Monthly Credit"}),": A credit in terms of US dollars that Aptos Labs grants the organization each month. It is use it or lose it, the credit does not roll over to the next month."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"System Limits"}),": These are caps that we set on the amount of resources that an organization is allowed to use. These exist to protect our infra from unexpectedly high usage. They are defined in terms of the service, e.g. CUs per 5 mins."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Budgets"}),": We allow organization admins to set a daily and/or monthly budget for their spending. Budgets are in dollar terms, not per-resource terms. Since they are enforced asynchronously, it is possible to slightly exceed your budget. You can set these on the ",(0,i.jsx)(t.em,{children:"Usage"})," tab in the side nav."]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:s[1].id,children:s[1].value}),"\n",(0,i.jsx)("br",{}),"\n",(0,i.jsx)(c.default,{}),"\n",(0,i.jsx)(o.P,{type:"info",children:(0,i.jsx)(t.p,{children:"Credits and limits are applied on a per-organization basis, not a per-user or per-project basis."})}),"\n",(0,i.jsx)(t.p,{children:"Usage of our services accrues a cost in dollars (USD) according to the following price schedule:"}),"\n",(0,i.jsx)(h.default,{}),"\n",(0,i.jsx)(t.p,{children:"If you have attached a payment method to your organization, you will be charged for any usage beyond your monthly credit. If you do not have a payment method attached, usage of our services will be disabled if you hit your monthly credit cap until the next month. Billing is tracked on a monthly basis, starting from 12am UTC."}),"\n",(0,i.jsx)(t.p,{children:"Transactions sponsored using the Gas Station are charged based on the gas used and the APT price at previous close-of-day (UTC time). Read more below."}),"\n",(0,i.jsx)(t.h2,{id:s[2].id,children:s[2].value}),"\n",(0,i.jsxs)(t.p,{children:["Unlike the ",(0,i.jsx)(t.strong,{children:"Monthly Credit"}),", which is declared in dollar terms for a full month, ",(0,i.jsx)(t.strong,{children:"System Limits"})," are always either instant values (e.g. disk space usage) or measured over a short (usually rolling) window of time (e.g. CUs per 5 mins). The purpose of System Limits is to protect our infra from greater usage than we can handle (spikes). These aren’t necessarily on the same dimensions that we use for billing (see the price schedule above)."]}),"\n",(0,i.jsx)(u.default,{}),"\n",(0,i.jsx)(t.p,{children:"Organizations are also subject to the following limits for HTTP requests:"}),"\n",(0,i.jsxs)(l.t,{items:["No Payment Method Attached","Payment Method Attached"],children:[(0,i.jsx)(l.t.Tab,{children:(0,i.jsx)(d.default,{appliesTo:"NoSubscription"})}),(0,i.jsx)(l.t.Tab,{children:(0,i.jsx)(d.default,{appliesTo:"HasSubscription"})})]}),"\n",(0,i.jsx)(t.p,{children:"Except for the per-processor limits, these limits apply to the whole organization. For example, all API usage shares the same Compute Units / 5 mins limit."}),"\n",(0,i.jsx)(o.P,{type:"info",children:(0,i.jsx)(t.p,{children:"Organizations are subject to the above default system limits based on their subscription status\n(whether you have a payment method or not). You may have a bump in place for your organization\ncreated by a Geomi admin that increases these."})}),"\n",(0,i.jsx)(t.h2,{id:s[3].id,children:s[3].value}),"\n",(0,i.jsxs)(l.t,{items:["Compute Units","Concurrent Streams","Gas","Indexing"],children:[(0,i.jsxs)(l.t.Tab,{children:[(0,i.jsx)(p,{services:["Node API","Indexer API","Gas Station","No-Code Indexing","Token Management Platform","Keyless Pepper Service"]}),(0,i.jsx)(t.h3,{children:"Summary"}),(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Billing: Usage of our APIs is accrued in terms of Compute Units. Requests cost exponentially more CUs based on how much load they place on our infrastru
1cture."}),"\n",(0,i.jsx)(t.li,{children:"System Limits: There is a limit on CU usage per 5 mins."}),"\n"]}),(0,i.jsx)(t.h3,{children:"Billing"}),(0,i.jsxs)(t.p,{children:["Requests to Geomi APIs are measured in terms of Compute Units (CUs). CUs measure the relative cost of a request on our infrastructure. For example, a given call to"," "," ",(0,i.jsx)("code",{children:"/v1/accounts/0x1"})," (the Node API) might cost 250 CUs while a call to ",(0,i.jsx)("code",{children:"/v1/graphql"})," (the Indexer API) might cost 500 CUs, indicating that the infra cost of the second request is 2x higher than the first. Compared to just rate limiting based on request count, Compute Units allow us to capture that some requests are more resource intensive than others."]}),(0,i.jsx)(t.p,{children:"Some of the above services are just APIs, e.g. the node and indexer APIs. Compute Units are the only way we track utilization for these services. Other services are more than just APIs, such as gas station or no-code indexing and accrue other costs."}),(0,i.jsxs)(t.p,{children:["For example, every request to gas station incurs a cost in terms of CUs to cover the infrastructure cost of the gas station. If through that request the gas station successfully sponsored a transaction, there will be an additional cost based on the gas used for the transaction. See the ",(0,i.jsx)(t.em,{children:"Gas Station"})," tab for more."]}),(0,i.jsxs)(t.p,{children:["Similarly, for no-code indexing, requests to the API we provision for your processor are accounted for with Compute Units. However, there are additional costs associated with indexing that are not captured by Compute Units, for example the cost of the database and processor. Those are accounted for as “Disk Usage” and “Write Throughput”. See the ",(0,i.jsx)(t.em,{children:"Indexing"})," tab for more."]}),(0,i.jsx)(t.h3,{children:"Compute Unit Calculation"}),(0,i.jsxs)(t.p,{children:["The method for calculating the CUs used by a request differs per upstream type (e.g. Node API vs. Indexer API) and endpoint (e.g. ",(0,i.jsx)("code",{children:"/v1/view"})," vs. ",(0,i.jsx)("code",{children:"/v1/accounts"}),"), but as a general rule of thumb, the more complex a request is (gas used, time taken, etc.), the more CUs it will consume. We use a variety of factors to calculate the cost of a request, and our approach is subject to change at any time. Broadly speaking, the behaviour is as described below."]}),(0,i.jsx)(t.h3,{children:"Node API"}),(0,i.jsx)(t.p,{children:"The current approach for this upstream is quite simple."}),(0,i.jsx)("br",{}),(0,i.jsx)("code",{children:"upstream_processing_time * multiplier * exponential_factor"}),(0,i.jsx)(t.p,{children:"In other words, cost is just a function of how long the upstream takes to process the request. In general, node API requests are dominated by I/O time on the database. The more complex a query is, the longer it takes, the higher the cost in CUs."}),(0,i.jsx)(t.p,{children:"Expensive, long running queries have an outsized impact on our infrastructure, so we scale the cost exponentially."}),(0,i.jsx)(t.h3,{children:"Node API (VM Endpoints)"}),(0,i.jsxs)(t.p,{children:["Requests to endpoints that involve execution with the Move VM (e.g."," "," ",(0,i.jsx)("code",{children:"/v1/transactions/simulate"})," or ",(0,i.jsx)("code",{children:"/v1/transactions/view"}),") return the cost of that execution in terms of gas. We use this gas cost and some multiplier to get the final gas cost:"]}),(0,i.jsx)("br",{}),(0,i.jsx)("code",{children:"gas_cost * multiplier"}),(0,i.jsx)(t.h3,{children:"Indexer API (Other Endpoints)"}),(0,i.jsxs)(t.p,{children:["We use the same formula as with the ",(0,i.jsx)("b",{children:"Node API"}),", albeit with different multipliers."]}),(0,i.jsx)(t.h3,{children:"System Limits"}),(0,i.jsxs)(t.p,{children:["The traditional “CUs per 5 minutes” limit has been ",(0,i.jsx)(t.strong,{children:"deprecated"})," and replaced with granular HTTP limits. See the “System Limits” section above for details on the new HTTP limits system, which provides more precise control over different types of requests based on upstream type, Node API operation, or GraphQL table."]})]}),(0,i.jsxs)(l.t.Tab,{children:[(0,i.jsx)(p,{services:["Transaction Stream Service"]}),(0,i.jsx)(t.h3,{children:"Summary"}),(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Billing: Usage is billed in bytes streamed and open-stream minutes when those dimensions are enabled in the price schedule."}),"\n",(0,i.jsx)(t.li,{children:"System Limits: There is a limit on the number of concurrent streams you can have open."}),"\n"]}),(0,i.jsx)(t.h3,{children:"Billing"}),(0,i.jsxs)(t.p,{children:["For streaming services, such as the ",(0,i.jsx)(t.a,{href:"https://aptos.dev/en/build/indexer/txn-stream",children:"Transaction Stream Service"}),", billing and the system limits work on different dimensions."]}),(0,i.jsxs)(t.p,{children:["Streaming charges use the enabled price-schedule dimensions: ",(0,i.jsx)(t.code,{children:"bytes_streamed * price_per_byte"})," and ",(0,i.jsx)(t.code,{children:"open_stream_minutes * price_per_minute"}),". Upstream transaction filtering reduces bytes streamed; closing unused streams reduces open-stream time."]}),(0,i.jsx)(t.h3,{children:"System Limits"}),(0,i.jsxs)(t.p,{children:["Separate from how we track usage for billing purposes, there is a system limit on the number of concurrent streams an organization can have open. This limit is ",(0,i.jsx)(t.strong,{children:"shared across all streaming connection types"}),", including WebSocket connections and gRPC streams. If the limit is 8 for example and you have 8 streams open concurrently at any given time (in any combination of WebSocket and gRPC), you will receive a 429 error if you try to open a new stream. The concurrent stream limit is higher for organizations with a payment method attached."]}),(0,i.jsxs)(t.p,{children:["For frontend keys, you can also configure a ",(0,i.jsx)(t.a,{href:"/docs/api-keys/frontend-keys#per-ip-concurrent-stream-limit",children:"per-IP concurrent stream limit"})," to prevent individual users from consuming too many streams."]})]}),(0,i.jsxs)(l.t.Tab,{children:[(0,i.jsx)(p,{services:["Gas Station","Token Management Platform"]}),(0,i.jsx)(t.h3,{children:"Summary"}),(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Billing: You are charged based on the amount of gas used for a transaction and the APT price at previous close-of-day."}),"\n",(0,i.jsx)(t.li,{children:"Gas cost is only accrued if the transaction executes on chain."}),"\n",(0,i.jsx)(t.li,{children:"Compute Units are consumed for all requests, even if the transaction is rejected."}),"\n"]}),(0,i.jsx)(t.h3,{children:"Billing"}),(0,i.jsxs)(t.p,{children:["Gas billing works a bit differently compared to the other cost dimensions. Cost in dollar terms for Compute Units for example is just a function of ",(0,i.jsx)(t.code,{children:"compute_units * price_per_unit"}),", where the price per unit is a set value for the entirety of the billing cycle. Gas billing cannot be calculated in this way because the price of gas is variable. Instead, we calculate the cost of gas in terms of gas used and the APT price at previous close-of-day."]}),(0,i.jsx)(t.p,{children:"For example, if we were trying to figure out the cost of a Gas Station resource for the 21st, 22nd, and 23rd of March, we would do essentially the following:"}),(0,i.jsx)(t.h3,{children:"System Limits"}),(0,i.jsx)(t.p,{children:"N/A"}),(0,i.jsx)(t.pre,{tabIndex:"0","data-language":"typescript","data-word-wrap":"","data-copy":"",children:(0,i.jsxs)(t.code,{children:[(0,i.jsxs)(t.span,{children:[(0,i.jsx)(t.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"function"}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:" getGasUsed"}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:"("}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#E36209","--shiki-dark":"#FFAB
170"},children:"resourceId"}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:", "}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#E36209","--shiki-dark":"#FFAB70"},children:"dates"}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:")"}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:":"}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" number"}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" {"})]}),"\n",(0,i.jsxs)(t.span,{children:[(0,i.jsx)(t.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"  const"}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" feePayerAddress"}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" ="}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" client."}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"getFeePayerAddress"}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:"(app);"})]}),"\n",(0,i.jsxs)(t.span,{children:[(0,i.jsx)(t.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"  let"}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" totalCostUsd "}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"="}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" 0"}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:";"})]}),"\n",(0,i.jsxs)(t.span,{children:[(0,i.jsx)(t.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"  for"}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" ("}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"const"}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" date"}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" of"}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" dates) {"})]}),"\n",(0,i.jsxs)(t.span,{children:[(0,i.jsx)(t.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"    const"}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" gasUsed"}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" ="}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" client."}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"getGasUsed"}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:"(resourceId, date);"})]}),"\n",(0,i.jsxs)(t.span,{children:[(0,i.jsx)(t.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"    const"}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" previousDate"}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" ="}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" date "}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"-"}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" 1"}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:";"})]}),"\n",(0,i.jsxs)(t.span,{children:[(0,i.jsx)(t.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"    const"}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" gasPrice"}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" ="}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" client."}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"getAptPriceInUsd"}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:"(previousDate);"})]}),"\n",(0,i.jsxs)(t.span,{children:[(0,i.jsx)(t.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:"    totalCostUsd "}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"+="}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" gasUsed "}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"*"}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" gasPrice;"})]}),"\n",(0,i.jsx)(t.span,{children:(0,i.jsx)(t.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:"  }"})}),"\n",(0,i.jsxs)(t.span,{children:[(0,i.jsx)(t.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"  return"}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" totalCostUsd;"})]}),"\n",(0,i.jsx)(t.span,{children:(0,i.jsx)(t.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:"}"})}),"\n",(0,i.jsx)(t.span,{children:" "}),"\n",(0,i.jsxs)(t.span,{children:[(0,i.jsx)(t.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"const"}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" totalCostUsd"}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" ="}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:" getGasUsed"}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:"(resourceId, ["}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"2025-03-21"'}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:", "}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"2025-03-22"'}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:", "}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"2025-03-23"'}),(0,i.jsx)(t.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:"]);"})]})]})}),(0,i.jsx)(t.p,{children:"In other words, we sum up the gas used each day and multiply it by the APT price at the previous close-of-day."}),(0,i.jsx)(t.p,{children:"If a transaction is rejected it does not incur any gas cost (this is not the same as a failed transaction, which is still executed and written to the ledger and therefore incurs a cost)."}),(0,i.jsx)(t.p,{children:"Each call to the gas station also incurs a flat cost in terms of CUs, even if the transaction is rejected."})]}),(0,i.jsxs)(l.t.Tab,{children:[(0,i.jsx)(p,{services:["No-Code Indexing"]}),(0,i.jsx)(t.h3,{children:"Summary"}),(0,i.jsx)(t.p,{children:(0,i.jsx)(t.strong,{children:"Billing"})}),(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"You are charged for the amount of disk space used by your processors."}),"\n",(0,i.jsx)(t.li,{children:"You are charged for the write throughput of your processors."}),"\n",(0,i.jsx)(t.li,{children:"You are charged a flat cost every minute your processor is running (paused processors do not accrue this cost)."}),"\n",(0,i.jsx)(t.li,{children:"Requests to the API created for the processor are accounted for with Compute Units."}),"\n"]}),(0,i.jsx)(t.p,{children:(0,i.jsx)(t.strong,{children:"System Limits"})}),(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"There is a maximum number of processors an organization can create."}),"\n",(0,i.jsx)(t.li,{children:"Processors will be halted if they hit their DB space limit."}),"\n",(0,i.jsx)(t.li,{children:"Indexing will fall behind if a processor hits its write throughput limit."}),"\n"]}),(0,i.jsx)(t.h3,{children:"Billing"}),(0,i.jsx)(t.p,{children:(0,i.jsx)(t.strong,{children:"Disk Usage"})}),(0,i.jsx)(t.p,{children:"You are charged for the amount of disk space used by your processors. This is charged per GiB hour (i.e. each GiB of disk space used for 1 hour costs the amount specified in the price schedule above)."}),(0,i.jsx)(t.p,{children:(0,i.jsx)(t.strong,{children:"Write Throughput"})}),(0,i.jsxs)(t.p,{children:["You are charged for the amount of data written by your processors. This is measured in terms of MiB written by the processor per 5 minutes. Both ",(0,i.jsx)(t.code,{children:"INSERTS"})," and ",(0,i.jsx)(t.code,{children:"UPSERTS"})," count towards this limit, the purpose of this limit is to protect the DB’s CPU, not its disk space."]}),(0,i.jsx)(t.p,{children:(0,i.jsx)(t.strong,{children:"Flat Cost"})}),(0,i.jsx)(t.p,{children:"You are charged a flat cost every minute your processor is running (paused processors do not accrue this cost)."}),(0,i.jsx)(t.h3,{children:"System Limits"}),(0,i.jsx)(t.p,{children:"Because a single processor is composed of multiple pieces of infrastru
1cture, and the load varies based on multiple factors, we use a combination of limits for no-code indexing."}),(0,i.jsx)(t.p,{children:(0,i.jsx)(t.strong,{children:"Number of processors"})}),(0,i.jsx)(t.p,{children:"Each organization is allowed a certain number of processors according to the system limits table above. You cannot create a new processor without first deleting an existing one if you have hit this limit. In-place upgrades do not count against this quota (since there is no new processor created). Hard upgrades count as new processors, and therefore count against this quota."}),(0,i.jsx)(t.p,{children:(0,i.jsx)(t.strong,{children:"DB space"})}),(0,i.jsx)(t.p,{children:"Each processor is bound by a certain disk space cap, e.g. 50 GiB. If your processor hits this limit, it will be paused (just like if you had paused the processor yourself through the UI). Paused processors do not index new events, but the API will continue to serve queries."}),(0,i.jsx)(t.p,{children:"This is a static limit, it is not a sliding window and it does not reset at certain time intervals."}),(0,i.jsx)(t.p,{children:(0,i.jsx)(t.strong,{children:"Write Throughput"})}),(0,i.jsx)(t.p,{children:"To ensure a single processor doesn’t use up too much of the query-handling capacity of the indexing infrastructure, we limit the amount of data written to the database by each processor. If a processor hits a certain limit, it will naturally lag behind the head of the chain."}),(0,i.jsx)(t.p,{children:"This is tracked with a sliding 5-minute window."})]})]})]})},"/docs/admin/billing",{filePath:"src/pages/docs/admin/billing.mdx",pageMap:n.O,frontMatter:{},title:"Billing"},"undefined"==typeof RemoteContent?m:RemoteContent.useTOC)},35999:(e,s,t)=>{"use strict";t.d(s,{O:()=>i});let i=[{data:{docs:{type:"page",title:"Documentation"}}},{name:"docs",route:"/docs",children:[{data:{introduction:{title:"Introduction"},start:{title:"Getting Started"},"api-keys":{title:"API Keys"},"api-reference":{title:"API Reference"}
1,"no-code-indexing":{title:"No-Code Indexing"},"gas-stations":{title:"Gas Stations"},"aptos-mcp":{title:"Aptos MCP"},admin:{title:"Admin"},faq:{title:"FAQ"},identity:{title:"Identity",href:"https://aptos.dev/en/build/guides/aptos-keyless"}}},{name:"admin",route:"/docs/admin",children:[{data:{billing:{title:"Billing"},"resource-management":{title:"Resource Management"}}},{name:"billing",route:"/docs/admin/billing",frontMatter:{sidebarTitle:"Billing"}},{name:"resource-management",route:"/docs/admin/resource-management",frontMatter:{title:"Resource Management"}}]},{name:"api-keys",route:"/docs/api-keys",children:[{data:{"frontend-keys":{title:"Frontend Keys"}}},{name:"frontend-keys",route:"/docs/api-keys/frontend-keys",frontMatter:{sidebarTitle:"Frontend Keys"}}]},{name:"api-keys",route:"/docs/api-keys",frontMatter:{sidebarTitle:"API Keys"}},{name:"api-reference",route:"/docs/api-reference",frontMatter:{title:"API Reference"}},{name:"aptos-mcp",route:"/docs/aptos-mcp",frontMatter:{title:"Aptos MCP"}},{name:"faq",route:"/docs/faq",frontMatter:{sidebarTitle:"Faq"}},{name:"gas-stations",route:"/docs/gas-stations",children:[{data:{shelby:{title:"Shelby"}}},{name:"shelby",route:"/docs/gas-stations/shelby",frontMatter:{sidebarTitle:"Shelby"}}]},{name:"gas-stations",route:"/docs/gas-stations",frontMatter:{sidebarTitle:"Gas Stations"}},{name:"introduction",route:"/docs/introduction",frontMatter:{sidebarTitle:"Introduction"}},{name:"no-code-indexing",route:"/docs/no-code-indexing",frontMatter:{sidebarTitle:"No Code Indexing"}},{name:"start",route:"/docs/start",children:[{data:{}}]},{name:"start",route:"/docs/start",frontMatter:{sidebarTitle:"Start"}}]}]},62459:(e,s,t)=>{"use strict";t.r(s),t.d(s,{default:()=>a});var i=t(23798),r=t(64407);t(21462);var n=t(12131);function a(){return(0,i.jsx)("div",{className:(0,n.AH)({w:"full"}),children:(0,i.jsx)(r.E,{className:(0,n.AH)({height:"[150px]",w:"full",my:"[2px]"})})})}},69016:(e,s,t)=>{"use strict";function i(e){switch(e){case"ComputeUnits":return"Compute Units";case"RequestCount":return"Request Count";case"RequestSize":return"Request Size";case"ResponseSize":return"Response Size";default:return e}}function r(e){return"RequestSize"===e||"ResponseSize"===e}function n(e){let s=["bytes","KiB","MiB","GiB","TiB"],t=0,i=e;for(;i>=1024&&t<s.length-1;)i/=1024,t++;let r=i%1==0?i.toLocaleString():i.toLocaleString(void 0,{maximumFractionDigits:1});return"".concat(r," ").concat(s[t])}function a(e){return n(1024*e*1024)}function o(e){return"AllRequests"===e?"All requests":"UpstreamTypeDefault"===e?"Default per upstream":"NodeOperationIdDefault"===e?"Default per node operation":"GraphqlTableDefault"===e?"Default per GraphQL table":"object"==typeof e&&"UpstreamType"in e?"Upstream: ".concat(e.UpstreamType):"object"==typeof e&&"NodeOperationId"in e?"Node operation: ".concat(e.NodeOperationId):"object"==typeof e&&"GraphqlTable"in e?"GraphQL table: ".concat(e.GraphqlTable):"object"==typeof e&&"DecibelHttpPath"in e?"Decibel HTTP path: ".concat(e.DecibelHttpPath):"Unknown scope"}function l(e){if(e<60)return"".concat(e,"s");if(e<3600){let s=Math.floor(e/60),t=e%60;return t>0?"".concat(s,"m ").concat(t,"s"):"".concat(s,"m")}let s=Math.floor(e/3600),t=Math.floor(e%3600/60),i=e%60,r="".concat(s,"h");return t>0&&(r+=" ".concat(t,"m")),i>0&&(r+=" ".concat(i,"s")),r}function c(e){var s;let{scopeType:t,scopeValue:i}="AllRequests"===(s=e.scope)?{scopeType:"AllRequests",scopeValue:null}:"UpstreamTypeDefault"===s?{scopeType:"UpstreamTypeDefault",scopeValue:null}:"NodeOperationIdDefault"===s?{scopeType:"NodeOperationIdDefault",scopeValue:null}:"GraphqlTableDefault"===s?{scopeType:"GraphqlTableDefault",scopeValue:null}:"object"==typeof s&&"UpstreamType"in s?{scopeType:"UpstreamType",scopeValue:s.UpstreamType}:"object"==typeof s&&"NodeOperationId"in s?{scopeType:"NodeOperationId",scopeValue:s.NodeOperationId}:"object"==typeof s&&"GraphqlTable"in s?{scopeType:"GraphqlTable",scopeValue:s.GraphqlTable}:"object"==typeof s&&"DecibelHttpPath"in s?{scopeType:"DecibelHttpPath",scopeValue:s.DecibelHttpPath}:{scopeType:"AllRequests",scopeValue:null};return"".concat(e.appliesTo,"-").concat(e.limitUnit,"-").concat(e.windowSeconds,"-").concat(t).concat(i?"-".concat(i):"")}function d(e,s){switch(e){case"AllRequests":default:return"AllRequests";case"UpstreamTypeDefault":return"UpstreamTypeDefault";case"UpstreamType":return{UpstreamType:s};case"NodeOperationIdDefault":return"NodeOperationIdDefault";case"NodeOperationId":if(!s)throw Error("Scope value is required for NodeOperationId scope type");return{NodeOperationId:s};case"GraphqlTableDefault":return"GraphqlTableDefault";case"GraphqlTable":if(!s)throw Error("Scope value is required for GraphqlTable scope t
1ype");return{GraphqlTable:s};case"DecibelHttpPath":if(!s)throw Error("Scope value is required for DecibelHttpPath scope type");return{DecibelHttpPath:s}}}t.d(s,{LU:()=>c,Pk:()=>o,UK:()=>l,_C:()=>a,gD:()=>r,j9:()=>d,z3:()=>n,zO:()=>i})},71268:(e,s,t)=>{"use strict";t.r(s),t.d(s,{default:()=>a});var i=t(23798),r=t(64927);t(21462);var n=t(75828);function a(e){let{error:s,fallbackMessage:t,heading:a="Error loading data"}=e;return(0,i.jsx)(r.F,{heading:a,variant:"error",children:(0,n.g)(s,t)})}},73792:(e,s,t)=>{"use strict";t.r(s),t.d(s,{default:()=>a});var i=t(23798),r=t(3415);function n(e,s){let{currency:t="USD"}=null!=s?s:{};return new Intl.NumberFormat(void 0,{style:"currency",currency:t,minimumFractionDigits:2,maximumFractionDigits:2}).format(e/100)}function a(){let{data:e,isLoading:s,error:t}=(0,r.n)();if(t)return(0,i.jsxs)("div",{children:["Error loading billing configs: ",t.message]});let a="$...",o="$...";if(!s&&e){let s=e.find(e=>"NoSubscription"===e.appliesTo),t=e.find(e=>"HasSubscription"===e.appliesTo);if(void 0===s||void 0===t)return(0,i.jsx)("div",{children:"Billing configs are missing!"});a=n(s.freeCreditCents),o=n(t.freeCreditCents)}return(0,i.jsxs)("p",{children:["All organizations are automatically granted a ",a," credit per month. If this credit is insufficient for your needs, you can add a payment method and we will give you a higher monthly credit of ",o," per month free of charge. We will charge your payment method for any usage above this credit."]})}},78475:(e,s,t)=>{"use strict";t.r(s),t.d(s,{default:()=>m});var i=t(23798),r=t(71602),n=t(41008),a=t(59354),o=t(68006),l=t(12131),c=t(85096),d=t(69016),h=t(3415),u=t(71268),p=t(62459);function m(){let{data:e,isLoading:s,error:t}=(0,h.n)();if(t)return(0,i.jsx)(u.default,{error:t,fallbackMessage:"Unknown error loading system limits",heading:"Error loading system limits"});if(s)return(0,i.jsx)(p.default,{});if(!e)return(0,i.jsx)(u.default,{error:t,fallbackMessage:"Unknown error loading system limits, data missing.",heading:"Error loading system limits"});let o=e.find(e=>"NoSubscription"===e.appliesTo),l=e.find(e=>"HasSubscription"===e.appliesTo);return void 0===o||void 0===l?(0,i.jsx)(u.default,{error:t,fallbackMessage:"Unknown error loading system limits, billing configs missing.",heading:"Error loading system limits"}):(0,i.jsx)("div",{className:(0,c.t$)({gap:"24"}),children:(0,i.jsx)("div",{children:(0,i.jsxs)(r.X,{children:[(0,i.jsx)("br",{}),(0,i.jsx)("thead",{children:(0,i.jsxs)(n.Tr,{children:[(0,i.jsx)(a.Th,{children:"Payment Method Attached"}),(0,i.jsx)(a.Th,{children:"Concurrent Streams"}),(0,i.jsx)(a.Th,{children:"Number of processors"}),(0,i.jsx)(a.Th,{children:"DB size per processor"}),(0,i.jsx)(a.Th,{children:"Writes per processor per 5 mins"})]})}),(0,i.jsx)("tbody",{children:[o,l].map(e=>(0,i.jsx)(g,{config:e},e.appliesTo))})]})})})}function g(e){let{config:s}=e;return(0,i.jsxs)(n.Tr,{children:[(0,i.jsx)(o.Td,{children:"NoSubscription"===s.appliesTo?"No":"Yes"}),(0,i.jsx)(o.Td,{className:(0,l.AH)({textStyle:"mono.md"}),children:s.concurrentStreams.toLocaleString()}),(0,i.jsx)(o.Td,{className:(0,l.AH)({textStyle:"mono.md"}),children:s.shepherdNumberOfProcessors.toLocaleString()}),(0,i.jsx)(o.Td,{className:(0,l.AH)({textStyle:"mono.md"}),children:(0,d._C)(s.shepherdDbSizeMebibytesPerProcessor)}),(0,i.jsx)(o.Td,{className:(0,l.AH)({textStyle:"mono.md"}),children:(0,d._C)(s.shepherdWriteMebibytesPerProcessor)})]})}},85221:(e,s,t)=>{"use strict";t.r(s),t.d(s,{default:()=>x});var i=t(23798),r=t(64927),n=t(71602),a=t(41008),o=t(59354),l=t(68006),c=t(21462),d=t(12131),h=t(85096),u=t(69016),p=t(21188),m=t(71268),g=t(62459);function x(e){let{appliesTo:s}=e,{data:t,isLoading:l,error:d}=function(){let{data:e=[],isLoading:s,error:t}=p.i.admin.getDefaultHttpLimitRules.useQuery({body:{_dummy:""}});return{data:(0,c.useMemo)(()=>{let s={};for(let t of e){let e=(0,u.LU)({appliesTo:t.appliesTo,scope:(0,u.j9)(t.scopeType,t.scopeValue),limitUnit:t.limitUnit,windowSeconds:t.windowSeconds});(!s[e]||new Date(t.createdAt).getTime()>new Date(s[e].createdAt).getTime())&&(s[e]=t)}return s},[e]),isLoading:s,error:t}}(),x=(0,c.useMemo)(()=>{let e=[];return Object.values(t).forEach(t=>{if(t.appliesTo===s){let s=t.limitUnit,i=(0,u.gD)(s)?(0,u.z3)(t.limit):t.limit.toLocaleStr
1ing(),r={scope:(0,u.Pk)((0,u.j9)(t.scopeType,t.scopeValue)),limit:i,unit:(0,u.zO)(s),window:(0,u.UK)(t.windowSeconds),rawRule:t};e.push(r)}}),e.sort((e,s)=>e.scope.localeCompare(s.scope))},[t,s]);return d?(0,i.jsx)(m.default,{error:d,fallbackMessage:"Unknown error loading HTTP limit rules",heading:"Error loading HTTP limit rules"}):l?(0,i.jsx)(g.default,{}):0===x.length?(0,i.jsx)(r.F,{heading:"No HTTP limit rules found",variant:"default",children:"No default HTTP limit rules are configured for this account type."}):(0,i.jsx)("div",{className:(0,h.t$)({gap:"24"}),children:(0,i.jsxs)(n.X,{children:[(0,i.jsx)("thead",{children:(0,i.jsxs)(a.Tr,{children:[(0,i.jsx)(o.Th,{children:"Scope"}),(0,i.jsx)(o.Th,{children:"Limit"}),(0,i.jsx)(o.Th,{children:"Unit"}),(0,i.jsx)(o.Th,{children:"Window"})]})}),(0,i.jsx)("tbody",{children:x.map((e,s)=>(0,i.jsx)(f,{rule:e},s))})]})})}function f(e){let{rule:s}=e;return(0,i.jsxs)(a.Tr,{children:[(0,i.jsx)(l.Td,{children:s.scope}),(0,i.jsx)(l.Td,{className:(0,d.AH)({textStyle:"mono.md"}),children:s.limit}),(0,i.jsx)(l.Td,{children:s.unit}),(0,i.jsxs)(l.Td,{className:(0,d.AH)({textStyle:"mono.md"}),children:["per ",s.window]})]})}},88085:(e,s,t)=>{(window.__NEXT_P=window.__NEXT_P||[]).push(["/docs/admin/billing",function(){return t(27902)}])}},e=>{e.O(0,[3611,1074,636,6593,8792],()=>e(e.s=88085)),_N_E=e.O()}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.