Skip to content

Error Handling

All CoogCasa APIs return consistent error responses. This guide explains the error format and how to handle common errors.

All errors follow this structure:

{
"error": "Human-readable error message",
"code": "ERROR_CODE",
"details": {}
}
FieldTypeDescription
errorstringHuman-readable error message
codestringMachine-readable error code (optional)
detailsobjectAdditional error details (optional)
CodeDescription
200 OKRequest successful
201 CreatedResource created successfully
204 No ContentSuccess with no response body
CodeDescription
400 Bad RequestInvalid request parameters
401 UnauthorizedMissing or invalid API key
403 ForbiddenAccess denied
404 Not FoundResource doesn’t exist
405 Method Not AllowedHTTP method not supported
429 Too Many RequestsRate limit exceeded
CodeDescription
500 Internal Server ErrorUnexpected server error
502 Bad GatewayUpstream service error
503 Service UnavailableService temporarily unavailable
504 Gateway TimeoutRequest timed out
GET /api/roster
{
"error": "sport parameter required"
}

Solution: Include the required parameter.

GET /api/roster?sport=mens-basketball
GET /api/schedules/sport?sport=invalid-sport
{
"error": "Invalid sport"
}

Solution: Use a valid sport key (mens-basketball, womens-basketball, football, baseball, softball).

GET /api/game?id=999999999
{
"error": "Game not found"
}

Solution: Verify the ID exists by listing available resources first.

HTTP/1.1 429 Too Many Requests
Retry-After: 60
{
"error": "Rate limit exceeded",
"retryAfter": 60
}

Solution: Wait for the Retry-After period before making more requests.

POST /api/trigger/schedules
{
"error": "Unauthorized"
}

Solution: Include a valid API key header.

POST /api/trigger/schedules
X-API-Key: your-api-key
async function fetchSchedules() {
try {
const response = await fetch('https://api.coogcasa.com/sports/api/schedules');
if (!response.ok) {
const error = await response.json();
switch (response.status) {
case 400:
console.error('Invalid request:', error.error);
break;
case 404:
console.error('Not found:', error.error);
break;
case 429:
console.error('Rate limited. Retry after:', error.retryAfter);
break;
default:
console.error('API error:', error.error);
}
return null;
}
return await response.json();
} catch (err) {
console.error('Network error:', err);
return null;
}
}
import requests
def fetch_schedules():
try:
response = requests.get('https://api.coogcasa.com/sports/api/schedules')
response.raise_for_status()
return response.json()
except requests.exceptions.HTTPError as e:
error = e.response.json()
if e.response.status_code == 429:
print(f"Rate limited. Retry after: {error.get('retryAfter')} seconds")
else:
print(f"API error: {error.get('error')}")
return None
except requests.exceptions.RequestException as e:
print(f"Network error: {e}")
return None

Don’t assume requests succeed. Check the HTTP status code.

For transient errors (5xx), implement exponential backoff:

async function fetchWithRetry(url, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
try {
const response = await fetch(url);
if (response.status >= 500) {
throw new Error('Server error');
}
return response;
} catch (err) {
if (i === maxRetries - 1) throw err;
await new Promise(r => setTimeout(r, Math.pow(2, i) * 1000));
}
}
}
  • Monitor 429 responses
  • Use the Retry-After header
  • Cache responses when possible

Translate error codes into user-friendly messages:

function getErrorMessage(error, status) {
switch (status) {
case 404:
return 'The requested item was not found.';
case 429:
return 'Too many requests. Please wait a moment and try again.';
case 503:
return 'Service temporarily unavailable. Please try again later.';
default:
return 'An error occurred. Please try again.';
}
}

Log error details for troubleshooting:

console.error('API Error', {
url: response.url,
status: response.status,
error: errorBody,
timestamp: new Date().toISOString()
});

If you encounter persistent errors:

  1. Check status.coogcasa.com for service status
  2. Search GitHub Issues
  3. Open a new issue with:
    • Request URL
    • Response status and body
    • Timestamp
    • Steps to reproduce