Customer Portal
Proxy GraphQL queries to Shopify Customer Account API
Executes GraphQL queries against Shopify’s Customer Account API on behalf of the authenticated customer. This endpoint handles token management, refresh, and authentication automatically.
What you can query:
- Customer profile information
- Order history and details
- Saved addresses
- Payment methods
- Subscriptions (via Customer Account API schema)
Token Management:
- Automatically uses stored access token
- Refreshes expired tokens automatically
- Returns 401 if customer needs to re-authenticate
Example Queries:
query {
customer {
id
emailAddress { emailAddress }
defaultAddress { address1 city }
}
}
Authentication: Customer must be logged in and have completed OAuth flow
POST
/
subscriptions
/
cp
/
api
/
customer-account-api
/
graphql
Proxy GraphQL queries to Shopify Customer Account API
curl --request POST \
--url https://www.myshop.com/apps/subscriptions/cp/api/customer-account-api/graphql \
--header 'Content-Type: application/json' \
--data '
{
"query": "query { customer { id emailAddress { emailAddress } } }",
"variables": {}
}
'import requests
url = "https://www.myshop.com/apps/subscriptions/cp/api/customer-account-api/graphql"
payload = {
"query": "query { customer { id emailAddress { emailAddress } } }",
"variables": {}
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
query: 'query { customer { id emailAddress { emailAddress } } }',
variables: {}
})
};
fetch('https://www.myshop.com/apps/subscriptions/cp/api/customer-account-api/graphql', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));const url = 'https://www.myshop.com/apps/subscriptions/cp/api/customer-account-api/graphql';
const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
query: 'query { customer { id emailAddress { emailAddress } } }',
variables: {}
})
};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://www.myshop.com/apps/subscriptions/cp/api/customer-account-api/graphql",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'query' => 'query { customer { id emailAddress { emailAddress } } }',
'variables' => [
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://www.myshop.com/apps/subscriptions/cp/api/customer-account-api/graphql"
payload := strings.NewReader("{\n \"query\": \"query { customer { id emailAddress { emailAddress } } }\",\n \"variables\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}require 'uri'
require 'net/http'
url = URI("https://www.myshop.com/apps/subscriptions/cp/api/customer-account-api/graphql")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"query\": \"query { customer { id emailAddress { emailAddress } } }\",\n \"variables\": {}\n}"
response = http.request(request)
puts response.read_body{
"data": {
"customer": {
"emailAddress": {
"emailAddress": "customer@example.com"
},
"id": "gid://shopify/Customer/123"
}
}
}{}{
"error": "no_valid_token",
"message": "Customer needs to authenticate"
}Add a line item to a specific section of a contract
Previous
Initiate Customer Account API OAuth flow
Next
⌘I
Proxy GraphQL queries to Shopify Customer Account API
curl --request POST \
--url https://www.myshop.com/apps/subscriptions/cp/api/customer-account-api/graphql \
--header 'Content-Type: application/json' \
--data '
{
"query": "query { customer { id emailAddress { emailAddress } } }",
"variables": {}
}
'import requests
url = "https://www.myshop.com/apps/subscriptions/cp/api/customer-account-api/graphql"
payload = {
"query": "query { customer { id emailAddress { emailAddress } } }",
"variables": {}
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
query: 'query { customer { id emailAddress { emailAddress } } }',
variables: {}
})
};
fetch('https://www.myshop.com/apps/subscriptions/cp/api/customer-account-api/graphql', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));const url = 'https://www.myshop.com/apps/subscriptions/cp/api/customer-account-api/graphql';
const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
query: 'query { customer { id emailAddress { emailAddress } } }',
variables: {}
})
};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://www.myshop.com/apps/subscriptions/cp/api/customer-account-api/graphql",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'query' => 'query { customer { id emailAddress { emailAddress } } }',
'variables' => [
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://www.myshop.com/apps/subscriptions/cp/api/customer-account-api/graphql"
payload := strings.NewReader("{\n \"query\": \"query { customer { id emailAddress { emailAddress } } }\",\n \"variables\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}require 'uri'
require 'net/http'
url = URI("https://www.myshop.com/apps/subscriptions/cp/api/customer-account-api/graphql")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"query\": \"query { customer { id emailAddress { emailAddress } } }\",\n \"variables\": {}\n}"
response = http.request(request)
puts response.read_body{
"data": {
"customer": {
"emailAddress": {
"emailAddress": "customer@example.com"
},
"id": "gid://shopify/Customer/123"
}
}
}{}{
"error": "no_valid_token",
"message": "Customer needs to authenticate"
}