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/recaps

Create 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

ParameterTypeRequiredDescription
datestringrequiredDate played in YYYY-MM-DD format (e.g. 2026-01-27).
courseobjectrequiredCourse information object. See nested fields below.
course.namestringrequiredName of the golf course.
course.parsnumber[]requiredArray of par values per hole (each 3–6). Minimum 3 holes.
course.addressstringoptionalCourse street address.
course.latitudenumberoptionalCourse latitude coordinate.
course.longitudenumberoptionalCourse longitude coordinate.
playersarrayrequiredArray of 1–8 player objects. See nested fields below.
players[].namestringrequiredPlayer name.
players[].scoresnumber[]requiredArray of hole scores (each 1–20). Minimum 3 holes.
anecdotesstringoptionalOptional round anecdotes or stories.
photosarrayoptionalOptional array of photo objects. See nested fields below.
photos[].urlstringrequiredURL of the photo (must be publicly accessible).
photos[].captionstringoptionalOptional 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/:id

Retrieve 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

ParameterTypeRequiredDescription
idstringrequiredThe 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