Logging a patron in and getting their patron ID, either with an identifier and a credential, with an identifier alone where the provider allows it, or through an identity provider. Also changing a credential the patron knows, and resetting one they have forgotten.

6 operations
POST /patron/{patronId}/credential/change

Change the patron's own password or pin code.

Bearer token ChangePatronCredential

Change a credential the patron already knows.

The credential field says which credential is being changed, and the current and new values are named after it, so a password and a pin code can never be sent in each other's place. It must be one of the credentials in patron->credentials->changeable in the configuration, otherwise the provider returns the error code 100013.

The provider must verify the current credential before applying the new one, and returns the error code 100001 if it is wrong. This is the only proof in the request that the caller is the patron, since the bearer token identifies the vendor and patronId is just an identifier.

PLAS states no format for a password or a pin code. If the provider rejects the new value it returns the error code 100011, and the info should say what was wrong, since there is nothing in the configuration for the vendor to validate against beforehand.

The endpoint is also a way to guess the current credential, so the provider is expected to rate limit it per patron, and should answer 429 rather than 400 once the limit is reached. This matters most for a pin code, which is short enough to be guessed outright if nothing throttles the attempts.

A patron who does not know their current credential uses POST /patron/credential/reset instead.

Example request

cURL

curl -X POST "$PLAS_BASE_URL/patron/40218873/credential/change?version=0.6.7" \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -H "Authorization: Bearer $PLAS_TOKEN" \
  -d '{
  "credential": "password",
  "currentPassword": "correct-horse-battery",
  "newPassword": "lantern-river-staple"
}'

JavaScript

const response = await fetch(`${process.env.PLAS_BASE_URL}/patron/40218873/credential/change?version=0.6.7`, {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Content-Type": "application/json",
    "Authorization": `Bearer ${process.env.PLAS_TOKEN}`,
  },
  body: JSON.stringify({
    "credential": "password",
    "currentPassword": "correct-horse-battery",
    "newPassword": "lantern-river-staple"
  }),
});

Python

import os
import requests

response = requests.post(
    f"{os.environ['PLAS_BASE_URL']}/patron/40218873/credential/change",
    params={
        "version": "0.6.7",
    },
    headers={
        "Accept": "application/json",
        "Content-Type": "application/json",
        "Authorization": f"Bearer {os.environ['PLAS_TOKEN']}",
    },
    json={
        "credential": "password",
        "currentPassword": "correct-horse-battery",
        "newPassword": "lantern-river-staple",
    },
)
response.raise_for_status()
The host and token are environment variables: PLAS_BASE_URL the provider’s base URL · PLAS_TOKEN an access token.

Parameters

patronIdrequired
path · string

Patron ID from authentication.

Example: 40218873
Shared across operations: version. See the shared contract on the version page.

Request body

application/json · required · ChangePatronCredentialRequestBody

Selected by the field credential

Variant: password

ChangePatronPasswordRequestBody

  • credentialstringrequired

    One of: password

  • currentPasswordstringrequired

    The patron's current password.

    The provider must verify this before applying newPassword. It is the only proof in the request that the caller is the patron, and not someone who knows the patron ID.

  • newPasswordstringrequired

    The password the patron wants from now on.

Variant: pin

ChangePatronPinRequestBody

  • credentialstringrequired

    One of: pin

  • currentPinstringrequired

    The patron's current pin code.

    The provider must verify this before applying newPin. It is the only proof in the request that the caller is the patron, and not someone who knows the patron ID.

  • newPinstringrequired

    The pin code the patron wants from now on.

Responses

204 The credential was changed, and the current value no longer works.

No response body.

400 The list of errors. Errors

Shared response, defined once for the whole API. See the shared contract on the version page.

Generated from the schema

Example

{
  "errors": [
    {
      "code": 200103,
      "info": "200103: invalid/unsupported query parameter value"
    }
  ]
}

Schema

Errors

  • errorsarray of Errorrequiredmin items 1

    The first error should always be the most relevant.

    Show 2 fieldsHide 2 fields
    • codeintegerrequired

      A number representing the type of error.

      List of error codes:

      • \<error code\>: \<error description\>
      • 500: System error
      • 600: Unsupported Open Library API version
      • 10001: Endpoint disabled
      • 71001: Consent has not been given for 'loan history'
      • 100001: Wrong patron identifier, password or pin code
      • 100011: New password or pin code rejected, because it does not meet the provider's requirements
      • 100013: The provider does not let the patron change the given credential
      • 100023: Patron ID not found
      • 100101: Patron could not be deleted, because the patron has something unresolved issue with the library (this could be anything from a loan to a fee, and so on ...)
      • 100211: maxNumberOfEmailAddresses exceeded
      • 100215: maxNumberOfPhoneNumbers exceeded
      • 100221: Pickup location cannot contain sections
      • 100411: Updating patron consent failed
      • 100611: Updating patron notification settings failed
      • 101001: Reservation ID not found
      • 101047: Branch ID cannot be used as pick up branch
      • 101053: Section ID cannot be used as pick up branch
      • 102001: Loan ID not found
      • 102301: Loan not renewable, because it is an interlibrary loan
      • 102311: Loan not renewable, because it is reserved
      • 110001: Branch ID not found
      • 200001: Publication ID not found
      • 200077: ui language not supported
      • 200101: missing required query parameter
      • 200103: invalid/unsupported query parameter value
      • 300001: Initialize payment should not be used
      • 300005: Initialize payment should be used
      • 300009: Payment method not supported
      • 300013: Payment method does not support partial payment
      • 300301: Finalized payment can not de changed
      • 300311: FinalizePaymentRequest.fees contains fees with the same ID
      • 310001: Loan history ID not found
      • 310011: Loan history ID already exists
      • 330001: List ID not found
      • 330011: List ID already exists
      • 330101: List item ID not found
      • 330111: List item ID already exists

      One of: 500 · 600 · 10001 · 71001 · 100001 · 100011 · 100013 · 100023 · 100101 · 100211 · 100215 · 100221 · 100411 · 100611 · 101001 · 101047 · 101053 · 102001 · 102301 · 102311 · 110001 · 200001 · 200077 · 200101 · 200103 · 300001 · 300005 · 300009 · 300013 · 300301 · 300311 · 310001 · 310011 · 330001 · 330011 · 330101 · 330111

    • infostringrequired

      Starts with the text matching the error code field (defined above), and a describing text could be added.

