How To Connect Your Venue System To The KudosCourts Developer API
A developer integration guide for venue operators who already run their own system and want to connect it to the KudosCourts developer API safely.
Direct answer
To connect an existing venue system to the KudosCourts developer API, create one integration, issue a scoped key, map external court IDs to live inventory, run the server-side precheck, validate a live availability read in the dashboard, then run one external write and cleanup smoke before handing snippets and the OpenAPI contract to the engineering team.
Create one integration for each external platform
Start in the Developers dashboard by creating a named integration for the external system that will control or read availability. Think of an integration as the operational boundary for one venue system, one partner, or one deployment environment.
Keeping integrations separate matters because keys, mapped external court IDs, and readiness checks all live inside that boundary. If you merge multiple systems into one integration too early, the dashboard becomes harder to reason about and handoff becomes riskier.
As soon as the integration exists, the launchpad can track progress through keys, mappings, precheck, and the guided test console. That makes it clear what still blocks a safe handoff.
What you will see
Create integration
Issue API key
Map at least one court
Run precheck
Start with one integration
Create a dedicated integration for each external platform so keys, mappings, and prechecks stay isolated and easy to reason about.
Quickstart
Developer auth header
X-API-Key: YOUR_API_KEY
Selected keys remain masked after creation. Snippets fall back to YOUR_API_KEY unless the selected key was just revealed.
Tip: Use the same naming convention your external engineering team already uses internally, such as 'Acme OMS Production' or 'Venue ERP Sandbox'.
Issue a scoped server key and capture the one-time secret
After the integration is created, issue a server-side API key with only the scopes the partner needs. The dashboard shows the plaintext secret once, then stores only the masked prefix and metadata afterward.
This is the moment to capture the secret in the partner's secret manager. The dashboard is intentionally optimized for a smooth handoff: the same card shows the current scopes, IP allowlist notes, and recent usage metadata after the reveal moment passes.
If the partner only needs live reads at first, start with `availability.read`. Add write scope only when they are actually ready to push availability changes into the platform.
If you want to validate the full public contract before handoff, create a temporary smoke-test key with both `availability.read` and `availability.write`, run the external write smoke once, then keep or rotate that key according to your launch policy.
What you will see
Secret shown once
Copy this now. The dashboard will only keep the masked prefix after this moment.
kudos_live_abc123_demo_secret
Tip: Use narrow scopes for onboarding and widen them later. It is easier to add access than to unwind an over-permissive key after handoff.
The snippets panel intentionally falls back to YOUR_API_KEY unless the currently selected key is the same one that was just revealed. That keeps the dashboard from re-exposing masked secrets later.
Map external court IDs to live inventory
The mapping table is where you connect each external court identifier to a real bookable court in the organization. The dashboard uses the same active venue and court inventory that operators already manage elsewhere in the platform.
This is the step that makes the rest of the workflow meaningful. Precheck, live reads, and write calls all depend on a valid external court ID mapping — without it, the API has no safe way to resolve the partner's identifiers to the internal booking model.
The guide should be read with the expectation that the table mirrors the live Developers dashboard exactly, but preview snippets can crop down to the relevant rows so the article stays readable.
What you will see
Cebu Sports Hub
2 active courts
Court A
court_id: court-a
Court B
court_id: court-b
Tip: Start with one mapped court first. Once precheck passes on that court, expand the same pattern across the rest of the venue.
Run the precheck before handing anything off
The precheck is the fastest way to validate readiness without sending the external engineering team on a blind integration attempt. It runs server-side and checks the fixed onboarding contract: integration health, key health, required scope, mapping existence, and a live sample availability read.
That means the product can catch the most common launch blockers before anyone copies a single snippet into a server. If the check fails, the response includes enough detail to tell you whether the problem is the integration setup, the key, the selected external court, or the live availability path.
Use the precheck whenever you change mappings or rotate keys. It is not just for first launch — it is the safest quick regression scan for the whole integration setup.
What you will see
Status
PASS
4 pass / 0 warn / 0 fail
Integration status
The integration is active.
API key status
The selected key is active and valid.
Court mappings
A mapped external court ID is ready for live checks.
Live availability read
A sample developer availability request completed successfully.
request_id: req_dev_01
Tip: Treat a green precheck as the minimum handoff bar. If it is not green, the external team should not be asked to debug the connection yet.
The precheck uses protected internal management routes and never requires the browser to re-send a stored plaintext key. That keeps the safety model aligned with production key handling.
Run one safe live availability read in the guided console, then validate one public write outside the dashboard
The guided test console is intentionally narrow: one live, read-only availability request that runs server-side against the currently selected integration, key, mapped external court, date, and duration.
This is enough to prove the end-to-end path works without turning the dashboard into a general-purpose API playground. The operator gets a visible request shape, the response payload, and the request ID needed for support or deeper investigation.
Once that read is green, switch to the public API for one external write smoke: create a temporary unavailability window with `curl`, read the same external court back through the public availability endpoint, then delete the temporary window immediately. That proves read and write alignment without moving write execution into the browser.
Because the console is locked to a safe read path, it is ideal for onboarding review calls and internal verification. Write calls stay copy-first in v1 so operators and developers can validate them deliberately and clean them up explicitly.
What you will see
Latest response
req_dev_01{
"request": {
"externalCourtId": "ext-court-a",
"date": "2026-03-16T09:00:00.000Z",
"durationMinutes": 60,
"includeUnavailable": true
},
"response": {
"options": [
{
"courtId": "court-1",
"startTime": "2026-03-16T09:00:00.000Z",
"endTime": "2026-03-16T10:00:00.000Z",
"status": "AVAILABLE",
"totalPriceCents": 60000,
"currency": "PHP"
}
],
"diagnostics": {
"hasHoursWindows": true,
"hasRateRules": true,
"dayHasHours": true,
"allSlotsBooked": false
}
},
"requestId": "req_dev_01"
}Tip: Use the same date and duration you expect the partner to query in their first real integration test. That makes the console output a true preview of launch-day behavior.
Hand off the snippets, OpenAPI contract, and smoke flow
Once the integration is green, move to the snippets and docs panel. The page generates cURL and JavaScript examples from the currently selected mapped external court and test inputs, then links directly to the public OpenAPI document for the full contract.
This is where operator UX and developer DX meet: the operator can confirm the selected values look right, and the external engineering team gets a starting point that already matches the live dashboard state instead of a generic sample lifted from separate documentation.
For full handoff, package three things together: the generated read snippet, the exact mapped external court id, and the public write smoke sequence you already validated with immediate cleanup. That gives the external team both the first request and the safest write pattern.
Use the generated snippets as the handoff artifact, but keep the OpenAPI spec in the package too. The snippets explain the first request; the contract explains the whole surface.
What you will see
cURL
curl -sS "https://kudoscourts.ph/api/developer/v1/courts/ext-court-a/availability?date=2026-03-16T09%3A00%3A00.000Z&durationMinutes=60&includeUnavailable=true" \ -H "X-API-Key: kudos_live_abc123_demo_secret" \ -H "Accept: application/json"
JavaScript
const url = new URL(
"https://kudoscourts.ph/api/developer/v1/courts/ext-court-a/availability",
);
url.searchParams.set("date", "2026-03-16T09:00:00.000Z");
url.searchParams.set("durationMinutes", "60");
url.searchParams.set("includeUnavailable", "true");
const response = await fetch(url, {
headers: { "X-API-Key": "kudos_live_abc123_demo_secret" },
});
const json = await response.json();
console.log(json);OpenAPI spec
Raw machine-readable API contract for docs, codegen, and external tooling.
Precheck workflow
Server-side readiness scan that validates key health, scope, mappings, and a live sample read.
Write safety
The dashboard only executes live read requests. Write endpoints stay copy-first in v1.
Tip: Share the snippet, the mapped external court id, the write smoke sequence, and the OpenAPI link together. Snippets accelerate the first request, while the spec answers follow-up integration questions.
Frequently asked questions
Why create one integration per external platform?
It keeps keys, court mappings, and readiness checks isolated so handoff and troubleshooting stay manageable.
Does the dashboard execute live write calls?
No. In v1 the dashboard only runs a safe live availability read. To validate writes, use the revealed key against the public unavailability route, confirm the result through the public availability read, then clean the temporary window up immediately.
Why is the precheck important before handoff?
It catches the common launch blockers first: inactive integrations, invalid keys, missing read scope, missing mappings, and failed live sample reads.
What should I give the external engineering team?
Give them the generated snippet for the first request, the selected external court ID, the one-time secret you stored securely, and the OpenAPI document for the full contract.