Examplary
  • Start for free

    Developer changelog

    Changes to the API, SDKs, embeds, and question type platform, in chronological order.

    1. POST /exams/{id} and POST /folders/{id} are gone

    2. Check the quality of a question over the API

      GET /exams/{id}/questions/{questionId}/quality returns Examplary's read on how well a question is written — the same analysis the editor shows.

      Useful if you're generating questions programmatically and want to flag the weak ones for a human before a test goes out.

    3. Rename the labels in embedded flows

      "Student level" doesn't fit every product. You can now override individual UI strings in any embed session by adding a strings object to theme:

      {
        "theme": {
          "strings": {
            "account.attributes.student-level-name": "Candidate level",
            "account.attributes.subject-name": "Assessment field"
          }
        }
      }
      

      To find the key for a label, open the Examplary dev tools with Shift + Control + Tilde, click the language icon and switch to Translation keys. Anything you don't override keeps its normal wording.

      More in theme options.

    4. Hide fields in the exam generation embed

      The generate-exam embed flow has five new presets for trimming down the form your users see: hideSubject, hideStudentLevel, hideDuration, hideTaxonomy and hideQuestionTypes.

      They pair nicely with the presets you were already sending. Set studentLevel and hideStudentLevel together, for example, and the level is applied without your users ever seeing the field — handy when your product already knows the answer.

      All of them are listed in the exam generation flow docs.

    5. Results summaries over the API

    6. The API is stricter about CORS

      The API used to reflect any origin back in its CORS headers. It now only does that for first-party Examplary origins and an organization's own active custom domain.

      If you were calling the API straight from browser JavaScript on your own domain, those requests will start failing. Server-to-server calls aren't affected — CORS is a browser-only restriction, so anything running on your backend carries on as before. If you need something in the browser, Embed Sessions are built for exactly that.

      LTI, OAuth and the public endpoints stay open, since they're meant to be called from places we don't control.

    7. Rate limits are now written down

      Most API endpoints are rate limited, per user or per IP address depending on the endpoint. That's been true for a while — you just had to find out by running into one.

      Every endpoint reference page now has a Rate limit section with its own limit, and there's a summary on the REST API overview. Go over it and you'll get a 429 with a Retry-After header telling you how long to wait.

      We also tightened the limits on the AI and email endpoints, and loosened them on the student-facing ones — a whole class taking a test from one school building shares a single IP address, and that shouldn't look like abuse.

    8. Release grades and assign sessions over the API

    9. Scanning endpoints for paper answers

    10. One endpoint for tests and practice spaces

      Listing everything in a workspace used to mean calling /exams and /practice-spaces and merging the two yourself.

      GET /items returns both in a single collection, so building a "recent activity" list or a picker takes one request. It needs the items:read scope.