Documentation du développeur

Construisez avec l'API Wordly.

Utilisez une clé API côté serveur, effectuez des requêtes HTTPS et suivez chaque appel grâce à un modèle de facturation prévisible basé sur le crédit. Cette référence documente les points finaux actuellement disponibles en production et marque clairement les points finaux qui sont encore en cours de préparation.

Version API v1Formater JSONTransports HTTPS uniquementSolde libre 50 créditsOuvrirAPI Télécharger le schémaPostman CollectionPostman Environment

Démarrage rapide

Créez un compte gratuit, vérifiez votre e-mail à l'aide du code à six chiffres et copiez la clé API affichée une fois dans votre tableau de bord de développeur.

  1. 1
    Créer un compte

    Inscrivez-vous avec seulement une adresse e-mail et un mot de passe.

  2. 2
    Vérifiez votre email

    Entrez le code envoyé par [email protected]. La vérification accorde 50 crédits gratuits.

  3. 3
    Stockez votre clé API

    Copiez le généré wly_live_... clé et conservez-la dans une variable d’environnement côté serveur.

  4. 4
    Faire une demande de test

    Appelez le point de terminaison du compte pour vérifier l’authentification et voir le solde restant.

Coquille
curl "https://api.wordlyenglish.com/v1/account" \
  -H "Authorization: Bearer $WORDLY_API_KEY" \
  -H "Accept: application/json"
200 réponse
{
  "data": {
    "message": "Authenticated",
    "credits_remaining": 50
  },
  "meta": { "lang": "en" }
}

URL de base et gestion des versions

Tous les points de terminaison de production sont servis à partir de l'URL de base versionnée suivante :

URL de basehttps://api.wordlyenglish.com/v1

Les changements de réponse ou de comportement en cas de rupture utiliseront une nouvelle version du chemin. Des champs supplémentaires peuvent être introduits dans v1, les clients doivent donc ignorer les propriétés de réponse qu'ils ne reconnaissent pas.

Authentification

Les points de terminaison authentifiés nécessitent une clé API dans le protocole HTTP Authorization en-tête utilisant le schéma Bearer.

Authorization: Bearer wly_live_your_api_key
N'exposez pas les clés API.

Ne placez jamais de clé active dans le JavaScript du navigateur, dans les référentiels Git publics, dans les captures d'écran, les journaux ou dans une application mobile distribuée. Appelez l'API Wordly depuis votre backend et laissez votre propre application communiquer avec ce backend.

Messages API localisés

Définissez la langue de réponse avec ?lang=tr ou la norme Accept-Language en-tête. Les paramètres de requête sont prioritaires. Chaque réponse JSON déclare les paramètres régionaux sélectionnés dans Content-Language et meta.lang. Les codes d'erreur restent stables en anglais pour la gestion programmatique ; seul le message lisible par l'homme est localisé.

curl "https://api.wordlyenglish.com/v1/account?lang=tr" \
  -H "Authorization: Bearer $WORDLY_API_KEY" \
  -H "Accept-Language: tr-TR"

Codes de langue pris en charge : en, tr, de, fr, es, it, pt, nl, pl, ru, uk, ar, fa, he, hi, bn, ur, zh, ja, ko, id, ms, vi, th, sv, no, da, fi, cs, ro.

Crédits et facturation

Each successful metered request consumes the documented number of credits. Email-verified accounts receive 50 free credits once. Credits are deducted atomically, so concurrent requests cannot spend the same balance twice. Balance lookup through GET /v1/account is free.

FonctionnementCoût du créditDisponibilité
GET /v1/status0En direct
GET /v1/account0En direct
GET /v1/words/{word}1 à 5En direct
GET /v1/words/search1En direct
GET /v1/words/random1 par motEn direct
POST /v1/words/batchBasé sur les enregistrements retournésEn direct

Use GET /v1/account when you need the current balance. Other endpoint responses include the operation charge but omit the remaining balance. When the balance is insufficient, the API returns HTTP 402 et ne traite pas l'opération.

