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.
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.
- 1Créer un compte
Inscrivez-vous avec seulement une adresse e-mail et un mot de passe.
- 2Vérifiez votre email
Entrez le code envoyé par
[email protected]. La vérification accorde 50 crédits gratuits. - 3Stockez votre clé API
Copiez le généré
wly_live_...clé et conservez-la dans une variable d’environnement côté serveur. - 4Faire une demande de test
Appelez le point de terminaison du compte pour vérifier l’authentification et voir le solde restant.
curl "https://api.wordlyenglish.com/v1/account" \
-H "Authorization: Bearer $WORDLY_API_KEY" \
-H "Accept: application/json"{
"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 :
https://api.wordlyenglish.com/v1Les 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_keyNe 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.
| Fonctionnement | Coût du crédit | Disponibilité |
|---|---|---|
GET /v1/status | 0 | En direct |
GET /v1/account | 0 | En direct |
GET /v1/words/{word} | 1 à 5 | En direct |
GET /v1/words/search | 1 | En direct |
GET /v1/words/random | 1 par mot | En direct |
POST /v1/words/batch | Basé sur les enregistrements retournés | En 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.
{
"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.
{
"data": { ... },
"meta": {
"credits_used": 1,
"request_id": "..."
}
}{
"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.
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.
Points finaux de production
/v1/statusEn directRenvoie 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" }
}/v1/accountLive · 0 creditsValidates the supplied key and returns the current account balance without charging a credit.
En-têtes
| Nom | Obligatoire | Descriptif |
|---|---|---|
Authorization | Oui | Bearer wly_live_... |
Accept | Recommandé | 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" }
}Points finaux du vocabulaire
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.
/v1/languagesLive · 0 creditsLists all supported interface and API-message locales. Vocabulary translations are returned only when a record contains them.
Query parameters
| Nom | Type | Obligatoire | Rules | Descriptif |
|---|---|---|---|---|
lang | string | No | Supported locale code | Language 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" }
}/v1/words/{word}Live · 1–5 creditsReturns one exact vocabulary record. Catalog and translated records cost 1 credit; enriched records cost 5 credits.
Parameters
| Nom | Location | Type | Obligatoire | Rules and meaning |
|---|---|---|---|---|
word | Path | string | Oui | Exact word or slug; maximum 120 characters. URL-encode special characters. |
languages | Query | string | No | Comma-separated translation codes, for example tr,de,fr. |
lang | Query | string | No | Human-readable message language; not a vocabulary filter. |
Exemple de demande
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" }
}/v1/words/searchEn direct · 1 créditSearches active vocabulary in alphabetical order. Use the returned cursor for stable forward pagination.
Query parameters
| Nom | Type | Obligatoire | Default / limit | Descriptif |
|---|---|---|---|---|
q | string | No | Max 120 chars | Case-insensitive contained text. |
level | string | No | Max 30 chars | Exact level filter. |
part_of_speech / pos | string | No | Max 40 chars | Exact grammatical-class filter. |
category | string | No | Max 80 chars | Category-array filter. |
limit | integer | No | 20; min 1, max 50 | Maximum returned records. |
cursor | string | No | Max 120 chars | Previous meta.next_cursor. |
languages | string | No | Comma-separated | Translations to include. |
Exemple de demande
curl "https://api.wordlyenglish.com/v1/words/search?q=app&level=advanced&languages=tr&limit=2" \
-H "Authorization: Bearer $WORDLY_API_KEY"200 · Success
{
"data": [{
"id": "application",
"word": "application",
"part_of_speech": "noun",
"level": "advanced",
"definition": null,
"example": null,
"translations": { "tr": "uygulama" },
"categories": [],
"media": { "image_url": null, "audio_url": null, "attribution": {} },
"completeness": "translated"
}],
"meta": { "credits_used": 1, "request_id": "...", "lang": "en", "count": 1, "next_cursor": null }
}/v1/words/randomLive · 1 credit per requested slotReturns random active words for quizzes, discovery feeds, and practice sessions.
Query parameters
| Nom | Type | Obligatoire | Default / limit | Descriptif |
|---|---|---|---|---|
count | integer | No | 1; min 1, max 20 | Requested slots and credit cost. |
level | string | No | Exact value | Level filter. |
part_of_speech / pos | string | No | Exact value | Grammatical-class filter. |
category | string | No | Exact value | Category filter. |
languages | string | No | Comma-separated | Translations 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 }
}/v1/words/batchLive · calculatedLooks 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
| Nom | Obligatoire | Value |
|---|---|---|
Authorization | Oui | Bearer wly_live_... |
Content-Type | Oui | application/json |
Accept | Recommandé | application/json |
JSON body
| Field | Type | Obligatoire | Rules | Descriptif |
|---|---|---|---|---|
words | string[] | Oui | 1–50 items; each max 120 chars | Words to resolve; duplicates are normalized and removed. |
languages | string[] | No | Supported locale codes | Translations 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" }
}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
| Field | Type | Nullable | Descriptif |
|---|---|---|---|
id | string | No | Stable URL-safe slug. |
word | string | No | Canonical English word. |
part_of_speech | string | Oui | Grammatical class. |
level | string | Oui | Learning difficulty or catalog level. |
definition | string | Oui | Concise English definition. |
example | string | Oui | Natural example sentence. |
phonetic | string | Oui | Pronunciation transcription when available. |
translations | object<string,string> | No | Locale codes mapped to translations; may be empty. |
synonyms | string[] | No | Available synonyms. |
antonyms | string[] | No | Available antonyms. |
categories | string[] | No | Learning or semantic categories. |
media.image_url | URL string | Oui | Learning image URL. |
media.audio_url | URL string | Oui | Pronunciation audio URL. |
media.attribution | object | No | Required media attribution metadata. |
completeness | enum | No | catalog, translated, ou enriched. |
Meta object
| Field | Type | When present | Descriptif |
|---|---|---|---|
credits_used | integer | Metered responses | Credits charged by this request. |
request_id | UUID string | Metered success | Support and billing trace ID. |
lang | string | Always | Selected message locale. |
count | integer | List responses | Number of response items. |
next_cursor | string or null | Search | Next page cursor; null means final page. |
Error object
| Field | Type | Descriptif |
|---|---|---|
error.code | string | Stable machine-readable code. |
error.message | string | Localized human-readable explanation. |
error.upgrade_url | string | Relative billing URL on a 402 result. |
meta.lang | string | Error-message locale. |
Erreurs
| HTTP | Coder | Signification | Action du client |
|---|---|---|---|
| 401 | invalid_api_key | Clé manquante, mal formée, révoquée ou inactive. | Vérifiez l'en-tête Bearer ou remplacez la clé. |
| 402 | credits_exhausted | Le compte manque de crédits pour l'opération. | Arrêtez les tentatives et dirigez le client vers la facturation. |
| 404 | not_found | Le point de terminaison demandé n’est pas disponible. | Vérifiez le chemin et la version de l'API. |
| 404 | word_not_found | L'entrée de vocabulaire demandée n'est pas disponible. | Vérifiez l’orthographe ou utilisez la recherche. |
| 422 | invalid_request | Un paramètre ou un corps de lot n'est pas valide. | Corrigez la demande avant de réessayer. |
| 405 | method_not_allowed | The endpoint does not accept the HTTP method. | Use the documented GET or POST method. |
| 413 | payload_too_large | The JSON request body exceeds 64 KB. | Reduce the batch body. |
| 415 | unsupported_media_type | The batch request is not JSON. | Send Content-Type: application/json. |
| 429 | rate_limit_exceeded | La clé API dépassait 120 requêtes par minute. | Attendre Retry-After. |
| 5xx | server_error | Une 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, et5xxséparément. - Query
GET /v1/accountwhen your application needs the current balance. - Consigner le point de terminaison, l'état, la latence et
request_idsans 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.
Besoin d'aide à l'intégration ? Courriel [email protected].