Pull End-of-Day takings with the Reporting API
Use a Basecamp developer API key to list historical End-of-Day (EOD) takings for a site. You do not need a Cognito / Basecamp user login for API calls.
| Environment | Base URL |
|---|---|
| Live | https://api.yeti.host |
| Test | https://test.yeti.host |
Prerequisites
- Access to Basecamp for your merchant
- Permission to manage API keys (Developer → API keys)
- The site ID of the site you want to query (see Find your site ID)
If you don’t see Developer → API keys, ask a Company Owner to enable Developer user on your Basecamp user (Users → edit user).
Create a developer API key in Basecamp
- Log in to Basecamp and select the correct merchant/company.
- In the left menu, open Developer → API keys.
- Click Create key.
- Enter a Description (for example
EOD reporting – production). - Under Select roles, choose
ExternalApiReportingUser.- Prefer this role alone for read-only EOD access (least privilege).
- Add other External API roles only if the same key also needs ecommerce or refund access — usually better as a separate key.
- Click Create.
- Copy the key immediately. Basecamp shows it once: “You will only see this key once.”
- Click Done.
Store the key in a secrets manager or server environment variable. Never put it in a browser, mobile app, or public repository.
To revise roles later: open the key → Edit API key → update Select roles.
Find your site ID
EOD listing is per site. In Basecamp:
- Go to Sites.
- Open the site you care about (Edit / site detail).
- Copy the site ID from the URL:
/sites/{siteId}.
Example: https://basecamp.yetipay.me/sites/11111111-1111-1111-1111-111111111111 → site ID is 11111111-1111-1111-1111-111111111111.
The site must belong to the same merchant as the API key.
Authenticate
Send the key as a Bearer token on every request:
Authorization: Bearer YOUR_API_KEY
List EOD reports
Endpoint: GET /v1/reporting/site/{siteId}/eod
Returns paginated historical EOD aggregates for that site. Nightly automatic runs have runType: "auto"; manual Basecamp or device runs have runType: "manual".
Query parameters
| Param | Required | Description |
|---|---|---|
dates | No | from,to as ISO date-times. Filters on the report’s end (to) timestamp. |
lastKey | No | Opaque cursor from a previous response for the next page. |
Page size is 50. When you paginate, the cursor keeps any dates filter — you don’t need to resend dates. If you do send both, dates must match the cursor.
First page (with date range)
curl -X GET \
'https://api.yeti.host/v1/reporting/site/YOUR_SITE_ID/eod?dates=2026-07-01T00:00:00.000Z,2026-07-08T00:00:00.000Z' \
-H 'Authorization: Bearer YOUR_API_KEY'
Next page
curl -X GET \
'https://api.yeti.host/v1/reporting/site/YOUR_SITE_ID/eod?lastKey=OPAQUE_CURSOR_FROM_PREVIOUS_RESPONSE' \
-H 'Authorization: Bearer YOUR_API_KEY'
Example response
{
"data": [
{
"siteId": "11111111-1111-1111-1111-111111111111",
"from": "2026-07-01T00:00:00.000Z",
"to": "2026-07-02T00:00:00.000Z",
"runType": "auto",
"totalTrx": { "value": 125000, "currency": "GBP" },
"totalRefunds": { "value": 2500, "currency": "GBP" },
"totalTips": { "value": 8000, "currency": "GBP" },
"totalMoto": { "value": 0, "currency": "GBP" },
"totalPBL": { "value": 0, "currency": "GBP" },
"totalPaymentMethod": {
"visa": {
"totalTrx": { "value": 125000, "currency": "GBP" },
"totalRefunds": { "value": 2500, "currency": "GBP" },
"totalTips": { "value": 8000, "currency": "GBP" },
"totalMoto": { "value": 0, "currency": "GBP" },
"totalPBL": { "value": 0, "currency": "GBP" },
"trxCount": 42,
"tipsCount": 18,
"refundsCount": 1,
"motoCount": 0,
"pblCount": 0
}
},
"trxCount": 42,
"tipsCount": 18,
"refundsCount": 1,
"motoCount": 0,
"pblCount": 0
}
],
"lastKey": "opaque-cursor"
}
Amounts are in minor units (pence for GBP: 125000 = £1,250.00).
If lastKey is missing, there are no further pages.
Common errors
| Status | Code | Meaning |
|---|---|---|
| 401 | yp_1001 | Missing, invalid, or expired API key |
| 403 | yp_1002 | Key is valid but lacks ExternalApiReportingUser |
| 400 | yp_2002 | Invalid dates / lastKey (must be valid from,to, not inverted; dates must match cursor if both sent) |
| 404 | yp_3003 | siteId not found for this merchant |
Security checklist
- Keep the key on the server only
- Prefer a dedicated key with only
ExternalApiReportingUser - Rotate keys: create a new one → switch your integration → disable the old one in Basecamp
- Don’t commit keys to source control