SDK para backend
Instalación
Sección titulada «Instalación»pnpm add @wodira/sdkUso básico
Sección titulada «Uso básico»import { createWodiraClient } from '@wodira/sdk';
const wodira = createWodiraClient({ apiKey: process.env.WODIRA_API_KEY!,});
const events = await wodira.searchEvents({ status: 'PUBLISHED', limit: 20 });const pricing = await wodira.getPricingCards(events.data[0].id);Si no usas Node/TypeScript, puedes llamar a los mismos endpoints con HTTP. En cada método tienes ejemplos equivalentes con @wodira/sdk, curl y PHP sin SDK.
Métodos
Sección titulada «Métodos»searchEventsBuscar eventos del organizadorgetEventLeer detalle completo de eventogetPricingCardsConsultar categorías, cupos y precioscreateRegistrationCrear inscripción server-to-serversearchRegistrationsBuscar inscripciones/ticketsupdateRegistrationActualizar una inscripcióndeleteRegistrationCancelar/eliminar inscripciónsearchEvents
Sección titulada «searchEvents»Busca eventos del organizador autenticado. Úsalo para sincronizar catálogos, mostrar listados internos o localizar el eventId antes de consultar pricing o inscripciones.
const events = await wodira.searchEvents({ search: 'Madrid', status: 'PUBLISHED', limit: 20, offset: 0,});curl -X POST "https://api.wodira.app/external/v1/organizer/events/search" \ -H "Authorization: Bearer $WODIRA_API_KEY" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{ "search": "Madrid", "status": "PUBLISHED", "limit": 20, "offset": 0 }'$payload = [ 'search' => 'Madrid', 'status' => 'PUBLISHED', 'limit' => 20, 'offset' => 0,];
$ch = curl_init('https://api.wodira.app/external/v1/organizer/events/search');curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . getenv('WODIRA_API_KEY'), 'Accept: application/json', 'Content-Type: application/json', ], CURLOPT_POSTFIELDS => json_encode($payload, JSON_THROW_ON_ERROR),]);
$response = curl_exec($ch);if ($response === false) { throw new RuntimeException(curl_error($ch));}curl_close($ch);
$events = json_decode($response, true, 512, JSON_THROW_ON_ERROR);- Endpoint:
POST /external/v1/organizer/events/search - Scope requerido:
events:read
getEvent
Sección titulada «getEvent»Obtiene el detalle de un evento concreto, incluyendo categorías, campos de formulario, waivers, sponsors y suplementos activos.
const event = await wodira.getEvent('event_123');curl "https://api.wodira.app/external/v1/organizer/events/event_123" \ -H "Authorization: Bearer $WODIRA_API_KEY" \ -H "Accept: application/json"$eventId = rawurlencode('event_123');
$ch = curl_init("https://api.wodira.app/external/v1/organizer/events/{$eventId}");curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . getenv('WODIRA_API_KEY'), 'Accept: application/json', ],]);
$response = curl_exec($ch);if ($response === false) { throw new RuntimeException(curl_error($ch));}curl_close($ch);
$event = json_decode($response, true, 512, JSON_THROW_ON_ERROR);- Endpoint:
GET /external/v1/organizer/events/:eventId - Scope requerido:
events:read
getPricingCards
Sección titulada «getPricingCards»Devuelve las categorías vendibles de un evento con cupo, inscritos, precio base, precio activo y tiers. Es el método recomendado antes de crear una inscripción.
const pricing = await wodira.getPricingCards('event_123');const firstCategory = pricing.cards[0];curl "https://api.wodira.app/external/v1/organizer/events/event_123/pricing-cards" \ -H "Authorization: Bearer $WODIRA_API_KEY" \ -H "Accept: application/json"$eventId = rawurlencode('event_123');
$ch = curl_init("https://api.wodira.app/external/v1/organizer/events/{$eventId}/pricing-cards");curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . getenv('WODIRA_API_KEY'), 'Accept: application/json', ],]);
$response = curl_exec($ch);if ($response === false) { throw new RuntimeException(curl_error($ch));}curl_close($ch);
$pricing = json_decode($response, true, 512, JSON_THROW_ON_ERROR);$firstCategory = $pricing['cards'][0] ?? null;- Endpoint:
GET /external/v1/organizer/events/:eventId/pricing-cards - Scope requerido:
pricing:read
createRegistration
Sección titulada «createRegistration»Crea una inscripción desde un backend de confianza usando secret key. No uses este método desde navegador; para checkout público usa createRegistrationCheckoutSession en @wodira/browser.
const order = await wodira.createRegistration({ eventId: 'event_123', categoryId: 'cat_123', teamName: 'Team Ada', athletes: [ { fullname: 'Ada Lovelace', email: 'ada@example.com', phone: '+34600000000', gender: 'FEMALE', idNumber: '12345678A', birthDate: '1990-01-01', }, ],});curl -X POST "https://api.wodira.app/external/v1/organizer/registrations" \ -H "Authorization: Bearer $WODIRA_API_KEY" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{ "eventId": "event_123", "categoryId": "cat_123", "teamName": "Team Ada", "athletes": [ { "fullname": "Ada Lovelace", "email": "ada@example.com", "phone": "+34600000000", "gender": "FEMALE", "idNumber": "12345678A", "birthDate": "1990-01-01" } ] }'$payload = [ 'eventId' => 'event_123', 'categoryId' => 'cat_123', 'teamName' => 'Team Ada', 'athletes' => [ [ 'fullname' => 'Ada Lovelace', 'email' => 'ada@example.com', 'phone' => '+34600000000', 'gender' => 'FEMALE', 'idNumber' => '12345678A', 'birthDate' => '1990-01-01', ], ],];
$ch = curl_init('https://api.wodira.app/external/v1/organizer/registrations');curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . getenv('WODIRA_API_KEY'), 'Accept: application/json', 'Content-Type: application/json', ], CURLOPT_POSTFIELDS => json_encode($payload, JSON_THROW_ON_ERROR),]);
$response = curl_exec($ch);if ($response === false) { throw new RuntimeException(curl_error($ch));}curl_close($ch);
$order = json_decode($response, true, 512, JSON_THROW_ON_ERROR);- Endpoint:
POST /external/v1/organizer/registrations - Scope requerido:
registrations:write
searchRegistrations
Sección titulada «searchRegistrations»Busca inscripciones/tickets para conciliación, soporte o sincronización con sistemas propios.
const registrations = await wodira.searchRegistrations({ eventId: 'event_123', search: 'ada@example.com', limit: 50,});curl -X POST "https://api.wodira.app/external/v1/organizer/registrations/search" \ -H "Authorization: Bearer $WODIRA_API_KEY" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{ "eventId": "event_123", "search": "ada@example.com", "limit": 50 }'$payload = [ 'eventId' => 'event_123', 'search' => 'ada@example.com', 'limit' => 50,];
$ch = curl_init('https://api.wodira.app/external/v1/organizer/registrations/search');curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . getenv('WODIRA_API_KEY'), 'Accept: application/json', 'Content-Type: application/json', ], CURLOPT_POSTFIELDS => json_encode($payload, JSON_THROW_ON_ERROR),]);
$response = curl_exec($ch);if ($response === false) { throw new RuntimeException(curl_error($ch));}curl_close($ch);
$registrations = json_decode($response, true, 512, JSON_THROW_ON_ERROR);- Endpoint:
POST /external/v1/organizer/registrations/search - Scope requerido:
registrations:read
updateRegistration
Sección titulada «updateRegistration»Actualiza datos de una inscripción existente desde backend cuando el integrador mantiene flujos de soporte o edición propios.
const ticket = await wodira.updateRegistration('ticket_123', { teamName: 'Team Ada Updated', note: 'Updated from external CRM',});curl -X PATCH "https://api.wodira.app/external/v1/organizer/registrations/ticket_123" \ -H "Authorization: Bearer $WODIRA_API_KEY" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{ "teamName": "Team Ada Updated", "note": "Updated from external CRM" }'$ticketId = rawurlencode('ticket_123');$payload = [ 'teamName' => 'Team Ada Updated', 'note' => 'Updated from external CRM',];
$ch = curl_init("https://api.wodira.app/external/v1/organizer/registrations/{$ticketId}");curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => 'PATCH', CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . getenv('WODIRA_API_KEY'), 'Accept: application/json', 'Content-Type: application/json', ], CURLOPT_POSTFIELDS => json_encode($payload, JSON_THROW_ON_ERROR),]);
$response = curl_exec($ch);if ($response === false) { throw new RuntimeException(curl_error($ch));}curl_close($ch);
$ticket = json_decode($response, true, 512, JSON_THROW_ON_ERROR);- Endpoint:
PATCH /external/v1/organizer/registrations/:ticketId - Scope requerido:
registrations:write
deleteRegistration
Sección titulada «deleteRegistration»Cancela o elimina una inscripción desde backend según las reglas operativas de WODira.
await wodira.deleteRegistration('ticket_123');curl -X DELETE "https://api.wodira.app/external/v1/organizer/registrations/ticket_123" \ -H "Authorization: Bearer $WODIRA_API_KEY" \ -H "Accept: application/json"$ticketId = rawurlencode('ticket_123');
$ch = curl_init("https://api.wodira.app/external/v1/organizer/registrations/{$ticketId}");curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => 'DELETE', CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . getenv('WODIRA_API_KEY'), 'Accept: application/json', ],]);
$response = curl_exec($ch);if ($response === false) { throw new RuntimeException(curl_error($ch));}curl_close($ch);- Endpoint:
DELETE /external/v1/organizer/registrations/:ticketId - Scope requerido:
registrations:write
Seguridad
Sección titulada «Seguridad»Guarda wd_live_... en variables de entorno o secret manager. Nunca la envíes al navegador.