Share your loan data with the network

Libraries using Lend Engine automatically share anonymous data with BorrowMore, unless opted out. If your library doesn't use Lend Engine, you can still contribute borrowing activity to our network report by exposing a simple JSON endpoint. Once set up, contact us and we'll add your library to the feed.

Overview

Your server needs to provide a single GET endpoint that returns a paginated list of completed loan rows — items that have been borrowed and returned. We poll this endpoint periodically to pull in new records.

No authentication is required — the endpoint can be public and read-only.

Endpoint

GET https://yourlibrary.example.com/api/loan-rows/

The exact path is up to you — just let us know what it is.

Query parameters

ParameterTypeDescription
checkedInFrom YYYY-MM-DD required Return rows where the item was checked in on or after this date.
checkedInTo YYYY-MM-DD optional Return rows where the item was checked in on or before this date.
page integer optional Page number, 1-indexed. Defaults to 1.
length integer optional Records per page. Defaults to 50, max 100.

Response format

Return application/json with the following structure:

{
  "totalResults": 312,
  "page": 1,
  "totalPages": 4,
  "itemsPerPage": 100,
  "hasNextPage": true,
  "hasPreviousPage": false,
  "loanRows": [
    {
      "id": 1042,
      "loanId": 501,
      "contactId": 88,
      "itemId": "item-abc-123",
      "itemName": "Power Drill",
      "itemSku": "DRILL-001",
      "itemType": "loan",
      "itemQuantity": 1,
      "fee": "2.50",
      "dueOutAt": "2026-01-15 09:00:00",
      "dueInAt": "2026-01-29 09:00:00",
      "checkedOutAt": "2026-01-15 10:30:00",
      "checkedInAt": "2026-01-28 14:15:00"
    }
  ]
}

Top-level fields

FieldTypeDescription
totalResultsintegerTotal matching records across all pages.
pageintegerCurrent page number.
totalPagesintegerTotal number of pages.
itemsPerPageintegerRecords returned on this page.
hasNextPagebooleanWhether a further page exists. Used to drive pagination.
hasPreviousPagebooleanWhether a previous page exists.
loanRowsarrayThe loan row records for this page.

Loan row fields

FieldTypeDescription
idintegerrequiredUnique ID for this loan row in your system. Used to deduplicate imports.
itemIdstringrequiredYour internal ID for the item. Used to group borrows per item.
itemNamestringrequiredDisplay name of the item. May be a JSON object keyed by locale, e.g. {"en": "Drill"}.
checkedOutAtdatetimerequiredWhen the borrower collected the item. Format: YYYY-MM-DD HH:MM:SS.
checkedInAtdatetimerequiredWhen the item was returned. Format: YYYY-MM-DD HH:MM:SS.
dueOutAtdatetimerequiredScheduled loan start date.
dueInAtdatetimerequiredScheduled return date.
loanIdintegeroptionalID of the parent loan (if your system groups multiple items per loan).
contactIdintegeroptionalAn opaque ID for the borrower. Never shown publicly — used only to count unique borrowers.
itemSkustringoptionalItem SKU or barcode.
itemTypestringoptionalType of loan, e.g. loan or reservation. Defaults to loan.
itemQuantityintegeroptionalQuantity lent. Defaults to 1.
feestringoptionalFee charged for this loan, as a decimal string e.g. "2.50". Defaults to "0.00".

Privacy

We only store the fields listed above. contactId is never displayed publicly — it is used solely to count the number of unique borrowers across the network. No names, emails, or personal details should be included in the response.

Get listed

Once your endpoint is live, get in touch with the URL and your library's slug on this platform. We'll verify the feed and add it to the daily import.