Réponse 402
{
  "error": {
    "code": "credits_exhausted",
    "message": "Your credit balance is exhausted. Add a package or enable pay-as-you-go to continue.",
    "upgrade_url": "/app.php?page=billing"
  }
}

Cycle de vie de la clé API

Créez des clés distinctes pour le développement, la préparation et la production. Wordly stocke uniquement un hachage cryptographique de chaque clé ; la valeur complète est affichée une fois à la création.

  • Nommez les clés par environnement ou service.
  • Utilisez des variables d'environnement ou un magasin de secrets géré.
  • Révoquez immédiatement une clé si elle a pu être exposée.
  • Faites pivoter les clés sans réutiliser les anciennes valeurs.
  • N'envoyez pas de clés dans les chaînes de requête.

Format de réponse

Les réponses réussies utilisent un niveau supérieur data objet et peut inclure un meta objet. Les erreurs utilisent toujours un niveau supérieur error objet avec un stable lisible par machine code et un lisible par l'homme message.

Demande réussie
{
  "data": { ... },
  "meta": {
    "credits_used": 1,
    "request_id": "..."
  }
}
Demande échouée
{
  "error": {
    "code": "invalid_api_key",
    "message": "..."
  }
}

Gardez le request_id lorsque vous contactez l'assistance au sujet d'une demande facturée réussie. JSON est codé en UTF-8 et les clients doivent envoyer Accept: application/json.

Cache behavior

Wordly caches shared vocabulary data on the server, never API keys, account identities, balances, rate-limit state, or request identifiers. Public status and language responses advertise shared-cache lifetimes. Authenticated responses remain private, no-store; applications may cache the stable data value in their own trusted backend when appropriate.

Référence du point de terminaison

Points finaux de production

OBTENIR/v1/statusEn direct

Renvoie des informations sur l’état de santé du service public et la version de l’API. Ce point de terminaison ne nécessite pas d’authentification et ne coûte aucun crédit.

Exemple de demande

curl "https://api.wordlyenglish.com/v1/status" \
  -H "Accept: application/json"

200 · Success

{
  "data": { "status": "ok", "version": "v1" },
  "meta": { "lang": "en" }
}
Possible results200 Service is reachable.405 Method is not GET.429 IP request limit exceeded.
OBTENIR/v1/accountLive · 0 credits

Validates the supplied key and returns the current account balance without charging a credit.

En-têtes

NomObligatoireDescriptif
AuthorizationOuiBearer wly_live_...
AcceptRecommandéapplication/json

En-têtes de réponse

X-Credits-Remaining is returned only by this balance endpoint.

200 · Success

{
  "data": { "message": "Authenticated", "credits_remaining": 1250 },
  "meta": { "lang": "en" }
}
Possible results200 Key accepted and balance returned.401 Missing, invalid, revoked, or suspended key.429 Rate limit exceeded.

Points finaux du vocabulaire

Plus de 20 000 entrées de catalogue sont en ligne.

Chaque enregistrement rapporte son completeness comme catalog, translated, ou enriched. Les champs qui ne sont pas disponibles sont renvoyés sous la forme null ou un objet vide au lieu de données inventées.

GET /v1/words/{word}

Renvoie une correspondance de mot exacte. Utiliser languages=tr,de,fr pour renvoyer uniquement les traductions demandées. Le catalogue ou les documents traduits coûtent 1 crédit ; les profils entièrement enrichis coûtent 5 crédits.

curl "https://api.wordlyenglish.com/v1/words/water?languages=tr,de" \
  -H "Authorization: Bearer $WORDLY_API_KEY"

GET /v1/words/search

Rechercher avec q et en option level, part_of_speech, category, limit, et cursor. Les limites vont de 1 à 50. Réussir meta.next_cursor dans la prochaine demande.

curl "https://api.wordlyenglish.com/v1/words/search?q=app&level=advanced&limit=20" \
  -H "Authorization: Bearer $WORDLY_API_KEY"

GET /v1/words/random

