[{"data":1,"prerenderedAt":723},["ShallowReactive",2],{"navigation_docs":3,"-getting-started-authentication":134,"-getting-started-authentication-surround":718},[4,36,61,87,113],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":35},"Getting Started","i-lucide-rocket","\u002Fgetting-started","1.getting-started",[10,15,20,25,30],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-sparkles",{"title":16,"path":17,"stem":18,"icon":19},"Quickstart","\u002Fgetting-started\u002Fquickstart","1.getting-started\u002F2.quickstart","i-lucide-zap",{"title":21,"path":22,"stem":23,"icon":24},"Authentication","\u002Fgetting-started\u002Fauthentication","1.getting-started\u002F3.authentication","i-lucide-key",{"title":26,"path":27,"stem":28,"icon":29},"Rate Limits & Quotas","\u002Fgetting-started\u002Frate-limits-quotas","1.getting-started\u002F4.rate-limits-quotas","i-lucide-gauge",{"title":31,"path":32,"stem":33,"icon":34},"SDKs & Tools","\u002Fgetting-started\u002Fsdks-tools","1.getting-started\u002F5.sdks-tools","i-lucide-box",false,{"title":37,"icon":38,"path":39,"stem":40,"children":41,"page":35},"Cloud Infrastructure","i-lucide-server","\u002Finfrastructure","2.infrastructure",[42,46,51,56],{"title":43,"path":44,"stem":45,"icon":38},"Cloud VPS Compute","\u002Finfrastructure\u002Fvps-compute","2.infrastructure\u002F1.vps-compute",{"title":47,"path":48,"stem":49,"icon":50},"Managed Databases","\u002Finfrastructure\u002Fmanaged-databases","2.infrastructure\u002F2.managed-databases","i-lucide-database",{"title":52,"path":53,"stem":54,"icon":55},"Networking & Cloud Firewall","\u002Finfrastructure\u002Fnetworking-firewall","2.infrastructure\u002F3.networking-firewall","i-lucide-shield",{"title":57,"path":58,"stem":59,"icon":60},"Block Storage & Volumes","\u002Finfrastructure\u002Fblock-storage","2.infrastructure\u002F4.block-storage","i-lucide-hard-drive",{"title":62,"icon":63,"path":64,"stem":65,"children":66,"page":35},"Services & APIs","i-lucide-cpu","\u002Fservices-api","3.services-api",[67,72,77,82],{"title":68,"path":69,"stem":70,"icon":71},"REST API Reference","\u002Fservices-api\u002Fapi-reference","3.services-api\u002F1.api-reference","i-lucide-terminal",{"title":73,"path":74,"stem":75,"icon":76},"URL Shortener API","\u002Fservices-api\u002Furl-shortener","3.services-api\u002F2.url-shortener","i-lucide-link",{"title":78,"path":79,"stem":80,"icon":81},"Temp Mail API","\u002Fservices-api\u002Ftemp-mail","3.services-api\u002F3.temp-mail","i-lucide-mail",{"title":83,"path":84,"stem":85,"icon":86},"Developer Utility APIs","\u002Fservices-api\u002Fdeveloper-utilities","3.services-api\u002F4.developer-utilities","i-lucide-wrench",{"title":88,"icon":89,"path":90,"stem":91,"children":92,"page":35},"Guides & Tutorials","i-lucide-book-open","\u002Fguides","4.guides",[93,98,103,108],{"title":94,"path":95,"stem":96,"icon":97},"Deploy a Full-Stack App with VPS & PostgreSQL","\u002Fguides\u002Fdeploy-fullstack-app","4.guides\u002F1.deploy-fullstack-app","i-lucide-layers",{"title":99,"path":100,"stem":101,"icon":102},"Automated Backups & Webhook Alerts","\u002Fguides\u002Fautomated-backups-webhook","4.guides\u002F2.automated-backups-webhook","i-lucide-bell",{"title":104,"path":105,"stem":106,"icon":107},"E2E Auth Testing with Temp Mail in CI\u002FCD","\u002Fguides\u002Fci-cd-temp-mail-testing","4.guides\u002F3.ci-cd-temp-mail-testing","i-lucide-check-circle-2",{"title":109,"path":110,"stem":111,"icon":112},"Custom Domain & SSL Configuration","\u002Fguides\u002Fcustom-domain-setup","4.guides\u002F4.custom-domain-setup","i-lucide-globe",{"title":114,"icon":115,"path":116,"stem":117,"children":118,"page":35},"Account & Billing","i-lucide-credit-card","\u002Faccount-billing","5.account-billing",[119,124,129],{"title":120,"path":121,"stem":122,"icon":123},"Pricing & Hourly Billing","\u002Faccount-billing\u002Fpricing-billing","5.account-billing\u002F1.pricing-billing","i-lucide-receipt",{"title":125,"path":126,"stem":127,"icon":128},"Team Management & RBAC","\u002Faccount-billing\u002Fteam-rbac","5.account-billing\u002F2.team-rbac","i-lucide-users",{"title":130,"path":131,"stem":132,"icon":133},"Resource Quotas & Service Limits","\u002Faccount-billing\u002Fservice-limits","5.account-billing\u002F3.service-limits","i-lucide-sliders",{"id":135,"title":21,"body":136,"description":709,"extension":710,"links":711,"meta":712,"navigation":713,"path":22,"seo":714,"stem":23,"__hash__":717},"docs\u002F1.getting-started\u002F3.authentication.md",{"type":137,"value":138,"toc":702},"minimark",[139,143,157,160,165,168,204,255,257,261,264,333,335,339,342,426,428,432,438,445,681,683,687,698],[140,141,21],"h1",{"id":142},"authentication",[144,145,146,147,151,152,156],"p",{},"All requests to the ",[148,149,150],"strong",{},"1st Services REST API"," must be authenticated using an API key passed via the standard HTTP ",[153,154,155],"code",{},"Authorization"," header.",[158,159],"hr",{},[161,162,164],"h2",{"id":163},"bearer-token-authentication","Bearer Token Authentication",[144,166,167],{},"Include your API key as a Bearer token with every HTTP request:",[169,170,176],"pre",{"className":171,"code":172,"filename":173,"language":174,"meta":175,"style":175},"language-http shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","GET \u002Fv1\u002Fvps\u002Finstances HTTP\u002F1.1\nHost: api.1st-services.com\nAuthorization: Bearer fst_live_9a8b7c6d5e4f3a2b1c0d\nContent-Type: application\u002Fjson\n","HTTP Request","http","",[153,177,178,186,192,198],{"__ignoreMap":175},[179,180,183],"span",{"class":181,"line":182},"line",1,[179,184,185],{},"GET \u002Fv1\u002Fvps\u002Finstances HTTP\u002F1.1\n",[179,187,189],{"class":181,"line":188},2,[179,190,191],{},"Host: api.1st-services.com\n",[179,193,195],{"class":181,"line":194},3,[179,196,197],{},"Authorization: Bearer fst_live_9a8b7c6d5e4f3a2b1c0d\n",[179,199,201],{"class":181,"line":200},4,[179,202,203],{},"Content-Type: application\u002Fjson\n",[169,205,210],{"className":206,"code":207,"filename":208,"language":209,"meta":175,"style":175},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","curl -X GET \"https:\u002F\u002Fapi.1st-services.com\u002Fv1\u002Fvps\u002Finstances\" \\\n  -H \"Authorization: Bearer $FIRST_API_KEY\"\n","cURL","bash",[153,211,212,239],{"__ignoreMap":175},[179,213,214,218,222,225,229,232,235],{"class":181,"line":182},[179,215,217],{"class":216},"sBMFI","curl",[179,219,221],{"class":220},"sfazB"," -X",[179,223,224],{"class":220}," GET",[179,226,228],{"class":227},"sMK4o"," \"",[179,230,231],{"class":220},"https:\u002F\u002Fapi.1st-services.com\u002Fv1\u002Fvps\u002Finstances",[179,233,234],{"class":227},"\"",[179,236,238],{"class":237},"sTEyZ"," \\\n",[179,240,241,244,246,249,252],{"class":181,"line":188},[179,242,243],{"class":220},"  -H",[179,245,228],{"class":227},[179,247,248],{"class":220},"Authorization: Bearer ",[179,250,251],{"class":237},"$FIRST_API_KEY",[179,253,254],{"class":227},"\"\n",[158,256],{},[161,258,260],{"id":259},"token-types-prefixes","Token Types & Prefixes",[144,262,263],{},"1st Services issues keys with explicit environment prefixes to prevent accidental exposure of production credentials:",[265,266,267,284],"table",{},[268,269,270],"thead",{},[271,272,273,278,281],"tr",{},[274,275,277],"th",{"align":276},"left","Key Type",[274,279,280],{"align":276},"Prefix",[274,282,283],{"align":276},"Description",[285,286,287,303,318],"tbody",{},[271,288,289,295,300],{},[290,291,292],"td",{"align":276},[148,293,294],{},"Live \u002F Production",[290,296,297],{"align":276},[153,298,299],{},"fst_live_",[290,301,302],{"align":276},"Accesses production VPS, active databases, live short links, and real mailboxes.",[271,304,305,310,315],{},[290,306,307],{"align":276},[148,308,309],{},"Test \u002F Sandbox",[290,311,312],{"align":276},[153,313,314],{},"fst_test_",[290,316,317],{"align":276},"Operates against simulated staging resources without incurring billing charges.",[271,319,320,325,330],{},[290,321,322],{"align":276},[148,323,324],{},"Restricted Token",[290,326,327],{"align":276},[153,328,329],{},"fst_res_",[290,331,332],{"align":276},"Scoped to a specific microservice (e.g. Temp Mail only or URL Shortener only).",[158,334],{},[161,336,338],{"id":337},"granular-api-scopes","Granular API Scopes",[144,340,341],{},"When creating an API key, you can restrict its permissions to only the capabilities required by your application:",[265,343,344,354],{},[268,345,346],{},[271,347,348,351],{},[274,349,350],{"align":276},"Scope",[274,352,353],{"align":276},"Permission Description",[285,355,356,366,376,386,396,406,416],{},[271,357,358,363],{},[290,359,360],{"align":276},[153,361,362],{},"vps:read",[290,364,365],{"align":276},"List instances, view specs, monitor CPU\u002FRAM metrics",[271,367,368,373],{},[290,369,370],{"align":276},[153,371,372],{},"vps:write",[290,374,375],{"align":276},"Create, reboot, rebuild, power-off, resize, delete VPS",[271,377,378,383],{},[290,379,380],{"align":276},[153,381,382],{},"database:read",[290,384,385],{"align":276},"Inspect database connection strings, cluster status",[271,387,388,393],{},[290,389,390],{"align":276},[153,391,392],{},"database:write",[290,394,395],{"align":276},"Provision databases, trigger backups, configure replicas",[271,397,398,403],{},[290,399,400],{"align":276},[153,401,402],{},"shortener:*",[290,404,405],{"align":276},"Create, edit, delete, and view analytics for short links",[271,407,408,413],{},[290,409,410],{"align":276},[153,411,412],{},"tempmail:*",[290,414,415],{"align":276},"Generate disposable mailboxes, fetch received messages",[271,417,418,423],{},[290,419,420],{"align":276},[153,421,422],{},"billing:read",[290,424,425],{"align":276},"View invoices, usage metrics, and balance",[158,427],{},[161,429,431],{"id":430},"webhook-signature-verification","Webhook Signature Verification",[144,433,434,435,156],{},"When receiving webhooks from 1st Services (such as incoming Temp Mail alerts or Database Backup notifications), verify the authenticity of the payload using the ",[153,436,437],{},"X-1st-Signature",[144,439,440,441,444],{},"Signatures use ",[148,442,443],{},"HMAC-SHA256"," with your webhook secret:",[169,446,451],{"className":447,"code":448,"filename":449,"language":450,"meta":175,"style":175},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import crypto from 'node:crypto'\n\nexport function verifyWebhookSignature(payload: string, signatureHeader: string, secret: string): boolean {\n  const expectedSignature = crypto\n    .createHmac('sha256', secret)\n    .update(payload)\n    .digest('hex')\n  \n  return crypto.timingSafeEqual(\n    Buffer.from(signatureHeader),\n    Buffer.from(expectedSignature)\n  )\n}\n","TypeScript \u002F Node.js","ts",[153,452,453,474,480,534,548,575,589,608,614,632,653,669,675],{"__ignoreMap":175},[179,454,455,459,462,465,468,471],{"class":181,"line":182},[179,456,458],{"class":457},"s7zQu","import",[179,460,461],{"class":237}," crypto ",[179,463,464],{"class":457},"from",[179,466,467],{"class":227}," '",[179,469,470],{"class":220},"node:crypto",[179,472,473],{"class":227},"'\n",[179,475,476],{"class":181,"line":188},[179,477,479],{"emptyLinePlaceholder":478},true,"\n",[179,481,482,485,489,493,496,500,503,506,509,512,514,516,518,521,523,525,528,531],{"class":181,"line":194},[179,483,484],{"class":457},"export",[179,486,488],{"class":487},"spNyl"," function",[179,490,492],{"class":491},"s2Zo4"," verifyWebhookSignature",[179,494,495],{"class":227},"(",[179,497,499],{"class":498},"sHdIc","payload",[179,501,502],{"class":227},":",[179,504,505],{"class":216}," string",[179,507,508],{"class":227},",",[179,510,511],{"class":498}," signatureHeader",[179,513,502],{"class":227},[179,515,505],{"class":216},[179,517,508],{"class":227},[179,519,520],{"class":498}," secret",[179,522,502],{"class":227},[179,524,505],{"class":216},[179,526,527],{"class":227},"):",[179,529,530],{"class":216}," boolean",[179,532,533],{"class":227}," {\n",[179,535,536,539,542,545],{"class":181,"line":200},[179,537,538],{"class":487},"  const",[179,540,541],{"class":237}," expectedSignature",[179,543,544],{"class":227}," =",[179,546,547],{"class":237}," crypto\n",[179,549,551,554,557,560,563,566,568,570,572],{"class":181,"line":550},5,[179,552,553],{"class":227},"    .",[179,555,556],{"class":491},"createHmac",[179,558,495],{"class":559},"swJcz",[179,561,562],{"class":227},"'",[179,564,565],{"class":220},"sha256",[179,567,562],{"class":227},[179,569,508],{"class":227},[179,571,520],{"class":237},[179,573,574],{"class":559},")\n",[179,576,578,580,583,585,587],{"class":181,"line":577},6,[179,579,553],{"class":227},[179,581,582],{"class":491},"update",[179,584,495],{"class":559},[179,586,499],{"class":237},[179,588,574],{"class":559},[179,590,592,594,597,599,601,604,606],{"class":181,"line":591},7,[179,593,553],{"class":227},[179,595,596],{"class":491},"digest",[179,598,495],{"class":559},[179,600,562],{"class":227},[179,602,603],{"class":220},"hex",[179,605,562],{"class":227},[179,607,574],{"class":559},[179,609,611],{"class":181,"line":610},8,[179,612,613],{"class":559},"  \n",[179,615,617,620,623,626,629],{"class":181,"line":616},9,[179,618,619],{"class":457},"  return",[179,621,622],{"class":237}," crypto",[179,624,625],{"class":227},".",[179,627,628],{"class":491},"timingSafeEqual",[179,630,631],{"class":559},"(\n",[179,633,635,638,640,642,644,647,650],{"class":181,"line":634},10,[179,636,637],{"class":237},"    Buffer",[179,639,625],{"class":227},[179,641,464],{"class":491},[179,643,495],{"class":559},[179,645,646],{"class":237},"signatureHeader",[179,648,649],{"class":559},")",[179,651,652],{"class":227},",\n",[179,654,656,658,660,662,664,667],{"class":181,"line":655},11,[179,657,637],{"class":237},[179,659,625],{"class":227},[179,661,464],{"class":491},[179,663,495],{"class":559},[179,665,666],{"class":237},"expectedSignature",[179,668,574],{"class":559},[179,670,672],{"class":181,"line":671},12,[179,673,674],{"class":559},"  )\n",[179,676,678],{"class":181,"line":677},13,[179,679,680],{"class":227},"}\n",[158,682],{},[161,684,686],{"id":685},"security-best-practices","Security Best Practices",[688,689,693,694,697],"u-alert",{"color":690,"icon":691,"title":692},"warning","i-lucide-shield-alert","Protect Your Production API Keys","Never commit your API keys to version control (Git repositories). Always store keys in environment variables (",[153,695,696],{},".env",") or a secrets manager (such as AWS Secrets Manager, Vault, or 1st Cloud Secrets).",[699,700,701],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":175,"searchDepth":188,"depth":188,"links":703},[704,705,706,707,708],{"id":163,"depth":188,"text":164},{"id":259,"depth":188,"text":260},{"id":337,"depth":188,"text":338},{"id":430,"depth":188,"text":431},{"id":685,"depth":188,"text":686},"Learn how to authenticate API requests and manage access tokens securely on 1st Services.","md",null,{},{"icon":24},{"title":715,"description":716},"Authentication & API Keys - 1st Services","Secure your API requests using Bearer tokens, token scopes, and webhook signature verification.","0h8BvohpBb1yckOq1wCmG4cAOcEmWZX0pbHY14-BXWI",[719,721],{"title":16,"path":17,"stem":18,"description":720,"icon":19,"children":-1},"Get started with 1st Services and deploy your first cloud resource in 5 minutes.",{"title":26,"path":27,"stem":28,"description":722,"icon":29,"children":-1},"Understand rate limits, throttling behaviors, and response headers across the 1st Services API.",1787579790495]