sdks · v2 api

six sdks. same api.

fully typed, covers every endpoint, ships weekly. source on github, no yearly license, no “contact sales”.

node.

latest 2.3.1 · apr 18, 2026
runtime node 18+ · deno · bun · cloudflare workers
typescript bundled · strict types
bundle 14kb gzip · esm + cjs
license mit
install + create event
$ npm i @tired/node

import { Tired } from '@tired/node';
const tired = new Tired(process.env.TIRED_KEY);

const event = await tired.events.create({
  title: 'sade yancey, late set',
  venueId: 'ven_…',
  doorsAt: new Date('2026-05-17T20:00-04:00'),
  tickets: [{ name: 'general', priceCents: 2500, quantity: 120 }],
});

// event.url → https://tired.events/e/sade-yancey

python.

latest 2.3.0 · apr 14, 2026
runtime python 3.9+
clients sync + async (httpx)
types pep 561 · py.typed
license mit
async · scan validation
$ pip install tired

from tired import AsyncTired
tired = AsyncTired(api_key=os.environ['TIRED_KEY'])

async def check_in(token):
    result = await tired.scan.validate(
        token=token, door='south',
    )
    if result.valid:
        print(f"welcome, {result.attendee.name}")
    else:
        print(f"reject: {result.reason}")

ruby.

latest 2.2.4 · apr 09, 2026
runtime ruby 3.0+ · rails 6.1+
rails activerecord-style resources
webhooks signed verification helpers
license mit
refund + webhook
$ gem install tired

Tired.api_key = ENV['TIRED_KEY']

# refund full order
Tired::Order.refund('ord_01HY…', reason: 'buyer_request')

# verify incoming webhook in a controller
def hook
  event = Tired::Webhook.construct_event(
    request.raw_post,
    request.headers['x-tired-signature'],
    ENV['WHSEC']
  )
  # event.type == 'order.created'
end

go.

latest 2.3.1 · apr 18, 2026
runtime go 1.21+
ctx every call takes context.Context
errors typed · errors.As friendly
license mit
list orders
$ go get tired.events/go

client := tired.New(os.Getenv("TIRED_KEY"))

iter := client.Orders.List(ctx, &tired.OrdersListParams{
  EventID:     tired.String("evt_01HY…"),
  Status:      tired.OrderStatusPaid,
  CreatedAfter: time.Now().Add(-7 * 24 * time.Hour),
})

for iter.Next() {
  o := iter.Current()
  fmt.Println(o.ID, o.TotalCents)
}

php.

latest 2.1.8 · apr 02, 2026
runtime php 8.1+
psr psr-18 http · psr-7 responses
framework laravel + symfony adapters
license mit
payout ledger
$ composer require tired/php

use Tired\Client;

$t = new Client(getenv('TIRED_KEY'));

$payouts = $t->payouts->all([
  'limit' => 10,
  'status' => 'paid',
]);

foreach ($payouts->data as $p) {
  echo $p->id . ' ' . ($p->net_cents / 100) . PHP_EOL;
}

swift.

latest 1.4.0 · apr 16, 2026
platforms ios 16+ · macOS 13+ · tvOS 16+
concurrency async/await throughout
door offline scan verification built in
license mit
door app · swift
// Package.swift
.package(url: "https://github.com/tired/swift", from: "1.4.0")

import Tired

let tired = Tired(apiKey: ProcessInfo.processInfo.environment["TIRED_KEY"]!)

func scan(token: String) async throws -> ScanResult {
  try await tired.scan.validate(token: token, door: "south")
}

and if your language isn't here?

the rest api is boring on purpose. json in, json out, no weird headers. it works from bash with curl. community-maintained sdks exist for rust, elixir, .net, kotlin — unsupported by us but linked on github.com/tired.