Ga naar de inhoud
CoachHelpr
CoachHelpr
Download

Koppelen met CoachHelpr

Laat de startopstelling van je team zien in je eigen app, op de clubsite of op het scorebord. Je haalt hem op bij één vast adres, met een sleutel voor jouw team.

Wat je kunt uitlezen

Je krijgt de startopstelling van de wedstrijd die nu bezig is, en anders die van de volgende wedstrijd. Heeft die nog geen opstelling, dan krijg je de standaardopstelling van het team.

Per speler krijg je de voornaam, de initialen, het rugnummer, de positie, of die speler aanvoerder is en de plek op het veld. Je ziet ook wie er op de bank begint.

Achternamen, notities en alles over fitheid of blessures geven we nooit mee.

Een sleutel krijgen

Een sleutel hoort bij één team. De coach van dat team maakt hem in de app, via Meer, Teams, het team en Koppelingen, en geeft hem aan jou.

De sleutel werkt niet meer zodra die coach het team niet meer coacht. Elke coach van het team kan hem intrekken, en wij ook.

Bewaar de sleutel op je server, nooit in een webpagina of app die anderen kunnen openen.

Vragen over koppelen stel je via het contactformulier.

Naar het contactformulier

Snel starten

Stuur de sleutel mee in de Authorization-header, met Bearer ervoor:

curl https://coachhelpr.app/api/v1/integration/start-lineup \
  -H "Authorization: Bearer chk_..."

Hetzelfde in JavaScript, op je server, met de sleutel in de omgevingsvariabele COACHHELPR_KEY:

const url = 'https://coachhelpr.app/api/v1/integration/start-lineup';
const response = await fetch(url, {
  headers: { Authorization: `Bearer ${process.env.COACHHELPR_KEY}` },
});
if (!response.ok) throw new Error(`CoachHelpr answered ${response.status}`);
const lineup = await response.json();

Je krijgt dan dit antwoord:

{
  "team": {
    "name": "MO14-1",
    "clubName": "HC De Linden"
  },
  "source": "match",
  "match": {
    "kickoffAt": "2026-10-10T10:30:00.000Z",
    "opponent": "HC Oosterpark MO14-2",
    "isHome": true,
    "pitch": "Veld 2",
    "running": false
  },
  "lineupStatus": "confirmed",
  "formation": "3-3-3-1",
  "slots": [
    {
      "slot": 1,
      "positionCode": "K",
      "line": "keeper",
      "x": 50,
      "y": 95,
      "player": {
        "firstName": "Noa",
        "initials": "NB",
        "shirtNumber": 1,
        "isCaptain": false
      }
    },
    {
      "slot": 2,
      "positionCode": "CA",
      "line": "defence",
      "x": 50,
      "y": 80,
      "player": {
        "firstName": "Amira",
        "initials": "AY",
        "shirtNumber": 4,
        "isCaptain": true
      }
    },
    {
      "slot": 3,
      "positionCode": "LA",
      "line": "defence",
      "x": 20,
      "y": 64,
      "player": {
        "firstName": "Fleur",
        "initials": "FJ",
        "shirtNumber": 3,
        "isCaptain": false
      }
    },
    {
      "slot": 4,
      "positionCode": "VS",
      "line": "defence",
      "x": 50,
      "y": 67,
      "player": {
        "firstName": "Lotte",
        "initials": "LV",
        "shirtNumber": 5,
        "isCaptain": false
      }
    },
    {
      "slot": 5,
      "positionCode": "RA",
      "line": "defence",
      "x": 80,
      "y": 64,
      "player": {
        "firstName": "Sara",
        "initials": "SK",
        "shirtNumber": 2,
        "isCaptain": false
      }
    },
    {
      "slot": 6,
      "positionCode": "LM",
      "line": "midfield",
      "x": 20,
      "y": 45,
      "player": {
        "firstName": "Julia",
        "initials": "JM",
        "shirtNumber": 8,
        "isCaptain": false
      }
    },
    {
      "slot": 7,
      "positionCode": "MM",
      "line": "midfield",
      "x": 50,
      "y": 48,
      "player": {
        "firstName": "Evi",
        "initials": "ED",
        "shirtNumber": 6,
        "isCaptain": false
      }
    },
    {
      "slot": 8,
      "positionCode": "RM",
      "line": "midfield",
      "x": 80,
      "y": 45,
      "player": {
        "firstName": "Tess",
        "initials": "TH",
        "shirtNumber": 7,
        "isCaptain": false
      }
    },
    {
      "slot": 9,
      "positionCode": "LV",
      "line": "attack",
      "x": 20,
      "y": 25,
      "player": {
        "firstName": "Mila",
        "initials": "MS",
        "shirtNumber": 11,
        "isCaptain": false
      }
    },
    {
      "slot": 10,
      "positionCode": "SP",
      "line": "attack",
      "x": 50,
      "y": 15,
      "player": {
        "firstName": "Zoë",
        "initials": "ZP",
        "shirtNumber": 9,
        "isCaptain": false
      }
    },
    {
      "slot": 11,
      "positionCode": "RV",
      "line": "attack",
      "x": 80,
      "y": 25,
      "player": null
    }
  ],
  "bench": [
    {
      "firstName": "Iris",
      "initials": "IW",
      "shirtNumber": 14,
      "isCaptain": false
    },
    {
      "firstName": "Yara",
      "initials": "YB",
      "shirtNumber": 16,
      "isCaptain": false
    }
  ],
  "serverTime": "2026-10-07T14:02:11.000Z"
}

