Documentation/Developers
Back
  • Getting started
    • Frontends and app types
    • Environments and endpoints
  • OAuth clients
    • Client ID and secret
    • Redirect URIs and start URL
    • Secret rotation
  • Login with appsolut
    • Authorization code flow
    • Tokens and claims
    • Frontend role
    • Sign-out
    • Revocation and issued tokens
    • Token endpoint errors
  • Frontend keys
    • Issue and store a key
    • Send a key
    • Rotate and revoke
  • Members API
    • Eligibility from a backend
    • The signed-in member
    • Results, rate limits and errors
    • Is an applicant an eligible member?
    • The signed-in frontend user's membership
  • appsolut register API
    • Implement the API
    • Connect and test
    • Verify a member with their challenge code
    • List every member
    • The status of several members
    • The status of one member
    • The person data of several members
    • The person data of one member
    • The claims of several members
    • The claims of one member
    • Health check

The signed-in frontend user's membership

GET /api/v1/members/me

Reads the organisation membership of the frontend user signed in to the calling frontend, for prefilling and submitting forms on their behalf. The status, communities and register are what the Studio has stored from the user's last membership check, with the grace rule applied. Only the member data (memberData: birth date, phone, postal address) is read live, for a valid membership, from the register the membership is linked to; the Studio stores none of it and logs no membership check for it.

Only an internal frontend may call it, with its frontend key and the user's access token from Login with appsolut, issued to this frontend (client_id) at this organisation (tenant_id). The user needs their frontend activation for the frontend and, if they hold an organisation membership, one that is not deactivated. A user without a membership gets status: null and no member fields.

Never the member code, the definition version, claims or why a membership is not valid. 600 requests per frontend user an hour, then 429: enough for any prefill and submission traffic, it only stops a runaway loop.

Authentication

  • All of these together:
    • frontendKey (HTTP bearer token, format ofk_<prefix>_<secret>): The frontend's frontend key, issued in the Studio on the frontend's page and shown once: Authorization: Bearer ofk_…. Up to two are active at a time, so a key can be rotated without downtime.
    • frontendUserToken (sent in the header X-Frontend-User-Token): The signed-in frontend user's access token from Login with appsolut (the OAuth token your backend holds for them), unchanged. Only beside the frontend key, never instead of it.

Responses

200

The user's membership. status: valid (a valid membership, on grace included while the register cannot answer), not_valid (a register refused it at the last check), unavailable (valid at the last check that reached a register, but the register has not answered for 7 days since), or null (no organisation membership). memberData is the member data of a valid membership; "unavailable" when its external register cannot be reached or cannot answer right now, including not within 1.5 s (the rest of the answer stands; ask again later); null when the membership is not valid, or the register no longer holds the member (the entry is gone or deactivated, or an external register does not find them).

Content type: application/json

One of these:

With an organisation membership

FieldTypeRequiredDescription
statusstringYesAllowed values: valid, not_valid, unavailable.
communitiesstring[]YesThe names of the organisation's communities the membership is in, from the facts of its last valid check; empty unless valid.
registerstring or nullYesThe register the membership is linked to; null once deleted.
lastVerifiedAtstring (date-time)YesThe last check that found the membership valid.
frontendsUsedobject[]YesThe organisation's frontends the user has signed in to, the latest sign-in first.
frontendsUsed[].namestringYesThe frontend's name.
frontendsUsed[].firstActivatedAtstring (date-time)YesWhen the user first signed in to it.
frontendsUsed[].lastSignedInAtstring (date-time)YesWhen the user last signed in to it.
memberDataobject or "unavailable" or nullYesRead live from the linked register, only for a valid membership (on grace included). The member data when the register holds the member; "unavailable" when an external register cannot be reached or cannot answer within 1.5 s; null when the membership is not valid, or the entry is gone or deactivated, or an external register does not find the member.
memberData.birthDatestring (date) or nullYesThe member's birth date.
memberData.phonestring or nullYesAs the register holds it, never normalised.
memberData.addressobject or nullYesNull when street, zip and city are all missing.
memberData.address.streetstring or nullYesStreet and house number.
memberData.address.zipstring or nullYesPostal code.
memberData.address.citystring or nullYesCity.

Without an organisation membership

FieldTypeRequiredDescription
statusnullYes
frontendsUsedobject[]YesThe organisation's frontends the user has signed in to, the latest sign-in first.
frontendsUsed[].namestringYesThe frontend's name.
frontendsUsed[].firstActivatedAtstring (date-time)YesWhen the user first signed in to it.
frontendsUsed[].lastSignedInAtstring (date-time)YesWhen the user last signed in to it.

Example: A valid member of an internal register

{
  "status": "valid",
  "communities": [
    "Retirees",
    "All staff"
  ],
  "register": "Retirees",
  "lastVerifiedAt": "2026-10-24T08:15:00.000Z",
  "frontendsUsed": [
    {
      "name": "Pannoniqa Portal",
      "firstActivatedAt": "2026-09-01T07:30:00.000Z",
      "lastSignedInAt": "2026-10-24T08:15:00.000Z"
    }
  ],
  "memberData": {
    "birthDate": "1958-03-14",
    "phone": "+43 660 1234567",
    "address": {
      "street": "Beispielgasse 12",
      "zip": "7000",
      "city": "Eisenstadt"
    }
  }
}

