API Documentatie

Eén API-key, klaar om te integreren.

Geef een agent (n8n, GPT, Claude, je eigen script) een API-key en deze pagina, en hij weet alles wat hij nodig heeft om links aan te maken, op te halen, bij te werken of te verwijderen.

Snelstart

Drie dingen heb je nodig:

  • Een account in Link Manager (Google-login).
  • Een API-key die je in de app aanmaakt onder de tab "API Toegang".
  • Deze basis-URL: https://linkfinderpro.com/api/v1

Daarna ben je in één commando aan de slag:

curl -H "Authorization: Bearer JOUW_KEY" \
  https://linkfinderpro.com/api/v1/links

Een API-key aanmaken

  1. Log in op Link Manager.
  2. Klik in de bovenbalk op API Toegang.
  3. Geef je key een herkenbare naam (bijvoorbeeld n8n-agent) en klik op Nieuwe API-key aanmaken.
  4. Kopieer de key meteen — hij wordt maar één keer volledig getoond. Daarna zie je alleen nog de prefix.
  5. Bewaar de key veilig. Verloren? Trek hem in en maak een nieuwe aan.

Een key heeft het formaat lmp_ gevolgd door 48 willekeurige hex-tekens. Hij wordt versleuteld (SHA-256) opgeslagen in de database — wij kunnen hem zelf niet meer terughalen.

Authenticatie

Stuur de key bij elk verzoek mee in een header. Twee varianten worden geaccepteerd:

# Variant 1 — Bearer token (aanbevolen)
Authorization: Bearer lmp_xxxxxxxxxxxxxxxxxxxxxxxx

# Variant 2 — X-API-Key header
X-API-Key: lmp_xxxxxxxxxxxxxxxxxxxxxxxx

Een verzoek zonder geldige key krijgt 401 Unauthorized terug. Bij elk geslaagd verzoek wordt het tijdstip van laatst gebruik bijgewerkt, zodat je in de app kunt zien welke keys actief zijn.

Basis-URL

Alle endpoints zitten onder dezelfde basis. Voor jouw omgeving is dat:

https://linkfinderpro.com/api/v1

In productie (Apache met de meegeleverde .htaccess) werken de schone paden zoals /api/v1/links en /api/v1/links/42 direct.

Op een omgeving zónder URL-rewrites (bijvoorbeeld de PHP ingebouwde server) zijn dezelfde endpoints altijd bereikbaar via hun bestandspad: /api/v1/links.php, /api/v1/link.php?id=42 en /api/v1/categories.php. Beide stijlen retourneren exact dezelfde data.

Endpoints overzicht

Methode Pad Beschrijving
GET/api/v1/linksAlle links van de gebruiker ophalen
POST/api/v1/linksNieuwe link aanmaken
GET/api/v1/links/{id}Eén link opvragen
PUT/api/v1/links/{id}Link bijwerken
DELETE/api/v1/links/{id}Link verwijderen
GET/api/v1/categoriesAlle categorieën van de gebruiker
POST/api/v1/categoriesNieuwe categorie aanmaken

GET /api/v1/links

Geeft alle links terug die bij jouw account horen.

Voorbeeld

curl -H "Authorization: Bearer JOUW_KEY" \
  https://linkfinderpro.com/api/v1/links
Probeer het uit

De key blijft alleen in deze browser staan (localStorage). Wij sturen hem niet naar onze server, behalve als header bij dit verzoek.

Response (200 OK)

{
  "data": [
    {
      "link_id": 42,
      "name": "Replit",
      "url": "https://replit.com",
      "search_term": "replit",
      "category_id": 3,
      "category_name": "Tools",
      "category_color": "#3498db",
      "notes": "Online IDE",
      "view_count": 7,
      "created_at": "2026-04-15 09:12:00",
      "updated_at": "2026-04-18 11:30:21"
    }
  ],
  "count": 1
}

POST /api/v1/links

Maakt een nieuwe link aan onder jouw account.

Request body (JSON)

VeldTypeVerplichtBeschrijving
namestringjaNaam van de link
urlstringjaDe volledige URL
search_termstringjaZelfgekozen trefwoord om de link snel terug te vinden
category_idintneeID van een bestaande categorie
notesstringneeVrije notitie

Voorbeeld

curl -X POST https://linkfinderpro.com/api/v1/links \
  -H "Authorization: Bearer JOUW_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Voorbeeld Link",
    "url": "https://voorbeeld.com",
    "search_term": "voorbeeld",
    "category_id": 1,
    "notes": "Optionele notitie"
  }'
Probeer het uit

Heb je een read-key, dan krijg je een 403. Gebruik een write- of full-key.

Response (201 Created)

{
  "message": "Link aangemaakt",
  "link_id": 123
}

GET /api/v1/links/{id}

Haalt één specifieke link op aan de hand van zijn link_id. Werkt ook via het bestandspad /api/v1/link.php?id={id} als URL-rewrites niet beschikbaar zijn.

Voorbeeld

curl -H "Authorization: Bearer JOUW_KEY" \
  https://linkfinderpro.com/api/v1/links/42
Probeer het uit

Response (200 OK)

{
  "link_id": 42,
  "name": "Replit",
  "url": "https://replit.com",
  "search_term": "replit",
  "category_id": 3,
  "notes": "Online IDE",
  "created_at": "2026-04-15 09:12:00"
}

PUT /api/v1/links/{id}

Werkt een bestaande link bij. name, url en search_term blijven verplicht; categorie en notities zijn optioneel.

Voorbeeld

curl -X PUT https://linkfinderpro.com/api/v1/links/42 \
  -H "Authorization: Bearer JOUW_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Replit (nieuwe naam)",
    "url": "https://replit.com",
    "search_term": "replit ide",
    "category_id": 3
  }'
Probeer het uit

PUT vereist een full-key.

Response

// 200 OK bij gewijzigd
{ "message": "Link bijgewerkt", "link_id": 42 }

// 200 OK bij identieke payload
{ "message": "Geen wijzigingen", "link_id": 42 }

DELETE /api/v1/links/{id}

Verwijdert de link permanent.

Voorbeeld

curl -X DELETE https://linkfinderpro.com/api/v1/links/42 \
  -H "Authorization: Bearer JOUW_KEY"
Probeer het uit

Let op: dit verwijdert de link permanent. Vereist een full-key.

Response (200 OK)

{
  "message": "Link verwijderd",
  "link_id": 42
}

Categorieën ophalen

GET /api/v1/categories

Lijst met alle categorieën van de gebruiker. Handig om de juiste category_id te vinden bij het aanmaken van een link.

Voorbeeld

curl -H "Authorization: Bearer JOUW_KEY" \
  https://linkfinderpro.com/api/v1/categories
Probeer het uit

Response (200 OK)

{
  "data": [
    {
      "category_id": 3,
      "name": "Tools",
      "description": "Handige online tools",
      "color": "#3498db",
      "created_at": "2026-03-01 10:00:00",
      "updated_at": "2026-03-12 14:22:00"
    }
  ],
  "count": 1
}

Datamodel

De API werkt met twee resources:

Link

  • link_id — uniek nummer (door server toegekend)
  • name — vrij te kiezen naam
  • url — volledige URL inclusief https://
  • search_term — eigen trefwoord, vrij te kiezen
  • category_id — verwijzing naar een categorie of null
  • notes — vrij notitieveld of null
  • view_count — alleen-lezen, aantal keer geopend
  • created_at, updated_at — tijdstempels