401 Bearer token invalid, missing, or expired.

Shared response, defined once for the whole API. See the shared contract on the version page.

No response body.

404 Resource not found.

Shared response, defined once for the whole API. See the shared contract on the version page.

No response body.

429 Too many requests. The provider is rate limiting and did not carry out the request.

The response should have a Retry-After header saying how many seconds to wait. Show the patron "try again later", not an error about what they sent.

Shared response, defined once for the whole API. See the shared contract on the version page.

Headers
Retry-After integer

Seconds to wait before sending the request again.

No response body.

POST /patron/authentication

Authenticate patron

Bearer token AuthenticatePatron

Authenticate patron by credentials.

Example request

cURL

curl -X POST "$PLAS_BASE_URL/patron/authentication?version=0.6.7" \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -H "Authorization: Bearer $PLAS_TOKEN" \
  -d '{
  "identifier": {
    "type": "local",
    "value": "N00012345"
  },
  "password": "correct-horse-battery"
}'

JavaScript

const response = await fetch(`${process.env.PLAS_BASE_URL}/patron/authentication?version=0.6.7`, {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Content-Type": "application/json",
    "Authorization": `Bearer ${process.env.PLAS_TOKEN}`,
  },
  body: JSON.stringify({
    "identifier": {
      "type": "local",
      "value": "N00012345"
    },
    "password": "correct-horse-battery"
  }),
});
const data = await response.json();

Python

import os
import requests

response = requests.post(
    f"{os.environ['PLAS_BASE_URL']}/patron/authentication",
    params={
        "version": "0.6.7",
    },
    headers={
        "Accept": "application/json",
        "Content-Type": "application/json",
        "Authorization": f"Bearer {os.environ['PLAS_TOKEN']}",
    },
    json={
        "identifier": {
            "type": "local",
            "value": "N00012345",
        },
        "password": "correct-horse-battery",
    },
)
data = response.json()
The host and token are environment variables: PLAS_BASE_URL the provider’s base URL · PLAS_TOKEN an access token.

Parameters

Shared across operations: version. See the shared contract on the version page.

Request body

application/json · required · PatronAuthenticationRequestBody

Authentication Patron

  • Show 2 fieldsHide 2 fields
    • A type identifier that tells which type of identifier is used.

      This is an open enum, so values other than the known ones are allowed. GET /configuration says which types the provider accepts for each flow, in patron.login.identifierTypes, patron.registration.identifierTypes and patron.deletion.identifierTypes.

      One of: local · email · phone · norway_national_library_card · norway_national_birth_number · denmark_cpr

      Show 2 variantsHide 2 variants

      Variant: PatronIdentifierTypeEnum

      PatronIdentifierTypeEnum

      Variant: PatronIdentifierTypeLiteral

      PatronIdentifierTypeLiteral

    • valuestringrequired

      Identifier value. This information may be sensitive.

  • passwordstringrequired

    The credential for the identifier.

    In authentication, registration and deletion this field carries whichever credential the provider uses, so at a provider that uses pin codes the value is a pin code even though the field is named password. For authentication, patron.login.credentials in GET /configuration says which it is.

    In POST /patron/{patronId}/credential/change the value is always a password. That request body carries a pin code in currentPin and newPin instead.

Responses

200 Success PatronAuthenticationResponseBody
Generated from the schema

Example

{
  "patron": {
    "address": {
      "city": "Nordby",
      "country": "Norway",
      "postalCode": "0182",
      "street": "Storgata 12"
    },
    "emails": [
      {
        "default": true,
        "email": "kari.nordmann@example.no",
        "verified": "yes"
      }
    ],
    "fullName": "Kari Nordmann",
    "givenName": "Kari",
    "identifiers": [
      {
        "type": "local",
        "value": "N00012345"
      }
    ],
    "patronId": "40218873",
    "permissions": [
      {
        "reason": "The patron has unpaid fees above the library’s limit.",
        "status": "allowed",
        "type": "off_hours"
      }
    ],
    "phoneNumbers": [
      {
        "default": true,
        "number": "+4791234567",
        "type": "mobile",
        "verified": "yes"
      }
    ],
    "pickupLocation": {
      "branchId": "nordby-main",
      "branchName": "Nordby Main Library",
      "sections": [
        {
          "id": "nordby-main-children",
          "name": "Children’s department",
          "type": "department"
        }
      ]
    },
    "reservation": {
      "postpone": {
        "fromDate": "2025-03-01",
        "toDate": "2025-03-31"
      }
    },
    "surname": "Nordmann"
  }
}

Schema

