Developer API
Your learning data, in a stable read-only contract.
Use a personal API key to read your cards, reviews, progress, vocabulary strength, writing history, and available course content.
- Version
- 1.0.0-beta
- Base URL
https://api.vocapi.app/v1- Format
- JSON over HTTPS
Authentication
Make your first request
Create a scoped key in Vocapi under Settings → API keys, then send it as a Bearer token. Each key can be rotated or revoked from the same screen.
curl "https://api.vocapi.app/v1/user" \
-H "Authorization: Bearer $VOCAPI_API_KEY"Contract 1.0.0-beta
16 read endpoints
Parameters and response statuses below are generated from the committed, versioned OpenAPI schema.
GET/v1/achievementsGet Achievements
Return the achievement catalog + the caller's progress for a language. Note: gated by ``progress:read`` -- there is no ``achievements:read`` scope in the ``api_keys`` scope catalog (``vocapi.api_keys.API_KEY_SCOPES``).
Parameters
languagequery · required
Responses
200Successful Response401Missing, invalid, revoked, or expired API key.402Free-tier user filtered to a locked (paid) language.403The API key lacks the required scope.404Unknown language code, or no resource with the given id.422Validation Error429Rate limit exceeded.
GET/v1/cardsGet Cards
List the caller's SRS cards, per-language or cross-language.
Parameters
languagequery · optionalpage_afterquery · optionalper_pagequery · optional
Responses
200Successful Response401Missing, invalid, revoked, or expired API key.402Free-tier user filtered to a locked (paid) language.403The API key lacks the required scope.404Unknown language code, or no resource with the given id.422Validation Error429Rate limit exceeded.
GET/v1/content/lessonsGet Content Lessons
List a language's lessons in global curriculum order.
Parameters
languagequery · requiredpage_afterquery · optionalper_pagequery · optional
Responses
200Successful Response401Missing, invalid, revoked, or expired API key.402Free-tier user filtered to a locked (paid) language.403The API key lacks the required scope.404Unknown language code, or no resource with the given id.422Validation Error429Rate limit exceeded.
GET/v1/content/lessons/{lesson_id}Get Content Lesson
Return one lesson with its composed, ordered blocks.
Parameters
lesson_idpath · required
Responses
200Successful Response401Missing, invalid, revoked, or expired API key.402Free-tier user filtered to a locked (paid) language.403The API key lacks the required scope.404Unknown language code, or no resource with the given id.422Validation Error429Rate limit exceeded.
GET/v1/content/readersGet Content Readers
List a language's curated graded readers.
Parameters
languagequery · requiredpage_afterquery · optionalper_pagequery · optional
Responses
200Successful Response401Missing, invalid, revoked, or expired API key.402Free-tier user filtered to a locked (paid) language.403The API key lacks the required scope.404Unknown language code, or no resource with the given id.422Validation Error429Rate limit exceeded.
GET/v1/content/readers/{item_id}Get Content Reader
Return one curated graded reader with its ordered sections.
Parameters
item_idpath · required
Responses
200Successful Response401Missing, invalid, revoked, or expired API key.402Free-tier user filtered to a locked (paid) language.403The API key lacks the required scope.404Unknown language code, or no resource with the given id.422Validation Error429Rate limit exceeded.
GET/v1/content/sentencesGet Content Sentences
List a language's active sentences, optionally filtered to one GP.
Parameters
languagequery · requiredgrammar_point_idquery · optionalpage_afterquery · optionalper_pagequery · optional
Responses
200Successful Response401Missing, invalid, revoked, or expired API key.402Free-tier user filtered to a locked (paid) language.403The API key lacks the required scope.404Unknown language code, or no resource with the given id.422Validation Error429Rate limit exceeded.
GET/v1/free-writesGet Free Writes Route
Return a keyset page of the caller's graded free-production attempts.
Parameters
languagequery · optionalupdated_afterquery · optionalpage_afterquery · optionalper_pagequery · optional
Responses
200Successful Response401Missing, invalid, revoked, or expired API key.402Free-tier user filtered to a locked (paid) language.403The API key lacks the required scope.404Unknown language code, or no resource with the given id.422Validation Error429Rate limit exceeded.
GET/v1/free-writes/error-patternsGet Error Patterns
Return the caller's recurring error-pattern rollup for a language. Wraps :func:`get_recent_error_patterns` with its default recent-window size -- no extra windowing params on this surface.
Parameters
languagequery · required
Responses
200Successful Response401Missing, invalid, revoked, or expired API key.402Free-tier user filtered to a locked (paid) language.403The API key lacks the required scope.404Unknown language code, or no resource with the given id.422Validation Error429Rate limit exceeded.
GET/v1/progress/chaptersGet Progress Chapters
List a language's chapters with a per-chapter lesson-completion rollup.
Parameters
languagequery · requiredpage_afterquery · optionalper_pagequery · optional
Responses
200Successful Response401Missing, invalid, revoked, or expired API key.402Free-tier user filtered to a locked (paid) language.403The API key lacks the required scope.404Unknown language code, or no resource with the given id.422Validation Error429Rate limit exceeded.
GET/v1/progress/grammar-pointsGet Progress Grammar Points
List a language's grammar-mastery dashboard, paginated.
Parameters
languagequery · requiredpage_afterquery · optionalper_pagequery · optional
Responses
200Successful Response401Missing, invalid, revoked, or expired API key.402Free-tier user filtered to a locked (paid) language.403The API key lacks the required scope.404Unknown language code, or no resource with the given id.422Validation Error429Rate limit exceeded.
GET/v1/progress/lessonsGet Progress Lessons
List every lesson in a language's curriculum order with completion state.
Parameters
languagequery · requiredpage_afterquery · optionalper_pagequery · optional
Responses
200Successful Response401Missing, invalid, revoked, or expired API key.402Free-tier user filtered to a locked (paid) language.403The API key lacks the required scope.404Unknown language code, or no resource with the given id.422Validation Error429Rate limit exceeded.
GET/v1/reviewsGet Reviews
Return a keyset page of the caller's review history.
Parameters
languagequery · optionalupdated_afterquery · optionalpage_afterquery · optionalper_pagequery · optional
Responses
200Successful Response401Missing, invalid, revoked, or expired API key.402Free-tier user filtered to a locked (paid) language.403The API key lacks the required scope.404Unknown language code, or no resource with the given id.422Validation Error429Rate limit exceeded.
GET/v1/summaryGet Summary
Return the learner's active-language and global state rollup.
Parameters
None.
Responses
200Successful Response401Missing, invalid, revoked, or expired API key.403The API key lacks the required scope.429Rate limit exceeded.
GET/v1/userGet User
Return the authenticated caller's profile.
Parameters
None.
Responses
200Successful Response401Missing, invalid, revoked, or expired API key.403The API key lacks the required scope.429Rate limit exceeded.
GET/v1/vocabularyGet Vocabulary
List the caller's vocabulary knowledge inventory for one language.
Parameters
languagequery · requiredpage_afterquery · optionalper_pagequery · optional
Responses
200Successful Response401Missing, invalid, revoked, or expired API key.402Free-tier user filtered to a locked (paid) language.403The API key lacks the required scope.404Unknown language code, or no resource with the given id.422Validation Error429Rate limit exceeded.
Built for trustworthy tools
Clear boundaries, useful responses.
- Keys are scoped, revocable, and stored as hashes.
- Every request resolves to the learner who created the key.
- Course access rules match the app and return explicit response details.
- Rate-limit responses identify when a client should slow down.