API Documentation
Complete reference for the 18Recap API. Learn how to authenticate, create recaps, and integrate with your application.
Authentication
All API requests require a valid API key passed in the X-API-KEY header. You can generate API keys from the API Keys page.
Header
X-API-KEY: your_api_key_here
Base URL
https://api.18recap.com/v1
POST
/recapsCreate a new recap from round data. Provide the course name, date of play, player information, and scores. The API validates all required fields and returns the created recap with a unique identifier.
Request Body Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
date | string | required | Date played in YYYY-MM-DD format (e.g. 2026-01-27). |
course | object | required | Course information object. See nested fields below. |
course.name | string | required | Name of the golf course. |
course.pars | number[] | required | Array of par values per hole (each 3–6). Minimum 3 holes. |
course.address | string | optional | Course street address. |
course.latitude | number | optional | Course latitude coordinate. |
course.longitude | number | optional | Course longitude coordinate. |
players | array | required | Array of 1–8 player objects. See nested fields below. |
players[].name | string | required | Player name. |
players[].scores | number[] | required | Array of hole scores (each 1–20). Minimum 3 holes. |
anecdotes | string | optional | Optional round anecdotes or stories. |
photos | array | optional | Optional array of photo objects. See nested fields below. |
photos[].url | string | required | URL of the photo (must be publicly accessible). |
photos[].caption | string | optional | Optional caption for the photo. |
Example Request
curl
curl --request POST \
--url https://api.18recap.com/v1/recaps \
--header 'X-API-KEY: your_api_key_here' \
--header 'Content-Type: application/json' \
--data '{
"date": "2026-01-27",
"course": {
"name": "Pebble Beach Golf Links",
"pars": [4,5,4,4,3,5,3,4,4,4,3,4,5,4,4,3,5,4],
"address": "1700 Old Course Dr, Pebble Beach, CA 93953",
"latitude": 36.5323941,
"longitude": -121.9452221
},
"players": [
{
"name": "Jordan Mitchell",
"scores": [4,5,3,5,4,6,4,3,5,5,4,4,5,3,6,4,5,4]
},
{
"name": "Casey Rivera",
"scores": [4,4,3,4,4,5,4,3,4,5,4,4,4,3,5,4,5,4]
}
],
"anecdotes": "Great conditions. Wind picked up on the back nine. Jordan amazing drive on 18.",
"photos": [
{
"url": "https://example.com/photos/hole18-drive.jpg",
"caption": "Jordan's amazing drive on 18"
}
]
}'Responses
JSON Response
{
"data": {
"id": "rec_a1b2c3d4e5f6",
"webStatus": "pending",
"webUrl": null,
"videoStatus": "pending",
"videoUrl": null,
"createdAt": "2026-01-27T14:30:00Z"
}
}GET
/recaps/:idRetrieve a recap by its unique identifier. Use this endpoint to poll for status updates after creating a recap. Returns 202 while still processing and 200 when complete. If either output failed, the response includes an error message field.
URL Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | required | The unique identifier of the recap (e.g. rec_a1b2c3d4e5f6). |
Example Request
curl
curl --request GET \ --url https://api.18recap.com/v1/recaps/rec_a1b2c3d4e5f6 \ --header 'X-API-KEY: your_api_key_here'
Responses
JSON Response
{
"data": {
"id": "rec_a1b2c3d4e5f6",
"webStatus": "complete",
"webUrl": "https://18recap.com/recaps/rec_a1b2c3d4e5f6",
"videoStatus": "complete",
"videoUrl": "https://media.18recap.com/rounds/rec_a1b2c3d4e5f6/recap.mp4",
"createdAt": "2026-01-27T14:30:00Z"
}
}Rate Limits
API requests are rate-limited per organization. Current limits:
- 12 requests/minute per API key