PatronAuthenticationResponseBody

  • patronPatronrequired
    Show 11 fieldsHide 11 fields
    • Show 4 fieldsHide 4 fields
      • citystringrequired

        This field refers to the city, town, or locality where the address is located.

      • countrystring

        This field specifies the name of the country where the address is located.

      • postalCodestring

        This field represents the numeric or alphanumeric code assigned to a specific area for efficient mail sorting and delivery.

      • streetstringrequired

        This field represents the name of the road, street, or thoroughfare where the address is located.
        The field should also contain the building number assigned to a building at the location, and the field should also contain identifiers such as apartment numbers, suite numbers, or floor numbers.

    • emailsarray of PatronEmailrequired

      The size of this array must not exceed (if specified) the ´maxNumberOfEmailAddresses´ value given in the configuration.

      Show 3 fieldsHide 3 fields
      • defaultboolean

        At most one email can de marked as default.

      • emailstringrequired

        Patron email, following RFC 5322.

      • verifiedstring

        Tells the state of verification of the email.

        One of: yes · no · pending

    • fullNamestringrequired

      FullName is always provided, but givenName and surname are only specified if the data is organized in such a detailed manner.

    • givenNamestring

      Patron's given name.

    • Show 2 fieldsHide 2 fields
      • A type identifier that tells which type of identifier is used.

        This is an open enum, so values other than the known ones are allowed. GET /configuration says which types the provider accepts for each flow, in patron.login.identifierTypes, patron.registration.identifierTypes and patron.deletion.identifierTypes.

        One of: local · email · phone · norway_national_library_card · norway_national_birth_number · denmark_cpr

        See PatronIdentifierType in the schema index

      • valuestringrequired

        Identifier value. This information may be sensitive.

    • patronIdstringrequired

      Unique patron identifier (unique for that customer).

    • permissionsarray of object

      This is a list of activities, locations, etc. that the patron is either allowed or blocked from accessing.

      Show 3 fieldsHide 3 fields
      • reasonstring

        Human readable text that explains why the patron is blocked.

      • statusstringrequired

        One of: allowed · blocked

      • typestringrequired

        Some suggested access types:

        • off_hours Access to the libraries outside normal opening hours.
        • self_service Block checkout and checkin on self service clients.
        • exclusion Patron is excluded from all library uses.
    • phoneNumbersarray of PatronPhoneNumberrequired

      The size of this array must not exceed (if specified) the ´maxNumberOfPhoneNumbers´ value given in the configuration.

      Show 4 fieldsHide 4 fields
      • defaultbooleanrequired

        At most one phone number can be marked as default.

      • numberstringrequiredpattern ^\+[1-9]\d{1,14}$

        The phone number, in ITU standard E.164 format.

      • typestringrequired

        This tells which type of phone the number is associated with

        One of: mobile · landline

      • verifiedstring

        Tells the state of verification of the phone number.

        One of: yes · no · pending

    • pickupLocationPickupLocationrequired

      The object tells where a reservation item can be picked up.

      This is the default pickup location for the patron.

      Show 3 fieldsHide 3 fields
    • Show 1 fieldHide 1 field
      • postponeobject

        This describes an interval (possibly an open interval, but only in one end) where the patron is not interested in reservations being fulfilled, e.g. while on vacation.

    • surnamestring

      Patron surname.

400 The list of errors. Errors

Shared response, defined once for the whole API. See the shared contract on the version page.

Generated from the schema

Example

{
  "errors": [
    {
      "code": 200103,
      "info": "200103: invalid/unsupported query parameter value"
    }
  ]
}

Schema

Errors

  • errorsarray of Errorrequiredmin items 1

    The first error should always be the most relevant.

    Show 2 fieldsHide 2 fields
    • codeintegerrequired

      A number representing the type of error.

      List of error codes:

      • \<error code\>: \<error description\>
      • 500: System error
      • 600: Unsupported Open Library API version
      • 10001: Endpoint disabled
      • 71001: Consent has not been given for 'loan history'
      • 100001: Wrong patron identifier, password or pin code
      • 100011: New password or pin code rejected, because it does not meet the provider's requirements
      • 100013: The provider does not let the patron change the given credential
      • 100023: Patron ID not found
      • 100101: Patron could not be deleted, because the patron has something unresolved issue with the library (this could be anything from a loan to a fee, and so on ...)
      • 100211: maxNumberOfEmailAddresses exceeded
      • 100215: maxNumberOfPhoneNumbers exceeded
      • 100221: Pickup location cannot contain sections
      • 100411: Updating patron consent failed
      • 100611: Updating patron notification settings failed
      • 101001: Reservation ID not found
      • 101047: Branch ID cannot be used as pick up branch
      • 101053: Section ID cannot be used as pick up branch
      • 102001: Loan ID not found
      • 102301: Loan not renewable, because it is an interlibrary loan
      • 102311: Loan not renewable, because it is reserved
      • 110001: Branch ID not found
      • 200001: Publication ID not found
      • 200077: ui language not supported
      • 200101: missing required query parameter
      • 200103: invalid/unsupported query parameter value
      • 300001: Initialize payment should not be used
      • 300005: Initialize payment should be used
      • 300009: Payment method not supported
      • 300013: Payment method does not support partial payment
      • 300301: Finalized payment can not de changed
      • 300311: FinalizePaymentRequest.fees contains fees with the same ID
      • 310001: Loan history ID not found
      • 310011: Loan history ID already exists
      • 330001: List ID not found
      • 330011: List ID already exists
      • 330101: List item ID not found
      • 330111: List item ID already exists

      One of: 500 · 600 · 10001 · 71001 · 100001 · 100011 · 100013 · 100023 · 100101 · 100211 · 100215 · 100221 · 100411 · 100611 · 101001 · 101047 · 101053 · 102001 · 102301 · 102311 · 110001 · 200001 · 200077 · 200101 · 200103 · 300001 · 300005 · 300009 · 300013 · 300301 · 300311 · 310001 · 310011 · 330001 · 330011 · 330101 · 330111

    • infostringrequired

      Starts with the text matching the error code field (defined above), and a describing text could be added.

401 Bearer token invalid, missing, or expired.

Shared response, defined once for the whole API. See the shared contract on the version page.

No response body.

GET /patron/authentication/identity-provider

This will fetch a SSO URL used for patron login, matching the chosen identity provider.

Bearer token GetPatronAuthenticationUrl

Example request

cURL

curl -X GET "$PLAS_BASE_URL/patron/authentication/identity-provider?identity_provider=norway_id_portal&code_challenge=E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM&state=af0ifjsldkj&version=0.6.7" \
  -H 'Accept: application/json' \
  -H "Authorization: Bearer $PLAS_TOKEN"

JavaScript