Category

  • category_id — uniek nummer
  • name — naam van de categorie
  • description — vrije beschrijving of null
  • color — hex-kleur (bijv. #3498db)

Foutafhandeling

Alle responses zijn JSON. Bij een fout krijg je een object met error (code) en message (Nederlandse uitleg):

{
  "error": "missing_parameters",
  "message": "name, url en search_term zijn verplicht."
}
StatusBetekenis
200 OKVerzoek geslaagd
201 CreatedNieuwe link succesvol aangemaakt
400 Bad RequestOntbrekend of ongeldig veld in de body
401 UnauthorizedAPI-key ontbreekt, ongeldig of ingetrokken
404 Not FoundLink bestaat niet (of niet van jou)
405 Method Not AllowedVerkeerde HTTP-methode op dit endpoint
429 Too Many RequestsVerzoeklimiet bereikt — zie sectie hieronder
500 / 503Onverwachte fout aan de serverkant

Verzoeklimiet (rate limiting)

Om misbruik en overbelasting te voorkomen geldt een limiet van standaard 60 verzoeken per minuut per API-key. Wordt de limiet overschreden, dan krijg je een 429 Too Many Requests met JSON-body en drie informatieve headers:

HeaderBetekenis
Retry-AfterAantal seconden tot je weer mag.
X-RateLimit-LimitMaximaal aantal verzoeken per minuut.
X-RateLimit-RemainingAantal verzoeken dat nog over is in dit venster.

Voorbeeld response:

HTTP/1.1 429 Too Many Requests
Retry-After: 42
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 0
Content-Type: application/json

{
  "error": "rate_limited",
  "message": "Te veel verzoeken. Probeer het over enkele seconden opnieuw.",
  "limit_per_minute": 60,
  "retry_after_seconds": 42
}

Tip: bouw in je client een korte pauze in op basis van Retry-After en hervat daarna automatisch. De limiet wordt per API-key bijgehouden, dus losse keys interfereren niet met elkaar.

Paginatie en filters

GET /api/v1/links ondersteunt vier optionele query-parameters waarmee je gericht en efficiënt links kunt ophalen. Zonder parameters blijft het gedrag backwards-compatible: je krijgt dan alle links in één response (geen LIMIT) — handig voor exports en bestaande integraties.

ParameterDefaultToelichting
page1Pagina-nummer (1 of hoger). Activeert paginatie.
limit50Items per pagina, maximaal 200. Activeert paginatie.
searchZoekt case-insensitive in naam, URL en search_term.
category_idFilter op één categorie.

De response bevat naast data en count ook een pagination-object:

GET /api/v1/links?page=2&limit=20&search=replit

{
  "data": [ /* ... 20 links ... */ ],
  "count": 20,
  "pagination": {
    "page": 2,
    "limit": 20,
    "total": 137,
    "total_pages": 7
  }
}

Ongeldige waarden (negatief, te hoog of geen geheel getal) geven een 400 Bad Request met een Nederlandse foutmelding.

Webhooks — realtime events ontvangen

Stel in de app onder het tabblad Webhooks een doel-URL in. Bij elk geselecteerd event sturen we een POST naar die URL met onderstaande JSON-body. Geen polling nodig.

EventWanneer?
link.createdEen nieuwe link is opgeslagen (UI of API).
link.updatedEen bestaande link is gewijzigd.
link.deletedEen link is verwijderd.
webhook.testVanuit de "Test"-knop in de UI.

Voorbeeld payload:

POST <jouw-url>
Content-Type: application/json
X-LinkManager-Event: link.created
X-LinkManager-Signature: sha256=<hex digest>

{
  "event": "link.created",
  "delivered_at": "2026-04-20T12:34:56+00:00",
  "data": {
    "link_id": 42,
    "name": "Voorbeeld",
    "url": "https://voorbeeld.com",
    "search_term": "voorbeeld",
    "category_id": 1,
    "category_name": "Werk",
    "category_color": "#3498db",
    "notes": null,
    "created_at": "...",
    "updated_at": "..."
  }
}

Signature verifiëren

Bereken HMAC-SHA256 over de ruwe request-body met je webhook-secret als sleutel en vergelijk met de header X-LinkManager-Signature (formaat sha256=<hex>).

# Node.js
const crypto = require('crypto');
const expected = 'sha256=' + crypto
  .createHmac('sha256', SECRET)
  .update(rawBody)
  .digest('hex');
if (expected !== req.headers['x-linkmanager-signature']) {
  return res.status(401).end();
}

Time-out per webhook is 5 seconden. Bij een non-2xx of fout wordt failure_count opgehoogd; er zijn geen automatische retries in deze versie. Inkomende webhooks of beheer via de REST API zijn nog niet beschikbaar.

OpenAPI spec — importeer in je tool

De volledige API is beschreven in een OpenAPI 3.0 bestand. Daarmee kun je in seconden een client genereren of de API in tools als Postman, Insomnia, Swagger UI of een GPT Action laden.

Spec-URL voor jouw omgeving:

https://linkfinderpro.com/openapi.json

Werkt het pad /openapi.json niet (bijvoorbeeld zonder URL-rewrites)? Gebruik dan rechtstreeks https://linkfinderpro.com/openapi.php.

ToolHoe importeren
Postman File → Import → Link → plak de spec-URL.
Insomnia Create → Import From → URL → plak de spec-URL.
Swagger UI / Redoc Open https://editor.swagger.io, kies File → Import URL en plak de spec-URL.
GPT Actions (custom GPT) In de GPT-builder → Actions → Import from URL → plak de spec-URL. Voeg vervolgens een API Key auth toe (header Authorization, prefix Bearer).
n8n / code Genereer een client met openapi-generator of openapi-typescript op basis van de spec-URL.
# Spec ophalen vanaf je terminal
curl https://linkfinderpro.com/openapi.json

Voor AI-agents

Kant-en-klare context-prompt

Plak onderstaande beschrijving in de systeem-prompt van je agent. Vervang alleen JOUW_KEY door de échte API-key.

Je hebt toegang tot de Link Manager REST API.
Basis-URL: https://linkfinderpro.com/api/v1
Authenticatie: stuur bij elk verzoek de header
  Authorization: Bearer JOUW_KEY

Endpoints (clean URL via Apache .htaccess):
  GET    /links              — alle links ophalen
  POST   /links              — nieuwe link (body: name, url, search_term, category_id?, notes?)
  GET    /links/{id}         — één link
  PUT    /links/{id}         — link bijwerken (zelfde body als POST)
  DELETE /links/{id}         — link verwijderen
  GET    /categories         — alle categorieën

Fallback zonder rewrites — gebruik dan deze paden:
  /links.php, /link.php?id={id}, /categories.php

Alle requests en responses zijn JSON. Verplichte velden voor een link
zijn name, url en search_term. Bij fouten krijg je een JSON met
"error" en "message". Statuscode 401 betekent dat de key ongeldig is,
403 dat je rol deze actie niet toestaat.

Volledige machine-leesbare beschrijving (OpenAPI 3.0):
  https://linkfinderpro.com/openapi.jsonImporteer deze URL als GPT Action of in Postman/Insomnia.

Inloggen en API-key aanmaken