---
title: Unauthenticated admin
description: >-
  Allows interacting with the Admin API on requests that didn't come from
  Shopify.
api_version: v1
source_url:
  html: >-
    https://shopify.dev/docs/api/shopify-app-remix/v1/unauthenticated/unauthenticated-admin
  md: >-
    https://shopify.dev/docs/api/shopify-app-remix/v1/unauthenticated/unauthenticated-admin.md
api_name: shopify-app-remix
---

# Unauthenticated admin

Allows interacting with the Admin API on requests that didn't come from Shopify.

**Caution:**

This should only be used for Requests that do not originate from Shopify. You must do your own authentication before using this method. This function doesn't perform **any** validation and shouldn't rely on unvalidated user input.

## unauthenticated.​admin(**[shop](#unauthenticatedadmin-propertydetail-shop)**​)

Creates an unauthenticated Admin context.

### Parameters

* **shop**

  **string**

  **required**

### Returns

* **Promise\<UnauthenticatedAdminContext\<Resources>>**

### UnauthenticatedAdminContext

* admin

  Methods for interacting with the GraphQL / REST Admin APIs for the given store.

  ```ts
  AdminApiContext<Resources>
  ```

* session

  The session for the given shop. This comes from the session storage which \`shopifyApp\` uses to store sessions in your database of choice. This will always be an offline session. You can use to get shop-specific data.

  ```ts
  Session
  ```

### AdminApiContext

Provides utilities that apps can use to make requests to the Admin API.

* graphql

  Methods for interacting with the Shopify Admin GraphQL API

  ```ts
  GraphQLClient
  ```

* rest

  Methods for interacting with the Shopify Admin REST API There are methods for interacting with individual REST resources. You can also make \`GET\`, \`POST\`, \`PUT\` and \`DELETE\` requests should the REST resources not meet your needs.

  ```ts
  RestClientWithResources<Resources>
  ```

### GraphQLClient

* query

  ```ts
  string
  ```

* options

  ```ts
  GraphQLQueryOptions
  ```

returns

```ts
Promise<Response>
```

### GraphQLQueryOptions

* apiVersion

  ```ts
  ApiVersion
  ```

* headers

  ```ts
  { [key: string]: any; }
  ```

* tries

  ```ts
  number
  ```

* variables

  ```ts
  QueryVariables
  ```

### QueryVariables

* \[key: string]

  ```ts
  any
  ```

### RestClientWithResources

```ts
RemixRestClient & {resources: Resources}
```

### RemixRestClient

* session

  ```ts
  Session
  ```

* get

  Performs a GET request on the given path.

  ```ts
  (params: GetRequestParams) => Promise<Response>
  ```

* post

  Performs a POST request on the given path.

  ```ts
  (params: PostRequestParams) => Promise<Response>
  ```

* put

  Performs a PUT request on the given path.

  ```ts
  (params: PostRequestParams) => Promise<Response>
  ```

* delete

  Performs a DELETE request on the given path.

  ```ts
  (params: GetRequestParams) => Promise<Response>
  ```

Examples

### Examples

* ####

  ##### Description

  Get your app's shop-specific data using the returned offline \`session\` object.

  ##### /app/routes/\*\*\\/\*.ts

  ```ts
  import { LoaderArgs, json } from "@remix-run/node";
  import { unauthenticated } from "../shopify.server";
  import { getMyAppData } from "~/db/model.server";

  export const loader = async ({ request }: LoaderArgs) => {
    const shop = getShopFromExternalRequest(request);
    const { session } = await unauthenticated.admin(shop);
    return json(await getMyAppData({shop: session.shop));
  };
  ```

* ####

  ##### Description

  Use \`admin.graphql\` to make query / mutation requests.

  ##### Example

  ```ts
  import { ActionArgs } from "@remix-run/node";
  import { authenticate } from "../shopify.server";

  export async function action({ request }: ActionArgs) {
    const { admin } = await authenticate.admin(request);

    const response = await admin.graphql(
      `#graphql
      mutation populateProduct($input: ProductInput!) {
        productCreate(input: $input) {
          product {
            id
          }
        }
      }`,
      { variables: { input: { title: "Product Name" } } }
    );

    const productData = await response.json();
    return json({ data: productData.data });
  }
  ```

* #### Using REST resources

  ##### Description

  Getting the number of orders in a store using REST resources.

  ##### /app/shopify.server.ts

  ```ts
  import { shopifyApp } from "@shopify/shopify-app-remix/server";
  import { restResources } from "@shopify/shopify-api/rest/admin/2023-07";

  const shopify = shopifyApp({
    restResources,
    // ...etc
  });
  export default shopify;
  export const authenticate = shopify.authenticate;
  ```

  ##### /app/routes/\*\*\\/\*.ts

  ```ts
  import { LoaderArgs, json } from "@remix-run/node";
  import { authenticate } from "../shopify.server";

  export const loader = async ({ request }: LoaderArgs) => {
    const { admin, session } = await authenticate.admin(request);
    return json(admin.rest.resources.Order.count({ session }));
  };
  ```

* #### Performing a GET request to the REST API

  ##### Description

  Use \`admin.rest.\&lt;method\&gt;\` to make custom requests to the API.

  ##### /app/shopify.server.ts

  ```ts
  import { shopifyApp } from "@shopify/shopify-app-remix/server";
  import { restResources } from "@shopify/shopify-api/rest/admin/2023-04";

  const shopify = shopifyApp({
    restResources,
    // ...etc
  });
  export default shopify;
  export const authenticate = shopify.authenticate;
  ```

  ##### /app/routes/\*\*\\/\*.ts

  ```ts
  import { LoaderArgs, json } from "@remix-run/node";
  import { authenticate } from "../shopify.server";

  export const loader = async ({ request }: LoaderArgs) => {
    const { admin, session } = await authenticate.admin(request);
    const response = await admin.rest.get({ path: "/customers/count.json" });
    const customers = await response.json();
    return json({ customers });
  };
  ```

***

## Related

[Interact with the Admin API. - API context](https://shopify.dev/docs/api/shopify-app-remix/v1/apis/admin-api)

***
