Bangun dengan Wordly API.
Gunakan kunci API sisi server, buat permintaan HTTPS, dan lacak setiap panggilan melalui model penagihan berbasis kredit yang dapat diprediksi. Referensi ini mendokumentasikan titik akhir yang saat ini tersedia dalam produksi dan dengan jelas menandai titik akhir yang masih dipersiapkan.
Mulai cepat
Buat akun gratis, verifikasi email Anda menggunakan kode enam digit, dan salin kunci API yang ditampilkan satu kali di dasbor pengembang Anda.
- 1Buat akun
Daftar hanya dengan alamat email dan kata sandi.
- 2Verifikasi email Anda
Masukkan kode yang dikirimkan oleh
[email protected]. Verification grants 50 free credits. - 3Simpan kunci API Anda
Salin yang dihasilkan
wly_live_...kunci dan simpan dalam variabel lingkungan sisi server. - 4Buat permintaan tes
Hubungi titik akhir akun untuk memverifikasi otentikasi dan melihat sisa saldo.
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 dasar dan pembuatan versi
Semua titik akhir produksi dilayani dari URL dasar berversi berikut:
https://api.wordlyenglish.com/v1Menghentikan respons atau perubahan perilaku akan menggunakan versi jalur baru. Bidang aditif dapat diperkenalkan di dalamnya v1, so clients should ignore response properties they do not recognize.
Otentikasi
Titik akhir yang diautentikasi memerlukan kunci API di HTTP Authorization header menggunakan skema Bearer.
Authorization: Bearer wly_live_your_api_keyJangan pernah menempatkan kunci langsung di browser JavaScript, repositori Git publik, tangkapan layar, log, atau aplikasi seluler terdistribusi. Panggil Wordly API dari backend Anda dan biarkan aplikasi Anda berkomunikasi dengan backend tersebut.
Pesan API yang dilokalkan
Atur bahasa respons dengan ?lang=tr atau standar Accept-Language tajuk. Parameter kueri diutamakan. Setiap respons JSON mendeklarasikan lokal yang dipilih Content-Language dan meta.lang. Error codes remain stable in English for programmatic handling; only the human-readable message is localized.
curl "https://api.wordlyenglish.com/v1/account?lang=tr" \
-H "Authorization: Bearer $WORDLY_API_KEY" \
-H "Accept-Language: tr-TR"Kode bahasa yang didukung: 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.
Kredit dan penagihan
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.
| Operasi | Biaya kredit | Ketersediaan |
|---|---|---|
GET /v1/status | 0 | Hidup |
GET /v1/account | 0 | Hidup |
GET /v1/words/{word} | 1–5 | Hidup |
GET /v1/words/search | 1 | Hidup |
GET /v1/words/random | 1 per word | Hidup |
POST /v1/words/batch | Berdasarkan catatan yang dikembalikan | Hidup |
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 dan tidak memproses operasi.
{
"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"
}
}API key lifecycle
Buat kunci terpisah untuk pengembangan, pementasan, dan produksi. Wordly hanya menyimpan hash kriptografi dari setiap kunci; nilai lengkap ditampilkan satu kali saat pembuatan.
- Kunci nama berdasarkan lingkungan atau layanan.
- Gunakan variabel lingkungan atau penyimpanan rahasia yang dikelola.
- Segera cabut kunci jika mungkin telah terbuka.
- Putar kunci tanpa menggunakan kembali nilai lama.
- Jangan mengirim kunci dalam string kueri.
Format tanggapan
Respons yang berhasil menggunakan tingkat atas data objek dan dapat mencakup a meta objek. Kesalahan selalu menggunakan tingkat atas error objek dengan stabil yang dapat dibaca mesin code dan dapat dibaca manusia message.
{
"data": { ... },
"meta": {
"credits_used": 1,
"request_id": "..."
}
}{
"error": {
"code": "invalid_api_key",
"message": "..."
}
}Pertahankan request_id saat menghubungi dukungan tentang permintaan penagihan yang berhasil. JSON dikodekan UTF-8 dan klien harus mengirim 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.
Titik akhir produksi
/v1/statusHidupMengembalikan informasi kesehatan layanan publik dan versi API. Titik akhir ini tidak memerlukan autentikasi dan tidak dikenakan biaya kredit.
Contoh permintaan
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.
Header
| Nama | Diperlukan | Deskripsi |
|---|---|---|
Authorization | Ya | Bearer wly_live_... |
Accept | Direkomendasikan | application/json |
Header respons
X-Credits-Remaining is returned only by this balance endpoint.
200 · Success
{
"data": { "message": "Authenticated", "credits_remaining": 1250 },
"meta": { "lang": "en" }
}Titik akhir kosakata
Setiap catatan melaporkannya completeness sebagai catalog, translated, or enriched. Fields that are not available are returned as null atau objek kosong, bukan data yang ditemukan.
GET /v1/words/{word}
Mengembalikan kata yang sama persis. Gunakan languages=tr,de,fr untuk mengembalikan hanya terjemahan yang diminta. Katalog atau catatan yang diterjemahkan berharga 1 kredit; profil yang diperkaya sepenuhnya berharga 5 kredit.
curl "https://api.wordlyenglish.com/v1/words/water?languages=tr,de" \
-H "Authorization: Bearer $WORDLY_API_KEY"GET /v1/words/search
Cari dengan q dan opsional level, part_of_speech, category, limit, and cursor. Limits range from 1 to 50. Pass meta.next_cursor ke permintaan berikutnya.
curl "https://api.wordlyenglish.com/v1/words/search?q=app&level=advanced&limit=20" \
-H "Authorization: Bearer $WORDLY_API_KEY"GET /v1/words/random
Mengembalikan 1–20 kata acak. Saring berdasarkan level, part_of_speech, or category. Each returned slot costs one credit.
POST /v1/words/batch
Mencari antara 1 dan 50 kata unik dalam satu permintaan. Responsnya mempertahankan urutan permintaan dan menandai setiap item dengan 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
Mengembalikan 30 antarmuka yang didukung dan lokal pesan API. Terjemahan kosakata dikembalikan hanya jika tersedia. Titik akhir ini bersifat publik dan tidak memerlukan biaya kredit.
Batas tarif
Setiap kunci API dibatasi hingga 120 permintaan yang diterima per menit berjalan. Tanggapannya meliputi X-RateLimit-Limit dan X-RateLimit-Remaining. A 429 rate_limit_exceeded respon termasuk 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
| Nama | Type | Diperlukan | Rules | Deskripsi |
|---|---|---|---|---|
lang | string | No | Supported locale code | Language for human-readable messages. |
Contoh permintaan
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
| Nama | Location | Type | Diperlukan | Rules and meaning |
|---|---|---|---|---|
word | Path | string | Ya | 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. |
Contoh permintaan
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/searchLangsung · 1 kreditSearches active vocabulary in alphabetical order. Use the returned cursor for stable forward pagination.
Query parameters
| Nama | Type | Diperlukan | Default / limit | Deskripsi |
|---|---|---|---|---|
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. |
Contoh permintaan
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
| Nama | Type | Diperlukan | Default / limit | Deskripsi |
|---|---|---|---|---|
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. |
Contoh permintaan
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.
Header
| Nama | Diperlukan | Value |
|---|---|---|
Authorization | Ya | Bearer wly_live_... |
Content-Type | Ya | application/json |
Accept | Direkomendasikan | application/json |
JSON body
| Field | Type | Diperlukan | Rules | Deskripsi |
|---|---|---|---|---|
words | string[] | Ya | 1–50 items; each max 120 chars | Words to resolve; duplicates are normalized and removed. |
languages | string[] | No | Supported locale codes | Translations to include. |
Contoh permintaan
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 | Deskripsi |
|---|---|---|---|
id | string | No | Stable URL-safe slug. |
word | string | No | Canonical English word. |
part_of_speech | string | Ya | Grammatical class. |
level | string | Ya | Learning difficulty or catalog level. |
definition | string | Ya | Concise English definition. |
example | string | Ya | Natural example sentence. |
phonetic | string | Ya | 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 | Ya | Learning image URL. |
media.audio_url | URL string | Ya | Pronunciation audio URL. |
media.attribution | object | No | Required media attribution metadata. |
completeness | enum | No | catalog, translated, or enriched. |
Meta object
| Field | Type | When present | Deskripsi |
|---|---|---|---|
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 | Deskripsi |
|---|---|---|
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. |
Kesalahan
| HTTP | Kode | Artinya | Tindakan klien |
|---|---|---|---|
| 401 | invalid_api_key | Kunci hilang, salah format, dicabut, atau tidak aktif. | Periksa header Bearer atau ganti kuncinya. |
| 402 | credits_exhausted | Akun tersebut tidak memiliki kredit untuk operasi tersebut. | Hentikan percobaan ulang dan arahkan pelanggan ke penagihan. |
| 404 | not_found | Titik akhir yang diminta tidak tersedia. | Periksa jalur dan versi API. |
| 404 | word_not_found | Entri kosakata yang diminta tidak tersedia. | Periksa ejaan atau gunakan pencarian. |
| 422 | invalid_request | Parameter atau isi batch tidak valid. | Perbaiki permintaan sebelum mencoba lagi. |
| 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 | Kunci API melebihi 120 permintaan per menit. | Wait for Retry-After. |
| 5xx | server_error | Kegagalan sisi server yang tidak terduga. | Coba lagi dengan kemunduran; hubungi dukungan jika terus-menerus. |
Kebijakan percobaan ulang yang disarankan
Jangan mencoba lagi 401, 402, or 404 secara otomatis. Untuk sementara 5xx respons, gunakan backoff eksponensial dengan jitter dan batas coba lagi yang ketat. Jangan pernah membuat putaran percobaan ulang tanpa batas karena setiap permintaan terotentikasi yang diterima dapat menghabiskan kredit.
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);ular piton
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);Panah / Berkibar
Jangan mengirimkan kunci Wordly di dalam aplikasi Flutter. Contohnya termasuk dalam fungsi server atau backend Dart yang tepercaya.
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']);
}Daftar periksa produksi
- Permintaan Proxy Wordly melalui backend tepercaya.
- Tetapkan batas waktu koneksi dan respons.
- Tangani
401,402,404, and5xxsecara terpisah. - Query
GET /v1/accountwhen your application needs the current balance. - Catat titik akhir, status, latensi, dan
request_idtanpa mencatat kunci API. - Gunakan kunci terpisah per lingkungan dan putar secara berkala.
- Cache stable vocabulary responses in your backend when appropriate.
Siap untuk membuat permintaan pertama Anda?
Buat akun, verifikasi email Anda, dan terima 50 kredit gratis.
Butuh bantuan integrasi? Surel [email protected].