<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Andreas</title>
    <description>The latest articles on Forem by Andreas (@wagnandr).</description>
    <link>https://forem.com/wagnandr</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F874277%2F37d8317a-8bb7-4930-b6a9-8930a2c46fd0.png</url>
      <title>Forem: Andreas</title>
      <link>https://forem.com/wagnandr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/wagnandr"/>
    <language>en</language>
    <item>
      <title>Two API Calls to Verify Someone Is a Student — No Document Uploads, No Email Checks</title>
      <dc:creator>Andreas</dc:creator>
      <pubDate>Thu, 14 May 2026 09:38:30 +0000</pubDate>
      <link>https://forem.com/wagnandr/two-api-calls-to-verify-someone-is-a-student-no-document-uploads-no-email-checks-13fk</link>
      <guid>https://forem.com/wagnandr/two-api-calls-to-verify-someone-is-a-student-no-document-uploads-no-email-checks-13fk</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Studid's Free API that confirms a user belongs to a real university — through their own institution's login. Two API calls, no documents, no email verification, no API keys.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;You need to know if someone is actually a student or researcher. The usual options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Upload a student ID or transcript&lt;/strong&gt; — privacy hassle, manual review, easy to fake&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check their &lt;code&gt;.edu&lt;/code&gt; email&lt;/strong&gt; — anyone can buy one, not real verification&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build university SSO yourself&lt;/strong&gt; — SAML certs, metadata, federation paperwork, weeks of work&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these are good for you or your users.&lt;/p&gt;

&lt;h2&gt;
  
  
  A different way
&lt;/h2&gt;

&lt;p&gt;The user logs in at their own university (same credentials they use for courses, email, library). You get back a simple result: yes, this person is at this institution. MFA included — the university handles it.&lt;/p&gt;

&lt;p&gt;Two REST calls, no protocol knowledge needed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your App                   Studid                 User's University
  │                         │                           │
  │── POST /verification ──→│                           │
  │←── { id, link } ───────│                           │
  │                         │                           │
  │── redirect user ───────→│ (picks their university)   │
  │                         │── SAML AuthnRequest ──────→
  │                         │←── SAML Assertion ───────│
  │                         │                           │
  │── GET /verification/id ─→                           │
  │←── { session } ────────│                           │
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 1: Create a check
&lt;/h2&gt;

&lt;p&gt;No signup, no API key. Pick any &lt;code&gt;secretToken&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -X POST https://api.studid.io/v2/auth/verification \
  -H "Content-Type: application/json" \
  -d '{
    "secretToken": "your-secret-here",
    "redirectUrl": "https://yourapp.com/callback",
    "serviceName": "Your App"
  }'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.studid.io/v2/auth/verification&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;secretToken&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randomUUID&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="na"&gt;redirectUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://yourapp.com/callback&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;serviceName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Your App&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;link&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"a1b2c3d4-..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"link"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://studid.io/search?id=a1b2c3d4-..."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Send the user to &lt;code&gt;link&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: User logs in at their university
&lt;/h2&gt;

&lt;p&gt;They pick their institution from the list (thousands available), then log in normally at their university — same username/password/MFA they already use. Nothing new to learn.&lt;/p&gt;

&lt;p&gt;When done, they arrive at your &lt;code&gt;redirectUrl&lt;/code&gt; with &lt;code&gt;?verificationId=...&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Read the result
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl "https://api.studid.io/v2/auth/verification/{id}?id={id}&amp;amp;secretToken=your-secret-here"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="s2"&gt;`https://api.studid.io/v2/auth/verification/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;?id=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;secretToken=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;secretToken&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"a1b2c3d4-..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"session"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"authIdentifier"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MCE6NXEQ3FC3PU...@tu-berlin.de"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"entityId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://idp.tu-berlin.de/shibboleth"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"affiliations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"student"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"member"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What this gives you
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use it for auth&lt;/strong&gt; — let users sign in with their university. The &lt;code&gt;authIdentifier&lt;/code&gt; is a reliable ID you can store in your user table.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use it for verification&lt;/strong&gt; — check discounts, gated content, academic pricing. You know the user's institution (&lt;code&gt;entityId&lt;/code&gt;) and optionally their role (&lt;code&gt;affiliations&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No email verification needed&lt;/strong&gt; — the university asserts their identity, not a self-reported address. Skip the confirmation-link dance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No document review&lt;/strong&gt; — no PDFs, no photos, no manual approval queues.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;code&gt;authIdentifier&lt;/code&gt; is computed server-side — the API picks the strongest identifier available. Just read one field.&lt;/p&gt;

&lt;h2&gt;
  
  
  Coverage
&lt;/h2&gt;

&lt;p&gt;Thousands of universities across 70+ national federations (US, Germany, UK, France, Japan, Switzerland, Netherlands, etc.).&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://studid.io/docs" rel="noopener noreferrer"&gt;API Reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://studid.io/docs/guide" rel="noopener noreferrer"&gt;Integration Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://studid.io" rel="noopener noreferrer"&gt;Demo&lt;/a&gt; — try it in ~30 seconds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No API keys. No signup. Free.&lt;/p&gt;

</description>
      <category>api</category>
      <category>tutorial</category>
      <category>edtech</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🥁 Just shipped the first alpha release of our API 🎉</title>
      <dc:creator>Andreas</dc:creator>
      <pubDate>Thu, 09 Jun 2022 11:10:43 +0000</pubDate>
      <link>https://forem.com/studid/just-shipped-the-first-alpha-release-of-our-api-1ihe</link>
      <guid>https://forem.com/studid/just-shipped-the-first-alpha-release-of-our-api-1ihe</guid>
      <description>&lt;p&gt;Our free API allows you to authenticate students, researchers and educators with the SSO service of their institution.&lt;/p&gt;

&lt;p&gt;A successful authentication provides the user's unique identifier, institution, institution country and affiliation (e.g. faculty, staff, student, employee) to their institution.&lt;/p&gt;

&lt;p&gt;To better understand how we can improve Studid, I'd appreciate any feedback or advice you can offer.&lt;/p&gt;

&lt;p&gt;Try Studid out &lt;a href="https://studid.io"&gt;https://studid.io&lt;/a&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>startup</category>
    </item>
  </channel>
</rss>
