Square
by @byungkyu
Square API integration with managed OAuth. Install only if you need Square administration. Connect with the least-privileged Square account and OAuth scopes...
clawhub install squareupπ About This Skill
name: squareup description: | Square API integration with managed OAuth. Install only if you need Square administration. Connect with the least-privileged Square account and OAuth scopes available, verify the intended connection ID before each request, and revoke unused connections promptly. This integration can mutate Square data β approve only specific write actions after checking the exact endpoint, account, resource ID, and consequence. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway). Requires network access and valid Maton API key. metadata: author: maton version: "1.0" clawdbot: emoji: π§ requires: env: - MATON_API_KEY
Square
Access the Square API with managed OAuth authentication. See the API Reference below for supported endpoints.
Quick Start
# List locations
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/squareup/v2/locations')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Base URL
https://api.maton.ai/squareup/{endpoint-path}
The gateway proxies requests to connect.squareup.com and automatically injects your OAuth token. Only the endpoints documented in the API Reference section below are supported β always use specific endpoint paths from that section rather than constructing arbitrary paths.
Authentication
All requests require the Maton API key in the Authorization header:
Authorization: Bearer $MATON_API_KEY
IMPORTANT: Treat MATON_API_KEY as a secret β do not log it, include it in chats or prompts visible to others, or expose it in shared files or outputs. The key authenticates with Maton, and the Square connection is independently scoped via OAuth. Use least-privileged Square OAuth scopes, revoke unused connections promptly, and if the key is compromised, rotate it immediately at maton.ai/settings.
Environment Variable: Set your API key as MATON_API_KEY:
export MATON_API_KEY="YOUR_API_KEY"
Getting Your API Key
1. Sign in or create an account at maton.ai 2. Go to maton.ai/settings 3. Copy your API key
Connection Management
Manage your Square OAuth connections at https://api.maton.ai.
List Connections
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections?app=squareup&status=ACTIVE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Create Connection
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'squareup'}).encode()
req = urllib.request.Request('https://api.maton.ai/connections', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Get Connection
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections/{connection_id}')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Response:
{
"connection": {
"connection_id": "{connection_id}",
"status": "ACTIVE",
"creation_time": "2025-12-08T07:20:53.488460Z",
"last_updated_time": "2026-01-31T20:03:32.593153Z",
"url": "https://connect.maton.ai/?session_token=...",
"app": "squareup",
"metadata": {}
}
}
Open the returned url in a browser to complete OAuth authorization.
Delete Connection
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections/{connection_id}', method='DELETE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Specifying Connection
If you have multiple Square connections, specify which one to use with the Maton-Connection header:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/squareup/v2/locations')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', '{connection_id}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If you have multiple connections, always include this header to ensure requests go to the intended account.
Security & Permissions
API Reference
Locations
#### List Locations
GET /squareup/v2/locations
#### Get Location
GET /squareup/v2/locations/{location_id}
#### Create Location
POST /squareup/v2/locations
Content-Type: application/json{
"location": {
"name": "New Location",
"address": {
"address_line_1": "123 Main St",
"locality": "San Francisco",
"administrative_district_level_1": "CA",
"postal_code": "94102",
"country": "US"
}
}
}
#### Update Location
PUT /squareup/v2/locations/{location_id}
Content-Type: application/json{
"location": {
"name": "Updated Location Name"
}
}
Merchants
#### Get Merchant
GET /squareup/v2/merchants/me
#### List Merchants
GET /squareup/v2/merchants
Payments
#### List Payments
GET /squareup/v2/payments
With filters:
GET /squareup/v2/payments?location_id={location_id}&begin_time=2026-01-01T00:00:00Z&end_time=2026-02-01T00:00:00Z
#### Get Payment
GET /squareup/v2/payments/{payment_id}
#### Create Payment
POST /squareup/v2/payments
Content-Type: application/json{
"source_id": "cnon:card-nonce-ok",
"idempotency_key": "unique-key-12345",
"amount_money": {
"amount": 1000,
"currency": "USD"
},
"location_id": "{location_id}"
}
#### Update Payment
PUT /squareup/v2/payments/{payment_id}
Content-Type: application/json{
"payment": {
"tip_money": {
"amount": 200,
"currency": "USD"
}
},
"idempotency_key": "unique-key-67890"
}
#### Complete Payment
POST /squareup/v2/payments/{payment_id}/complete
Content-Type: application/json{}
#### Cancel Payment
POST /squareup/v2/payments/{payment_id}/cancel
Content-Type: application/json{}
Refunds
#### List Refunds
GET /squareup/v2/refunds
#### Get Refund
GET /squareup/v2/refunds/{refund_id}
#### Create Refund
POST /squareup/v2/refunds
Content-Type: application/json{
"idempotency_key": "unique-refund-key",
"payment_id": "{payment_id}",
"amount_money": {
"amount": 500,
"currency": "USD"
},
"reason": "Customer requested refund"
}
Customers
#### List Customers
GET /squareup/v2/customers
#### Get Customer
GET /squareup/v2/customers/{customer_id}
#### Create Customer
POST /squareup/v2/customers
Content-Type: application/json{
"given_name": "John",
"family_name": "Doe",
"email_address": "john.doe@example.com",
"phone_number": "+15551234567"
}
#### Update Customer
PUT /squareup/v2/customers/{customer_id}
Content-Type: application/json{
"email_address": "john.updated@example.com"
}
#### Delete Customer
DELETE /squareup/v2/customers/{customer_id}
#### Search Customers
POST /squareup/v2/customers/search
Content-Type: application/json{
"query": {
"filter": {
"email_address": {
"exact": "john.doe@example.com"
}
}
}
}
Orders
#### Create Order
POST /squareup/v2/orders
Content-Type: application/json{
"order": {
"location_id": "{location_id}",
"line_items": [
{
"name": "Item 1",
"quantity": "1",
"base_price_money": {
"amount": 1000,
"currency": "USD"
}
}
]
},
"idempotency_key": "unique-order-key"
}
#### Get Order
GET /squareup/v2/orders/{order_id}
#### Update Order
PUT /squareup/v2/orders/{order_id}
Content-Type: application/json{
"order": {
"location_id": "{location_id}",
"version": 1
},
"fields_to_clear": ["line_items"]
}
#### Search Orders
POST /squareup/v2/orders/search
Content-Type: application/json{
"location_ids": ["{location_id}"],
"query": {
"filter": {
"state_filter": {
"states": ["OPEN"]
}
}
}
}
#### Batch Retrieve Orders
POST /squareup/v2/orders/batch-retrieve
Content-Type: application/json{
"location_id": "{location_id}",
"order_ids": ["{order_id_1}", "{order_id_2}"]
}
#### Pay Order
POST /squareup/v2/orders/{order_id}/pay
Content-Type: application/json{
"idempotency_key": "unique-key",
"payment_ids": ["{payment_id}"]
}
Catalog
#### List Catalog
GET /squareup/v2/catalog/list
With type filter:
GET /squareup/v2/catalog/list?types=ITEM,CATEGORY
#### Get Catalog Object
GET /squareup/v2/catalog/object/{object_id}
#### Upsert Catalog Object
POST /squareup/v2/catalog/object
Content-Type: application/json{
"idempotency_key": "unique-catalog-key",
"object": {
"type": "ITEM",
"id": "#new-item",
"item_data": {
"name": "Coffee",
"description": "Hot brewed coffee",
"variations": [
{
"type": "ITEM_VARIATION",
"id": "#small-coffee",
"item_variation_data": {
"name": "Small",
"pricing_type": "FIXED_PRICING",
"price_money": {
"amount": 300,
"currency": "USD"
}
}
}
]
}
}
}
#### Delete Catalog Object
DELETE /squareup/v2/catalog/object/{object_id}
#### Batch Upsert Catalog Objects
POST /squareup/v2/catalog/batch-upsert
Content-Type: application/json{
"idempotency_key": "unique-batch-key",
"batches": [
{
"objects": [...]
}
]
}
#### Search Catalog Objects
POST /squareup/v2/catalog/search
Content-Type: application/json{
"object_types": ["ITEM"],
"query": {
"text_query": {
"keywords": ["coffee"]
}
}
}
#### Get Catalog Info
GET /squareup/v2/catalog/info
Inventory
#### Retrieve Inventory Count
GET /squareup/v2/inventory/{catalog_object_id}
#### Batch Retrieve Inventory Counts
POST /squareup/v2/inventory/counts/batch-retrieve
Content-Type: application/json{
"catalog_object_ids": ["{object_id_1}", "{object_id_2}"],
"location_ids": ["{location_id}"]
}
#### Batch Change Inventory
POST /squareup/v2/inventory/changes/batch-create
Content-Type: application/json{
"idempotency_key": "unique-inventory-key",
"changes": [
{
"type": "ADJUSTMENT",
"adjustment": {
"catalog_object_id": "{object_id}",
"location_id": "{location_id}",
"quantity": "10",
"from_state": "NONE",
"to_state": "IN_STOCK"
}
}
]
}
#### Retrieve Inventory Adjustment
GET /squareup/v2/inventory/adjustments/{adjustment_id}
Invoices
#### List Invoices
GET /squareup/v2/invoices?location_id={location_id}
#### Get Invoice
GET /squareup/v2/invoices/{invoice_id}
#### Create Invoice
POST /squareup/v2/invoices
Content-Type: application/json{
"invoice": {
"location_id": "{location_id}",
"order_id": "{order_id}",
"primary_recipient": {
"customer_id": "{customer_id}"
},
"payment_requests": [
{
"request_type": "BALANCE",
"due_date": "2026-02-15"
}
],
"delivery_method": "EMAIL"
},
"idempotency_key": "unique-invoice-key"
}
#### Update Invoice
PUT /squareup/v2/invoices/{invoice_id}
Content-Type: application/json{
"invoice": {
"version": 1,
"payment_requests": [
{
"uid": "{payment_request_uid}",
"due_date": "2026-02-20"
}
]
},
"idempotency_key": "unique-update-key"
}
#### Publish Invoice
POST /squareup/v2/invoices/{invoice_id}/publish
Content-Type: application/json{
"version": 1,
"idempotency_key": "unique-publish-key"
}
#### Cancel Invoice
POST /squareup/v2/invoices/{invoice_id}/cancel
Content-Type: application/json{
"version": 1
}
#### Delete Invoice
DELETE /squareup/v2/invoices/{invoice_id}?version=1
#### Search Invoices
POST /squareup/v2/invoices/search
Content-Type: application/json{
"query": {
"filter": {
"location_ids": ["{location_id}"],
"customer_ids": ["{customer_id}"]
}
}
}
Team Members
#### Search Team Members
POST /squareup/v2/team-members/search
Content-Type: application/json{
"query": {
"filter": {
"location_ids": ["{location_id}"],
"status": "ACTIVE"
}
}
}
#### Get Team Member
GET /squareup/v2/team-members/{team_member_id}
#### Update Team Member
PUT /squareup/v2/team-members/{team_member_id}
Content-Type: application/json{
"team_member": {
"given_name": "Updated Name"
}
}
Loyalty
#### List Loyalty Programs
GET /squareup/v2/loyalty/programs
#### Get Loyalty Program
GET /squareup/v2/loyalty/programs/{program_id}
#### Search Loyalty Accounts
POST /squareup/v2/loyalty/accounts/search
Content-Type: application/json{
"query": {
"customer_ids": ["{customer_id}"]
}
}
#### Create Loyalty Account
POST /squareup/v2/loyalty/accounts
Content-Type: application/json{
"loyalty_account": {
"program_id": "{program_id}",
"mapping": {
"phone_number": "+15551234567"
}
},
"idempotency_key": "unique-key"
}
#### Accumulate Loyalty Points
POST /squareup/v2/loyalty/accounts/{account_id}/accumulate
Content-Type: application/json{
"accumulate_points": {
"order_id": "{order_id}"
},
"location_id": "{location_id}",
"idempotency_key": "unique-key"
}
Payment Links (Online Checkout)
#### List Payment Links
GET /squareup/v2/online-checkout/payment-links
#### Get Payment Link
GET /squareup/v2/online-checkout/payment-links/{id}
#### Create Payment Link
POST /squareup/v2/online-checkout/payment-links
Content-Type: application/json{
"idempotency_key": "unique-key",
"quick_pay": {
"name": "Payment for Service",
"price_money": {
"amount": 1000,
"currency": "USD"
},
"location_id": "{location_id}"
}
}
#### Update Payment Link
PUT /squareup/v2/online-checkout/payment-links/{id}
Content-Type: application/json{
"payment_link": {
"version": 1,
"description": "Updated description"
}
}
#### Delete Payment Link
DELETE /squareup/v2/online-checkout/payment-links/{id}
Cards
#### List Cards
GET /squareup/v2/cards
GET /squareup/v2/cards?customer_id={customer_id}
#### Get Card
GET /squareup/v2/cards/{card_id}
#### Create Card
POST /squareup/v2/cards
Content-Type: application/json{
"idempotency_key": "unique-key",
"source_id": "cnon:card-nonce-ok",
"card": {
"customer_id": "{customer_id}"
}
}
#### Disable Card
POST /squareup/v2/cards/{card_id}/disable
Payouts
#### List Payouts
GET /squareup/v2/payouts
GET /squareup/v2/payouts?location_id={location_id}
#### Get Payout
GET /squareup/v2/payouts/{payout_id}
#### List Payout Entries
GET /squareup/v2/payouts/{payout_id}/payout-entries
Bank Accounts
#### List Bank Accounts
GET /squareup/v2/bank-accounts
#### Get Bank Account
GET /squareup/v2/bank-accounts/{bank_account_id}
Terminal
#### List Terminal Checkouts
GET /squareup/v2/terminals/checkouts
#### Create Terminal Checkout
POST /squareup/v2/terminals/checkouts
Content-Type: application/json{
"idempotency_key": "unique-key",
"checkout": {
"amount_money": {
"amount": 1000,
"currency": "USD"
},
"device_options": {
"device_id": "{device_id}"
}
}
}
#### Get Terminal Checkout
GET /squareup/v2/terminals/checkouts/{checkout_id}
#### Search Terminal Checkouts
POST /squareup/v2/terminals/checkouts/search
Content-Type: application/json{
"query": {
"filter": {
"status": "COMPLETED"
}
}
}
#### Cancel Terminal Checkout
POST /squareup/v2/terminals/checkouts/{checkout_id}/cancel
Pagination
Square uses cursor-based pagination. List endpoints return a cursor field when more results exist:
GET /squareup/v2/payments?cursor={cursor_value}
Response includes pagination info:
{
"payments": [...],
"cursor": "next_page_cursor_value"
}
Continue fetching by passing the cursor value in subsequent requests until no cursor is returned.
Code Examples
JavaScript
const response = await fetch(
'https://api.maton.ai/squareup/v2/locations',
{
headers: {
'Authorization': Bearer ${process.env.MATON_API_KEY}
}
}
);
const data = await response.json();
Python
import os
import requestsresponse = requests.get(
'https://api.maton.ai/squareup/v2/locations',
headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'}
)
data = response.json()
Notes
2026-02-07T01:59:28.459Z)idempotency_key to prevent duplicate operationscurl -g when URLs contain brackets to disable glob parsingjq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environmentsError Handling
| Status | Meaning | |--------|---------| | 400 | Missing Square connection or bad request | | 401 | Invalid or missing Maton API key | | 403 | Insufficient OAuth scopes | | 404 | Resource not found | | 429 | Rate limited | | 4xx/5xx | Passthrough error from Square API |
Error Response Format
{
"errors": [
{
"category": "INVALID_REQUEST_ERROR",
"code": "NOT_FOUND",
"detail": "Could not find payment with id: {payment_id}"
}
]
}
Troubleshooting: API Key Issues
1. Check that the MATON_API_KEY environment variable is set:
echo $MATON_API_KEY
2. Verify the API key is valid by listing connections:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Troubleshooting: Invalid App Name
1. Ensure your URL path starts with squareup. For example:
https://api.maton.ai/squareup/v2/locationshttps://api.maton.ai/v2/locationsTroubleshooting: Insufficient Scopes
If you receive a 403 error with INSUFFICIENT_SCOPES, the OAuth connection doesn't have the required permissions. Create a new connection and ensure you grant all necessary permissions during OAuth authorization.
Resources
π‘ Examples
# List locations
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/squareup/v2/locations')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
π Tips & Best Practices
2026-02-07T01:59:28.459Z)idempotency_key to prevent duplicate operationscurl -g when URLs contain brackets to disable glob parsingjq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments