--- title: Scopes description: |- Contains functions used to manage scopes for your app. This object is returned on authenticated Admin requests. api_version: v1 latest api_name: shopify-app-react-router source_url: html: https://shopify.dev/docs/api/shopify-app-react-router/latest/apis/scopes md: https://shopify.dev/docs/api/shopify-app-react-router/latest/apis/scopes.md --- # Scopesobject Contains functions used to manage scopes for your app. This object is returned on authenticated Admin requests. ## scopes Provides utilities that apps can use to [manage scopes](https://shopify.dev/docs/apps/build/authentication-authorization/app-installation/manage-access-scopes) for the app using the Admin API. * query () => Promise\ required Queries Shopify for the scopes for this app on this shop * request (scopes: string\[]) => Promise\ required Requests the merchant to grant the provided scopes for this app on this shop Warning: This method performs a server-side redirect. * revoke (scopes: string\[]) => Promise\ required Revokes the provided scopes from this app on this shop Warning: This method throws an [error](https://shopify.dev/docs/api/admin-graphql/unstable/objects/AppRevokeAccessScopesAppRevokeScopeError) if the provided optional scopes contains a required scope. ### ScopesDetail * granted The scopes that have been granted on the shop for this app ```ts string[] ``` * optional The optional scopes that the app has declared in its configuration ```ts string[] ``` * required The required scopes that the app has declared in its configuration ```ts string[] ``` ```ts export interface ScopesDetail { /** * The scopes that have been granted on the shop for this app */ granted: Scope[]; /** * The required scopes that the app has declared in its configuration */ required: Scope[]; /** * The optional scopes that the app has declared in its configuration */ optional: Scope[]; } ``` ### ScopesRevokeResponse * revoked The scopes that have been revoked on the shop for this app ```ts string[] ``` ```ts export interface ScopesRevokeResponse { /** * The scopes that have been revoked on the shop for this app */ revoked: Scope[]; } ``` ## Examples ### query Query for granted scopes Call `scopes.query` to get scope details. ### Examples * #### Query for granted scopes ##### Description Call \`scopes.query\` to get scope details. ##### /app.\_index.tsx ```typescript import type { LoaderFunctionArgs } from "react-router"; import { useLoaderData } from "react-router"; import { authenticate } from "../shopify.server"; import { json } from "react-router"; export const loader = async ({ request }: LoaderFunctionArgs) => { const { scopes } = await authenticate.admin(request); const scopesDetail = await scopes.query(); return ({ hasWriteProducts: scopesDetail.granted.includes('write_products'), }); }; export default function Index() { const {hasWriteProducts} = useLoaderData(); ... } ``` ### request Request consent from the merchant to grant the provided scopes for this app Call `scopes.request` to request optional scopes. ### Examples * #### Request consent from the merchant to grant the provided scopes for this app ##### Description Call \`scopes.request\` to request optional scopes. ##### /app/routes/app.request.tsx ```typescript import type { ActionFunctionArgs } from "react-router"; import { useFetcher } from "react-router"; import { authenticate } from "../shopify.server"; import { json } from "react-router"; // Example of an action to POST a request to for optional scopes export const action = async ({ request }: ActionFunctionArgs) => { const { scopes } = await authenticate.admin(request); const body = await request.formData(); const scopesToRequest = body.getAll("scopes") as string[]; // If the scopes are not already granted, a full page redirect to the request URL occurs await scopes.request(scopesToRequest); // otherwise return an empty response return ({}); }; export default function Index() { const fetcher = useFetcher(); const handleRequest = () => { fetcher.submit({scopes: ["write_products"]}, { method: "POST", }); }; ... } ``` ### revoke Revoke optional scopes Call `scopes.revoke` to revoke optional scopes. ### Examples * #### Revoke optional scopes ##### Description Call \`scopes.revoke\` to revoke optional scopes. ##### /app.\_index.tsx ```typescript import type { ActionFunctionArgs } from "react-router"; import { useFetcher } from "react-router"; import { authenticate } from "../shopify.server"; import { json } from "react-router"; // Example of an action to POST optional scopes to revoke export const action = async ({ request }: ActionFunctionArgs) => { const { scopes } = await authenticate.admin(request); const body = await request.formData(); const scopesToRevoke = body.getAll("scopes") as string[]; const revokedResponse = await scopes.revoke(scopesToRevoke); return (revokedResponse); }; export default function Index() { const fetcher = useFetcher(); const handleRevoke = () => { fetcher.submit({scopes: ["write_products"]}, { method: "POST", }); }; ... } ``` ## Related [Authenticate requests from Shopify Admin. - Admin context](https://shopify.dev/docs/api/shopify-app-react-router/authenticate/admin)