API Overview
Base URL: https://cases.shipmentbot.com/api/v1
The API follows JSON:API-style envelopes with HATEOAS links and predictable pagination metadata.
All protected endpoints accept X-API-Key auth and can also work with an authenticated browser session.
Quick Start
curl -X GET "https://cases.shipmentbot.com/api/v1/campaigns?page[number]=1&page[size]=2" \
-H "Accept: application/json" \
-H "X-API-Key: csb_live_your_token_here"
Response Envelope
Collection responses return data, included, links, and meta.page:
{
"data": [
{
"id": "1",
"type": "campaigns",
"attributes": {
"name": "Weekly Customer Stories",
"cadence": "weekly",
"deadline_day": "friday",
"nudge_days": ["monday", "wednesday", "friday"],
"format_template": "spin",
"active": true,
"created_at": "2026-03-01T10:00:00.000Z",
"updated_at": "2026-03-01T10:00:00.000Z"
},
"relationships": {
"campaign_periods": {
"links": {
"self": "https://cases.shipmentbot.com/api/v1/campaigns/1/relationships/campaign_periods",
"related": "https://cases.shipmentbot.com/api/v1/campaigns/1/campaign_periods"
},
"data": [{ "id": "11", "type": "campaign_periods" }]
}
},
"links": {
"self": "https://cases.shipmentbot.com/api/v1/campaigns/1"
}
}
],
"included": [],
"links": {
"self": "https://cases.shipmentbot.com/api/v1/campaigns?page%5Bnumber%5D=1&page%5Bsize%5D=2",
"first": "https://cases.shipmentbot.com/api/v1/campaigns?page%5Bnumber%5D=1&page%5Bsize%5D=2",
"last": "https://cases.shipmentbot.com/api/v1/campaigns?page%5Bnumber%5D=3&page%5Bsize%5D=2",
"next": "https://cases.shipmentbot.com/api/v1/campaigns?page%5Bnumber%5D=2&page%5Bsize%5D=2",
"prev": null
},
"meta": {
"page": {
"number": 1,
"size": 2,
"total_records": 6,
"total_pages": 3
}
}
}
Single-resource responses return the same envelope with an empty meta hash:
{
"data": {
"id": "4",
"type": "employees",
"attributes": {
"name": "Jamie Writer",
"email": "jamie.writer@example.com",
"created_at": "2026-03-04T16:02:12.000Z",
"updated_at": "2026-03-04T16:02:12.000Z"
},
"relationships": {
"submissions": {
"links": {
"self": "https://cases.shipmentbot.com/api/v1/employees/4/relationships/submissions",
"related": "https://cases.shipmentbot.com/api/v1/submissions?filter%5Bemployee_id%5D=4"
},
"data": [{ "id": "15", "type": "submissions" }]
}
},
"links": {
"self": "https://cases.shipmentbot.com/api/v1/employees/4"
}
},
"included": [],
"links": {
"self": "https://cases.shipmentbot.com/api/v1/employees/4"
},
"meta": {}
}
Error Envelope
Errors return data: null and an errors array:
{
"data": null,
"included": [],
"links": {
"self": "https://cases.shipmentbot.com/api/v1/submissions"
},
"meta": {},
"errors": [
{
"status": "400",
"title": "Bad Request",
"detail": "employee relationship is required"
}
]
}
Query Parameters
| Parameter | Purpose | Example |
|---|---|---|
page[number] |
Page number (default 1) |
?page[number]=2 |
page[size] |
Page size (default 25, max 100) |
?page[size]=50 |
filter[field] |
Resource filtering per endpoint allow-list | ?filter[active]=true |
sort |
Comma-separated fields, prefix with - for desc |
?sort=-created_at,name |
include |
Sideload related resources | ?include=campaign_periods,content_versions |
Common Status Codes
| Status | Meaning |
|---|---|
200 |
Success |
201 |
Created |
204 |
Deleted / no response body |
400 |
Bad request (missing required relationships, malformed payload) |
401 |
Missing, invalid, or expired API key |
403 |
Authenticated user has no current account |
404 |
Resource not found in the current account scope |
422 |
Validation error |
Endpoint Map
| Resource | Methods | Paths |
|---|---|---|
| API Keys | GET, POST, DELETE, POST validate | /api/v1/api_keys, /api/v1/api_keys/:id, /api/v1/api_keys/validate |
| Campaigns | GET, POST, GET by id, PATCH, DELETE | /api/v1/campaigns, /api/v1/campaigns/:id |
| Campaign Periods | GET nested index, POST nested create, GET by id, PATCH | /api/v1/campaigns/:campaign_id/campaign_periods, /api/v1/campaign_periods/:id |
| Content Versions | GET nested index, POST nested create, GET by id, PATCH | /api/v1/campaigns/:campaign_id/content_versions, /api/v1/content_versions/:id |
| Employees | GET, POST, GET by id, PATCH, DELETE | /api/v1/employees, /api/v1/employees/:id |
| Submissions | GET, POST, GET by id, PATCH, parse single, parse all, nested GET/POST | /api/v1/submissions, /api/v1/submissions/:id, /api/v1/submissions/:id/parse_spin, /api/v1/submissions/parse_spin_all, /api/v1/campaign_periods/:campaign_period_id/submissions |
| Content Pieces | GET nested index, GET by id, PATCH | /api/v1/submissions/:submission_id/content_pieces, /api/v1/content_pieces/:id |
| Nudges | GET index | /api/v1/nudges |
Nested Routes
/api/v1/campaigns/:campaign_id/campaign_periodsfor campaign-specific periods/api/v1/campaigns/:campaign_id/content_versionsfor campaign-specific content versions/api/v1/campaign_periods/:campaign_period_id/submissionsfor period-scoped submissions/api/v1/submissions/:submission_id/content_piecesfor submission-scoped generated pieces
AI-Friendly Schema
Use /api/v1/api.json for a full machine-readable API reference
containing endpoints, request contracts, and response schemas.