Multi-channel platform

One platform. Three ways to deliver.

Use Voorna as a complete hosted website, embed it into your existing site, or integrate it directly via API — all from the same account.

Fastest to launch

Hosted Website

Create a complete voting website at voorna.com/e/your-event. Landing page, participant profiles, leaderboard, payments — all included. No code required.

Landing pageParticipant profilesLive leaderboardPaymentsAnalytics
voorna.com/e/miss-auckland-2027
Most flexible

Embed Anywhere

Drop VOORNA voting into your existing WordPress, Webflow, Squarespace, or custom website. Works as an iframe, JavaScript widget, or React component.

IframeJS WidgetReact (coming soon)ResponsiveBranded
<script src="https://voorna.com/widget.js"
  data-event="miss-auckland-2027">
</script>
Full control

API Integration

Use VOORNA as your voting backend. Build your own frontend — web, mobile, kiosk, or digital display — while we handle votes, payments, and fraud.

EventsParticipantsVotingPaymentsWebhooksOpenAPI docs
{ "rank": 1, "name": "Sofia Reyes", "votes": 1690 }

All three methods share the same account, database, analytics, and payments. Switch anytime — no data migration required.

Developers

VOORNA REST API

Use VOORNA as your voting backend. Build your own frontend — web, mobile, kiosk, or digital display — while we handle votes, payments, and fraud. All endpoints share the same backend as the hosted website and embeddable widgets.

Base URL

https://voorna.com

Authentication

Authenticated endpoints require an API key, issued per organiser from your dashboard under Settings → API Keys. Pass it as a Bearer token in the Authorization header. Keys are prefixed with voorna_ and are shown only once at creation.

Authorization: Bearer voorna_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Rate limiting

Requests are rate limited per API key (configurable per organiser). Free voting endpoints additionally enforce a 10-second IP cooldown and a 50-votes-per-day-per-IP cap to prevent fraud. Exceeding a limit returns HTTP 429.

Endpoints

Events

GET/api/events/{slug}/participantsList participants for an event.API key
GET/api/events/{slug}/leaderboardGet ranked participants by vote count.API key

Voting

POST/api/events/{slug}/votesCast a free vote (rate limited, fraud protected).Public

API Keys

POST/api/keysGenerate a new API key (dashboard session).Session
DELETE/api/keys/{id}Revoke an API key.Session

Example — Cast a free vote

POST https://voorna.com/api/events/miss-auckland-2027/votes
Content-Type: application/json

{
  "participant_id": "p-001",
  "kind": "free",
  "source_referral_code": "sofia26"
}

// 200 OK
{ "ok": true, "participant_id": "p-001", "vote_count": 1691 }

Example — List participants

GET https://voorna.com/api/events/miss-auckland-2027/participants
Authorization: Bearer voorna_xxxxxxxx

// 200 OK
{
  "participants": [
    {
      "id": "p-001",
      "name": "Sofia Reyes",
      "number": 1,
      "photo_url": "https://…",
      "bio": "Community advocate…",
      "vote_count": 1690,
      "referral_code": "sofia26",
      "status": "active"
    }
  ]
}

Example — Get leaderboard

GET https://voorna.com/api/events/miss-auckland-2027/leaderboard
Authorization: Bearer voorna_xxxxxxxx

// 200 OK
{
  "leaderboard": [
    { "rank": 1, "name": "Sofia Reyes", "vote_count": 1690 },
    { "rank": 2, "name": "Amara Okafor", "vote_count": 1542 }
  ],
  "updated_at": "2026-06-25T01:00:00.000Z"
}

Webhooks

Subscribe to event triggers to react to activity in real time. v1 events: vote.cast, payment.succeeded, and event.closed. OAuth 2.0 and official SDKs (Node, Python, PHP) are on the v2 roadmap.