Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.
get_api_artifactsOne API's artifacts, grouped by type.
get_openapiThe primary OpenAPI for this API.
find_similar_apisAPIs that look like this one.
apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
resolveTurn a domain, URL or GitHub org into the provider it belongs to.
find_cohortsEvery scored population of providers in the catalog.
All 92 tools →
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/squarespace-contacts-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no email required.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Commerce Contacts API
version: '2'
description: 'Manage customer contacts and address book entries for a website: create, read, update, delete, and query contacts; maintain addresses for shipping and fulfillment.'
servers:
- url: https://api.squarespace.com
description: Commerce API
security:
- Authorization: []
tags:
- description: 'Manage customer contacts and address book entries for a website: create, read, update, delete, and query contacts; maintain addresses for shipping and fulfillment.'
name: Contacts
x-zudoku-collapsed: true
paths:
/v1/contacts:
get:
description: Returns a paginated list of contacts for the website. Requires OAuth website scope website.contacts.read or website.contacts, or API key scope CONTACT_READONLY or CONTACT, or OAuth website scope website.profiles.read or website.profiles (OAuth only).
operationId: getContacts
parameters:
- description: number of contacts to retrieve per request
in: query
name: pageSize
required: false
schema:
maximum: 1000
minimum: 0
type: integer
format: int32
default: 50
- description: where next page of results begins. should be {pagination.nextPageCursor} from previous response.
in: query
name: cursor
required: false
schema:
type: string
- in: header
name: Authorization
required: true
description: API key or OAuth access token
schema:
type: string
default: Bearer YOUR_API_KEY_OR_OAUTH_TOKEN
- in: header
name: User-Agent
required: true
description: User Agent
schema:
type: string
default: YOUR_CUSTOM_APP_DESCRIPTION
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedGetContactsResponse'
description: A paginated list of contacts.
'400':
content:
application/json:
schema:
$ref: '#/components/schemas/StandardErrorPayload'
description: 'Invalid pagination parameters: page size out of range or cursor not from a previous response.'
'403':
content:
application/json:
schema:
$ref: '#/components/schemas/StandardErrorPayload'
description: Forbidden. Insufficient scope (OAuth or API key), or the requested resource is not accessible for the authenticated website.
'429':
content:
application/json:
schema:
$ref: '#/components/schemas/StandardErrorPayload'
description: Too many requests. The rate limit for this endpoint has been exceeded.
summary: List contacts
tags:
- Contacts
post:
description: Creates a new contact. Requires OAuth website scope website.contacts, or API key scope CONTACT, or OAuth website scope website.profiles (OAuth only).
operationId: createContact
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/CreateContactRequest'
description: The contact to create.
required: true
responses:
'201':
content:
application/json:
schema:
$ref: '#/components/schemas/CreateContactResponse'
description: The created contact.
'400':
content:
application/json:
schema:
$ref: '#/components/schemas/StandardErrorPayload'
description: Invalid input or malformed JSON.
'403':
content:
application/json:
schema:
$ref: '#/components/schemas/StandardErrorPayload'
description: Forbidden. Insufficient scope (OAuth or API key), or the requested resource is not accessible for the authenticated website.
'409':
content:
application/json:
schema:
$ref: '#/components/schemas/StandardErrorPayload'
description: A contact with the same unique fields already exists.
'429':
content:
application/json:
schema:
$ref: '#/components/schemas/StandardErrorPayload'
description: Too many requests. The rate limit for this endpoint has been exceeded.
summary: Create contact
tags:
- Contacts
parameters:
- in: header
name: Authorization
required: true
description: API key or OAuth access token
schema:
type: string
default: Bearer YOUR_API_KEY_OR_OAUTH_TOKEN
- in: header
name: User-Agent
required: true
description: User Agent
schema:
type: string
default: YOUR_CUSTOM_APP_DESCRIPTION
/v1/contacts/query:
post:
description: Returns a paginated list of contacts matching filters and sort options in the request body. Requires OAuth website scope website.contacts.read or website.contacts, or API key scope CONTACT_READONLY or CONTACT, or OAuth website scope website.profiles.read or website.profiles (OAuth only).
operationId: queryContacts
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/QueryContactsRequest'
description: Filters and sort order for the contact query.
required: true
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedQueryContactsResponse'
description: A paginated list of contacts matching the query.
'400':
content:
application/json:
schema:
$ref: '#/components/schemas/StandardErrorPayload'
description: Invalid input or malformed JSON.
'403':
content:
application/json:
schema:
$ref: '#/components/schemas/StandardErrorPayload'
description: Forbidden. Insufficient scope (OAuth or API key), or the requested resource is not accessible for the authenticated website.
'429':
content:
application/json:
schema:
$ref: '#/components/schemas/StandardErrorPayload'
description: Too many requests. The rate limit for this endpoint has been exceeded.
summary: Query contacts
tags:
- Contacts
parameters:
- in: header
name: Authorization
required: true
description: API key or OAuth access token
schema:
type: string
default: Bearer YOUR_API_KEY_OR_OAUTH_TOKEN
- in: header
name: User-Agent
required: true
description: User Agent
schema:
type: string
default: YOUR_CUSTOM_APP_DESCRIPTION
/v1/contacts/{contactId}:
delete:
description: Deletes the contact for the given contact ID. Requires OAuth website scope website.contacts, or API key scope CONTACT, or OAuth website scope website.profiles (OAuth only).
operationId: deleteContact
parameters:
- description: The contact's ID.
in: path
name: contactId
required: true
schema:
type: string
examples:
default:
value: 64a7e3d2c8f1b95e30a14d2b
- in: header
name: Authorization
required: true
description: API key or OAuth access token
schema:
type: string
default: Bearer YOUR_API_KEY_OR_OAUTH_TOKEN
- in: header
name: User-Agent
required: true
description: User Agent
schema:
type: string
default: YOUR_CUSTOM_APP_DESCRIPTION
responses:
'204':
description: No content.
'403':
content:
application/json:
schema:
$ref: '#/components/schemas/StandardErrorPayload'
description: Forbidden. Insufficient scope (OAuth or API key), or the requested resource is not accessible for the authenticated website.
'404':
content:
application/json:
schema:
$ref: '#/components/schemas/StandardErrorPayload'
description: The contact was not found.
'429':
content:
application/json:
schema:
$ref: '#/components/schemas/StandardErrorPayload'
description: Too many requests. The rate limit for this endpoint has been exceeded.
summary: Delete contact
tags:
- Contacts
get:
description: Returns the contact for the given contact ID. Requires OAuth website scope website.contacts.read or website.contacts, or API key scope CONTACT_READONLY or CONTACT, or OAuth website scope website.profiles.read or website.profiles (OAuth only).
operationId: getContact
parameters:
- description: The contact's ID.
in: path
name: contactId
required: true
schema:
type: string
examples:
default:
value: 64a7e3d2c8f1b95e30a14d2b
- in: header
name: Authorization
required: true
description: API key or OAuth access token
schema:
type: string
default: Bearer YOUR_API_KEY_OR_OAUTH_TOKEN
- in: header
name: User-Agent
required: true
description: User Agent
schema:
type: string
default: YOUR_CUSTOM_APP_DESCRIPTION
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/GetContactResponse'
description: The requested contact.
'403':
content:
application/json:
schema:
$ref: '#/components/schemas/StandardErrorPayload'
description: Forbidden. Insufficient scope (OAuth or API key), or the requested resource is not accessible for the authenticated website.
'404':
content:
application/json:
schema:
$ref: '#/components/schemas/StandardErrorPayload'
description: The contact was not found.
'429':
content:
application/json:
schema:
$ref: '#/components/schemas/StandardErrorPayload'
description: Too many requests. The rate limit for this endpoint has been exceeded.
summary: Get contact
tags:
- Contacts
patch:
description: Updates a contact using JSON merge patch. Requires OAuth website scope website.contacts, or API key scope CONTACT, or OAuth website scope website.profiles (OAuth only).
operationId: patchContact
parameters:
- description: The contact's ID.
in: path
name: contactId
required: true
schema:
type: string
examples:
default:
value: 64a7e3d2c8f1b95e30a14d2b
- in: header
name: Authorization
required: true
description: API key or OAuth access token
schema:
type: string
default: Bearer YOUR_API_KEY_OR_OAUTH_TOKEN
- in: header
name: User-Agent
required: true
description: User Agent
schema:
type: string
default: YOUR_CUSTOM_APP_DESCRIPTION
requestBody:
content:
application/merge-patch+json:
schema:
$ref: '#/components/schemas/PatchContactRequest'
description: Fields to update on the contact.
required: true
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/PatchContactResponse'
description: The updated contact.
'400':
content:
application/json:
schema:
$ref: '#/components/schemas/StandardErrorPayload'
description: Malformed syntax or invalid request body.
'403':
content:
application/json:
schema:
$ref: '#/components/schemas/StandardErrorPayload'
description: Forbidden. Insufficient scope (OAuth or API key), or the requested resource is not accessible for the authenticated website.
'404':
content:
application/json:
schema:
$ref: '#/components/schemas/StandardErrorPayload'
description: The contact was not found.
'409':
content:
application/json:
schema:
$ref: '#/components/schemas/StandardErrorPayload'
description: The email address is already associated with another contact.
'429':
content:
application/json:
schema:
$ref: '#/components/schemas/StandardErrorPayload'
description: Too many requests. The rate limit for this endpoint has been exceeded.
summary: Update contact
tags:
- Contacts
/v1/contacts/{contactId}/address-book:
get:
description: Returns paginated addresses for the contact. When there is at least one entry, exactly one is the default shipping address (defaultShippingAddressId and each entry's defaultShipping reflect this). The default shipping address (when present) is always included on the first page of results. Requires OAuth website scope website.contacts.read or website.contacts, or API key scope CONTACT_READONLY or CONTACT, or OAuth website scope website.profiles.read or website.profiles (OAuth only).
operationId: getAddressBook
parameters:
- description: The contact's ID.
in: path
name: contactId
required: true
schema:
type: string
examples:
default:
value: 64a7e3d2c8f1b95e30a14d2b
- description: number of contacts to retrieve per request
in: query
name: pageSize
required: false
schema:
maximum: 1000
minimum: 0
type: integer
format: int32
default: 50
- description: where next page of results begins. should be {pagination.nextPageCursor} from previous response.
in: query
name: cursor
required: false
schema:
type: string
- in: header
name: Authorization
required: true
description: API key or OAuth access token
schema:
type: string
default: Bearer YOUR_API_KEY_OR_OAUTH_TOKEN
- in: header
name: User-Agent
required: true
description: User Agent
schema:
type: string
default: YOUR_CUSTOM_APP_DESCRIPTION
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/GetAddressBookResponse'
description: Paginated list of the contact's addresses. When there is at least one entry, the first page always includes the default shipping address, and defaultShippingAddressId identifies it. On later pages, addressBookEntries is the next slice only; defaultShippingAddressId is present only when the default shipping entry appears in that slice.
'403':
content:
application/json:
schema:
$ref: '#/components/schemas/StandardErrorPayload'
description: Forbidden. Insufficient scope (OAuth or API key), or the requested resource is not accessible for the authenticated website.
'404':
content:
application/json:
schema:
$ref: '#/components/schemas/StandardErrorPayload'
description: The contact was not found.
'429':
content:
application/json:
schema:
$ref: '#/components/schemas/StandardErrorPayload'
description: Too many requests. The rate limit for this endpoint has been exceeded.
summary: Get address book
tags:
- Contacts
post:
description: Creates a new address book entry for the contact. If this is the contact's only address book entry after creation, it becomes the default shipping address even when defaultShipping is false. Requires OAuth website scope website.contacts, or API key scope CONTACT, or OAuth website scope website.profiles (OAuth only).
operationId: createAddressBookEntry
parameters:
- description: The contact's ID.
in: path
name: contactId
required: true
schema:
type: string
examples:
default:
value: 64a7e3d2c8f1b95e30a14d2b
- in: header
name: Authorization
required: true
description: API key or OAuth access token
schema:
type: string
default: Bearer YOUR_API_KEY_OR_OAUTH_TOKEN
- in: header
name: User-Agent
required: true
description: User Agent
schema:
type: string
default: YOUR_CUSTOM_APP_DESCRIPTION
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/CreateAddressBookEntryRequest'
description: The address book entry to create.
required: true
responses:
'201':
content:
application/json:
schema:
$ref: '#/components/schemas/CreateAddressBookEntryResponse'
description: The created address book entry.
'400':
content:
application/json:
schema:
$ref: '#/components/schemas/StandardErrorPayload'
description: Invalid input or malformed JSON.
'403':
content:
application/json:
schema:
$ref: '#/components/schemas/StandardErrorPayload'
description: Forbidden. Insufficient scope (OAuth or API key), or the requested resource is not accessible for the authenticated website.
'404':
content:
application/json:
schema:
$ref: '#/components/schemas/StandardErrorPayload'
description: The contact was not found.
'429':
content:
application/json:
schema:
$ref: '#/components/schemas/StandardErrorPayload'
description: Too many requests. The rate limit for this endpoint has been exceeded.
summary: Create address book entry
tags:
- Contacts
/v1/contacts/{contactId}/address-book/{addressBookEntryId}:
delete:
description: Deletes the address book entry for the contact. If the deleted entry was the default shipping address, another entry is assigned as the default. Requires OAuth website scope website.contacts, or API key scope CONTACT, or OAuth website scope website.profiles (OAuth only).
operationId: deleteAddressBookEntry
parameters:
- description: The contact's ID.
in: path
name: contactId
required: true
schema:
type: string
examples:
default:
value: 64a7e3d2c8f1b95e30a14d2b
- description: The address book entry's ID.
in: path
name: addressBookEntryId
required: true
schema:
type: string
examples:
default:
value: 5f8d0d55b54764421b7156aa
- in: header
name: Authorization
required: true
description: API key or OAuth access token
schema:
type: string
default: Bearer YOUR_API_KEY_OR_OAUTH_TOKEN
- in: header
name: User-Agent
required: true
description: User Agent
schema:
type: string
default: YOUR_CUSTOM_APP_DESCRIPTION
responses:
'204':
description: No content.
'403':
content:
application/json:
schema:
$ref: '#/components/schemas/StandardErrorPayload'
description: Forbidden. Insufficient scope (OAuth or API key), or the requested resource is not accessible for the authenticated website.
'404':
content:
application/json:
schema:
$ref: '#/components/schemas/StandardErrorPayload'
description: The contact or address book entry was not found.
'429':
content:
application/json:
schema:
$ref: '#/components/schemas/StandardErrorPayload'
description: Too many requests. The rate limit for this endpoint has been exceeded.
summary: Delete address book entry
tags:
- Contacts
get:
description: Returns a single address book entry for the contact. Requires OAuth website scope website.contacts.read or website.contacts, or API key scope CONTACT_READONLY or CONTACT, or OAuth website scope website.profiles.read or website.profiles (OAuth only).
operationId: getAddressBookEntry
parameters:
- description: The contact's ID.
in: path
name: contactId
required: true
schema:
type: string
examples:
default:
value: 64a7e3d2c8f1b95e30a14d2b
- description: The address book entry's ID.
in: path
name: addressBookEntryId
required: true
schema:
type: string
examples:
default:
value: 5f8d0d55b54764421b7156aa
- in: header
name: Authorization
required: true
description: API key or OAuth access token
schema:
type: string
default: Bearer YOUR_API_KEY_OR_OAUTH_TOKEN
- in: header
name: User-Agent
required: true
description: User Agent
schema:
type: string
default: YOUR_CUSTOM_APP_DESCRIPTION
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/GetAddressBookEntryResponse'
description: The requested address book entry.
'403':
content:
application/json:
schema:
$ref: '#/components/schemas/StandardErrorPayload'
description: Forbidden. Insufficient scope (OAuth or API key), or the requested resource is not accessible for the authenticated website.
'404':
content:
application/json:
schema:
$ref: '#/components/schemas/StandardErrorPayload'
description: The contact or address book entry was not found.
'429':
content:
application/json:
schema:
$ref: '#/components/schemas/StandardErrorPayload'
description: Too many requests. The rate limit for this endpoint has been exceeded.
summary: Get address book entry
tags:
- Contacts
put:
description: Replaces an address book entry for the contact with a full JSON body. When updating the entry that is currently the default, setting "defaultShipping" from true to false has no effect. Requires OAuth website scope website.contacts, or API key scope CONTACT, or OAuth website scope website.profiles (OAuth only).
operationId: updateAddressBookEntry
parameters:
- description: The contact's ID.
in: path
name: contactId
required: true
schema:
type: string
examples:
default:
value: 64a7e3d2c8f1b95e30a14d2b
- description: The address book entry's ID.
in: path
name: addressBookEntryId
required: true
schema:
type: string
examples:
default:
value: 5f8d0d55b54764421b7156aa
- in: header
name: Authorization
required: true
description: API key or OAuth access token
schema:
type: string
default: Bearer YOUR_API_KEY_OR_OAUTH_TOKEN
- in: header
name: User-Agent
required: true
description: User Agent
schema:
type: string
default: YOUR_CUSTOM_APP_DESCRIPTION
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateAddressBookEntryRequest'
description: The replacement address book entry.
required: true
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateAddressBookEntryResponse'
description: The updated address book entry.
'400':
content:
application/json:
schema:
$ref: '#/components/schemas/StandardErrorPayload'
description: Invalid input or malformed JSON.
'403':
content:
application/json:
schema:
$ref: '#/components/schemas/StandardErrorPayload'
description: Forbidden. Insufficient scope (OAuth or API key), or the requested resource is not accessible for the authenticated website.
'404':
content:
application/json:
schema:
$ref: '#/components/schemas/StandardErrorPayload'
description: The contact or address book entry was not found.
'429':
content:
application/json:
schema:
$ref: '#/components/schemas/StandardErrorPayload'
description: Too many requests. The rate limit for this endpoint has been exceeded.
summary: Replace address book entry
tags:
- Contacts
components:
schemas:
CreateContactResponse:
type: object
properties:
contact:
$ref: '#/components/schemas/Contact'
CreateAddressBookEntryResponse:
type: object
properties:
addressBookEntry:
$ref: '#/components/schemas/AddressBookEntry'
AddressBook:
type: object
properties:
addressBookEntries:
type: array
description: List of Address Book Entries
items:
$ref: '#/components/schemas/AddressBookEntry'
defaultShippingAddressId:
type: string
description: The id of the address book entry that is the default shipping address.
description: Address settings for a contact. When there is at least one address book entry, exactly one is the default shipping address; default shipping address is always returned on the first page of paginated results).
UpdateAddressBookEntryRequest:
required:
- address
type: object
properties:
address:
$ref: '#/components/schemas/ContactAddress'
defaultShipping:
type: boolean
description: Whether this entry should be the default shipping address. When updating the entry that is currently the default, changing this value from true to false has no effect.
IntegerFilter:
type: object
properties:
max:
type: integer
description: Filter out any numbers greater
format: int32
min:
type: integer
description: Filter out any numbers lower
format: int32
description: Object for filtering by a min and max integer
CreateContactRequest:
required:
- firstName
- lastName
- locale
- primaryEmail
type: object
properties:
firstName:
type: string
description: Contact's first name
examples:
- john
lastName:
type: string
description: Contact's last name
examples:
- doe
locale:
type: string
description: Contact's locale
examples:
- en-US
primaryEmail:
$ref: '#/components/schemas/CreateEmail'
CreateEmail:
required:
- email
type: object
properties:
acceptsMarketing:
type: boolean
description: If contact's email accepts marketing
default: false
email:
type: string
format: email
description: The email address.
examples:
- jane.doe@example.com
description: Primary email supplied when creating a contact.
PatchContactRequest:
type: object
properties:
firstName:
type: string
description: The contact's first name.
examples:
- John
lastName:
type: string
description: The contact's last name.
examples:
- Smith
locale:
type: string
description: The contact's locale.
examples:
- en-US
primaryEmail:
$ref: '#/components/schemas/PatchEmail'
description: Fields to update on an existing contact.
examples:
- firstName: John
lastName: Smith
locale: en-US
primaryEmail:
email: johnsmith@mail.com
acceptsMarketing: true
GetAddressBookEntryResponse:
type: object
properties:
addressBookEntry:
$ref: '#/components/schemas/AddressBookEntry'
PaginatedGetContactsResponse:
type: object
properties:
contacts:
type: array
description: paginated list of contacts retrieved
items:
$ref: '#/components/schemas/Contact'
pagination:
examples:
- hasNextPage: true
nextPageCursor: ewogICJhIiA6ICI2OWNhOWExZjgxNGMwYTY0MmIwMTIzYzkiLAogICJiIiA6ICJJRCIKfQ
nextPageUrl: /v1/contacts?cursor=ewogICJhIiA6ICI2OWNhOWExZjgxNGMwYTY0MmIwMTIzYzkiLAogICJiIiA6ICJJRCIKfQ
type: object
properties:
hasNextPage:
type: boolean
nextPageCursor:
type: string
nextPageUrl:
type: string
QueryContactsRequest:
type: object
properties:
acceptsMarketingWithDate:
$ref: '#/components/schemas/AcceptsMarketingWithDate'
cursor:
type: string
description: The cursor for the next page of results. Use the value of `pagination.nextPageCursor` from the previous response.
donationAmount:
$ref: '#/components/schemas/IntegerFilter'
donationCount:
$ref: '#/components/schemas/IntegerFilter'
firstDonationOn:
$ref: '#/components/schemas/DateFilter'
firstOrderOn:
$ref: '#/components/schemas/DateFilter'
lastDonationOn:
$ref: '#/components/schemas/DateFilter'
lastOrderOn:
$ref: '#/components/schemas/DateFilter'
orderAmount:
$ref: '#/components/schemas/IntegerFilter'
orderCount:
$ref: '#/components/schemas/IntegerFilter'
pageSize:
maximum: 1000
minimum: 1
type: integer
description: The number of contacts to return per request.
format: int32
default: 50
searchString:
type: string
description: Search string for Name and Email address
sortDirection:
type: string
description: Direction to sort results, ASCENDING or DESCENDING
enum:
- ASCENDING
- DESCENDING
sortField:
type: string
description: Field to sort results by
enum:
- ID
- CREATED_ON
- EMAIL
- ACCEPTS_MARKETING_JOINED_ON
- FIRST_NAME
- LAST_NAME
- ORDER_COUNT
- LAST_ORDER_ON
- ORDER_AMOUNT
- DONATION_COUNT
- LAST_DONATION_ON
- DONATION_AMOUNT
examples:
- acceptsMarketingWithDate:
acceptsMarketing: true
joinedOn:
before: '2025-11-21T10:00:00Z'
after: '2020-11-26T14:30:00Z'
searchString: jane
firstOrderOn:
before: '2025-11-21T10:00:00Z'
after: '2025-11-26T14:30:00Z'
lastOrderOn:
before:
# --- truncated at 32 KB (44 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/squarespace/refs/heads/main/openapi/squarespace-contacts-api-openapi.yml