Skip to main content
A Visit records a date selected by a buyer. The system uses a high default capacity (total_slots = 9999) so that no date is ever genuinely unavailable. If a visit record for a given date does not exist yet, the POST /create/ endpoint creates it automatically.
This is a simplified scheduling system. Capacity enforcement exists in the model but is not enforced in practice — total_slots is intentionally set to 9999 to allow unlimited selections for any date.

Endpoints

MethodPathAuthDescription
GET/api/visits/PublicList all visits
GET/api/visits/available/PublicList visits with open slots
POST/api/visits/create/PublicCreate visit or return existing for date
GET/api/visits/by_day/?date=YYYY-MM-DDPublicLook up a visit by exact date
GET/api/visits/{id}/PublicRetrieve a single visit
PUT/api/visits/{id}/update/AdminUpdate a visit record
DELETE/api/visits/{id}/delete/AdminDelete a visit record

GET /api/visits/

Returns all visit records, ordered by date descending.
curl https://api.parquemarino.cr/api/visits/
[
  {
    "id": 12,
    "day": "2025-04-10",
    "total_slots": 9999,
    "occupied_slots": 8
  },
  {
    "id": 11,
    "day": "2025-04-05",
    "total_slots": 9999,
    "occupied_slots": 3
  }
]

GET /api/visits/available/

Returns visit records where available_slots > 0. Each object includes the computed available_slots field.

Response fields

visits
array
Array of visit objects with open capacity.
total_available
integer
Count of visit records returned.
curl https://api.parquemarino.cr/api/visits/available/

POST /api/visits/create/

Creates a new visit for a date, or returns the existing visit if one already exists for that date. This endpoint is public and is called automatically by the anonymous purchase flow. Idempotent behavior: if a visit already exists for the given day, the server returns 200 OK with the existing record instead of creating a duplicate.

Request body

day
string
required
Visit date in YYYY-MM-DD format.
total_slots
integer
default:9999
Override the default capacity. Omit to use the system default.
curl -X POST https://api.parquemarino.cr/api/visits/create/ \
  -H "Content-Type: application/json" \
  -d '{"day": "2025-05-20"}'
Created (new date) — 201 Created:
{
  "id": 15,
  "day": "2025-05-20",
  "total_slots": 9999,
  "occupied_slots": 0
}
Existing date — 200 OK:
{
  "id": 9,
  "day": "2025-05-20",
  "total_slots": 9999,
  "occupied_slots": 5
}

GET /api/visits/by_day/

Looks up a visit record by exact date. Returns 404 if no visit exists for that date.

Query parameters

date
string
required
The visit date to look up, in YYYY-MM-DD format.
curl "https://api.parquemarino.cr/api/visits/by_day/?date=2025-05-20"
{
  "id": 15,
  "day": "2025-05-20",
  "total_slots": 9999,
  "occupied_slots": 2
}
Error — date not found:
{
  "error": "Visit not found for the specified date"
}

Model reference

FieldTypeDescription
idintegerAuto-generated primary key
daydateVisit date — unique per record
total_slotsintegerCapacity ceiling, default 9999
occupied_slotsintegerOccupied count, starts at 0
Computed property (not stored):
PropertyFormula
available_slotstotal_slots - occupied_slots

Slot methods (internal)

MethodDescription
occupy_slots(n)Increments occupied_slots by n if capacity allows; returns bool
free_slots(n)Decrements occupied_slots by n; raises ValueError if n > occupied_slots
has_available_slots(n)Returns True if at least n slots are free

Build docs developers (and LLMs) love