Velden

Alle velden van het antwoord. Een pad met [] geldt voor elk item in die lijst.

VeldTypeBetekenis
teamobjectHet team van de sleutel.
team.namestringDe naam van het team.
team.clubNamestring | nullDe naam van de club, of null zonder club.
source"match" | "standard" | "none"Waar de opstelling vandaan komt. match: de opstelling van de wedstrijd in het veld match. standard: de standaardopstelling van het team. none: er is geen opstelling.
matchobject | nullDe wedstrijd die nu gespeeld wordt, en anders de volgende. Ook gevuld als die wedstrijd nog geen opstelling heeft: source is dan standard of none. null zonder wedstrijd.
match.kickoffAtstring (date-time)Wanneer de wedstrijd begint, in UTC.
match.opponentstringDe tegenstander.
match.isHomebooleantrue bij een thuiswedstrijd.
match.pitchstring | nullHet veld, of null als dat niet bekend is.
match.runningbooleantrue als de wedstrijd nu gespeeld wordt.
lineupStatus"confirmed" | "proposal" | "outdated" | nullAlleen bij match, anders null. confirmed: de coach heeft de opstelling bevestigd. proposal: een voorstel dat de coach nog niet heeft bevestigd. outdated: er is iets veranderd sinds het voorstel, bijvoorbeeld wie er mee kan doen.
formationstring | nullHet spelsysteem, zoals 3-3-3-1. null bij none.
slotsobject[]Elke plek van het spelsysteem, op volgorde, ook een plek waar niemand staat.
slots[].slotintegerHet nummer van de plek, vanaf 1.
slots[].positionCodestringDe afkorting van de positie, zoals K, LA of SP.
slots[].line"keeper" | "defence" | "midfield" | "attack"De linie van de plek.
slots[].xintegerWaar de plek staat over de breedte van het veld, van 0 (links) tot 100 (rechts).
slots[].yintegerWaar de plek staat over de lengte van het veld, van 0 (bij het doel van de tegenstander) tot 100 (bij het eigen doel).
slots[].playerobject | nullDe speler op deze plek, of null als de plek leeg is.
slots[].player.firstNamestringDe voornaam.
slots[].player.initialsstringDe initialen.
slots[].player.shirtNumberinteger | nullHet rugnummer, of null als dat niet bekend is.
slots[].player.isCaptainbooleantrue voor de aanvoerder.
benchobject[]Wie er op de bank begint. Leeg bij standard en none.
bench[].firstNamestringDe voornaam.
bench[].initialsstringDe initialen.
bench[].shirtNumberinteger | nullHet rugnummer, of null als dat niet bekend is.
bench[].isCaptainbooleantrue voor de aanvoerder.
serverTimestring (date-time)Het moment waarop we het antwoord maakten, in UTC.

Fouten en limieten

401 auth_required
Geen sleutel, een verkeerde of ingetrokken sleutel, of een sleutel van een coach die het team niet meer coacht.
429 rate_limited
Meer dan 60 verzoeken in een minuut met dezelfde sleutel. Wacht even en probeer het dan opnieuw.
500 internal_error
Er ging bij ons iets mis. Probeer het later nog een keer.

Eén keer per minuut ophalen is ruim genoeg.

Aanroepen via MCP tellen mee voor dezelfde 60 per minuut. Verbinden kost een paar aanroepen, en elke keer dat de assistent de opstelling opvraagt komt er een bij.

De API stuurt geen CORS-headers, dus een webpagina op een andere site kan het antwoord niet lezen. Roep hem aan vanaf je server.

Gebruiken met AI (MCP)

Met MCP kan een AI-assistent zoals Claude of Cursor de opstelling van je team voor je uitlezen. Je gebruikt dezelfde sleutel, met dezelfde limiet. De tool heeft geen argumenten: de sleutel bepaalt het team.

Adres
https://coachhelpr.app/api/v1/integration/mcp
Tool
get_start_lineup

In Claude Code voeg je de server toe met:

claude mcp add --transport http coachhelpr \
  https://coachhelpr.app/api/v1/integration/mcp \
  --header "Authorization: Bearer chk_..."

In Cursor zet je dit in ~/.cursor/mcp.json:

{
  "mcpServers": {
    "coachhelpr": {
      "url": "https://coachhelpr.app/api/v1/integration/mcp",
      "headers": {
        "Authorization": "Bearer chk_..."
      }
    }
  }
}

Claude Desktop gaat via mcp-remote, daarvoor heb je Node.js nodig. Zet dit in claude_desktop_config.json:

{
  "mcpServers": {
    "coachhelpr": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://coachhelpr.app/api/v1/integration/mcp",
        "--header",
        "Authorization:${COACHHELPR_AUTH}"
      ],
      "env": {
        "COACHHELPR_AUTH": "Bearer chk_..."
      }
    }
  }
}

Meer