Example: A valid member of an external register, which holds no phone

{
  "status": "valid",
  "communities": [
    "Active employees",
    "All staff"
  ],
  "register": "SAP HR",
  "lastVerifiedAt": "2026-10-24T08:15:00.000Z",
  "frontendsUsed": [
    {
      "name": "Pannoniqa App",
      "firstActivatedAt": "2026-10-02T18:00:00.000Z",
      "lastSignedInAt": "2026-10-24T08:15:00.000Z"
    },
    {
      "name": "Pannoniqa Portal",
      "firstActivatedAt": "2026-09-01T07:30:00.000Z",
      "lastSignedInAt": "2026-10-20T12:00:00.000Z"
    }
  ],
  "memberData": {
    "birthDate": "1979-02-02",
    "phone": null,
    "address": {
      "street": "Musterweg 3",
      "zip": "7100",
      "city": "Neusiedl am See"
    }
  }
}

Example: A valid member whose entry holds no member data

{
  "status": "valid",
  "communities": [
    "Active employees",
    "All staff"
  ],
  "register": "Works council",
  "lastVerifiedAt": "2026-10-24T08:15:00.000Z",
  "frontendsUsed": [
    {
      "name": "Pannoniqa Portal",
      "firstActivatedAt": "2026-09-01T07:30:00.000Z",
      "lastSignedInAt": "2026-10-24T08:15:00.000Z"
    }
  ],
  "memberData": {
    "birthDate": null,
    "phone": null,
    "address": null
  }
}

Example: A valid member whose external register cannot answer

{
  "status": "valid",
  "communities": [
    "Active employees",
    "All staff"
  ],
  "register": "SAP HR",
  "lastVerifiedAt": "2026-10-24T08:15:00.000Z",
  "frontendsUsed": [
    {
      "name": "Pannoniqa Portal",
      "firstActivatedAt": "2026-09-01T07:30:00.000Z",
      "lastSignedInAt": "2026-10-24T08:15:00.000Z"
    }
  ],
  "memberData": "unavailable"
}

Example: A valid member whose register no longer holds them

{
  "status": "valid",
  "communities": [
    "All staff"
  ],
  "register": "Retirees",
  "lastVerifiedAt": "2026-10-24T08:15:00.000Z",
  "frontendsUsed": [
    {
      "name": "Pannoniqa Portal",
      "firstActivatedAt": "2026-09-01T07:30:00.000Z",
      "lastSignedInAt": "2026-10-24T08:15:00.000Z"
    }
  ],
  "memberData": null
}

Example: Refused at the last check

{
  "status": "not_valid",
  "communities": [],
  "register": "Retirees",
  "lastVerifiedAt": "2026-08-30T10:00:00.000Z",
  "frontendsUsed": [
    {
      "name": "Pannoniqa Portal",
      "firstActivatedAt": "2026-08-01T09:00:00.000Z",
      "lastSignedInAt": "2026-10-20T12:00:00.000Z"
    }
  ],
  "memberData": null
}

Example: The register has not answered for 7 days

{
  "status": "unavailable",
  "communities": [],
  "register": null,
  "lastVerifiedAt": "2026-10-10T09:00:00.000Z",
  "frontendsUsed": [
    {
      "name": "Pannoniqa Portal",
      "firstActivatedAt": "2026-09-15T09:00:00.000Z",
      "lastSignedInAt": "2026-10-24T09:00:00.000Z"
    }
  ],
  "memberData": null
}

Example: Signed in, no organisation membership

{
  "status": null,
  "frontendsUsed": [
    {
      "name": "Pannoniqa Portal",
      "firstActivatedAt": "2026-10-24T09:00:00.000Z",
      "lastSignedInAt": "2026-10-24T09:00:00.000Z"
    }
  ]
}

401

No frontend key, or one that is malformed, unknown or revoked, or the key of a disconnected frontend; or the frontend is external; or no user token, or one that does not verify, has expired, belongs to a Studio user, to another frontend or another organisation; or the user's frontend activation is gone, or their membership is deactivated. Every case gets the same answer.

Headers

NameTypeDescription
WWW-Authenticate"Bearer"

Content type: application/json

FieldTypeRequiredDescription
errorstringYesAllowed values: invalid_request, unauthenticated, too_large, rate_limited, unavailable.

Example: Not authenticated

{
  "error": "unauthenticated"
}

429

Over 600 requests for this frontend user in the hour that began with their first counted request. Refused requests are not counted. There is no Retry-After.

Content type: application/json

FieldTypeRequiredDescription
errorstringYesAllowed values: invalid_request, unauthenticated, too_large, rate_limited, unavailable.

Example: Rate limited

{
  "error": "rate_limited"
}

503

The Studio itself failed. Retry later; the key and the token are fine.

Content type: application/json

FieldTypeRequiredDescription
errorstringYesAllowed values: invalid_request, unauthenticated, too_large, rate_limited, unavailable.

Example: The Studio is unavailable

{
  "error": "unavailable"
}