Manage in-store pickup addresses offered at checkout
/admin/api/pickup-locations
List every pickup location ordered by `sort_order` ascending then `id`. Disabled locations are included so the merchant can re-enable them; the storefront only offers enabled locations at checkout.
/admin/api/pickup-locations
Create a pickup location. New locations default to enabled and to a sort_order chosen by the server. Use the PUT endpoint to change ordering or enabled state.
/admin/api/pickup-locations/{id}
Replace every field on the pickup location. The body must include `enabled` and `sort_order`; both are required (unlike on POST, where the server picks defaults).
/admin/api/pickup-locations/{id}
Delete a pickup location. Orders that referenced this location keep their copied shipping address — the foreign key is set to NULL via `ON DELETE SET NULL`.
/admin/api/pickup-locations
List every pickup location ordered by `sort_order` ascending then `id`. Disabled locations are included so the merchant can re-enable them; the storefront only offers enabled locations at checkout.
[
{
"id": 1,
"name": "Sofia – Vitosha Blvd store",
"line1": "Vitosha Blvd 25",
"line2": null,
"city": "Sofia",
"state": null,
"postal_code": "1000",
"country": "BG",
"phone": "+359 2 123 4567",
"hours": "Mon–Sat 10:00–20:00",
"instructions": "Ring the bell at the side entrance.",
"enabled": true,
"sort_order": 0,
"created_at": "2026-04-25T10:00:00Z",
"updated_at": "2026-04-25T10:00:00Z"
}
]
curl "https://yourshop.zeroshop.io/admin/api/pickup-locations" \
-H "Authorization: Bearer zspat_..."
import requests
resp = requests.get(
"https://yourshop.zeroshop.io/admin/api/pickup-locations",
headers={"Authorization": "Bearer zspat_..."}
)
locations = resp.json()
const resp = await fetch("https://yourshop.zeroshop.io/admin/api/pickup-locations", {
headers: { "Authorization": "Bearer zspat_..." }
});
const locations = await resp.json();
require "net/http"
require "json"
uri = URI("https://yourshop.zeroshop.io/admin/api/pickup-locations")
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer zspat_..."
resp = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
locations = JSON.parse(resp.body)
/admin/api/pickup-locations
Create a pickup location. New locations default to enabled and to a sort_order chosen by the server. Use the PUT endpoint to change ordering or enabled state.
{
"name": "Sofia – Vitosha Blvd store",
"line1": "Vitosha Blvd 25",
"line2": null,
"city": "Sofia",
"state": null,
"postal_code": "1000",
"country": "BG",
"phone": "+359 2 123 4567",
"hours": "Mon–Sat 10:00–20:00",
"instructions": "Ring the bell at the side entrance."
}
{
"id": 1,
"name": "Sofia – Vitosha Blvd store",
"line1": "Vitosha Blvd 25",
"line2": null,
"city": "Sofia",
"state": null,
"postal_code": "1000",
"country": "BG",
"phone": "+359 2 123 4567",
"hours": "Mon–Sat 10:00–20:00",
"instructions": "Ring the bell at the side entrance.",
"enabled": true,
"sort_order": 0,
"created_at": "2026-04-25T10:00:00Z",
"updated_at": "2026-04-25T10:00:00Z"
}
curl -X POST "https://yourshop.zeroshop.io/admin/api/pickup-locations" \
-H "Authorization: Bearer zspat_..." \
-H "Content-Type: application/json" \
-d '{
"name": "Sofia – Vitosha Blvd store",
"line1": "Vitosha Blvd 25",
"city": "Sofia",
"postal_code": "1000",
"country": "BG"
}'
import requests
resp = requests.post(
"https://yourshop.zeroshop.io/admin/api/pickup-locations",
headers={"Authorization": "Bearer zspat_..."},
json={
"name": "Sofia – Vitosha Blvd store",
"line1": "Vitosha Blvd 25",
"city": "Sofia",
"postal_code": "1000",
"country": "BG"
}
)
location = resp.json()
const resp = await fetch("https://yourshop.zeroshop.io/admin/api/pickup-locations", {
method: "POST",
headers: {
"Authorization": "Bearer zspat_...",
"Content-Type": "application/json"
},
body: JSON.stringify({
name: "Sofia – Vitosha Blvd store",
line1: "Vitosha Blvd 25",
city: "Sofia",
postal_code: "1000",
country: "BG"
})
});
const location = await resp.json();
require "net/http"
require "json"
uri = URI("https://yourshop.zeroshop.io/admin/api/pickup-locations")
req = Net::HTTP::Post.new(uri)
req["Authorization"] = "Bearer zspat_..."
req["Content-Type"] = "application/json"
req.body = {
name: "Sofia – Vitosha Blvd store",
line1: "Vitosha Blvd 25",
city: "Sofia",
postal_code: "1000",
country: "BG"
}.to_json
resp = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
location = JSON.parse(resp.body)
/admin/api/pickup-locations/{id}
Replace every field on the pickup location. The body must include `enabled` and `sort_order`; both are required (unlike on POST, where the server picks defaults).
{
"name": "Sofia – Vitosha Blvd store",
"line1": "Vitosha Blvd 25",
"city": "Sofia",
"postal_code": "1000",
"country": "BG",
"enabled": true,
"sort_order": 1
}
curl -X PUT "https://yourshop.zeroshop.io/admin/api/pickup-locations/1" \
-H "Authorization: Bearer zspat_..." \
-H "Content-Type: application/json" \
-d '{
"name": "Sofia – Vitosha Blvd store",
"line1": "Vitosha Blvd 25",
"city": "Sofia",
"postal_code": "1000",
"country": "BG",
"enabled": true,
"sort_order": 1
}'
import requests
resp = requests.put(
"https://yourshop.zeroshop.io/admin/api/pickup-locations/1",
headers={"Authorization": "Bearer zspat_..."},
json={
"name": "Sofia – Vitosha Blvd store",
"line1": "Vitosha Blvd 25",
"city": "Sofia",
"postal_code": "1000",
"country": "BG",
"enabled": True,
"sort_order": 1
}
)
assert resp.status_code == 204
await fetch("https://yourshop.zeroshop.io/admin/api/pickup-locations/1", {
method: "PUT",
headers: {
"Authorization": "Bearer zspat_...",
"Content-Type": "application/json"
},
body: JSON.stringify({
name: "Sofia – Vitosha Blvd store",
line1: "Vitosha Blvd 25",
city: "Sofia",
postal_code: "1000",
country: "BG",
enabled: true,
sort_order: 1
})
});
require "net/http"
require "json"
uri = URI("https://yourshop.zeroshop.io/admin/api/pickup-locations/1")
req = Net::HTTP::Put.new(uri)
req["Authorization"] = "Bearer zspat_..."
req["Content-Type"] = "application/json"
req.body = {
name: "Sofia – Vitosha Blvd store",
line1: "Vitosha Blvd 25",
city: "Sofia",
postal_code: "1000",
country: "BG",
enabled: true,
sort_order: 1
}.to_json
Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
/admin/api/pickup-locations/{id}
Delete a pickup location. Orders that referenced this location keep their copied shipping address — the foreign key is set to NULL via `ON DELETE SET NULL`.
curl -X DELETE "https://yourshop.zeroshop.io/admin/api/pickup-locations/1" \
-H "Authorization: Bearer zspat_..."
import requests
requests.delete(
"https://yourshop.zeroshop.io/admin/api/pickup-locations/1",
headers={"Authorization": "Bearer zspat_..."}
)
await fetch("https://yourshop.zeroshop.io/admin/api/pickup-locations/1", {
method: "DELETE",
headers: { "Authorization": "Bearer zspat_..." }
});
require "net/http"
uri = URI("https://yourshop.zeroshop.io/admin/api/pickup-locations/1")
req = Net::HTTP::Delete.new(uri)
req["Authorization"] = "Bearer zspat_..."
Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
We value your privacy
We use cookies for essential site functionality and, with your consent, analytics to understand how our platform is used. No personal data is shared with third parties. See our Privacy Policy for details.