Skip to content
Carolina Code Conference
Served by SQL (Ash) in 10ms

Polyglot API specification

OpenAPI 3 documentation for language backends that serve speakers and sponsors. The live contract is openapi.yaml. Implement a new API using AGENTS.md.

GET /

API identity and endpoint catalog

Returns language metadata and the list of routes this process serves so the Elixir site can register it.

{
  "api_version": "1.1.0",
  "endpoints": [
    "GET /health",
    "GET /v1/speakers",
    "GET /v1/sponsors"
  ],
  "framework": "Sinatra",
  "language": "Ruby"
}

GET /health

Liveness

Cheap liveness probe used for boot health checks and keep-alives. Must not hit the database if possible.

{
  "status": "ok"
}

POST /internal/api-endpoints/register

Register this API with the Elixir site

Called once on boot. Bearer POLYGLOT_REGISTER_TOKEN. Upserts by language + base_url.

{
  "id": "00000000-0000-0000-0000-000000000001",
  "ok": true
}

GET /v1/speakers

Listed speakers

Returns listed speakers. With ?year= each row includes languages and topics for that year's talks so listing filters work.

{
  "data": [
    {
      "company": "Example",
      "first_name": "Diana",
      "languages": [
        "elixir"
      ],
      "last_name": "Pham",
      "name": "Diana Pham",
      "photo_path": "/images/speakers/diana-pham.jpg",
      "slug": "diana-pham",
      "topics": [
        "development"
      ],
      "year": 2026
    }
  ]
}

GET /v1/speakers/{slug}

Speaker detail (all years)

Full speaker profile across conferences, including talks, languages, and topics.

{
  "data": {
    "bio": "Speaker biography",
    "name": "Diana Pham",
    "other_years": [
      2025,
      2024
    ],
    "slug": "diana-pham",
    "talks": []
  }
}

GET /v1/speakers/{year}/{slug}

Speaker detail for a conference year

Year-scoped speaker page used by /speakers/{year}/{slug}. Includes that year's talks (with youtube_id when a recording exists) and other_years for navigation.

{
  "data": {
    "name": "Charles Nutter",
    "other_years": [],
    "slug": "charles-nutter",
    "talks": [
      {
        "format": "keynote",
        "languages": [
          "ruby",
          "java"
        ],
        "slug": "bringing-ruby-to-the-jvm-making-the-impossible-possible",
        "title": "Bringing Ruby to the JVM: Making the Impossible Possible",
        "topics": [
          "development"
        ],
        "youtube_id": "pzm6I4liJlg"
      }
    ],
    "year": 2023
  }
}

GET /v1/sponsors

Listed sponsors

Returns listed sponsors. With ?year= each row includes that year's tier. description and blurb are the organization profile, the same text every year.

{
  "data": [
    {
      "logo_path": "/images/sponsors/flywheel.png",
      "name": "Flywheel",
      "slug": "flywheel",
      "tier": "platinum",
      "website": "https://www.flywheelgreenvillesc.com",
      "year": 2026
    }
  ]
}

GET /v1/sponsors/{slug}

Sponsor detail (all years)

Organization profile with website, socials, and description.

{
  "data": {
    "description": "Coworking campus in Greenville.",
    "name": "Flywheel",
    "slug": "flywheel",
    "twitter_url": "https://x.com/flywheel",
    "website": "https://www.flywheelgreenvillesc.com"
  }
}

GET /v1/sponsors/{year}/{slug}

Sponsor detail for a conference year

Year-scoped sponsor page used by /sponsors/{year}/{slug}. Tier is for that year. blurb repeats the organization description. other_years lists the other sponsored years.

{
  "data": {
    "blurb": "Home of the Carolina Code Conference.",
    "name": "Flywheel",
    "other_years": [
      2025
    ],
    "slug": "flywheel",
    "tier": "platinum",
    "year": 2026
  }
}

GET /v1/years

Conference years

Lists conference years so public pages can render year filters without hard-coding them.

{
  "data": [
    {
      "year": 2026
    },
    {
      "year": 2025
    }
  ]
}