---
title: Fulfillment Service
description: Contains functions for verifying fulfillment service requests.
api_version: v1
source_url:
  html: >-
    https://shopify.dev/docs/api/shopify-app-react-router/latest/authenticate/fulfillment-service
  md: >-
    https://shopify.dev/docs/api/shopify-app-react-router/latest/authenticate/fulfillment-service.md
---

# Fulfillment Service

Contains functions for verifying fulfillment service requests.

See the [fulfillment service documentation](https://shopify.dev/docs/apps/fulfillment/fulfillment-service-apps) for more information.

## authenticate.​fulfillment​Service(**[request](#authenticatefulfillmentservice-propertydetail-request)**​)

Verifies requests coming from Shopify to fulfillment service apps.

### Parameters

* **request**

  **Request**

  **required**

### Returns

* **Promise\<FulfillmentServiceContext>**

### FulfillmentServiceContext

* admin

  An admin context for the fulfillment service request. Returned only if there is a session for the shop.

  ```ts
  AdminApiContext
  ```

* payload

  The payload from the fulfillment service request.

  ```ts
  FulfillmentServicePayload
  ```

* session

  A session with an offline token for the shop. Returned only if there is a session for the shop.

  ```ts
  unknown
  ```

### 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<AdminOperations>
  ```

### GraphQLClient

* query

  ```ts
  Operation extends keyof Operations
  ```

* options

  ```ts
  GraphQLQueryOptions<Operation, Operations>
  ```

returns

```ts
interface Promise<T> {
    /**
     * Attaches callbacks for the resolution and/or rejection of the Promise.
     * @param onfulfilled The callback to execute when the Promise is resolved.
     * @param onrejected The callback to execute when the Promise is rejected.
     * @returns A Promise for the completion of which ever callback is executed.
     */
    then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null): Promise<TResult1 | TResult2>;

    /**
     * Attaches a callback for only the rejection of the Promise.
     * @param onrejected The callback to execute when the Promise is rejected.
     * @returns A Promise for the completion of the callback.
     */
    catch<TResult = never>(onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | undefined | null): Promise<T | TResult>;
}, interface Promise<T> {}, Promise: PromiseConstructor, interface Promise<T> {
    readonly [Symbol.toStringTag]: string;
}, interface Promise<T> {
    /**
     * Attaches a callback that is invoked when the Promise is settled (fulfilled or rejected). The
     * resolved value cannot be modified from the callback.
     * @param onfinally The callback to execute when the Promise is settled (fulfilled or rejected).
     * @returns A Promise for the completion of the callback.
     */
    finally(onfinally?: (() => void) | undefined | null): Promise<T>;
}
```

### GraphQLQueryOptions

* apiVersion

  The version of the API to use for the request.

  ```ts
  unknown
  ```

* headers

  Additional headers to include in the request.

  ```ts
  Record<string, any>
  ```

* signal

  An optional AbortSignal to cancel the request.

  ```ts
  AbortSignal
  ```

* tries

  The total number of times to try the request if it fails.

  ```ts
  number
  ```

* variables

  The variables to pass to the operation.

  ```ts
  ApiClientRequestOptions<Operation, Operations>
  ```

### FulfillmentServicePayload

```ts
Record<string, any> & {
  kind: string;
}
```

Examples

### Examples

* ####

  ##### Description

  Handle a fulfillment service notification call

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

  ```ts
  import {type ActionFunctionArgs} from 'react-router';

  import {authenticate} from '../shopify.server';

  export const action = async ({request}: ActionFunctionArgs) => {
    const {admin, payload} = await authenticate.fulfillmentService(request);

    const kind = payload.kind;

    if (kind === 'FULFILLMENT_REQUEST') {
      const response = await admin?.graphql(
        `#graphql
           query {
             shop {
               assignedFulfillmentOrders(first: 10, assignmentStatus: FULFILLMENT_REQUESTED) {
                 edges {
                   node {
                     id
                     destination {
                     firstName
                     lastName
                   }
                   lineItems(first: 10) {
                     edges {
                       node {
                       id
                       productTitle
                       sku
                       remainingQuantity
                     }
                   }
                 }
                 merchantRequests(first: 10, kind: FULFILLMENT_REQUEST) {
                   edges {
                     node {
                       message
                     }
                   }
                 }
               }
             }
           }
         }
        }`,
      );

      const fulfillments = await response.json();
      console.log(fulfillments);
    }

    return new Response();
  };
  ```

* ####

  ##### Description

  Use the session associated with this request to use the Admin GraphQL API

  ##### /app/routes/fulfillment\_order\_notification.ts

  ```ts
  import { ActionFunctionArgs } from "react-router";
  import { authenticate } from "../shopify.server";

  export async function action({ request }: ActionFunctionArgs) {
    const { admin, session } = await authenticate.fulfillmentService(request);

    console.log(session.id)

    return new Response();
  }
  ```

* ####

  ##### Description

  Get the request's POST payload.

  ##### Example

  ```ts
  /app/routes/fulfillment_order_notification.ts
  import { ActionFunction } from "react-router";
  import { authenticate } from "../shopify.server";

  export const action: ActionFunction = async ({ request }) => {
    const { payload } = await authenticate.fulfillmentService(request);
    if(payload.kind === 'FULFILLMENT_REQUEST') {
     // handle fulfillment request
    } else if (payload.kind === 'CANCELLATION_REQUEST') {
     // handle cancellation request
    };
  return new Response();
  ```

* ####

  ##### Description

  Use the session associated with this request.

  ##### /app/routes/fulfillment\_service\_notification.tsx

  ```ts
  import { ActionFunctionArgs } from "react-router";
  import { authenticate } from "../shopify.server";

  export const action = async ({ request }: ActionFunctionArgs) => {
    const { session, admin } = await authenticate.fulfillmentService(request);

    console.log(session.id)

    return new Response();
  };
  ```

***

## Related

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

[Receive fulfillment requests and cancellations. - Manage Fulfillments](https://shopify.dev/docs/apps/fulfillment/fulfillment-service-apps/manage-fulfillments)

***