Renvoie 1 à 20 mots aléatoires. Filtrer par level, part_of_speech, ou category. Chaque emplacement retourné coûte un crédit.

POST /v1/words/batch

Recherche entre 1 et 50 mots uniques en une seule requête. La réponse préserve l'ordre des requêtes et marque chaque élément avec found.

curl -X POST "https://api.wordlyenglish.com/v1/words/batch?lang=tr" \
  -H "Authorization: Bearer $WORDLY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"words":["water","opportunity"],"languages":["tr","de"]}'

GET /v1/languages

Renvoie les 30 paramètres régionaux d'interface et de message API pris en charge. Les traductions de vocabulaire sont renvoyées uniquement lorsqu'elles sont disponibles. Ce point de terminaison est public et ne coûte aucun crédit.

Limite de taux

Chaque clé API est limitée à 120 requêtes acceptées par minute glissante. Les réponses incluent X-RateLimit-Limit et X-RateLimit-Remaining. Un 429 rate_limit_exceeded la réponse comprend Retry-After: 60.

OBTENIR/v1/languagesLive · 0 credits

Lists all supported interface and API-message locales. Vocabulary translations are returned only when a record contains them.

Query parameters

NomTypeObligatoireRulesDescriptif
langstringNoSupported locale codeLanguage for human-readable messages.

Exemple de demande

curl "https://api.wordlyenglish.com/v1/languages?lang=tr"

200 · Success

{
  "data": [{
    "code": "tr",
    "name": "Türkçe",
    "message_localization": true,
    "vocabulary_translation": "when_available"
  }],
  "meta": { "count": 30, "lang": "tr" }
}
Possible results200 Locale list returned.405 Method is not GET.429 IP request limit exceeded.
OBTENIR/v1/words/{word}Live · 1–5 credits

Returns one exact vocabulary record. Catalog and translated records cost 1 credit; enriched records cost 5 credits.

Parameters

NomLocationTypeObligatoireRules and meaning
wordPathstringOuiExact word or slug; maximum 120 characters. URL-encode special characters.
languagesQuerystringNoComma-separated translation codes, for example tr,de,fr.
langQuerystringNoHuman-readable message language; not a vocabulary filter.

Exemple de demande

Coquille
curl "https://api.wordlyenglish.com/v1/words/water?languages=tr,de" \
  -H "Authorization: Bearer $WORDLY_API_KEY" \
  -H "Accept: application/json"

200 · Success

{
  "data": {
    "id": "water",
    "word": "water",
    "part_of_speech": "noun",
    "level": "basic",
    "definition": "A clear liquid essential for life.",
    "example": "Please drink enough water every day.",
    "translations": { "tr": "su", "de": "Wasser" },
    "categories": ["nature", "daily-life"],
    "media": {
      "image_url": "https://media.example/water.webp",
      "audio_url": "https://media.example/water.mp3",
      "attribution": {}
    },
    "completeness": "enriched"
  },
  "meta": {
    "credits_used": 5,
    "request_id": "5ebac760-cdc5-4a73-a87b-22463d81483c",
    "lang": "en"
  }
}

404 · Word unavailable

{
  "error": { "code": "word_not_found", "message": "The requested word was not found." },
  "meta": { "lang": "en" }
}
Possible results200 Exact record returned.401 Invalid API key.402 Insufficient credits.404 Word not found.422 Word too long.429 Rate limit exceeded.
OBTENIR/v1/words/randomLive · 1 credit per requested slot

Returns random active words for quizzes, discovery feeds, and practice sessions.

Query parameters

NomTypeObligatoireDefault / limitDescriptif
countintegerNo1; min 1, max 20Requested slots and credit cost.
levelstringNoExact valueLevel filter.
part_of_speech / posstringNoExact valueGrammatical-class filter.
categorystringNoExact valueCategory filter.
languagesstringNoComma-separatedTranslations to include.

Exemple de demande

curl "https://api.wordlyenglish.com/v1/words/random?count=3&level=basic&languages=tr" \
  -H "Authorization: Bearer $WORDLY_API_KEY"

