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.
- frontendKey (HTTP bearer token, format
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
| Field | Type | Required | Description |
|---|---|---|---|
status | string | Yes | Allowed values: valid, not_valid, unavailable. |
communities | string[] | Yes | The names of the organisation's communities the membership is in, from the facts of its last valid check; empty unless valid. |
register | string or null | Yes | The register the membership is linked to; null once deleted. |
lastVerifiedAt | string (date-time) | Yes | The last check that found the membership valid. |
frontendsUsed | object[] | Yes | The organisation's frontends the user has signed in to, the latest sign-in first. |
frontendsUsed[].name | string | Yes | The frontend's name. |
frontendsUsed[].firstActivatedAt | string (date-time) | Yes | When the user first signed in to it. |
frontendsUsed[].lastSignedInAt | string (date-time) | Yes | When the user last signed in to it. |
memberData | object or "unavailable" or null | Yes | Read 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.birthDate | string (date) or null | Yes | The member's birth date. |
memberData.phone | string or null | Yes | As the register holds it, never normalised. |
memberData.address | object or null | Yes | Null when street, zip and city are all missing. |
memberData.address.street | string or null | Yes | Street and house number. |
memberData.address.zip | string or null | Yes | Postal code. |
memberData.address.city | string or null | Yes | City. |
Without an organisation membership
| Field | Type | Required | Description |
|---|---|---|---|
status | null | Yes | |
frontendsUsed | object[] | Yes | The organisation's frontends the user has signed in to, the latest sign-in first. |
frontendsUsed[].name | string | Yes | The frontend's name. |
frontendsUsed[].firstActivatedAt | string (date-time) | Yes | When the user first signed in to it. |
frontendsUsed[].lastSignedInAt | string (date-time) | Yes | When 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
| Name | Type | Description |
|---|---|---|
WWW-Authenticate | "Bearer" |
Content type: application/json
| Field | Type | Required | Description |
|---|---|---|---|
error | string | Yes | Allowed 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
| Field | Type | Required | Description |
|---|---|---|---|
error | string | Yes | Allowed 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
| Field | Type | Required | Description |
|---|---|---|---|
error | string | Yes | Allowed values: invalid_request, unauthenticated, too_large, rate_limited, unavailable. |
Example: The Studio is unavailable
{
"error": "unavailable"
}