GraphQL Admin API 2026-10 / New feature

Return policy profiles
Read per-market return rules as structured data

Instead of reading return policy text, apps can now fetch rules such as the return window for each market through the API. Profiles take precedence over the store's return policy text. They're read-only through the API.

On this page
  1. What's changing (in 30 seconds)
  2. How it works: profiles and markets
  3. New APIs
  4. Required access scopes
  5. Behaviors to watch for when implementing
  6. What's not included and what your app needs to handle
  7. 5 key points for developers
  8. 3 practical use cases
  9. One-line summary for proposals

1What's changing

Starting with API version 2026-10 , the GraphQL Admin API lets you read return policy profiles (ReturnPolicyProfile) .
A profile is a set of return rules assigned to markets, and ittakes precedence over the store's return policy text. Apps can retrieve each market's return rules, such as the length of the return window, as structured data.

Before: policies were text

Shop.shopPolicies 's REFUND_POLICY and similar fields were the only way to read return conditions, as plain text.

After: rules are structured data

You can retrieve each market's return rules field by field. To set different return rules for different markets, you need to use profiles.

2How it works: profiles and markets

Default profile Unnamed ยท one per store Applies to all markets without a named profile Named profiles Carve out markets that need different terms ๐Ÿ”’ For Managed Markets EU Provided and locked by Shopify Applies when no profile is assigned Assign via marketCreate / marketUpdate Can't be assigned to other markets Market (unassigned) Market (unassigned) Market (named assignment) EU market Market. returnPolicyProfile Only the directly assigned profile is returned Unassigned โ†’ null (hierarchy is not resolved)
1 profile = 1 rule set

Can be referenced by any market

A profile is the unit for configuring return rules, and it's what markets are linked to.

Watch the scope of impact

Edits apply to every market that references it

Editing a profile changes the return terms for every market that references it.

EU regulations

The EU profile for Managed Markets is locked

It's locked so return terms never fall below the minimum standard. Apps can read it but can't assign it to other markets.

3New APIs

TypeNameDescription
Query returnPolicyProfile Returns a single profile by ID
Query returnPolicyProfiles Returns the store's list of profiles.default An argument lets you filter by whether a profile is the default
Field Market.returnPolicyProfile The profile directly assigned to the market (null if none)
Mutation input marketCreate / marketUpdate Assigns a profile when creating or updating a market. Updates can also remove the assignment (see each reference for input fields)

4Required access scopes

Read: read_legal_policies

Required to read profiles (includingMarket 's returnPolicyProfile field).

Assign: write_markets

Assigning or unassigning a profile to a market counts as editing the market.

Apps that both read and assign profiles should requestboth scopes.

5Behaviors to watch for when implementing

What null means โ‘ 

Market.returnPolicyProfile is null

Means no profile is directly assigned to that market. The market hierarchy is not resolved.

Meaning of null โ‘ก

returnRules / editRules is null

This doesn't mean missing data โ€” it means the rule is OFF .returnRules is null in a profile, customers can make returns without restrictions.

Change detection

updatedAt is an aggregate value

It isn't a value stored on the profile row itself; it's aggregated across the profile and all its rules. It advances whenever any part of the policy changes.

user error

Two cases that return errors

โ‘  Specifying both assign and unassign in the same market update request โ‘ก Assigning a Shopify-provided Managed Markets profile to a market.

6What's not included and what apps need to do

There are no mutations for the profiles themselves.Create, update, and delete happen in the Shopify admin; the API is read-only.
1

No required changes

Existing queries that read the policy body keep working as-is.

2

Migrate off REFUND_POLICY

Shop.shopPolicies 's REFUND_POLICY : if you read return conditions from it, move to returnPolicyProfiles instead.

3

Use profiles for per-market rules

To represent return rules that differ by market, you need to use profiles.

75 key points for developers

null โ‰  empty

1. Read "null" two different ways

Market.returnPolicyProfile null means "no direct assignment."returnRules null means "rule OFF = returns allowed without restrictions." Treating either as "no data" leads to incorrect display.

2. Hierarchy resolution is the app's responsibility

The API doesn't resolve the market hierarchy. Since unassigned markets fall back to the default profile, to show the effective rule, use returnPolicyProfiles(default: ...) to fetch the default and fill the gap.

3. Invalidate caches using updatedAt as the key

It's an aggregate that advances even when rules under the profile change, so it works as a change-detection key. Also keep in mind that editing a profile affects every market that references it.

4. The API is read-only, plus assignment

Profile CRUD is admin-only. All an app can do is use marketCreate / marketUpdate to assign and unassign (write_markets).

5. Block operations that cause user errors up front

the same marketUpdate โ€” don't send assignments and unassignments together. Exclude Managed Markets' locked EU profiles from the assignment options in your UI.

8Three practical use cases

USE CASE 1

Correctly determine per-market return windows in return apps and return portals

Challenge
The returns app relies on REFUND_POLICY text or custom settings, so it can't reflect return conditions that differ by market.
Approach
returnPolicyProfiles and Market.returnPolicyProfile to fetch each market's rules and use them to decide whether a return is eligible.
Impact
The app's decisions match the rules configured in the admin, eliminating duplicate management.
Tech notes
read_legal_policies is required.returnRules is null, treat it as "no limit." For markets with no direct assignment (null), fall back to the default profile.
EU
USE CASE 2

Assigning return rules when automating market setup for cross-border stores

Challenge
There's an ops tool for creating markets during international expansion, but linking return conditions is manual and easy to miss.
Approach
Set up named profiles in the admin โ†’ from the tool, use marketCreate / marketUpdate to assign the relevant profile.
Impact
Return conditions are locked in as soon as a market is added, preventing missed settings.
Tech notes
write_markets is required. Don't mix assignments and unassignments in the same request. Managed Markets EU profiles can't be assigned (user error), so exclude them from the options.
USE CASE 3

List return conditions by market and detect changes

Challenge
Ops and CS teams have a hard time seeing which return conditions apply to which market. It's also easy to miss that editing one profile affects multiple markets.
Approach
Periodically fetch profiles and their market assignments into a list, and send a notification whenupdatedAt changes.
Impact
Current return conditions and any changes become visible, making CS responses and internal checks easier.
Tech notes
updatedAt is an aggregate value that also advances on rule changes, so it works as a change-detection key. Webhooks aren't mentioned.

9One-line summary for proposals

"Starting with API 2026-10, per-market return rules can be read as structured data via the GraphQL Admin API.
Existing apps don't need changes, but handling per-market return conditions requires migrating to profiles.
The API is read-only; the only action apps can take is assigning profiles to markets."