200 · Success

{
  "data": [{ "id": "water", "word": "water", "part_of_speech": "noun", "level": "basic", "definition": null, "example": null, "translations": { "tr": "su" }, "categories": [], "media": { "image_url": null, "audio_url": null, "attribution": {} }, "completeness": "translated" }],
  "meta": { "credits_used": 3, "request_id": "...", "lang": "en", "count": 1 }
}
Possible results200 Random array returned.401 Invalid API key.402 Balance below requested count.429 Rate limit exceeded.
POST/v1/words/batchLive · calculated

Looks up 1–50 unique words while preserving request order. Each enriched result costs 5 credits, another found result costs 1, and the minimum request charge is 1.

En-têtes

NomObligatoireValue
AuthorizationOuiBearer wly_live_...
Content-TypeOuiapplication/json
AcceptRecommandéapplication/json

JSON body

FieldTypeObligatoireRulesDescriptif
wordsstring[]Oui1–50 items; each max 120 charsWords to resolve; duplicates are normalized and removed.
languagesstring[]NoSupported locale codesTranslations to include.

Exemple de demande

curl -X POST "https://api.wordlyenglish.com/v1/words/batch?lang=tr" \
  -H "Authorization: Bearer $WORDLY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"words":["water","not-a-word"],"languages":["tr","de"]}'

200 · Success

{
  "data": [
    { "query": "water", "found": true, "word": { "id": "water", "word": "water", "part_of_speech": "noun", "level": "basic", "definition": null, "example": null, "translations": { "tr": "su", "de": "Wasser" }, "categories": [], "media": { "image_url": null, "audio_url": null, "attribution": {} }, "completeness": "translated" } },
    { "query": "not-a-word", "found": false, "word": null }
  ],
  "meta": { "credits_used": 1, "request_id": "...", "lang": "tr", "count": 2 }
}

422 · Invalid body

{
  "error": { "code": "invalid_request", "message": "Provide between 1 and 50 words." },
  "meta": { "lang": "en" }
}
Possible results200 Ordered results.401 Invalid API key.402 Insufficient credits.413 Body over 64 KB.415 Content-Type is not JSON.422 Invalid words array.429 Rate limit exceeded.

Response field reference

Every stable response variable is described below. Additive fields may appear later, so clients should ignore fields they do not recognize.

Vocabulary object

FieldTypeNullableDescriptif
idstringNoStable URL-safe slug.
wordstringNoCanonical English word.
part_of_speechstringOuiGrammatical class.
levelstringOuiLearning difficulty or catalog level.
definitionstringOuiConcise English definition.
examplestringOuiNatural example sentence.
phoneticstringOuiPronunciation transcription when available.
translationsobject<string,string>NoLocale codes mapped to translations; may be empty.
synonymsstring[]NoAvailable synonyms.
antonymsstring[]NoAvailable antonyms.
categoriesstring[]NoLearning or semantic categories.
media.image_urlURL stringOuiLearning image URL.
media.audio_urlURL stringOuiPronunciation audio URL.
media.attributionobjectNoRequired media attribution metadata.
completenessenumNocatalog, translated, ou enriched.

Meta object

FieldTypeWhen presentDescriptif
credits_usedintegerMetered responsesCredits charged by this request.
request_idUUID stringMetered successSupport and billing trace ID.
langstringAlwaysSelected message locale.
countintegerList responsesNumber of response items.
next_cursorstring or nullSearchNext page cursor; null means final page.

Error object

FieldTypeDescriptif
error.codestringStable machine-readable code.
error.messagestringLocalized human-readable explanation.
error.upgrade_urlstringRelative billing URL on a 402 result.
meta.langstringError-message locale.

Erreurs

