Skip to main content
Tickets represent the different entry categories sold at Parque Marino del Pacífico Sur (General, Student, Child, etc.). Each ticket type tracks its own stock via total_slots and occupied_slots.

Endpoints

MethodPathAuthDescription
GET/api/tickets/PublicList all tickets
GET/api/tickets/available/PublicList tickets with available stock
GET/api/tickets/{id}/PublicRetrieve a single ticket
POST/api/tickets/create/AdminCreate a new ticket
PUT/api/tickets/{id}/update/AdminUpdate a ticket
DELETE/api/tickets/{id}/delete/AdminDelete a ticket

GET /api/tickets/

Returns all ticket types. No authentication required.
curl https://api.parquemarino.cr/api/tickets/
[
  {
    "id": 1,
    "name": "Entrada General",
    "description": "Acceso completo al parque marino",
    "price": "15000.00",
    "currency": "CRC",
    "total_slots": 1276,
    "occupied_slots": 42
  },
  {
    "id": 2,
    "name": "Entrada Estudiante",
    "description": "Con carné estudiantil válido",
    "price": "8000.00",
    "currency": "CRC",
    "total_slots": 1276,
    "occupied_slots": 15
  }
]

GET /api/tickets/available/

Returns only tickets with remaining stock (total_slots - occupied_slots > 0). Each object includes a computed available_slots field.
The AvailableTicketsView in the source references is_active as a filter, but the Tickets model does not define an is_active field — the serializer exposes all model fields (fields = '__all__'). If the database includes an is_active migration not yet reflected in the model file, this filter will apply; otherwise all tickets with available stock are returned.
curl https://api.parquemarino.cr/api/tickets/available/

Response

tickets
array
Array of available ticket objects.
total_available
integer
Count of ticket types returned in this response.
{
  "tickets": [
    {
      "id": 1,
      "name": "Entrada General",
      "description": "Acceso completo al parque marino",
      "price": "15000.00",
      "currency": "CRC",
      "total_slots": 1276,
      "occupied_slots": 42,
      "available_slots": 1234
    }
  ],
  "total_available": 1
}

GET /api/tickets//

Returns a single ticket by its primary key. No authentication required.

Path parameters

id
integer
required
The numeric ID of the ticket.
curl https://api.parquemarino.cr/api/tickets/1/

POST /api/tickets/create/

Creates a new ticket type. Requires admin authentication (IsAuthenticatedAndRole).
This endpoint requires a valid admin JWT token in the Authorization: Bearer <token> header.

Request body

name
string
required
Unique display name for this ticket type. Maximum 30 characters.
description
string
required
Short description shown during checkout. Maximum 100 characters.
price
decimal
required
Unit price. Up to 10 total digits with 2 decimal places.
currency
string
default:"CRC"
Currency for this ticket. Either CRC (colones) or USD (dollars).
total_slots
integer
default:1276
Maximum tickets available for this type.
occupied_slots
integer
default:0
Pre-occupied slots. Normally left at 0 on creation.
curl -X POST https://api.parquemarino.cr/api/tickets/create/ \
  -H "Authorization: Bearer <admin_token>" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Entrada Adulto Mayor",
    "description": "Para personas mayores de 60 años",
    "price": "7500.00",
    "currency": "CRC",
    "total_slots": 1276
  }'
{
  "id": 5,
  "name": "Entrada Adulto Mayor",
  "description": "Para personas mayores de 60 años",
  "price": "7500.00",
  "currency": "CRC",
  "total_slots": 1276,
  "occupied_slots": 0
}

Model reference

FieldTypeDescription
idintegerAuto-generated primary key
namestringUnique ticket name, max 30 chars
descriptionstringBuyer-facing description, max 100 chars
pricedecimal(10,2)Unit price
currencystringCRC or USD
total_slotsintegerCapacity ceiling, default 1276
occupied_slotsintegerCount of sold/reserved tickets, default 0
The available endpoint filters by is_active=True in the queryset. Inactive tickets are stored in the database but hidden from buyers.

Build docs developers (and LLMs) love