Circuit Pickup Locations API
Look up the pickup locations your orders ship from.
Look up the pickup locations your orders ship from.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
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.curl "https://apis.io/api/v1/apis/getcircuit-com:getcircuit-com-pickup-locations-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Spoke Connect Pickup Locations API
description: 'This is the documentation of the Spoke Connect API HTTP endpoints. The Connect
API is how a retailer creates, tracks, and hands off its deliveries in Spoke
programmatically. # Introduction
The Spoke Connect API is an HTTP API that lets you operate on your orders
programmatically. Use it to create, edit, delete, list, and retrieve orders,
submit them to a courier and withdraw them before they ship, and download
printable PDF labels. Read-only endpoints expose the couriers and pickup
locations your orders reference. Spoke offers no programming SDKs for the Connect API. Call the endpoints
documented on this page directly, or generate a client from the
OpenAPI spec. For worked examples of the flows a retailer integration needs, see the
Usage Examples. # Using the API
## Address
The base address for this version of the API, to be used before every endpoint
listed here, is:
```
https://api.spoke.com/connect/v1
```
Notice the `https://` prefix. The Connect API will **not** accept plain HTTP
requests. ## Your first request
Every request must be authenticated with an API key. The following request
lists your orders:
```bash
curl "https://api.spoke.com/connect/v1/orders" \
-H "Authorization: Bearer "
```
The response contains an `orders` array, plus a `nextPageToken` cursor to pass
as `pageToken` when there are more results to fetch. ## Authentication
Every Connect API request must be authenticated with an API key. ### Creating API keys
API keys are created and expired from the **Integrations** page in your Connect
settings, by retailer admins. You can have up to 5 active keys at a time. Expired keys don''t count towards the limit. Treat your keys as secrets: don''t embed them in client-side code, and expire
any key you suspect has leaked. ### Using your key
Pass the key in the `Authorization` header. Both the `Bearer` and `Basic`
schemes are accepted:
```
Authorization: Bearer
```
```
Authorization: Basic :)>
```
For `Basic`, use the API key as the username and leave the password empty. `curl` builds the encoded header for you with `-u ":"`:
```bash
curl "https://api.spoke.com/connect/v1/orders" -u ":"
```
### Authentication errors
Requests with a missing, invalid, or expired key are rejected with a
`401 Unauthorized` response. ## On resource types
Every response from the Connect API is a JSON object, and every request that
carries a body must send it as JSON with the `Content-Type: application/json`
header. The API exposes four resource types:
| Resource | What it is | Where |
| --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------- |
| `Order` | A package, or set of packages, you are sending to a recipient through a courier. Everything else in the API exists to describe or act on an order. | Read and write, `/orders` |
| `Courier` | A courier your retailer account is connected to, and that you can submit orders to. | Read-only, `/couriers` |
| `PickupLocation` | One of your own locations a courier can collect from, referenced by an order''s `deliveryInstructions.handOffInfo.pickupLocationId`. | Read-only, `/pickupLocations` |
| `OrderShippingLabels` | A short-lived signed link to an order''s printable labels, rendered as a single PDF. | Read-only, `/orders/{id}/shippingLabels` |
Couriers and pickup locations are managed in the Spoke Connect app, not through
this API. The API reads them so you can reference them by id when you create
and submit orders. What every field on these resources means is documented on the
Models pages. ## On resource IDs
Every resource in the Connect API has a unique id that Spoke generates.'
version: v1
servers:
- url: https://api.spoke.com/connect/v1
security:
- BearerAuth: []
- BasicAuth: []
tags:
- name: Pickup Locations
description: Look up the pickup locations your orders ship from.
paths:
/pickupLocations:
get:
operationId: listPickupLocations
summary: List pickup locations
tags:
- Pickup Locations
description: List the authenticated retailer's pickup locations.
parameters:
- schema:
type: string
minLength: 1
maxLength: 255
in: query
name: pageToken
required: false
description: The page token to continue from.
- schema:
default: 100
type: integer
minimum: 1
maximum: 100
in: query
name: maxPageSize
required: false
description: The maximum number of pickup locations to return.
responses:
'200':
description: The retailer's pickup locations.
content:
application/json:
schema:
type: object
properties:
pickupLocations:
type: array
items:
$ref: '#/components/schemas/connectPickupLocationSchema'
description: The retailer's pickup locations.
nextPageToken:
description: The token for the next page, or null when there are no more pickup locations.
type:
- 'null'
- string
required:
- pickupLocations
- nextPageToken
definitions:
connectPickupLocationSchema:
type: object
properties:
id:
allOf:
- $ref: '#/components/schemas/connectPickupLocationIdSchema'
description: Pickup location identifier.
name:
type: string
description: The location's display name.
required:
- id
- name
additionalProperties: false
description: A retailer pickup location.
connectPickupLocationIdSchema:
type: string
pattern: ^pickupLocations\/[a-zA-Z0-9_-]{1,50}$
description: Unique identifier of a pickup location, in the format `pickupLocations/{id}`.
description: The retailer's pickup locations.
'400':
description: Query parameters are invalid
content:
application/json:
schema:
type: object
properties:
message:
type: string
description: The error message.
code:
type: string
description: The error code.
param:
type: string
description: The parameter that caused the error.
url:
type: string
description: The URL with more information about the error.
required:
- message
description: Query parameters are invalid
'401':
description: Unauthorized
content:
application/json:
schema:
type: object
properties:
message:
type: string
description: The error message.
url:
type: string
description: The URL with more information about the error.
required:
- message
description: Unauthorized
'500':
description: An internal server error occurred
content:
application/json:
schema:
type: object
properties:
message:
type: string
description: The error message.
code:
type: string
description: The error code.
param:
type: string
description: The parameter that caused the error.
url:
type: string
description: The URL with more information about the error.
required:
- message
description: An internal server error occurred
default:
description: The default error model
content:
application/json:
schema:
type: object
properties:
message:
type: string
description: The error message.
code:
type: string
description: The error code.
param:
type: string
description: The parameter that caused the error.
url:
type: string
description: The URL with more information about the error.
required:
- message
description: The default error model
/pickupLocations/{id}:
get:
operationId: getPickupLocation
summary: Retrieve a pickup location
tags:
- Pickup Locations
description: Retrieve a single one of the authenticated retailer's pickup locations.
parameters:
- schema:
type: string
pattern: ^[a-zA-Z0-9_-]{1,50}$
in: path
name: id
required: true
description: The pickup location id.
responses:
'200':
description: The requested pickup location.
content:
application/json:
schema:
type: object
properties:
id:
allOf:
- $ref: '#/components/schemas/connectPickupLocationIdSchema'
description: Pickup location identifier.
name:
type: string
description: The location's display name.
required:
- id
- name
additionalProperties: false
description: The requested pickup location.
definitions:
connectPickupLocationIdSchema:
type: string
pattern: ^pickupLocations\/[a-zA-Z0-9_-]{1,50}$
description: Unique identifier of a pickup location, in the format `pickupLocations/{id}`.
'400':
description: ID format is invalid
content:
application/json:
schema:
type: object
properties:
message:
type: string
description: The error message.
code:
type: string
description: The error code.
param:
type: string
description: The parameter that caused the error.
url:
type: string
description: The URL with more information about the error.
required:
- message
description: ID format is invalid
title: The request is invalid
'401':
description: Unauthorized
content:
application/json:
schema:
type: object
properties:
message:
type: string
description: The error message.
url:
type: string
description: The URL with more information about the error.
required:
- message
description: Unauthorized
'404':
description: The pickup location does not belong to the retailer, or does not exist.
content:
application/json:
schema:
type: object
properties:
message:
type: string
description: The error message.
code:
type: string
enum:
- pickup_location_not_found
required:
- message
- code
description: The pickup location does not belong to the retailer, or does not exist.
title: Pickup location not found
'500':
description: An internal server error occurred
content:
application/json:
schema:
type: object
properties:
message:
type: string
description: The error message.
code:
type: string
description: The error code.
param:
type: string
description: The parameter that caused the error.
url:
type: string
description: The URL with more information about the error.
required:
- message
description: An internal server error occurred
default:
description: The default error model
content:
application/json:
schema:
type: object
properties:
message:
type: string
description: The error message.
code:
type: string
description: The error code.
param:
type: string
description: The parameter that caused the error.
url:
type: string
description: The URL with more information about the error.
required:
- message
description: The default error model
components:
schemas:
connectPickupLocationIdSchema:
type: string
pattern: ^pickupLocations\/[a-zA-Z0-9_-]{1,50}$
description: Unique identifier of a pickup location, in the format `pickupLocations/{id}`.
connectPickupLocationSchema:
type: object
properties:
id:
allOf:
- $ref: '#/components/schemas/connectPickupLocationIdSchema'
description: Pickup location identifier.
name:
type: string
description: The location's display name.
required:
- id
- name
additionalProperties: false
description: A retailer pickup location.
securitySchemes:
BearerAuth:
type: http
scheme: bearer
description: Pass the API key directly as the token.
BasicAuth:
type: http
scheme: basic
description: Use the API key as the username and leave the password empty.