HTTPCoderSignificationAction du client
401invalid_api_keyClé manquante, mal formée, révoquée ou inactive.Vérifiez l'en-tête Bearer ou remplacez la clé.
402credits_exhaustedLe compte manque de crédits pour l'opération.Arrêtez les tentatives et dirigez le client vers la facturation.
404not_foundLe point de terminaison demandé n’est pas disponible.Vérifiez le chemin et la version de l'API.
404word_not_foundL'entrée de vocabulaire demandée n'est pas disponible.Vérifiez l’orthographe ou utilisez la recherche.
422invalid_requestUn paramètre ou un corps de lot n'est pas valide.Corrigez la demande avant de réessayer.
405method_not_allowedThe endpoint does not accept the HTTP method.Use the documented GET or POST method.
413payload_too_largeThe JSON request body exceeds 64 KB.Reduce the batch body.
415unsupported_media_typeThe batch request is not JSON.Send Content-Type: application/json.
429rate_limit_exceededLa clé API dépassait 120 requêtes par minute.Attendre Retry-After.
5xxserver_errorUne panne inattendue côté serveur.Réessayez avec interruption ; contactez le support si vous persistez.

Politique de nouvelle tentative recommandée

Ne réessayez pas 401, 402, ou 404 automatiquement. Pour transitoire 5xx réponses, utilisez une interruption exponentielle avec une gigue et un plafond de nouvelle tentative strict. Ne créez jamais de boucle de nouvelle tentative illimitée, car chaque demande authentifiée acceptée peut consommer des crédits.

JavaScript/Node.js

const response = await fetch('https://api.wordlyenglish.com/v1/account', {
  headers: {
    Authorization: `Bearer ${process.env.WORDLY_API_KEY}`,
    Accept: 'application/json'
  }
});

const body = await response.json();
if (!response.ok) {
  throw new Error(`${body.error.code}: ${body.error.message}`);
}

console.log(body.data.credits_remaining);

Python

import os
import requests

response = requests.get(
    'https://api.wordlyenglish.com/v1/account',
    headers={
        'Authorization': f'Bearer {os.environ["WORDLY_API_KEY"]}',
        'Accept': 'application/json',
    },
    timeout=15,
)
response.raise_for_status()
print(response.json()['data']['credits_remaining'])

PHP

$curl = curl_init('https://api.wordlyenglish.com/v1/account');
curl_setopt_array($curl, [
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_TIMEOUT => 15,
  CURLOPT_HTTPHEADER => [
    'Authorization: Bearer ' . getenv('WORDLY_API_KEY'),
    'Accept: application/json',
  ],
]);

$body = curl_exec($curl);
$status = curl_getinfo($curl, CURLINFO_RESPONSE_CODE);
curl_close($curl);

if ($status >= 400) {
  throw new RuntimeException('Wordly API request failed');
}
$data = json_decode($body, true, flags: JSON_THROW_ON_ERROR);

Fléchette / Battement

N'envoyez pas la clé Wordly dans une application Flutter. L'exemple appartient à une fonction backend ou serveur Dart de confiance.

final response = await http.get(
  Uri.parse('https://api.wordlyenglish.com/v1/account'),
  headers: {
    'Authorization': 'Bearer ${Platform.environment['WORDLY_API_KEY']}',
    'Accept': 'application/json',
  },
);

final body = jsonDecode(response.body) as Map<String, dynamic>;
if (response.statusCode >= 400) {
  throw Exception((body['error'] as Map)['code']);
}

Liste de contrôle de production

  • Requêtes proxy Wordly via un backend de confiance.
  • Définissez les délais d’attente de connexion et de réponse.
  • Poignée 401, 402, 404, et 5xx séparément.
  • Query GET /v1/account when your application needs the current balance.
  • Consigner le point de terminaison, l'état, la latence et request_id sans enregistrer la clé API.
  • Utilisez des clés distinctes par environnement et faites-les pivoter périodiquement.
  • Cache stable vocabulary responses in your backend when appropriate.

Prêt à faire votre première demande ?

Créez un compte, vérifiez votre e-mail et recevez 50 crédits gratuits.

Créer un compte gratuit

Besoin d'aide à l'intégration ? Courriel [email protected].