Public API Rules
- Public GraphQL at
/graphqlis read-only. Mutations are rejected. - Anonymous request rate limit: 100 requests/minute/IP.
- All user-provided text is sanitized before storage.
Public Endpoints
| Method | Path | Description |
|---|---|---|
| GET | / | Public convention browser (search, filters, modal details). |
| GET | /map | World map view with convention markers and device-location lookup. |
| GET | /con?id=<id> | Public full-page convention details view for sharing links. |
| GET | /con/schedule?id=<id> | Public schedule page for convention sub-events. |
| GET | /suggest?id=<id> | Public suggestion page for convention corrections and badge pricing. |
| GET | /report?id=<id> | Report a safety issue for a convention. |
| POST | /submit/issue | Submit a safety issue report. |
| POST | /graphql | Public read-only GraphQL for conventions and sub-events. |
| GET | /healthz | Health probe. |
GraphQL Query Options
conventions(limit, offset, sortBy, sortOrder, country, region, city, organizerCode, q, subEventType, hasSubEventTypes, conventionType)
nearestConventions(n, fromDate, country, region, city)
conventionsByDistance(lat, lon, radiusKm, limit, includePast)
subEvents(conventionId, type, limit, offset)
Schema Highlights
Convention.cancelledindicates cancelled conventions.Convention.latitudeandConvention.longitudeprovide GPS coordinates derived from city metadata (venue is ignored).ConventionDistance.distanceKmis returned byconventionsByDistance.SubEvent.cancelledindicates cancelled sub-events.importantDates,badges, andsubEventsare included per convention.
Convention Schema
| Field | Type | Notes |
|---|---|---|
| id | ID! | Convention ID. |
| organizerId | Int! | Organizer numeric ID. |
| organizerCode | String! | Organizer code (ORG-xxxxxx). |
| organizerName | String! | Organizer display name. |
| name | String! | Convention name. |
| seriesName | String! | Series name. |
| sourceEventId | Int | Source import event ID. |
| sourceSlug | String! | Source slug. |
| sourceUrl | String! | Source URL. |
| dateText | String! | Human-readable date string. |
| startDate | String! | YYYY-MM-DD. |
| endDate | String! | YYYY-MM-DD. |
| venue | String! | Venue name. |
| city | String! | City. |
| region | String! | Region/state. |
| country | String! | Country. |
| locationText | String! | Location string. |
| latitude | Float! | Derived from city metadata. |
| longitude | Float! | Derived from city metadata. |
| homepageUrl | String! | Official homepage. |
| registrationUrl | String! | Registration link. |
| rulesUrl | String! | Rules link. |
| ageRating | String! | Age rating text. |
| conventionType | String! | `convention`, `meetup`, `online`, or `other`. |
| cancelled | Boolean! | Cancelled status. |
| description | String! | Convention description. |
| socialLinks | [ConventionLink!]! | Social links. |
| importantDates | [ImportantDate!]! | Important dates. |
| badges | [ConventionBadge!]! | Badge pricing entries. |
| subEvents | [SubEvent!]! | Sub-events. |
| notifications | [ConventionNotification!]! | News updates. |
| fingerprint | String! | Uniqueness fingerprint. |
| createdAt | String! | RFC3339 timestamp. |
| updatedAt | String! | RFC3339 timestamp. |
Public Event Stream
GET /public/events returns an SSE stream of public lifecycle events only:
convention.createdconvention.changedconvention.deletedconvention.cancelledsubevent.createdsubevent.changedsubevent.deletedsubevent.cancellednotification.urgentCopyable cURL Examples
Public GraphQL conventions query
curl -s https://cons.furs.gg/graphql \
-H 'Content-Type: application/json' \
-d '{"query":"{ conventions(limit: 20, sortBy:\"start_date\", sortOrder:\"asc\") { id name cancelled startDate endDate city country latitude longitude badges { name type daysValid price registrationUrl } subEvents { title type cancelled startsAt } importantDates { label dateValue } } }"}'Nearest conventions query
curl -s https://cons.furs.gg/graphql \
-H 'Content-Type: application/json' \
-d '{"query":"{ nearestConventions(n: 10, fromDate:\"2026-02-19\") { id name startDate endDate city country cancelled } }"}'Distance-based conventions query
curl -s https://cons.furs.gg/graphql \
-H 'Content-Type: application/json' \
-d '{"query":"{ conventionsByDistance(lat: 40.7128, lon: -74.0060, radiusKm: 500) { distanceKm convention { id name startDate city country latitude longitude } } }"}'Public event stream (SSE)
curl -N https://cons.furs.gg/public/events