Connect your Oracle Cloud tenancy to nOps so nOps can read your FOCUS cost reports. You run one Oracle Resource Manager stack and paste a connection code back into nOps.
A tenancy administrator: a member of the Administrators group in your Oracle Cloud tenancy. The stack creates a user, a group, and a policy in the root compartment, and only a tenancy administrator can do that.The nOps steps need an nOps admin. One person can do both parts, or two people can work through the same wizard.
What does nOps get access to?
Only your Oracle cost and usage reports. Oracle stores these reports in a bucket that Oracle owns, not in your tenancy. The policy the stack creates lets one nOps user read objects in that bucket, and nothing else.nOps can’t see, create, change, or delete any resource in your tenancy. See Permissions & Resources for the full list.
Does nOps ever see a password or private key from my tenancy?
No. nOps creates the key pair. It keeps the private key in an encrypted secret store and only gives you the public key. The user the stack creates has no console password, so it can only use that API key.The connection code you paste back holds no secret. It only holds your tenancy OCID, the user OCID, the key fingerprint, and your home region.
Which region do I deploy the stack in?
Any region works. The stack always creates the user, group, and policy in your home region, because Oracle keeps identity resources and cost reports there. The stack record itself stays in the region and compartment you pick.
How long until I see my Oracle costs in nOps?
Oracle writes a new FOCUS report about every 6 hours. A report can be up to 24 hours late. After verification, nOps loads the reports Oracle has kept, which is up to the last 12 months, and then checks for new reports every day.If your tenancy is new, the first report can take up to a day to appear.
My tenancy is non-metered. Can I connect it?
Oracle does not produce cost reports for non-metered tenancies, so nOps has no cost data to read. Setup still passes, but nOps will keep reporting that no reports were found. Contact your Oracle account team or nOps support if you’re not sure which type you have.
Do you support government or other Oracle realms?
Not yet. nOps supports the commercial realm only: tenancy OCIDs that start with ocid1.tenancy.oc1... The stack refuses any other tenancy.
Can I connect more than one tenancy?
Yes. Add one integration per tenancy, and run the stack once in each tenancy with that integration’s public key. Each integration has its own key. nOps won’t let you connect the same tenancy twice.
We use Oracle Organizations. Which tenancy do I connect?
Connect the parent tenancy only. Oracle writes the cost reports for the whole organization in the parent tenancy, and they include every child tenancy. A child tenancy shows little or none of its own spend, and connecting both counts the child’s spend twice.If you connect a child tenancy, verification still passes, but nOps warns you and names the parent.
nOps reads the FOCUS cost reports that Oracle Cloud generates for your tenancy. FOCUS is an open standard format for cost data, so your Oracle costs line up with your other clouds in nOps.Setup has two steps in the nOps wizard:
Deploy — Name your integration, generate and copy your nOps public key, and run the nOps stack in Oracle Cloud
Connect — Paste the connection code from the stack, and nOps verifies access
Setup takes about 10 minutes. You need:
An nOps admin account
A tenancy administrator in Oracle Cloud (a member of the Administrators group)
If you use Oracle Organizations, run the setup in the parent tenancy. Its cost reports cover every child tenancy.
Enter a name that helps you find this integration later (for example, “Production OCI tenancy”), then click Generate key.nOps creates the integration and a key pair for it. You can leave the wizard and come back later: the integration shows Action Required until verification passes.
The nOps stack is an Oracle Resource Manager stack. Its source is public: nops-io/terraform-oci-nops-integration. It has two fields: your nOps public key, and an optional email for the nOps user.
1
Copy Your nOps Public Key
On the Deploy step, click the copy button next to the public key. You paste it into Oracle Cloud in a moment.The key belongs to this integration only. If you start a second integration, it gets a different key.
2
Click Deploy to Oracle Cloud
Click Deploy to Oracle Cloud. Oracle Cloud opens in a new tab, on the Create stack page, with the nOps stack already loaded. Keep the nOps tab open.Sign in as a tenancy administrator if Oracle asks you to.
3
Review the Stack Information
Oracle shows the stack’s name and the compartment it will be saved in. You can keep the defaults. Click Next.
4
Paste the Public Key
In the nOps public key field, paste the key you copied. Leave everything else as it is. Click Next.Oracle requires an email on every user. Leave Email for the nOps user blank to use yours, or enter a team mailbox. Oracle may send it a welcome message; the nOps user still can’t sign in to the Console.
5
Create and Apply
On the Review page, select Run apply, then click Create. Resource Manager starts an apply job. It usually takes a minute or two.
6
Copy the Connection Code
When the job succeeds, open the job’s Outputs and copy the value of nops_connection_code. It’s one long line of letters and numbers.
Prefer to read the code first? The stack is plain Terraform. Open nops-io/terraform-oci-nops-integration to see every resource it creates before you click Deploy to Oracle Cloud. The Deploy button always uses a pinned, tagged release, so the code you read is the code that runs.
Go back to the nOps tab. On the Connect step, paste the connection code.
2
Click Verify
Click Verify. nOps saves the code and then checks, from its own servers, that it can reach your reports:
API key signs in — Oracle accepts the key the stack added (GetNamespace)
Can list cost reports — nOps can list your FOCUS cost reports (ListObjects)
Can read a cost report — nOps can open a report file (HeadObject)
Cost reports found — how many reports Oracle has written so far. This one is for information only: zero reports still passes
nOps also checks whether your tenancy is a child tenancy in an Oracle organization (ListOrganizations). That check never fails verification; it only adds a warning.
3
Click Done
When the checks pass, nOps shows Oracle Cloud Verified and the button changes to Done. Read any note on the screen (for example, that Oracle hasn’t written reports yet), then click Done. Your integration is now Active.If a check fails, nOps shows Required Access Not Detected with the fix for each failed check. See Troubleshooting.
New API keys and policies can take a few minutes to take effect in Oracle Cloud. nOps retries a few times on its own before it reports a failed check. If a check still fails, wait a few minutes and click Verify again.
If you need to stop partway, click Finish later. The integration shows Action Required, and nOps doesn’t read any data from it.nOps saves the connection code when you click Verify, even if a check fails. To pick up where you left off, open the integration from Settings > Cloud Provider Integrations. The wizard reopens at Connect if you already saved a code, and shows it as dots, so you only need to click Verify again. It opens at Deploy if you didn’t save one. Your public key stays the same, so you don’t need to run the stack again.You can also go back to the Deploy step from Connect at any time to copy the key again.
The code must be copied whole, from the nops_connection_code output of a successful apply job. Check that:
You copied the full value, with no spaces or line breaks added
You copied the output of the latest successful apply job for this stack
nOps says the code was made with a different key
The stack was run with a public key from a different nOps integration, or from an earlier attempt that you deleted. Each integration has its own key.In Oracle Cloud, go to Developer Services > Resource Manager > Stacks and open the nOps stack. Click Edit, paste the public key shown in this integration’s Deploy step, save, and run Apply again. Then copy the new connection code.
nOps says this tenancy is already connected
Another nOps integration in your organization already uses this tenancy. Use that integration, or delete it first if you want to start over.
The "API key signs in" check fails
Oracle didn’t accept the key. Most often the key is still new: wait a few minutes and click Verify again.If it keeps failing, check the user the stack created:
In Oracle Cloud, go to Identity & Security > Domains, open the Default domain, and select Users. (Older tenancies without identity domains: Identity & Security > Users.)
Open the nOps user and select API keys.
Confirm there is a key whose fingerprint matches the one shown in nOps.
If the key is missing, run Apply on the nOps stack again with the public key from this integration’s Deploy step.
The "Can list cost reports" check fails
nOps signed in but Oracle refused to list your reports. This means the policy is missing or hasn’t taken effect yet. Oracle can take a few minutes to apply a new policy, so wait and click Verify again.A new API key can also cause this: Oracle accepts it for sign-in a few minutes before it accepts it for cost reports. nOps then says the key isn’t activated for cost reports yet.New tenancy? Until Oracle writes a tenancy’s first cost report, the report bucket doesn’t exist, and Oracle answers exactly as it does when the policy is missing. If your tenancy was created in the last day, click Verify again tomorrow.If it keeps failing, open Identity & Security > Policies, select the root compartment, and open the nOps policy (nops-cost-reports-policy-<suffix>). It must contain both of these statements, with your nOps group’s name (nops-cost-reports-reader-<suffix>, shown in the stack’s nops_group_name output) in the second one:
define tenancy usage-report as ocid1.tenancy.oc1..aaaaaaaaned4fkpkisbwjlr56u7cj63lf3wffbilvqknstgtvzub7vhqkggqendorse group <nops group> to read objects in tenancy usage-report
The policy must be in the root compartment. Oracle only accepts these statements there. If the policy was changed or removed, run Apply on the nOps stack again to restore it.
The "Can read a cost report" check fails
nOps can list your reports but Oracle refused to open one. This happens when the policy’s endorse statement was changed from read objects to inspect objects, which allows listing only. Run Apply on the nOps stack again to restore the policy, then click Verify again.
Verification passes, but no reports were found
This is normal for a new tenancy. Oracle writes a FOCUS report about every 6 hours, and the first one can take up to a day. nOps keeps checking every day, so you don’t need to do anything.To check on Oracle’s side, go to Billing & Cost Management > Cost and Usage Reports and look for a FOCUS Reports folder.If your tenancy is non-metered, Oracle doesn’t produce cost reports, and none will appear.
nOps warns that this is a child tenancy
Your tenancy belongs to an Oracle organization, and Oracle writes the organization’s cost reports in the parent tenancy the warning names. Add a new integration, run the stack in that parent tenancy, then remove this one.
nOps says Oracle Cloud didn't respond
Oracle Cloud returned an error or timed out, so nOps couldn’t run the checks. Nothing about your integration changed: an active integration stays active. Try Verify again in a few minutes.
The stack's apply job fails
Open the failed job and read its log. Common causes:
You are not a tenancy administrator. Ask a member of the Administrators group to run the stack.
The public key was pasted incorrectly. Edit the stack, paste the key again from the nOps Deploy step, save, and run Apply again.
The primary email must be specified. Oracle couldn’t find an email for you. Edit the stack, enter Email for the nOps user, save, and run Apply again.
In Oracle Cloud, go to Developer Services > Resource Manager > Stacks and open the nOps stack. Click Destroy and confirm. This removes the policy, the user, its API key, and the group. When the destroy job finishes, you can delete the stack itself.
To cut off access right away, before you destroy the stack, delete the API key on the nOps user in Oracle Cloud. nOps can no longer sign in once the key is gone.
What the nOps stack creates in your tenancy, and why each part is needed.
Cloud Provider Integrations
All the cloud providers and tools you can connect to nOps.
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"nOps Documentation","description":"nOps cloud cost optimization platform: platform guides, cloud provider onboarding, and more.","colors":{"primary":"#0071EA","light":"#3399FF","dark":"#0056B3"},"logo":{"light":"https://mintcdn.com/nopsio/soDze3u_2cvKfXf7/logo/light.svg?fit=max\u0026auto=format\u0026n=soDze3u_2cvKfXf7\u0026q=85\u0026s=52543d77f0daf2d0e4763930bdc46fe6","dark":"https://mintcdn.com/nopsio/soDze3u_2cvKfXf7/logo/dark.svg?fit=max\u0026auto=format\u0026n=soDze3u_2cvKfXf7\u0026q=85\u0026s=0ef246577335b94b314a9ea2acf070e4","href":"https://clara.nops.io"},"favicon":"https://mintcdn.com/nopsio/soDze3u_2cvKfXf7/favicon.svg?fit=max\u0026auto=format\u0026n=soDze3u_2cvKfXf7\u0026q=85\u0026s=fdd5f561841463f4a4d314cf20927244","api":{"openapi":"openapi.json","playground":{"display":"interactive"},"examples":{"defaults":"required","languages":["curl","python","javascript","go"],"prefill":true},"url":"full"},"appearance":{"default":"dark"},"background":{"decoration":"gradient"},"navbar":{"links":[{"href":"mailto:support@nops.io","label":"Support"}],"primary":{"type":"button","label":"Dashboard","href":"https://clara.nops.io"}},"footer":{"socials":{"linkedin":"https://linkedin.com/company/nops-io","website":"https://nops.io","x":"https://x.com/naborly"},"links":[{"header":"Resources","items":[{"label":"nOps Platform","href":"https://clara.nops.io"},{"label":"Help Center","href":"https://help.nops.io"},{"label":"Blog","href":"https://nops.io/blog"}]},{"header":"Company","items":[{"label":"About nOps","href":"https://nops.io"},{"label":"Contact Support","href":"mailto:support@nops.io"}]}]},"search":{"prompt":"Search nOps docs..."},"fonts":{"heading":{"family":"Poppins","weight":600},"body":{"family":"Inter"}},"styling":{"codeblocks":{"theme":{"light":"github-light","dark":"github-dark"}},"latex":false},"errors":{"404":{"redirect":false,"title":"Page not found","description":"The page you're looking for doesn't exist. [Go back to the docs home](/)."}},"contextual":{"options":["copy","view","download-spec","chatgpt","claude","perplexity","mcp","add-mcp","cursor","vscode"],"display":"header"},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"nopsio","hasAudioNarration":false,"actualSubdomain":"nopsio","customDomains":["help.nops.io"],"gitSource":{"type":"github","owner":"nops-io","repo":"clara","deployBranch":"dev","contentDirectory":"public-docs","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6aeb4632119a07d709eb5c2f","collectionId":"c25b1835-03df-41a5-925c-96184c0cb8fa","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6aeb4632119a07d709eb5c2f"},"feedback":{"thumbs":true,"agentFeedback":true},"entitlements":{},"buildId":"6aeb59a1a60f76c944539864","clientVersion":"0.0.4054","searchFilterCounts":[{"language":"default","tag":"Developers","count":170},{"language":"default","tag":"API Reference","count":164},{"language":"default","tag":"Guides","count":72},{"language":"default","tag":"Seat Tracking","count":42},{"language":"default","tag":"Cost allocation","count":26},{"language":"default","tag":"Budgets","count":24},{"language":"default","tag":"Cloud provider integrations","count":18},{"language":"default","tag":"Third-Party Integrations","count":18},{"language":"default","tag":"Business unit economics","count":14},{"language":"default","tag":"AI","count":9}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":true},"customCss":[],"page":{"pagePath":"oci/integration-setup","slug":"/oci/integration-setup","pageMetadata":{"title":"Oracle Cloud Infrastructure - Integration Setup","description":"Connect your Oracle Cloud tenancy to nOps so nOps can read your FOCUS cost reports. You run one Oracle Resource Manager stack and paste a connection code back into nOps.","icon":"plug","href":"/oci/integration-setup"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Connect your Oracle Cloud tenancy to nOps so nOps can read your FOCUS cost reports. You run one Oracle Resource Manager stack and paste a connection code back into nOps.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,hr:`hr`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{Accordion,AccordionGroup,Card,CardGroup,CodeBlock,Heading,Info,Step,Steps,Tip}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!AccordionGroup)_missingMdxReference(`AccordionGroup`,true);if(!Card)_missingMdxReference(`Card`,true);if(!CardGroup)_missingMdxReference(`CardGroup`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Info)_missingMdxReference(`Info`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Tip)_missingMdxReference(`Tip`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`2`,id:`faqs`,children:`FAQs`}),`\n`,_jsxs(AccordionGroup,{children:[_jsxs(Accordion,{title:`Who needs to run the setup?`,id:`who-needs-to-run-the-setup`,children:[_jsxs(_components.p,{children:[`A `,_jsx(_components.strong,{children:`tenancy administrator`}),`: a member of the `,_jsx(_components.strong,{children:`Administrators`}),` group in your Oracle Cloud tenancy. The stack creates a user, a group, and a policy in the root compartment, and only a tenancy administrator can do that.`]}),_jsxs(_components.p,{children:[`The nOps steps need an nOps `,_jsx(_components.strong,{children:`admin`}),`. One person can do both parts, or two people can work through the same wizard.`]})]}),_jsxs(Accordion,{title:`What does nOps get access to?`,id:`what-does-nops-get-access-to`,children:[_jsxs(_components.p,{children:[`Only your Oracle `,_jsx(_components.strong,{children:`cost and usage reports`}),`. Oracle stores these reports in a bucket that Oracle owns, not in your tenancy. The policy the stack creates lets one nOps user read objects in that bucket, and nothing else.`]}),_jsxs(_components.p,{children:[`nOps can’t see, create, change, or delete any resource in your tenancy. See `,_jsx(_components.a,{href:`/oci/permissions-and-resources`,children:`Permissions \u0026 Resources`}),` for the full list.`]})]}),_jsxs(Accordion,{title:`Does nOps ever see a password or private key from my tenancy?`,id:`does-nops-ever-see-a-password-or-private-key-from-my-tenancy`,children:[_jsxs(_components.p,{children:[`No. nOps creates the key pair. It keeps the private key in an encrypted secret store and only gives you the `,_jsx(_components.strong,{children:`public`}),` key. The user the stack creates has no console password, so it can only use that API key.`]}),_jsx(_components.p,{children:`The connection code you paste back holds no secret. It only holds your tenancy OCID, the user OCID, the key fingerprint, and your home region.`})]}),_jsx(Accordion,{title:`Which region do I deploy the stack in?`,id:`which-region-do-i-deploy-the-stack-in`,children:_jsxs(_components.p,{children:[`Any region works. The stack always creates the user, group, and policy in your `,_jsx(_components.strong,{children:`home region`}),`, because Oracle keeps identity resources and cost reports there. The stack record itself stays in the region and compartment you pick.`]})}),_jsxs(Accordion,{title:`How long until I see my Oracle costs in nOps?`,id:`how-long-until-i-see-my-oracle-costs-in-nops`,children:[_jsxs(_components.p,{children:[`Oracle writes a new FOCUS report about `,_jsx(_components.strong,{children:`every 6 hours`}),`. A report can be `,_jsx(_components.strong,{children:`up to 24 hours`}),` late. After verification, nOps loads the reports Oracle has kept, which is up to the `,_jsx(_components.strong,{children:`last 12 months`}),`, and then checks for new reports every day.`]}),_jsx(_components.p,{children:`If your tenancy is new, the first report can take up to a day to appear.`})]}),_jsx(Accordion,{title:`My tenancy is non-metered. Can I connect it?`,id:`my-tenancy-is-non-metered-can-i-connect-it`,children:_jsxs(_components.p,{children:[`Oracle does not produce cost reports for non-metered tenancies, so nOps has no cost data to read. Setup still passes, but nOps will keep reporting that no reports were found. Contact your Oracle account team or `,_jsx(_components.a,{href:`mailto:support@nops.io`,children:`nOps support`}),` if you’re not sure which type you have.`]})}),_jsx(Accordion,{title:`Do you support government or other Oracle realms?`,id:`do-you-support-government-or-other-oracle-realms`,children:_jsxs(_components.p,{children:[`Not yet. nOps supports the commercial realm only: tenancy OCIDs that start with `,_jsx(_components.code,{children:`ocid1.tenancy.oc1..`}),`. The stack refuses any other tenancy.`]})}),_jsx(Accordion,{title:`Can I connect more than one tenancy?`,id:`can-i-connect-more-than-one-tenancy`,children:_jsx(_components.p,{children:`Yes. Add one integration per tenancy, and run the stack once in each tenancy with that integration’s public key. Each integration has its own key. nOps won’t let you connect the same tenancy twice.`})}),_jsxs(Accordion,{title:`We use Oracle Organizations. Which tenancy do I connect?`,id:`we-use-oracle-organizations-which-tenancy-do-i-connect`,children:[_jsxs(_components.p,{children:[`Connect the `,_jsx(_components.strong,{children:`parent tenancy`}),` only. Oracle writes the cost reports for the whole organization in the parent tenancy, and they include every child tenancy. A child tenancy shows little or none of its own spend, and connecting both counts the child’s spend twice.`]}),_jsx(_components.p,{children:`If you connect a child tenancy, verification still passes, but nOps warns you and names the parent.`})]})]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`overview`,children:`Overview`}),`\n`,_jsxs(_components.p,{children:[`nOps reads the `,_jsx(_components.strong,{children:`FOCUS cost reports`}),` that Oracle Cloud generates for your tenancy. FOCUS is an open standard format for cost data, so your Oracle costs line up with your other clouds in nOps.`]}),`\n`,_jsx(_components.p,{children:`Setup has two steps in the nOps wizard:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Deploy`}),` — Name your integration, generate and copy your nOps public key, and run the nOps stack in Oracle Cloud`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Connect`}),` — Paste the connection code from the stack, and nOps verifies access`]}),`\n`]}),`\n`,_jsxs(Info,{children:[_jsxs(_components.p,{children:[`Setup takes about `,_jsx(_components.strong,{children:`10 minutes`}),`. You need:`]}),_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`An nOps admin account`}),`\n`,_jsxs(_components.li,{children:[`A tenancy administrator in Oracle Cloud (a member of the `,_jsx(_components.strong,{children:`Administrators`}),` group)`]}),`\n`]}),_jsxs(_components.p,{children:[`If you use Oracle Organizations, run the setup in the `,_jsx(_components.strong,{children:`parent tenancy`}),`. Its cost reports cover every child tenancy.`]})]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`1-name-your-integration`,children:`1. Name Your Integration`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Open Cloud Provider Integrations`,children:_jsxs(_components.p,{children:[`Log in to `,_jsx(_components.strong,{children:`nOps`}),` and go to `,_jsx(_components.a,{href:`https://clara.nops.io/settings`,children:_jsx(_components.strong,{children:`Settings > Cloud Provider Integrations`})}),`. Scroll down to the `,_jsx(_components.strong,{children:`Add a provider`}),` section and click the `,_jsx(_components.strong,{children:`Oracle Cloud`}),` card.`]})}),_jsxs(Step,{title:`Enter an Integration Name`,children:[_jsxs(_components.p,{children:[`Enter a name that helps you find this integration later (for example, “Production OCI tenancy”), then click `,_jsx(_components.strong,{children:`Generate key`}),`.`]}),_jsxs(_components.p,{children:[`nOps creates the integration and a key pair for it. You can leave the wizard and come back later: the integration shows `,_jsx(_components.strong,{children:`Action Required`}),` until verification passes.`]})]})]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`2-deploy-the-nops-stack`,children:`2. Deploy the nOps Stack`}),`\n`,_jsxs(_components.p,{children:[`The nOps stack is an Oracle `,_jsx(_components.strong,{children:`Resource Manager`}),` stack. Its source is public: `,_jsx(_components.a,{href:`https://github.com/nops-io/terraform-oci-nops-integration`,children:`nops-io/terraform-oci-nops-integration`}),`. It has two fields: your nOps public key, and an optional email for the nOps user.`]}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Copy Your nOps Public Key`,children:[_jsxs(_components.p,{children:[`On the `,_jsx(_components.strong,{children:`Deploy`}),` step, click the copy button next to the public key. You paste it into Oracle Cloud in a moment.`]}),_jsx(_components.p,{children:`The key belongs to this integration only. If you start a second integration, it gets a different key.`})]}),_jsxs(Step,{title:`Click Deploy to Oracle Cloud`,children:[_jsxs(_components.p,{children:[`Click `,_jsx(_components.strong,{children:`Deploy to Oracle Cloud`}),`. Oracle Cloud opens in a new tab, on the `,_jsx(_components.strong,{children:`Create stack`}),` page, with the nOps stack already loaded. Keep the nOps tab open.`]}),_jsxs(_components.p,{children:[`Sign in as a `,_jsx(_components.strong,{children:`tenancy administrator`}),` if Oracle asks you to.`]})]}),_jsx(Step,{title:`Review the Stack Information`,children:_jsxs(_components.p,{children:[`Oracle shows the stack’s name and the compartment it will be saved in. You can keep the defaults. Click `,_jsx(_components.strong,{children:`Next`}),`.`]})}),_jsxs(Step,{title:`Paste the Public Key`,children:[_jsxs(_components.p,{children:[`In the `,_jsx(_components.strong,{children:`nOps public key`}),` field, paste the key you copied. Leave everything else as it is. Click `,_jsx(_components.strong,{children:`Next`}),`.`]}),_jsxs(_components.p,{children:[`Oracle requires an email on every user. Leave `,_jsx(_components.strong,{children:`Email for the nOps user`}),` blank to use yours, or enter a team mailbox. Oracle may send it a welcome message; the nOps user still can’t sign in to the Console.`]})]}),_jsx(Step,{title:`Create and Apply`,children:_jsxs(_components.p,{children:[`On the `,_jsx(_components.strong,{children:`Review`}),` page, select `,_jsx(_components.strong,{children:`Run apply`}),`, then click `,_jsx(_components.strong,{children:`Create`}),`. Resource Manager starts an apply job. It usually takes a minute or two.`]})}),_jsx(Step,{title:`Copy the Connection Code`,children:_jsxs(_components.p,{children:[`When the job succeeds, open the job’s `,_jsx(_components.strong,{children:`Outputs`}),` and copy the value of `,_jsx(_components.strong,{children:_jsx(_components.code,{children:`nops_connection_code`})}),`. It’s one long line of letters and numbers.`]})})]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Prefer to read the code first?`}),` The stack is plain Terraform. Open `,_jsx(_components.a,{href:`https://github.com/nops-io/terraform-oci-nops-integration`,children:`nops-io/terraform-oci-nops-integration`}),` to see every resource it creates before you click `,_jsx(_components.strong,{children:`Deploy to Oracle Cloud`}),`. The Deploy button always uses a pinned, tagged release, so the code you read is the code that runs.`]})}),`\n`,_jsxs(_components.p,{children:[`For what the stack creates and why, see `,_jsx(_components.a,{href:`/oci/permissions-and-resources`,children:`Permissions \u0026 Resources`}),`.`]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`3-connect-and-verify`,children:`3. Connect and Verify`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Paste the Connection Code`,children:_jsxs(_components.p,{children:[`Go back to the nOps tab. On the `,_jsx(_components.strong,{children:`Connect`}),` step, paste the connection code.`]})}),_jsxs(Step,{title:`Click Verify`,children:[_jsxs(_components.p,{children:[`Click `,_jsx(_components.strong,{children:`Verify`}),`. nOps saves the code and then checks, from its own servers, that it can reach your reports:`]}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`API key signs in`}),` — Oracle accepts the key the stack added (`,_jsx(_components.code,{children:`GetNamespace`}),`)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Can list cost reports`}),` — nOps can list your FOCUS cost reports (`,_jsx(_components.code,{children:`ListObjects`}),`)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Can read a cost report`}),` — nOps can open a report file (`,_jsx(_components.code,{children:`HeadObject`}),`)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Cost reports found`}),` — how many reports Oracle has written so far. This one is for information only: zero reports still passes`]}),`\n`]}),_jsxs(_components.p,{children:[`nOps also checks whether your tenancy is a child tenancy in an Oracle organization (`,_jsx(_components.code,{children:`ListOrganizations`}),`). That check never fails verification; it only adds a warning.`]})]}),_jsxs(Step,{title:`Click Done`,children:[_jsxs(_components.p,{children:[`When the checks pass, nOps shows `,_jsx(_components.strong,{children:`Oracle Cloud Verified`}),` and the button changes to `,_jsx(_components.strong,{children:`Done`}),`. Read any note on the screen (for example, that Oracle hasn’t written reports yet), then click `,_jsx(_components.strong,{children:`Done`}),`. Your integration is now `,_jsx(_components.strong,{children:`Active`}),`.`]}),_jsxs(_components.p,{children:[`If a check fails, nOps shows `,_jsx(_components.strong,{children:`Required Access Not Detected`}),` with the fix for each failed check. See `,_jsx(_components.a,{href:`#troubleshooting`,children:`Troubleshooting`}),`.`]})]})]}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[`New API keys and policies can take a few minutes to take effect in Oracle Cloud. nOps retries a few times on its own before it reports a failed check. If a check still fails, wait a few minutes and click `,_jsx(_components.strong,{children:`Verify`}),` again.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`finishing-later`,children:`Finishing Later`}),`\n`,_jsxs(_components.p,{children:[`If you need to stop partway, click `,_jsx(_components.strong,{children:`Finish later`}),`. The integration shows `,_jsx(_components.strong,{children:`Action Required`}),`, and nOps doesn’t read any data from it.`]}),`\n`,_jsxs(_components.p,{children:[`nOps saves the connection code when you click `,_jsx(_components.strong,{children:`Verify`}),`, even if a check fails. To pick up where you left off, open the integration from `,_jsx(_components.strong,{children:`Settings > Cloud Provider Integrations`}),`. The wizard reopens at `,_jsx(_components.strong,{children:`Connect`}),` if you already saved a code, and shows it as dots, so you only need to click `,_jsx(_components.strong,{children:`Verify`}),` again. It opens at `,_jsx(_components.strong,{children:`Deploy`}),` if you didn’t save one. Your public key stays the same, so you don’t need to run the stack again.`]}),`\n`,_jsxs(_components.p,{children:[`You can also go back to the `,_jsx(_components.strong,{children:`Deploy`}),` step from `,_jsx(_components.strong,{children:`Connect`}),` at any time to copy the key again.`]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`troubleshooting`,children:`Troubleshooting`}),`\n`,_jsxs(AccordionGroup,{children:[_jsxs(Accordion,{title:`nOps says the connection code isn't valid`,id:`nops-says-the-connection-code-isnt-valid`,children:[_jsxs(_components.p,{children:[`The code must be copied whole, from the `,_jsx(_components.code,{children:`nops_connection_code`}),` output of a successful apply job. Check that:`]}),_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`You copied the full value, with no spaces or line breaks added`}),`\n`,_jsxs(_components.li,{children:[`You copied the output of the `,_jsx(_components.strong,{children:`latest`}),` successful apply job for this stack`]}),`\n`]})]}),_jsxs(Accordion,{title:`nOps says the code was made with a different key`,id:`nops-says-the-code-was-made-with-a-different-key`,children:[_jsxs(_components.p,{children:[`The stack was run with a public key from a `,_jsx(_components.strong,{children:`different`}),` nOps integration, or from an earlier attempt that you deleted. Each integration has its own key.`]}),_jsxs(_components.p,{children:[`In Oracle Cloud, go to `,_jsx(_components.strong,{children:`Developer Services > Resource Manager > Stacks`}),` and open the nOps stack. Click `,_jsx(_components.strong,{children:`Edit`}),`, paste the public key shown in `,_jsx(_components.strong,{children:`this`}),` integration’s `,_jsx(_components.strong,{children:`Deploy`}),` step, save, and run `,_jsx(_components.strong,{children:`Apply`}),` again. Then copy the new connection code.`]})]}),_jsx(Accordion,{title:`nOps says this tenancy is already connected`,id:`nops-says-this-tenancy-is-already-connected`,children:_jsx(_components.p,{children:`Another nOps integration in your organization already uses this tenancy. Use that integration, or delete it first if you want to start over.`})}),_jsxs(Accordion,{title:`The \"API key signs in\" check fails`,id:`the-api-key-signs-in-check-fails`,children:[_jsxs(_components.p,{children:[`Oracle didn’t accept the key. Most often the key is still new: wait a few minutes and click `,_jsx(_components.strong,{children:`Verify`}),` again.`]}),_jsx(_components.p,{children:`If it keeps failing, check the user the stack created:`}),_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`In Oracle Cloud, go to `,_jsx(_components.strong,{children:`Identity \u0026 Security > Domains`}),`, open the `,_jsx(_components.strong,{children:`Default`}),` domain, and select `,_jsx(_components.strong,{children:`Users`}),`. (Older tenancies without identity domains: `,_jsx(_components.strong,{children:`Identity \u0026 Security > Users`}),`.)`]}),`\n`,_jsxs(_components.li,{children:[`Open the nOps user and select `,_jsx(_components.strong,{children:`API keys`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Confirm there is a key whose `,_jsx(_components.strong,{children:`fingerprint`}),` matches the one shown in nOps.`]}),`\n`]}),_jsxs(_components.p,{children:[`If the key is missing, run `,_jsx(_components.strong,{children:`Apply`}),` on the nOps stack again with the public key from this integration’s `,_jsx(_components.strong,{children:`Deploy`}),` step.`]})]}),_jsxs(Accordion,{title:`The \"Can list cost reports\" check fails`,id:`the-can-list-cost-reports-check-fails`,children:[_jsxs(_components.p,{children:[`nOps signed in but Oracle refused to list your reports. This means the policy is missing or hasn’t taken effect yet. Oracle can take a few minutes to apply a new policy, so wait and click `,_jsx(_components.strong,{children:`Verify`}),` again.`]}),_jsx(_components.p,{children:`A new API key can also cause this: Oracle accepts it for sign-in a few minutes before it accepts it for cost reports. nOps then says the key isn’t activated for cost reports yet.`}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`New tenancy?`}),` Until Oracle writes a tenancy’s first cost report, the report bucket doesn’t exist, and Oracle answers exactly as it does when the policy is missing. If your tenancy was created in the last day, click `,_jsx(_components.strong,{children:`Verify`}),` again tomorrow.`]}),_jsxs(_components.p,{children:[`If it keeps failing, open `,_jsx(_components.strong,{children:`Identity \u0026 Security > Policies`}),`, select the `,_jsx(_components.strong,{children:`root`}),` compartment, and open the nOps policy (`,_jsx(_components.code,{children:`nops-cost-reports-policy-\u003csuffix>`}),`). It must contain both of these statements, with your nOps group’s name (`,_jsx(_components.code,{children:`nops-cost-reports-reader-\u003csuffix>`}),`, shown in the stack’s `,_jsx(_components.code,{children:`nops_group_name`}),` output) in the second one:`]}),_jsx(CodeBlock,{numberOfLines:`3`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light github-dark`,style:{backgroundColor:`#fff`,\"--shiki-dark-bg\":`#24292e`,color:`#24292e`,\"--shiki-dark\":`#e1e4e8`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`3`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`define tenancy usage-report as ocid1.tenancy.oc1..aaaaaaaaned4fkpkisbwjlr56u7cj63lf3wffbilvqknstgtvzub7vhqkggq`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`endorse group \u003cnops group> to read objects in tenancy usage-report`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),_jsxs(_components.p,{children:[`The policy must be in the `,_jsx(_components.strong,{children:`root`}),` compartment. Oracle only accepts these statements there. If the policy was changed or removed, run `,_jsx(_components.strong,{children:`Apply`}),` on the nOps stack again to restore it.`]})]}),_jsx(Accordion,{title:`The \"Can read a cost report\" check fails`,id:`the-can-read-a-cost-report-check-fails`,children:_jsxs(_components.p,{children:[`nOps can list your reports but Oracle refused to open one. This happens when the policy’s `,_jsx(_components.code,{children:`endorse`}),` statement was changed from `,_jsx(_components.code,{children:`read objects`}),` to `,_jsx(_components.code,{children:`inspect objects`}),`, which allows listing only. Run `,_jsx(_components.strong,{children:`Apply`}),` on the nOps stack again to restore the policy, then click `,_jsx(_components.strong,{children:`Verify`}),` again.`]})}),_jsxs(Accordion,{title:`Verification passes, but no reports were found`,id:`verification-passes-but-no-reports-were-found`,children:[_jsx(_components.p,{children:`This is normal for a new tenancy. Oracle writes a FOCUS report about every 6 hours, and the first one can take up to a day. nOps keeps checking every day, so you don’t need to do anything.`}),_jsxs(_components.p,{children:[`To check on Oracle’s side, go to `,_jsx(_components.strong,{children:`Billing \u0026 Cost Management > Cost and Usage Reports`}),` and look for a `,_jsx(_components.strong,{children:`FOCUS Reports`}),` folder.`]}),_jsxs(_components.p,{children:[`If your tenancy is `,_jsx(_components.strong,{children:`non-metered`}),`, Oracle doesn’t produce cost reports, and none will appear.`]})]}),_jsx(Accordion,{title:`nOps warns that this is a child tenancy`,id:`nops-warns-that-this-is-a-child-tenancy`,children:_jsxs(_components.p,{children:[`Your tenancy belongs to an Oracle organization, and Oracle writes the organization’s cost reports in the parent tenancy the warning names. Add a new integration, run the stack in that `,_jsx(_components.strong,{children:`parent tenancy`}),`, then remove this one.`]})}),_jsx(Accordion,{title:`nOps says Oracle Cloud didn't respond`,id:`nops-says-oracle-cloud-didnt-respond`,children:_jsxs(_components.p,{children:[`Oracle Cloud returned an error or timed out, so nOps couldn’t run the checks. Nothing about your integration changed: an active integration stays active. Try `,_jsx(_components.strong,{children:`Verify`}),` again in a few minutes.`]})}),_jsxs(Accordion,{title:`The stack's apply job fails`,id:`the-stacks-apply-job-fails`,children:[_jsx(_components.p,{children:`Open the failed job and read its log. Common causes:`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`You are not a tenancy administrator.`}),` Ask a member of the `,_jsx(_components.strong,{children:`Administrators`}),` group to run the stack.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`The public key was pasted incorrectly.`}),` Edit the stack, paste the key again from the nOps `,_jsx(_components.strong,{children:`Deploy`}),` step, save, and run `,_jsx(_components.strong,{children:`Apply`}),` again.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`The primary email must be specified.`}),` Oracle couldn’t find an email for you. Edit the stack, enter `,_jsx(_components.strong,{children:`Email for the nOps user`}),`, save, and run `,_jsx(_components.strong,{children:`Apply`}),` again.`]}),`\n`]})]})]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`disconnecting-oracle-cloud`,children:`Disconnecting Oracle Cloud`}),`\n`,_jsx(_components.p,{children:`Do both steps to remove nOps’s access completely:`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Delete the Integration in nOps`,children:_jsxs(_components.p,{children:[`In `,_jsx(_components.a,{href:`https://clara.nops.io/settings`,children:_jsx(_components.strong,{children:`Settings > Cloud Provider Integrations`})}),`, delete the Oracle Cloud integration. nOps stops reading your reports and deletes its private key.`]})}),_jsx(Step,{title:`Destroy the Stack in Oracle Cloud`,children:_jsxs(_components.p,{children:[`In Oracle Cloud, go to `,_jsx(_components.strong,{children:`Developer Services > Resource Manager > Stacks`}),` and open the nOps stack. Click `,_jsx(_components.strong,{children:`Destroy`}),` and confirm. This removes the policy, the user, its API key, and the group. When the destroy job finishes, you can delete the stack itself.`]})})]}),`\n`,_jsx(Tip,{children:_jsx(_components.p,{children:`To cut off access right away, before you destroy the stack, delete the API key on the nOps user in Oracle Cloud. nOps can no longer sign in once the key is gone.`})}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`related-guides`,children:`Related Guides`}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`Permissions \u0026 Resources`,icon:`shield-check`,href:`/oci/permissions-and-resources`,children:_jsx(_components.p,{children:`What the nOps stack creates in your tenancy, and why each part is needed.`})}),_jsx(Card,{title:`Cloud Provider Integrations`,icon:`plug`,href:`/platform/integrations`,children:_jsx(_components.p,{children:`All the cloud providers and tools you can connect to nOps.`})})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"codeStyling":{"theme":{"light":"github-light","dark":"github-dark"}},"config":{},"pageMetadata":{"title":"Oracle Cloud Infrastructure - Integration Setup","description":"Connect your Oracle Cloud tenancy to nOps so nOps can read your FOCUS cost reports. You run one Oracle Resource Manager stack and paste a connection code back into nOps.","icon":"plug","href":"/oci/integration-setup"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"FAQs","slug":"faqs","depth":2,"children":[]},{"title":"Overview","slug":"overview","depth":2,"children":[]},{"title":"1. Name Your Integration","slug":"1-name-your-integration","depth":2,"children":[]},{"title":"2. Deploy the nOps Stack","slug":"2-deploy-the-nops-stack","depth":2,"children":[]},{"title":"3. Connect and Verify","slug":"3-connect-and-verify","depth":2,"children":[{"title":"Finishing Later","slug":"finishing-later","depth":3,"children":[]}]},{"title":"Troubleshooting","slug":"troubleshooting","depth":2,"children":[]},{"title":"Disconnecting Oracle Cloud","slug":"disconnecting-oracle-cloud","depth":2,"children":[]},{"title":"Related Guides","slug":"related-guides","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"nopsio","siteName":"nOps Documentation","title":"Oracle Cloud Infrastructure - Integration Setup - nOps Documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-04T14:50:41.683Z","originalFileLocation":"oci/integration-setup.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"dark\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Connect your Oracle Cloud tenancy to nOps so nOps can read your FOCUS cost reports. You run one Oracle Resource Manager stack and paste a connection code back into nOps.\">\u003cmeta data-mint-head name=\"application-name\" content=\"nOps Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/nopsio/fqCOsxgCfR4Zn53X/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/nopsio/fqCOsxgCfR4Zn53X/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/nopsio/fqCOsxgCfR4Zn53X/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/nopsio/fqCOsxgCfR4Zn53X/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/nopsio/fqCOsxgCfR4Zn53X/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/nopsio/fqCOsxgCfR4Zn53X/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/nopsio/fqCOsxgCfR4Zn53X/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/nopsio/fqCOsxgCfR4Zn53X/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/nopsio/fqCOsxgCfR4Zn53X/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Oracle Cloud Infrastructure - Integration Setup - nOps Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Connect your Oracle Cloud tenancy to nOps so nOps can read your FOCUS cost reports. You run one Oracle Resource Manager stack and paste a connection code back into nOps.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"nOps Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://help.nops.io/oci/integration-setup\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://nopsio.mintlify.app/_mintlify/api/og/v2?division=Oracle+Cloud+Infrastructure\u0026amp;title=Oracle+Cloud+Infrastructure+-+Integration+Setup\u0026amp;description=Connect+your+Oracle+Cloud+tenancy+to+nOps+so+nOps+can+read+your+FOCUS+cost+reports.+You+run+one+Oracle+Resource+Manager+stack+and+paste+a+connection+code+back+i\u0026amp;theme=1b405a0e606eab946414f3c3\u0026amp;signature=16f512972405e83f220aded6edc60b2a390a5d432450949bd00c5a7b6ccb474c\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Oracle Cloud Infrastructure - Integration Setup - nOps Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Connect your Oracle Cloud tenancy to nOps so nOps can read your FOCUS cost reports. You run one Oracle Resource Manager stack and paste a connection code back into nOps.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://nopsio.mintlify.app/_mintlify/api/og/v2?division=Oracle+Cloud+Infrastructure\u0026amp;title=Oracle+Cloud+Infrastructure+-+Integration+Setup\u0026amp;description=Connect+your+Oracle+Cloud+tenancy+to+nOps+so+nOps+can+read+your+FOCUS+cost+reports.+You+run+one+Oracle+Resource+Manager+stack+and+paste+a+connection+code+back+i\u0026amp;theme=1b405a0e606eab946414f3c3\u0026amp;signature=16f512972405e83f220aded6edc60b2a390a5d432450949bd00c5a7b6ccb474c\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/nopsio/fqCOsxgCfR4Zn53X/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"nOps Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0071EA\">\u003clink data-mint-head rel=\"canonical\" href=\"https://help.nops.io/oci/integration-setup\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/oci/integration-setup.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://help.nops.io/#organization\",\"name\":\"nOps Documentation\",\"url\":\"https://help.nops.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/nopsio/soDze3u_2cvKfXf7/logo/light.svg?fit=max\u0026auto=format\u0026n=soDze3u_2cvKfXf7\u0026q=85\u0026s=52543d77f0daf2d0e4763930bdc46fe6\"}},{\"@type\":\"WebSite\",\"@id\":\"https://help.nops.io#website\",\"name\":\"nOps Documentation\",\"url\":\"https://help.nops.io\",\"publisher\":{\"@id\":\"https://help.nops.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://help.nops.io/oci/integration-setup#webpage\",\"url\":\"https://help.nops.io/oci/integration-setup\",\"name\":\"Oracle Cloud Infrastructure - Integration Setup\",\"description\":\"Connect your Oracle Cloud tenancy to nOps so nOps can read your FOCUS cost reports. You run one Oracle Resource Manager stack and paste a connection code back into nOps.\",\"dateModified\":\"2026-11-04T14:50:41.683Z\",\"isPartOf\":{\"@id\":\"https://help.nops.io#website\"},\"breadcrumb\":{\"@id\":\"https://help.nops.io/oci/integration-setup#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://help.nops.io/oci/integration-setup#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Cloud provider integrations\",\"item\":\"https://help.nops.io/platform/integrations\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Oracle Cloud Infrastructure - Integration Setup\",\"item\":\"https://help.nops.io/oci/integration-setup\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://help.nops.io/oci/integration-setup#article\",\"headline\":\"Oracle Cloud Infrastructure - Integration Setup\",\"name\":\"Oracle Cloud Infrastructure - Integration Setup\",\"description\":\"Connect your Oracle Cloud tenancy to nOps so nOps can read your FOCUS cost reports. You run one Oracle Resource Manager stack and paste a connection code back into nOps.\",\"url\":\"https://help.nops.io/oci/integration-setup\",\"mainEntityOfPage\":{\"@id\":\"https://help.nops.io/oci/integration-setup#webpage\"},\"dateModified\":\"2026-11-04T14:50:41.683Z\",\"publisher\":{\"@id\":\"https://help.nops.io/#organization\"},\"isPartOf\":{\"@id\":\"https://help.nops.io#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"nOps Documentation\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"nOps Documentation","nav":{"global":null,"tabs":[{"tab":"Guides","groups":[{"group":"Getting Started","pages":[{"title":"Welcome to nOps","sidebarTitle":"Welcome","href":""}]},{"group":"Cloud provider integrations","pages":[{"title":"Integrations","sidebarTitle":"Integrations","href":"/platform/integrations"},{"group":"Amazon Web Services","pages":[{"title":"Amazon Web Services - Integration Setup","icon":"aws","href":"/aws/integration-setup"},{"title":"Amazon Web Services - Commitment Management Setup","icon":"chart-line","href":"/aws/commitment-management-setup"},{"title":"Amazon Web Services - Permissions \u0026 Resources","icon":"shield-check","href":"/aws/permissions-and-resources"}]},{"group":"Google Cloud Platform","pages":[{"title":"Google Cloud Platform - Prerequisites","icon":"list-check","href":"/gcp/prerequisites"},{"title":"Google Cloud Platform - Integration Setup","icon":"plug","href":"/gcp/integration-setup"},{"title":"Google Cloud Platform - Commitment Management Setup","icon":"chart-line","href":"/gcp/commitment-management-setup"},{"title":"Google Cloud Platform - Permissions \u0026 Resources - Savings Analysis","icon":"shield-check","href":"/gcp/permissions-and-resources-sa"},{"title":"Google Cloud Platform - Permissions \u0026 Resources - Commitment Management","icon":"shield-check","href":"/gcp/permissions-and-resources-cm"}]},{"group":"Microsoft Azure","pages":[{"title":"Microsoft Azure - Prerequisites","icon":"list-check","href":"/azure/prerequisites"},{"title":"Microsoft Azure - Savings Analysis Setup","icon":"plug","href":"/azure/integration-setup"},{"title":"Microsoft Azure - Setup Script (Azure CLI)","icon":"terminal","href":"/azure/cli-setup"},{"title":"Microsoft Azure - Commitment Management Setup","icon":"chart-line","href":"/azure/commitment-management-setup"},{"title":"Microsoft Azure - Commitment Management Setup Script","icon":"terminal","href":"/azure/cm-cli-setup"},{"title":"Microsoft Azure - Permissions \u0026 Resources","icon":"shield-check","href":"/azure/permissions-and-resources"},{"description":"Security architecture, API usage, RBAC requirements, and resource footprint for the nOps Azure integration.","title":"Microsoft Azure - Security","icon":"lock-keyhole","href":"/azure/security"}]},{"group":"Oracle Cloud Infrastructure","pages":[{"title":"Oracle Cloud Infrastructure - Integration Setup","icon":"plug","href":"/oci/integration-setup"},{"title":"Oracle Cloud Infrastructure - Permissions \u0026 Resources","description":"Complete reference of what the nOps stack creates in your Oracle Cloud tenancy, the permissions nOps uses, and where your cost data comes from.","icon":"shield-check","href":"/oci/permissions-and-resources"}]}]},{"group":"Platform","pages":[{"title":"Home page","sidebarTitle":"Home page","href":"/platform/home"},{"title":"Users and roles","sidebarTitle":"Users and roles","href":"/platform/users"},{"title":"Organizations","sidebarTitle":"Organizations","href":"/platform/organizations"},{"title":"Roles and data scopes","sidebarTitle":"Roles \u0026 data scopes","href":"/platform/roles-and-data-scopes"},{"title":"Notifications","sidebarTitle":"Notifications","href":"/platform/notifications"},{"title":"Issue creation from recommendations","sidebarTitle":"Issue creation","href":"/platform/issue-tracker-notifications"},{"title":"Slack \u0026 Teams Delivery","sidebarTitle":"Slack \u0026 Teams","href":"/platform/slack-and-teams"},{"title":"Security and authentication","sidebarTitle":"Security and auth","href":"/platform/security-and-auth"}]},{"group":"Clara","pages":[{"title":"Ask Clara","sidebarTitle":"Ask Clara","href":"/clara/clara-chat"},{"title":"Canvas","sidebarTitle":"Canvas","href":"/clara/canvas"}]},{"group":"Inform","pages":[{"title":"Inform","href":"/inform/introduction"},{"group":"Explorer","root":{"title":"Explorer","href":"/inform/explorer"},"pages":[{"title":"Explorer Dashboard","href":"/inform/explorer-dashboard"},{"title":"Reports","href":"/inform/reports"}]},{"group":"Recommendations","root":{"title":"Recommendations","href":"/inform/recommendations"},"pages":[{"title":"Supported recommendations","href":"/inform/supported-recommendations"}]},{"title":"Anomalies","href":"/inform/anomalies"},{"title":"MAP Manager","href":"/inform/map-manager"}]},{"group":"AI","pages":[{"title":"Introduction","href":"/ai/introduction"},{"title":"Set up AI seat tracking","href":"/ai/setup"},{"title":"Tracking","href":"/ai/tracking"},{"title":"Requests","href":"/ai/requests"},{"title":"Wallets","href":"/ai/wallets"},{"title":"Budgets","href":"/ai/budgets"},{"title":"Automated Rebalance","href":"/ai/automated-rebalance"},{"title":"AI Recommendations","href":"/ai/recommendations"},{"title":"AI Anomalies","href":"/ai/anomalies"}]},{"group":"Operate","pages":[{"title":"Budgets","href":"/operate/budgets"},{"title":"Business Unit Economics","href":"/operate/business-unit-economics"},{"title":"Cloud \u0026 SaaS Contract Tracker","href":"/operate/contract-tracker"}]},{"group":"Optimize","pages":[{"title":"Commitment Inventory","href":"/optimize/commitment-inventory"}]},{"group":"Third-Party Integrations","pages":[{"title":"Cursor","icon":"key","href":"/integrations/cursor-admin-api"},{"title":"Datadog","icon":"chart-line","href":"/integrations/datadog"},{"title":"MongoDB Atlas","icon":"database","href":"/integrations/mongodb-atlas"},{"title":"Fastly","icon":"globe","href":"/integrations/fastly"},{"title":"Cloudflare","icon":"cloud","href":"/integrations/cloudflare"},{"title":"OpenAI (Platform)","icon":"robot","href":"/integrations/openai"},{"title":"ChatGPT (Enterprise)","icon":"robot","href":"/integrations/openai-enterprise"},{"title":"Anthropic (Platform)","icon":"robot","href":"/integrations/anthropic"},{"title":"Claude.ai (Enterprise)","icon":"robot","href":"/integrations/claude-enterprise"},{"title":"Twilio","icon":"phone","href":"/integrations/twilio"},{"title":"LiteLLM","icon":"route","href":"/integrations/litellm"},{"title":"Atlassian","icon":"key","href":"/integrations/atlassian"},{"title":"GitHub","icon":"key","href":"/integrations/github"},{"title":"GitLab","icon":"key","href":"/integrations/gitlab"},{"title":"Amazon Bedrock","icon":"aws","href":"/integrations/amazon-bedrock"},{"title":"Databricks","icon":"boxes-stacked","href":"/integrations/databricks"},{"title":"Snowflake","icon":"snowflake","href":"/integrations/snowflake"},{"title":"Vercel","icon":"triangle","href":"/integrations/vercel"}]},{"group":"Telemetry","pages":[{"title":"Send OpenTelemetry data to nOps","sidebarTitle":"OpenTelemetry","href":"/telemetry/opentelemetry"}]},{"group":"Plugins","pages":[{"title":"Clara MCP","sidebarTitle":"Clara MCP","href":"/plugins/clara-mcp"},{"title":"Clara Slack Agent","sidebarTitle":"Clara Slack Agent","href":"/plugins/clara-slack-agent"},{"title":"nOps RecBot","sidebarTitle":"nOps RecBot","href":"/plugins/nops-recbot"}]},{"group":"Portfolio Portal","pages":[{"title":"Portfolio Portal","sidebarTitle":"Portfolio Portal","href":"/portfolio/introduction"}]},{"group":"Support","pages":[{"title":"nOps Customer Service SLAs","sidebarTitle":"Customer Service SLAs","href":"/support/customer-service-sla"}]}]},{"tab":"Developers","pages":[{"title":"Developers","href":"/developers"}]}]},"basePath":"","title":"Oracle Cloud Infrastructure - Integration Setup - nOps Documentation","buildId":"dpl_345ReqzYaAjzS9QpeJemsKdb7KDj","deploymentId":"dpl_345ReqzYaAjzS9QpeJemsKdb7KDj","dynamics":[],"chunks":[]}