const response = await fetch(`${process.env.PLAS_BASE_URL}/patron/authentication/identity-provider?identity_provider=norway_id_portal&code_challenge=E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM&state=af0ifjsldkj&version=0.6.7`, {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.PLAS_TOKEN}`,
  },
});
const data = await response.json();

Python

import os
import requests

response = requests.get(
    f"{os.environ['PLAS_BASE_URL']}/patron/authentication/identity-provider",
    params={
        "identity_provider": "norway_id_portal",
        "code_challenge": "E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM",
        "state": "af0ifjsldkj",
        "version": "0.6.7",
    },
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['PLAS_TOKEN']}",
    },
)
data = response.json()
The host and token are environment variables: PLAS_BASE_URL the provider’s base URL · PLAS_TOKEN an access token.

Parameters

identity_providerrequired
query · string

The identity provider type, found in GET /configuration.

Example: norway_id_portal
code_challengerequired
query · string

A hashed value (of the code_verifier from a PKCE flow) used to secure the authorization code exchange.

Example: E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM
staterequired
query · string

A random string to protect against CSRF and track the request state. The value should be returned to the Vendor on the callback url after login.

Example: af0ifjsldkj
prompt
query · string

If prompt is set to login, the returned url should force a new login, even if the user is already logged in.

Example: login
app_redirect_url
query · string (uri)

This value should be returned to the Vendor on the callback url after login.

Example: https://app.nordby.bibliotek.example/callback
Shared across operations: version. See the shared contract on the version page.

Responses

200 Success PatronAuthenticationIdentityProviderResponseBody
Generated from the schema

Example

{
  "url": "https://nordby.bibliotek.example/url"
}

Schema

PatronAuthenticationIdentityProviderResponseBody

  • urlstring (uri)required
400 The list of errors. Errors

Shared response, defined once for the whole API. See the shared contract on the version page.

Generated from the schema

Example

{
  "errors": [
    {
      "code": 200103,
      "info": "200103: invalid/unsupported query parameter value"
    }
  ]
}

Schema

Errors

  • errorsarray of Errorrequiredmin items 1

    The first error should always be the most relevant.

    Show 2 fieldsHide 2 fields
    • codeintegerrequired

      A number representing the type of error.

      List of error codes:

      • \<error code\>: \<error description\>
      • 500: System error
      • 600: Unsupported Open Library API version
      • 10001: Endpoint disabled
      • 71001: Consent has not been given for 'loan history'
      • 100001: Wrong patron identifier, password or pin code
      • 100011: New password or pin code rejected, because it does not meet the provider's requirements
      • 100013: The provider does not let the patron change the given credential
      • 100023: Patron ID not found
      • 100101: Patron could not be deleted, because the patron has something unresolved issue with the library (this could be anything from a loan to a fee, and so on ...)
      • 100211: maxNumberOfEmailAddresses exceeded
      • 100215: maxNumberOfPhoneNumbers exceeded
      • 100221: Pickup location cannot contain sections
      • 100411: Updating patron consent failed
      • 100611: Updating patron notification settings failed
      • 101001: Reservation ID not found
      • 101047: Branch ID cannot be used as pick up branch
      • 101053: Section ID cannot be used as pick up branch
      • 102001: Loan ID not found
      • 102301: Loan not renewable, because it is an interlibrary loan
      • 102311: Loan not renewable, because it is reserved
      • 110001: Branch ID not found
      • 200001: Publication ID not found
      • 200077: ui language not supported
      • 200101: missing required query parameter
      • 200103: invalid/unsupported query parameter value
      • 300001: Initialize payment should not be used
      • 300005: Initialize payment should be used
      • 300009: Payment method not supported
      • 300013: Payment method does not support partial payment
      • 300301: Finalized payment can not de changed
      • 300311: FinalizePaymentRequest.fees contains fees with the same ID
      • 310001: Loan history ID not found
      • 310011: Loan history ID already exists
      • 330001: List ID not found
      • 330011: List ID already exists
      • 330101: List item ID not found
      • 330111: List item ID already exists

      One of: 500 · 600 · 10001 · 71001 · 100001 · 100011 · 100013 · 100023 · 100101 · 100211 · 100215 · 100221 · 100411 · 100611 · 101001 · 101047 · 101053 · 102001 · 102301 · 102311 · 110001 · 200001 · 200077 · 200101 · 200103 · 300001 · 300005 · 300009 · 300013 · 300301 · 300311 · 310001 · 310011 · 330001 · 330011 · 330101 · 330111

    • infostringrequired

      Starts with the text matching the error code field (defined above), and a describing text could be added.

401 Bearer token invalid, missing, or expired.

Shared response, defined once for the whole API. See the shared contract on the version page.

No response body.

POST /patron/authentication/identity-provider

Authenticate patron by code and code verifier from SSO login.

Bearer token AuthenticatePatronByCodeAndCodeVerifier

Example request

cURL

curl -X POST "$PLAS_BASE_URL/patron/authentication/identity-provider?version=0.6.7" \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -H "Authorization: Bearer $PLAS_TOKEN" \
  --data-urlencode 'code=SplxlOBeZQQYbYS6WxSbIA' \
  --data-urlencode 'code_verifier=dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk' \
  --data-urlencode 'identity_provider=norway_id_portal'

JavaScript

const response = await fetch(`${process.env.PLAS_BASE_URL}/patron/authentication/identity-provider?version=0.6.7`, {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Content-Type": "application/x-www-form-urlencoded",
    "Authorization": `Bearer ${process.env.PLAS_TOKEN}`,
  },
  body: new URLSearchParams({
    "code": "SplxlOBeZQQYbYS6WxSbIA",
    "code_verifier": "dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk",
    "identity_provider": "norway_id_portal",
  }),
});
const data = await response.json();

Python

import os
import requests

response = requests.post(
    f"{os.environ['PLAS_BASE_URL']}/patron/authentication/identity-provider",
    params={
        "version": "0.6.7",
    },
    headers={
        "Accept": "application/json",
        "Content-Type": "application/x-www-form-urlencoded",
        "Authorization": f"Bearer {os.environ['PLAS_TOKEN']}",
    },
    data={
        "code": "SplxlOBeZQQYbYS6WxSbIA",
        "code_verifier": "dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk",
        "identity_provider": "norway_id_portal",
    },
)
data = response.json()
The host and token are environment variables: PLAS_BASE_URL the provider’s base URL · PLAS_TOKEN an access token.

Parameters

Shared across operations: version. See the shared contract on the version page.

Request body

application/x-www-form-urlencoded · required · PatronAuthenticationByCodeAndCodeVerifierRequestBody
  • codestringrequired

    The code obtained from a SSO patron authentication.

  • code_verifierstringrequired

    The code verifier use to create the code challenge use to obtained the code.

  • identity_providerstringrequired

    The identity provider type, found in GET /configuration.

    One of: norway_id_portal · norway_nl_oidc · norway_feide_oidc · denmark_mit_id · denmark_dbc_access_platform

Responses

200 Success PatronAuthenticationByCodeAndCodeVerifierResponseBody
Generated from the schema

Example

{
  "patron": {
    "address": {
      "city": "Nordby",
      "country": "Norway",
      "postalCode": "0182",
      "street": "Storgata 12"
    },
    "emails": [
      {
        "default": true,
        "email": "kari.nordmann@example.no",
        "verified": "yes"
      }
    ],
    "fullName": "Kari Nordmann",
    "givenName": "Kari",
    "identifiers": [
      {
        "type": "local",
        "value": "N00012345"
      }
    ],
    "patronId": "40218873",
    "permissions": [
      {
        "reason": "The patron has unpaid fees above the library’s limit.",
        "status": "allowed",
        "type": "off_hours"
      }
    ],
    "phoneNumbers": [
      {
        "default": true,
        "number": "+4791234567",
        "type": "mobile",
        "verified": "yes"
      }
    ],
    "pickupLocation": {
      "branchId": "nordby-main",
      "branchName": "Nordby Main Library",
      "sections": [
        {
          "id": "nordby-main-children",
          "name": "Children’s department",
          "type": "department"
        }
      ]
    },
    "reservation": {
      "postpone": {
        "fromDate": "2025-03-01",
        "toDate": "2025-03-31"
      }
    },
    "surname": "Nordmann"
  }
}

Schema

PatronAuthenticationByCodeAndCodeVerifierResponseBody

  • patronPatronrequired
    Show 11 fieldsHide 11 fields
    • Show 4 fieldsHide 4 fields
      • citystringrequired

        This field refers to the city, town, or locality where the address is located.

      • countrystring

        This field specifies the name of the country where the address is located.

      • postalCodestring

        This field represents the numeric or alphanumeric code assigned to a specific area for efficient mail sorting and delivery.

      • streetstringrequired

        This field represents the name of the road, street, or thoroughfare where the address is located.
        The field should also contain the building number assigned to a building at the location, and the field should also contain identifiers such as apartment numbers, suite numbers, or floor numbers.

    • emailsarray of PatronEmailrequired

      The size of this array must not exceed (if specified) the ´maxNumberOfEmailAddresses´ value given in the configuration.

      Show 3 fieldsHide 3 fields
      • defaultboolean

        At most one email can de marked as default.

      • emailstringrequired

        Patron email, following RFC 5322.

      • verifiedstring

        Tells the state of verification of the email.

        One of: yes · no · pending

    • fullNamestringrequired

      FullName is always provided, but givenName and surname are only specified if the data is organized in such a detailed manner.

    • givenNamestring

      Patron's given name.

    • Show 2 fieldsHide 2 fields
      • A type identifier that tells which type of identifier is used.

        This is an open enum, so values other than the known ones are allowed. GET /configuration says which types the provider accepts for each flow, in patron.login.identifierTypes, patron.registration.identifierTypes and patron.deletion.identifierTypes.

        One of: local · email · phone · norway_national_library_card · norway_national_birth_number · denmark_cpr

        See PatronIdentifierType in the schema index

      • valuestringrequired

        Identifier value. This information may be sensitive.

    • patronIdstringrequired

      Unique patron identifier (unique for that customer).

    • permissionsarray of object

      This is a list of activities, locations, etc. that the patron is either allowed or blocked from accessing.

      Show 3 fieldsHide 3 fields
      • reasonstring

        Human readable text that explains why the patron is blocked.

      • statusstringrequired

        One of: allowed · blocked

      • typestringrequired

        Some suggested access types:

        • off_hours Access to the libraries outside normal opening hours.
        • self_service Block checkout and checkin on self service clients.
        • exclusion Patron is excluded from all library uses.
    • phoneNumbersarray of PatronPhoneNumberrequired

      The size of this array must not exceed (if specified) the ´maxNumberOfPhoneNumbers´ value given in the configuration.

      Show 4 fieldsHide 4 fields
      • defaultbooleanrequired

        At most one phone number can be marked as default.

      • numberstringrequiredpattern ^\+[1-9]\d{1,14}$

        The phone number, in ITU standard E.164 format.

      • typestringrequired

        This tells which type of phone the number is associated with

        One of: mobile · landline

      • verifiedstring

        Tells the state of verification of the phone number.

        One of: yes · no · pending

    • pickupLocationPickupLocationrequired

      The object tells where a reservation item can be picked up.

      This is the default pickup location for the patron.

      Show 3 fieldsHide 3 fields
    • Show 1 fieldHide 1 field
      • postponeobject

        This describes an interval (possibly an open interval, but only in one end) where the patron is not interested in reservations being fulfilled, e.g. while on vacation.

    • surnamestring

      Patron surname.

400 The list of errors. Errors

Shared response, defined once for the whole API. See the shared contract on the version page.

Generated from the schema

Example

{
  "errors": [
    {
      "code": 200103,
      "info": "200103: invalid/unsupported query parameter value"
    }
  ]
}

Schema

Errors

  • errorsarray of Errorrequiredmin items 1

    The first error should always be the most relevant.

    Show 2 fieldsHide 2 fields
    • codeintegerrequired

      A number representing the type of error.

      List of error codes:

      • \<error code\>: \<error description\>
      • 500: System error
      • 600: Unsupported Open Library API version
      • 10001: Endpoint disabled
      • 71001: Consent has not been given for 'loan history'
      • 100001: Wrong patron identifier, password or pin code
      • 100011: New password or pin code rejected, because it does not meet the provider's requirements
      • 100013: The provider does not let the patron change the given credential
      • 100023: Patron ID not found
      • 100101: Patron could not be deleted, because the patron has something unresolved issue with the library (this could be anything from a loan to a fee, and so on ...)
      • 100211: maxNumberOfEmailAddresses exceeded
      • 100215: maxNumberOfPhoneNumbers exceeded
      • 100221: Pickup location cannot contain sections
      • 100411: Updating patron consent failed
      • 100611: Updating patron notification settings failed
      • 101001: Reservation ID not found
      • 101047: Branch ID cannot be used as pick up branch
      • 101053: Section ID cannot be used as pick up branch
      • 102001: Loan ID not found
      • 102301: Loan not renewable, because it is an interlibrary loan
      • 102311: Loan not renewable, because it is reserved
      • 110001: Branch ID not found
      • 200001: Publication ID not found
      • 200077: ui language not supported
      • 200101: missing required query parameter
      • 200103: invalid/unsupported query parameter value
      • 300001: Initialize payment should not be used
      • 300005: Initialize payment should be used
      • 300009: Payment method not supported
      • 300013: Payment method does not support partial payment
      • 300301: Finalized payment can not de changed
      • 300311: FinalizePaymentRequest.fees contains fees with the same ID
      • 310001: Loan history ID not found
      • 310011: Loan history ID already exists
      • 330001: List ID not found
      • 330011: List ID already exists
      • 330101: List item ID not found
      • 330111: List item ID already exists

      One of: 500 · 600 · 10001 · 71001 · 100001 · 100011 · 100013 · 100023 · 100101 · 100211 · 100215 · 100221 · 100411 · 100611 · 101001 · 101047 · 101053 · 102001 · 102301 · 102311 · 110001 · 200001 · 200077 · 200101 · 200103 · 300001 · 300005 · 300009 · 300013 · 300301 · 300311 · 310001 · 310011 · 330001 · 330011 · 330101 · 330111

    • infostringrequired

      Starts with the text matching the error code field (defined above), and a describing text could be added.

401 Bearer token invalid, missing, or expired.

Shared response, defined once for the whole API. See the shared contract on the version page.

No response body.

POST /patron/authentication/no-password

Authenticate patron without use of a password

Bearer token AuthenticatePatronNoPassword

Authenticate patron without use of a password. This should only be used when absolutely necessary.

Example request

cURL

curl -X POST "$PLAS_BASE_URL/patron/authentication/no-password?version=0.6.7" \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -H "Authorization: Bearer $PLAS_TOKEN" \
  -d '{
  "identifier": {
    "type": "local",
    "value": "N00012345"
  }
}'

JavaScript

const response = await fetch(`${process.env.PLAS_BASE_URL}/patron/authentication/no-password?version=0.6.7`, {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Content-Type": "application/json",
    "Authorization": `Bearer ${process.env.PLAS_TOKEN}`,
  },
  body: JSON.stringify({
    "identifier": {
      "type": "local",
      "value": "N00012345"
    }
  }),
});
const data = await response.json();

Python

import os
import requests

response = requests.post(
    f"{os.environ['PLAS_BASE_URL']}/patron/authentication/no-password",
    params={
        "version": "0.6.7",
    },
    headers={
        "Accept": "application/json",
        "Content-Type": "application/json",
        "Authorization": f"Bearer {os.environ['PLAS_TOKEN']}",
    },
    json={
        "identifier": {
            "type": "local",
            "value": "N00012345",
        },
    },
)
data = response.json()
The host and token are environment variables: PLAS_BASE_URL the provider’s base URL · PLAS_TOKEN an access token.

Parameters

Shared across operations: version. See the shared contract on the version page.

Request body

application/json · required · PatronAuthenticationNoPasswordRequestBody

Authentication Patron without using password

  • Show 2 fieldsHide 2 fields
    • A type identifier that tells which type of identifier is used.

      This is an open enum, so values other than the known ones are allowed. GET /configuration says which types the provider accepts for each flow, in patron.login.identifierTypes, patron.registration.identifierTypes and patron.deletion.identifierTypes.

      One of: local · email · phone · norway_national_library_card · norway_national_birth_number · denmark_cpr

      Show 2 variantsHide 2 variants

      Variant: PatronIdentifierTypeEnum

      PatronIdentifierTypeEnum

      Variant: PatronIdentifierTypeLiteral

      PatronIdentifierTypeLiteral

    • valuestringrequired

      Identifier value. This information may be sensitive.

Responses

200 Success PatronAuthenticationNoPasswordResponseBody
Generated from the schema

Example

{
  "patron": {
    "address": {
      "city": "Nordby",
      "country": "Norway",
      "postalCode": "0182",
      "street": "Storgata 12"
    },
    "emails": [
      {
        "default": true,
        "email": "kari.nordmann@example.no",
        "verified": "yes"
      }
    ],
    "fullName": "Kari Nordmann",
    "givenName": "Kari",
    "identifiers": [
      {
        "type": "local",
        "value": "N00012345"
      }
    ],
    "patronId": "40218873",
    "permissions": [
      {
        "reason": "The patron has unpaid fees above the library’s limit.",
        "status": "allowed",
        "type": "off_hours"
      }
    ],
    "phoneNumbers": [
      {
        "default": true,
        "number": "+4791234567",
        "type": "mobile",
        "verified": "yes"
      }
    ],
    "pickupLocation": {
      "branchId": "nordby-main",
      "branchName": "Nordby Main Library",
      "sections": [
        {
          "id": "nordby-main-children",
          "name": "Children’s department",
          "type": "department"
        }
      ]
    },
    "reservation": {
      "postpone": {
        "fromDate": "2025-03-01",
        "toDate": "2025-03-31"
      }
    },
    "surname": "Nordmann"
  }
}

Schema

PatronAuthenticationNoPasswordResponseBody

  • patronPatronrequired
    Show 11 fieldsHide 11 fields
    • Show 4 fieldsHide 4 fields
      • citystringrequired

        This field refers to the city, town, or locality where the address is located.

      • countrystring

        This field specifies the name of the country where the address is located.

      • postalCodestring

        This field represents the numeric or alphanumeric code assigned to a specific area for efficient mail sorting and delivery.

      • streetstringrequired

        This field represents the name of the road, street, or thoroughfare where the address is located.
        The field should also contain the building number assigned to a building at the location, and the field should also contain identifiers such as apartment numbers, suite numbers, or floor numbers.

    • emailsarray of PatronEmailrequired

      The size of this array must not exceed (if specified) the ´maxNumberOfEmailAddresses´ value given in the configuration.

      Show 3 fieldsHide 3 fields
      • defaultboolean

        At most one email can de marked as default.

      • emailstringrequired

        Patron email, following RFC 5322.

      • verifiedstring

        Tells the state of verification of the email.

        One of: yes · no · pending

    • fullNamestringrequired

      FullName is always provided, but givenName and surname are only specified if the data is organized in such a detailed manner.

    • givenNamestring

      Patron's given name.

    • Show 2 fieldsHide 2 fields
      • A type identifier that tells which type of identifier is used.

        This is an open enum, so values other than the known ones are allowed. GET /configuration says which types the provider accepts for each flow, in patron.login.identifierTypes, patron.registration.identifierTypes and patron.deletion.identifierTypes.

        One of: local · email · phone · norway_national_library_card · norway_national_birth_number · denmark_cpr

        See PatronIdentifierType in the schema index

      • valuestringrequired

        Identifier value. This information may be sensitive.

    • patronIdstringrequired

      Unique patron identifier (unique for that customer).

    • permissionsarray of object

      This is a list of activities, locations, etc. that the patron is either allowed or blocked from accessing.

      Show 3 fieldsHide 3 fields
      • reasonstring

        Human readable text that explains why the patron is blocked.

      • statusstringrequired

        One of: allowed · blocked

      • typestringrequired

        Some suggested access types:

        • off_hours Access to the libraries outside normal opening hours.
        • self_service Block checkout and checkin on self service clients.
        • exclusion Patron is excluded from all library uses.
    • phoneNumbersarray of PatronPhoneNumberrequired

      The size of this array must not exceed (if specified) the ´maxNumberOfPhoneNumbers´ value given in the configuration.

      Show 4 fieldsHide 4 fields
      • defaultbooleanrequired

        At most one phone number can be marked as default.

      • numberstringrequiredpattern ^\+[1-9]\d{1,14}$

        The phone number, in ITU standard E.164 format.

      • typestringrequired

        This tells which type of phone the number is associated with

        One of: mobile · landline

      • verifiedstring

        Tells the state of verification of the phone number.

        One of: yes · no · pending

    • pickupLocationPickupLocationrequired

      The object tells where a reservation item can be picked up.

      This is the default pickup location for the patron.

      Show 3 fieldsHide 3 fields
    • Show 1 fieldHide 1 field
      • postponeobject

        This describes an interval (possibly an open interval, but only in one end) where the patron is not interested in reservations being fulfilled, e.g. while on vacation.

    • surnamestring

      Patron surname.

400 The list of errors. Errors

Shared response, defined once for the whole API. See the shared contract on the version page.

Generated from the schema

Example

{
  "errors": [
    {
      "code": 200103,
      "info": "200103: invalid/unsupported query parameter value"
    }
  ]
}

Schema

Errors

  • errorsarray of Errorrequiredmin items 1

    The first error should always be the most relevant.

    Show 2 fieldsHide 2 fields
    • codeintegerrequired

      A number representing the type of error.

      List of error codes:

      • \<error code\>: \<error description\>
      • 500: System error
      • 600: Unsupported Open Library API version
      • 10001: Endpoint disabled
      • 71001: Consent has not been given for 'loan history'
      • 100001: Wrong patron identifier, password or pin code
      • 100011: New password or pin code rejected, because it does not meet the provider's requirements
      • 100013: The provider does not let the patron change the given credential
      • 100023: Patron ID not found
      • 100101: Patron could not be deleted, because the patron has something unresolved issue with the library (this could be anything from a loan to a fee, and so on ...)
      • 100211: maxNumberOfEmailAddresses exceeded
      • 100215: maxNumberOfPhoneNumbers exceeded
      • 100221: Pickup location cannot contain sections
      • 100411: Updating patron consent failed
      • 100611: Updating patron notification settings failed
      • 101001: Reservation ID not found
      • 101047: Branch ID cannot be used as pick up branch
      • 101053: Section ID cannot be used as pick up branch
      • 102001: Loan ID not found
      • 102301: Loan not renewable, because it is an interlibrary loan
      • 102311: Loan not renewable, because it is reserved
      • 110001: Branch ID not found
      • 200001: Publication ID not found
      • 200077: ui language not supported
      • 200101: missing required query parameter
      • 200103: invalid/unsupported query parameter value
      • 300001: Initialize payment should not be used
      • 300005: Initialize payment should be used
      • 300009: Payment method not supported
      • 300013: Payment method does not support partial payment
      • 300301: Finalized payment can not de changed
      • 300311: FinalizePaymentRequest.fees contains fees with the same ID
      • 310001: Loan history ID not found
      • 310011: Loan history ID already exists
      • 330001: List ID not found
      • 330011: List ID already exists
      • 330101: List item ID not found
      • 330111: List item ID already exists

      One of: 500 · 600 · 10001 · 71001 · 100001 · 100011 · 100013 · 100023 · 100101 · 100211 · 100215 · 100221 · 100411 · 100611 · 101001 · 101047 · 101053 · 102001 · 102301 · 102311 · 110001 · 200001 · 200077 · 200101 · 200103 · 300001 · 300005 · 300009 · 300013 · 300301 · 300311 · 310001 · 310011 · 330001 · 330011 · 330101 · 330111

    • infostringrequired

      Starts with the text matching the error code field (defined above), and a describing text could be added.

401 Bearer token invalid, missing, or expired.

Shared response, defined once for the whole API. See the shared contract on the version page.

No response body.

POST /patron/credential/reset

Request that a reset link is sent to the patron.

Bearer token ResetPatronCredential

Request that the provider sends a link, so the patron can set a credential they no longer know.

The identifier follows patron->login->identifierTypes in the configuration, since this is the recovery path for login.

The credential field says which credential to reset, and must be one of the credentials in patron->credentials->resettable in the configuration. If the field is missing, the provider decides which credential to reset.

The email in the request selects which of the patron's registered addresses to use, and is never a destination in its own right.
The link is only sent if that address is already attached to the identified patron and verified there. An attached but unverified address is treated exactly like no match, since the vendor can write patron email addresses through PATCH /patron/{patronId}/information.

If no link is sent, for any reason including rate limiting, the response is still 202. The endpoint must not reveal whether a patron exists, or which email addresses are attached to one, so neither the response nor the time it takes should differ between a match and no match.

The 400 is only for a malformed request body. In particular the error codes 100023 and 100013 must not be returned.

The link is the provider's, but the token in it must be unguessable, must be single use, and must expire after a short period. The request deliberately carries no URL, so the link cannot be pointed at a host chosen by the caller.

Example request

cURL

curl -X POST "$PLAS_BASE_URL/patron/credential/reset?version=0.6.7" \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -H "Authorization: Bearer $PLAS_TOKEN" \
  -d '{
  "credential": "password",
  "email": "kari.nordmann@example.no",
  "identifier": {
    "type": "local",
    "value": "N00012345"
  }
}'

JavaScript

const response = await fetch(`${process.env.PLAS_BASE_URL}/patron/credential/reset?version=0.6.7`, {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Content-Type": "application/json",
    "Authorization": `Bearer ${process.env.PLAS_TOKEN}`,
  },
  body: JSON.stringify({
    "credential": "password",
    "email": "kari.nordmann@example.no",
    "identifier": {
      "type": "local",
      "value": "N00012345"
    }
  }),
});

Python

import os
import requests

response = requests.post(
    f"{os.environ['PLAS_BASE_URL']}/patron/credential/reset",
    params={
        "version": "0.6.7",
    },
    headers={
        "Accept": "application/json",
        "Content-Type": "application/json",
        "Authorization": f"Bearer {os.environ['PLAS_TOKEN']}",
    },
    json={
        "credential": "password",
        "email": "kari.nordmann@example.no",
        "identifier": {
            "type": "local",
            "value": "N00012345",
        },
    },
)
response.raise_for_status()
The host and token are environment variables: PLAS_BASE_URL the provider’s base URL · PLAS_TOKEN an access token.

Parameters

Shared across operations: version. See the shared contract on the version page.

Request body

application/json · required · ResetPatronCredentialRequestBody
  • credentialstring

    The credential the patron wants reset.

    It must be one of the credentials in patron.credentials.resettable in GET /configuration. If this is missing, the provider decides which credential to reset.

    The patron is not logged in here, so the vendor cannot know which credentials this patron uses. It only knows what GET /configuration says. If the value is not one the provider can reset, nothing is sent, and the response looks the same as when it is.

    One of: password · pin

  • emailstringrequired

    The email address, following RFC 5322, that the reset link should be sent to.

    This selects which of the patron's already registered email addresses to use. The provider must only send the reset link if this email address is already attached to the patron identified by identifier and verified there, and must never send to an address that is not. If it is not attached, or attached but not verified, nothing must be sent, and the response is unchanged.

  • Show 2 fieldsHide 2 fields
    • A type identifier that tells which type of identifier is used.

      This is an open enum, so values other than the known ones are allowed. GET /configuration says which types the provider accepts for each flow, in patron.login.identifierTypes, patron.registration.identifierTypes and patron.deletion.identifierTypes.

      One of: local · email · phone · norway_national_library_card · norway_national_birth_number · denmark_cpr

      Show 2 variantsHide 2 variants

      Variant: PatronIdentifierTypeEnum

      PatronIdentifierTypeEnum

      Variant: PatronIdentifierTypeLiteral

      PatronIdentifierTypeLiteral

    • valuestringrequired

      Identifier value. This information may be sensitive.

Responses

202 The request was accepted. Whether a link is sent is decided after this response, so this is also the response when no link will be sent at all.

No response body.

400 The list of errors. Errors

Shared response, defined once for the whole API. See the shared contract on the version page.

Generated from the schema

Example

{
  "errors": [
    {
      "code": 200103,
      "info": "200103: invalid/unsupported query parameter value"
    }
  ]
}

Schema

Errors

  • errorsarray of Errorrequiredmin items 1

    The first error should always be the most relevant.

    Show 2 fieldsHide 2 fields
    • codeintegerrequired

      A number representing the type of error.

      List of error codes:

      • \<error code\>: \<error description\>
      • 500: System error
      • 600: Unsupported Open Library API version
      • 10001: Endpoint disabled
      • 71001: Consent has not been given for 'loan history'
      • 100001: Wrong patron identifier, password or pin code
      • 100011: New password or pin code rejected, because it does not meet the provider's requirements
      • 100013: The provider does not let the patron change the given credential
      • 100023: Patron ID not found
      • 100101: Patron could not be deleted, because the patron has something unresolved issue with the library (this could be anything from a loan to a fee, and so on ...)
      • 100211: maxNumberOfEmailAddresses exceeded
      • 100215: maxNumberOfPhoneNumbers exceeded
      • 100221: Pickup location cannot contain sections
      • 100411: Updating patron consent failed
      • 100611: Updating patron notification settings failed
      • 101001: Reservation ID not found
      • 101047: Branch ID cannot be used as pick up branch
      • 101053: Section ID cannot be used as pick up branch
      • 102001: Loan ID not found
      • 102301: Loan not renewable, because it is an interlibrary loan
      • 102311: Loan not renewable, because it is reserved
      • 110001: Branch ID not found
      • 200001: Publication ID not found
      • 200077: ui language not supported
      • 200101: missing required query parameter
      • 200103: invalid/unsupported query parameter value
      • 300001: Initialize payment should not be used
      • 300005: Initialize payment should be used
      • 300009: Payment method not supported
      • 300013: Payment method does not support partial payment
      • 300301: Finalized payment can not de changed
      • 300311: FinalizePaymentRequest.fees contains fees with the same ID
      • 310001: Loan history ID not found
      • 310011: Loan history ID already exists
      • 330001: List ID not found
      • 330011: List ID already exists
      • 330101: List item ID not found
      • 330111: List item ID already exists

      One of: 500 · 600 · 10001 · 71001 · 100001 · 100011 · 100013 · 100023 · 100101 · 100211 · 100215 · 100221 · 100411 · 100611 · 101001 · 101047 · 101053 · 102001 · 102301 · 102311 · 110001 · 200001 · 200077 · 200101 · 200103 · 300001 · 300005 · 300009 · 300013 · 300301 · 300311 · 310001 · 310011 · 330001 · 330011 · 330101 · 330111

    • infostringrequired

      Starts with the text matching the error code field (defined above), and a describing text could be added.

401 Bearer token invalid, missing, or expired.

Shared response, defined once for the whole API. See the shared contract on the version page.

No response body.