Evergreen ILS and its OpenSRF API
January 20, 2026 at 7:40 AM • 12 min read • 2349 wordsI am not a C person by any means nor whatever but I was genuinely curious to see how Evergreen works. I am, as stated prior, a dumb dog with a laptop but I am proud to share my findings.
Fun fact: Evergreen ILS is open source. Isn't that neat?
My general understanding of OpenSRF
OpenSRF's API architecture seems to be broken down a service and a method. For example, the open-ils.auth service exposes methods like open-ils.auth.authenticate.complete and open-ils.auth.session.retrieve
OpenSRF is a message routing network that offers scalability and failover support for individual services and entire servers with minimal development and deployment overhead. You can use OpenSRF to build loosely-coupled applications that can be deployed on a single server or on clusters of geographically distributed servers using the same code and minimal configuration changes.
— Easing gently into OpenSRF
Login
Evergreen seems to be session-oriented, meaning you create a session and you use that session token to authenticate everywhere else. You need to start off the authentication process by using the open-ils.auth.authenticate.init method. I believe this a challenge-response system.
curl -X \ POST 'https://gapines.org/osrf-gateway-v1' \ -H 'Connection: Keep-Alive' \ -H 'Accept-Encoding: gzip' \ -H 'Content-Type: application/x-www-form-urlencoded' \ -H 'Accept-Charset: UTF-8' \ --data \ -urlencode 'service=open-ils.auth' --data \ -urlencode 'method=open-ils.auth.authenticate.init' --data \ -urlencode 'param="[library card number]"'
It will return a Bcrypt hash of something with 10 rounds (the seed)
$2a$10$....
To which your client uses will generate a response using:
md5(seedValue + md5(password))
To which you send back using (as the password value)
curl -X \ POST 'https://gapines.org/osrf-gateway-v1' \ -H 'Connection: Keep-Alive' \ -H 'Accept-Encoding: gzip' \ -H 'Content-Type: application/x-www-form-urlencoded' \ -H 'Accept-Charset: UTF-8' \ --data \ -urlencode 'service=open-ils.auth' --data \ -urlencode 'method=open-ils.auth.authenticate.complete' --data \ -urlencode 'param={"type":"persist","username":"[number]","password":"[redacted]"}'
To which it will tell you if it succeed:
{ "payload": [ { "ilsevent": 0, "textcode": "SUCCESS", "desc": "Success", "pid": 1077960, "stacktrace": "oils_auth.c:702", "payload": { "authtoken": "[redacted]", "authtime": 1209600, "provisional": 0 } } ], "status": 200 }
Or fail:
{ "payload": [ { "ilsevent": 1000, "textcode": "LOGIN_FAILED", "desc": "User login failed", "pid": 2611946, "stacktrace": "oils_auth.c:794" } ], "status": 200 }
Logout
When you're done messing around, you should destroy your session. Unless I understood something wrong, "1209600" is just one fortnight (2 weeks). That's a long session with a token that has wide access to your account.
curl -X \ POST 'https://gapines.org/osrf-gateway-v1' -H 'Connection: Keep-Alive' \ -H 'Accept-Encoding: gzip' \ -H 'Content-Type: application/x-www-form-urlencoded' \ -H 'Accept-Charset: UTF-8' \ --data \ -urlencode 'service=open-ils.auth' --data \ -urlencode 'method=open-ils.auth.session.delete' --data \ -urlencode 'param="[auth token]"'
Version
You can also check the version of it
curl -X \ POST 'https://gapines.org/osrf-gateway-v1' -H 'Connection: Keep-Alive' \ -H 'Accept-Encoding: gzip' \ -H 'Content-Type: application/x-www-form-urlencoded' \ -H 'Accept-Charset: UTF-8' \ --data \ -urlencode 'service=open-ils.actor' --data \ -urlencode 'method=opensrf.open-ils.system.ils_version'
At the time of writing, it returns:
{ "payload": ["3-14-3"], "status": 200 }
I'm unsure which version this specifies but I'm going to guess its the current version of Evergreen currently running and that its running 3.14.3
Library Branches
You can get a list of every library branch
curl -X \ GET 'https://gapines.org/osrf-gateway-v1?service=open-ils.actor&method=open-ils.actor.org_tree.retrieve&_ck=160&_sk=3-14-3' -H 'Connection: Keep-Alive' \ -H 'Accept-Encoding: gzip' \ -H 'Accept-Charset: UTF-8' \
_sk derives from version in "version"
_ck comes from... I don't know?
and it will give this list including the library name, library code, phone number, etc.
{ "payload": [ { "__c": "aou", "__p": [ [ { "__c": "aou", "__p": [ [ { "__c": "aou", "__p": [ [], 16, 16, 18, 16, 16, "Aaron Heard Resource Center", 3, 6, "ARL-ARON", "aaronlibrary@athenslibrary.org", "706-549-7780", "t", 1, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, "GA0011", "022", null, null, "GRA" ] } ] ] } ] ] } ], "status": 200 }
Session details
You can also get details about the session
curl -X \ POST 'https://gapines.org/osrf-gateway-v1' -H 'Connection: Keep-Alive' \ -H 'Accept-Encoding: gzip' \ -H 'Content-Type: application/x-www-form-urlencoded' \ -H 'Accept-Charset: UTF-8' \ --data \ -urlencode 'service=open-ils.auth' --data \ -urlencode 'method=open-ils.auth.session.retrieve' --data \ -urlencode 'param="[token from login]"'
Which will give you every detail you could ever ask for:
{ "payload": [ { "__c": "au", "__p": [ null, null, null, null, null, null, null, null, null, null, "[Library Id?]", null, "t", "f", "[redacted]", "[redacted]", 0, 0, "[Account Creation Date in ISO]", "0.00 [I think this is fines paid?]", "[PHONE NUMBER]", "[DATE OF BIRTH]", "[EMAIL]", null, "[Account Expires Date in ISO]", "[FAMILY NAME]", "[FIRST NAME]", "[library id but it's an integer]", "[PATRON ID. Note this is an integer and not a string.]", 1, null, "GA-[Something?]", null, "XXXXXXXXXX.XXXXXXXXXXX.XXXXXXXXX [No clue what this is]", "[no clue what this is]", "f", 1, "[what is described as 'Other Phone']", "", null, null, 2, "", 1, null, "f", "[no clue what this is]", "[Barcode number]", null, "t", "[Last Login Date? I don't know]", null, "", "", "", null, "[Guardian Name]", null, "'[first name]':1,2 '[part of my last name]':3,4", null, "f", null, null, null, null, null, null, null, null, null, null, null, null ] } ], "status": 200 }
I redacted some numbers in case it could be connected back to my account. Sorry about that.
Account messages
I was able to see all of my account messages as well:
curl -X \ POST 'https://gapines.org/osrf-gateway-v1' -H 'Connection: Keep-Alive' \ -H 'Accept-Encoding: gzip' \ -H 'Content-Type: application/x-www-form-urlencoded' \ -H 'Accept-Charset: UTF-8' \ --data \ -urlencode 'service=open-ils.actor' --data \ -urlencode 'method=open-ils.actor.message.retrieve' --data \ -urlencode 'param="[auth token]"' --data \ -urlencode 'param=[PATRON_ID]' --data \ -urlencode 'param=null'
And it showed me messages back from 2021 which weren't even in my account's dashboard


Here's the raw format though
{ "payload": [ [ { "__c": "aum", "__p": [ "[Creation Date?]", null, "[library id but it's an integer]", "[Message ID?]", "f", "Subject Text, i.e. Overdue Library Materials", "[PATRON_ID]", "\nOur records indicate the following items are 10 days or more overdue....[redacted]", "t", null, null, null ] }, { "__c": "aum", "__p": [ "[Creation Date?]", "[Another random Date?]", "[library id but it's an integer]", "[Message ID?]", "t", "Subject Text, i.e. Hold Available for Pickup", "[PATRON_ID]", "\nThe items you requested are available for pickup at:...[redacted]", "t", null, null, null ] } ] ], "status": 200 }
Search Details
You can search without being logged in and it supports some amount of structured querying. Like, Heartstoppers site(PINES). When fetching more details per book, it'll give you MARCXML.
I still have yet to understand it
Email to SMS gateways
Evergreen has a database of carrier E-mail to SMS gateways since they send E-mails to SMS from pines-notices@georgialibraries.org
curl -X \ GET 'https://gapines.org/osrf-gateway-v1?service=open-ils.pcrud&method=open-ils.pcrud.search.csc.atomic¶m=%22ANONYMOUS%22¶m=%7B%22active%22%3A1%7D&_ck=160&_sk=3-14-3' -H 'Connection: Keep-Alive' \ -H 'Accept-Encoding: gzip' \ -H 'Accept-Charset: UTF-8' \
It's big, so I didn't format it.
{"payload":[[{"__c":"csc","__p":[2,"Canada & USA","Rogers Wireless","t","$number@pcs.rogers.com"]},{"__c":"csc","__p":[3,"Canada & USA","Rogers Wireless (Alternate)","t","1$number@mms.rogers.com"]},{"__c":"csc","__p":[4,"Canada & USA","Telus Mobility","t","$number@msg.telus.com"]},{"__c":"csc","__p":[14,"International","Iridium","t","$number@msg.iridium.com"]},{"__c":"csc","__p":[15,"International","Globalstar","t","$number@msg.globalstarusa.com"]},{"__c":"csc","__p":[16,"International","Bulletin.net","t","$number@bulletinmessenger.net"]},{"__c":"csc","__p":[17,"International","Panacea Mobile","t","$number@api.panaceamobile.com"]},{"__c":"csc","__p":[18,"USA","C Beyond","t","$number@cbeyond.sprintpcs.com"]},{"__c":"csc","__p":[19,"Alaska, USA","General Communications, Inc.","t","$number@mobile.gci.net"]},{"__c":"csc","__p":[20,"California, USA","Golden State Cellular","t","$number@gscsms.com"]},{"__c":"csc","__p":[21,"Cincinnati, Ohio, USA","Cincinnati Bell","t","$number@gocbw.com"]},{"__c":"csc","__p":[22,"Hawaii, USA","Hawaiian Telcom Wireless","t","$number@hawaii.sprintpcs.com"]},{"__c":"csc","__p":[23,"Midwest, USA","i wireless (T-Mobile)","t","$number.iws@iwspcs.net"]},{"__c":"csc","__p":[24,"USA","i-wireless (Sprint PCS)","t","$number@iwirelesshometext.com"]},{"__c":"csc","__p":[25,"USA","MetroPCS","t","$number@mymetropcs.com"]},{"__c":"csc","__p":[26,"USA","Kajeet","t","$number@mobile.kajeet.net"]},{"__c":"csc","__p":[27,"USA","Element Mobile","t","$number@SMS.elementmobile.net"]},{"__c":"csc","__p":[28,"USA","Esendex","t","$number@echoemail.net"]},{"__c":"csc","__p":[29,"USA","Boost Mobile","t","$number@myboostmobile.com"]},{"__c":"csc","__p":[31,"USA","Bluegrass Cellular","t","$number@sms.bluecell.com"]},{"__c":"csc","__p":[35,"USA","Alltel (Allied Wireless)","t","$number@sms.alltelwireless.com"]},{"__c":"csc","__p":[36,"USA","Alaska Communications","t","$number@msg.acsalaska.com"]},{"__c":"csc","__p":[37,"USA","Ameritech","t","$number@paging.acswireless.com"]},{"__c":"csc","__p":[40,"USA","Cellular One (Dobson) / O2 / Orange","t","$number@mobile.celloneusa.com"]},{"__c":"csc","__p":[41,"USA","Cellular South","t","$number@csouth1.com"]},{"__c":"csc","__p":[42,"USA","Cellcom","t","$number@cellcom.quiktxt.com"]},{"__c":"csc","__p":[43,"USA","Chariton Valley Wireless","t","$number@sms.cvalley.net"]},{"__c":"csc","__p":[45,"USA","Cleartalk Wireless","t","$number@sms.cleartalk.us"]},{"__c":"csc","__p":[46,"USA","Edge Wireless","t","$number@sms.edgewireless.com"]},{"__c":"csc","__p":[47,"USA","Syringa Wireless","t","$number@rinasms.com"]},{"__c":"csc","__p":[48,"USA","T-Mobile","t","$number@tmomail.net"]},{"__c":"csc","__p":[50,"USA","South Central Communications","t","$number@rinasms.com"]},{"__c":"csc","__p":[51,"USA","Simple Mobile","t","$number@smtext.com"]},{"__c":"csc","__p":[52,"USA","Sprint (PCS)","t","$number@messaging.sprintpcs.com"]},{"__c":"csc","__p":[53,"USA","Nextel","t","$number@messaging.nextel.com"]},{"__c":"csc","__p":[54,"USA","Pioneer Cellular","t","$number@zsend.com"]},{"__c":"csc","__p":[55,"USA","Qwest Wireless","t","$number@qwestmp.com"]},{"__c":"csc","__p":[56,"USA","US Cellular","t","$number@email.uscc.net"]},{"__c":"csc","__p":[57,"USA","Unicel","t","$number@utext.com"]},{"__c":"csc","__p":[58,"USA","Teleflip","t","$number@teleflip.com"]},{"__c":"csc","__p":[61,"USA","USA Mobility","t","$number@usamobility.net"]},{"__c":"csc","__p":[62,"USA","Viaero","t","$number@viaerosms.com"]},{"__c":"csc","__p":[63,"USA","TracFone","t","$number@mmst5.tracfone.com"]},{"__c":"csc","__p":[64,"USA","Centennial Wireless","t","$number@cwemail.com"]},{"__c":"csc","__p":[65,"South Korea and USA","Helio","t","$number@myhelio.com"]},{"__c":"csc","__p":[66,"USA","Republic Wireless (must enable on device)","t","$number@text.republicwireless.com"]},{"__c":"csc","__p":[67,"USA","Google Fi","t","$number@msg.fi.google.com"]},{"__c":"csc","__p":[1002,"USA","Verizon Wireless (MMS)","t","$number@vzwpix.com"]},{"__c":"csc","__p":[60,"USA","Verizon Wireless (SMS)","t","$number@vtext.com"]},{"__c":"csc","__p":[1003,"USA","Consumer Cellular","t","$number@mailmymobile.net"]},{"__c":"csc","__p":[1037,"USA","Xfinity - SMS","t","$number@vtext.com"]},{"__c":"csc","__p":[1038,"USA","Xfinity - MMS","t","$number@mypixmessages.com"]},{"__c":"csc","__p":[59,"USA","Virgin Mobile (US)","t","$number@vmobl.com"]},{"__c":"csc","__p":[1039,"USA","Consumer Cellular (AT&T SIM)","t","$number@txt.att.net"]},{"__c":"csc","__p":[1040,"USA","Page Plus (Verizon reseller)","t","$number@vtext.com"]},{"__c":"csc","__p":[49,"USA","Straight Talk (Verizon reseller)","t","$number@vtext.com"]},{"__c":"csc","__p":[1041,"USA","Mint Mobile","t","$number@tmomail.net"]},{"__c":"csc","__p":[1042,"USA","PureTalk","t","$number@txt.att.net"]},{"__c":"csc","__p":[1043,"USA","Consumer Cellular (MMS)","t","$number@mms.att.net"]},{"__c":"csc","__p":[1044,"USA","US Mobile (T-Mobile)","t","$number@tmomail.net"]},{"__c":"csc","__p":[1045,"USA","US Mobile (Verizon)","t","$number@vtext.com"]},{"__c":"csc","__p":[1047,"USA","Spectrum Mobile (MMS)","t","$number@mypixmessages.com"]},{"__c":"csc","__p":[1046,"USA","Spectrum Mobile (SMS)","t","$number@vtext.com"]},{"__c":"csc","__p":[1048,"USA","Cox Mobile (SMS)","t","$number@vtext.com"]},{"__c":"csc","__p":[1049,"USA","Cox Mobile (MMS)","t","$number@vzwpix.com"]},{"__c":"csc","__p":[7,"Canada","Bell Mobility & Solo Mobile","t","$number@txt.bell.ca"]},{"__c":"csc","__p":[12,"Canada","MTS Mobility","t","$number@text.mtsmobility.com"]}]],"status":200}
Hold Management
You can create holds:
curl -X \ POST 'https://gapines.org/osrf-gateway-v1' -H 'Connection: Keep-Alive' \ -H 'Accept-Encoding: gzip' \ -H 'Content-Type: application/x-www-form-urlencoded' \ -H 'Accept-Charset: UTF-8' \ --data \ -urlencode 'service=open-ils.circ' --data \ -urlencode 'method=open-ils.circ.holds.test_and_create.batch' --data \ -urlencode 'param="[auth token]"' --data \ -urlencode 'param={"patronid":[patron id],"pickup_lib":"[library id but it's an integer]","hold_type":"P","email_notify":true,"expire_time":null,"frozen":false,"thaw_date":null,"phone_notify":"[phone number]","sms_carrier":48,"sms_notify":"[phone number]"}' --data \ -urlencode 'param=[TARGET_ID]'
{ "payload": [ { "result": "HOLD ID BUT IT IS AN INTEGER", "target": "TARGET_ID:int" } ], "status": 200 }
Modify holds:
curl -X \ POST 'https://gapines.org/osrf-gateway-v1' \ -H 'Connection: Keep-Alive' \ -H 'Accept-Encoding: gzip' \ -H 'Content-Type: application/x-www-form-urlencoded' \ -H 'Accept-Charset: UTF-8' \ --data \ -urlencode 'service=open-ils.circ' --data \ -urlencode 'method=open-ils.circ.hold.update' --data \ -urlencode 'param="[auth token]"' --data \ -urlencode 'param=null' --data \ -urlencode 'param={"id":"HOLD_ID","pickup_lib":"LIBRARY_ID","frozen":true,"expire_time":"2026-07-19T00:00:00-0400","thaw_date":null}'
{ "payload": ["1"], "status": 200 }
Cancel holds
curl -X \ POST 'https://gapines.org/osrf-gateway-v1' \ -H 'Connection: Keep-Alive' \ -H 'Accept-Encoding: gzip' \ -H 'Content-Type: application/x-www-form-urlencoded' \ -H 'Accept-Charset: UTF-8' \ --data \ -urlencode 'service=open-ils.circ' --data \ -urlencode 'method=open-ils.circ.hold.cancel' --data \ -urlencode 'param="[auth token]"' --data \ -urlencode 'param=[hold id]' --data \ -urlencode 'param=null' --data \ -urlencode 'param="Give some reason here"'
{ "payload": ["1"], "status": 200 }
View holds:
curl -X \ POST 'https://gapines.org/osrf-gateway-v1' \ -H 'Connection: Keep-Alive' \ -H 'Accept-Encoding: gzip' \ -H 'Content-Type: application/x-www-form-urlencoded' \ -H 'Accept-Charset: UTF-8' \ --data \ -urlencode 'service=open-ils.circ' --data \ -urlencode 'method=open-ils.circ.holds.retrieve' --data \ -urlencode 'param="[auth token]"' --data \ -urlencode 'param=[patron id]'
{ "payload": [ [ { "__c": "ahr", "__p": [ null, null, null, "???", "t", "[hold expires date but]", null, null, null, "P", null, "hold id but int", "[Phone number for calling]", "[phone number for sms]", "??", "LIBRARY_ID", "[placed date but iso]", "LIBRARY_ID", "[placed date but iso]", "[Patron ID but int]", null, 0, "LIBRARY_ID", "??", "[Patron ID but int]", null, null, null, null, null, null, null, null, "f", null, null, null, null, null, "t", null, [], null, "f", null, null ] } ] ], "status": 200 }
And then view stats for a specific hold
curl -X \ POST 'https://gapines.org/osrf-gateway-v1' \ -H 'Connection: Keep-Alive' \ -H 'Accept-Encoding: gzip' \ -H 'Content-Type: application/x-www-form-urlencoded' \ -H 'Accept-Charset: UTF-8' \ --data \ -urlencode 'service=open-ils.circ' --data \ -urlencode 'method=open-ils.circ.hold.queue_stats.retrieve' --data \ -urlencode 'param="[auth token]"' --data \ -urlencode 'param=[HOLD ID]'
{ "payload": [ { "total_holds": 1, "status": 2, "estimated_wait": 0, "queue_position": 1, "potential_copies": 64 } ], "status": 200 }
Fines
You can also view fines you have (which are a barrier to reading)
curl -X \ POST 'https://gapines.org/osrf-gateway-v1' -H 'Connection: Keep-Alive' \ -H 'Accept-Encoding: gzip' \ -H 'Content-Type: application/x-www-form-urlencoded' \ -H 'Accept-Charset: UTF-8' \ --data \ -urlencode 'service=open-ils.actor' --data \ -urlencode 'method=open-ils.actor.user.fines.summary' --data \ -urlencode 'param="[auth token]"' --data \ -urlencode 'param=[patron id]'
{ "payload": [ { "__c": "mous", "__p": [ "9.80", "9.80", "0.0", "[patron id but integer]" ] } ], "status": 200 }
Where 9.80 is the total that one owes and 0.00 is the amount paid.
And you can even view more details about the fines owed
curl -X \ POST 'https://gapines.org/osrf-gateway-v1' -H 'Connection: Keep-Alive' \ -H 'Accept-Encoding: gzip' \ -H 'Content-Type: application/x-www-form-urlencoded' \ -H 'Accept-Charset: UTF-8' \ --data \ -urlencode 'service=open-ils.actor' --data \ -urlencode 'method=open-ils.actor.user.transactions.have_charge.fleshed' --data \ -urlencode 'param="[auth token]"' --data \ -urlencode 'param=[patron id]'
{ "payload": [ [ { "record": { "__c": "mvr", "__p": [ "Project Nought", "Furedi, Chelsey", "???", null, "2023", "9780358381693", null, "on1369930447", { "LGBTQ+ people": 1, "Corporations": 1, "Graphic novels": 1, "Étudiants": 1, "Graphic novels (fiction only) (New Zealand)": 1, "Enlèvement (Droit pénal)": 1, "Interpersonal relations": 1, "Voyages dans le temps": 1, "YOUNG ADULT FICTION / Comics & Graphic Novels / Science Fiction": 1, "YOUNG ADULT FICTION / Comics & Graphic Novels / LGBTQ+": 1, "Gay youth": 1, "Sociétés": 1, "College students": 1, "LGBTQ+ youth": 1, "Minorités sexuelles": 1, "Time travel": 1, "Romans graphiques": 1, "YOUNG ADULT FICTION / Comics & Graphic Novels / Action & Adventure": 1, "New Zealand": 1, "YOUNG ADULT FICTION / Comics & Graphic Novels / Mystery & Detective": 1, "Sexual minorities": 1, "Jeunes homosexuels": 1 }, [ "text" ], [], "First edition.", [], "\"Ren Mittal's last memory in the year 1996 is getting on a bus to visit his mystery pen pal Georgia. When he wakes up in 2122, he thinks he might be hallucinating...he's not! Tech conglomerate Chronotech sponsors a time-travel program to help students in 2122 learn what history was really like...from real-life subjects who've been transported into the future...and Ren is one of them. In 2122, Ren's life in the 1990s is practically ancient history--and Ren's not sure how to feel about that. On top of it all, he learns that his memory will be wiped of all things 2122 before he's sent back to the '90s. Adding to Ren's complicated feels, he's forming a crush on his student guide, Mars. And when he crosses paths with the absolute last person he expected to see in the future, he has a bigger problem on his hands: What if Chronotech isn't the benevolent organisation they claim to be, and he and his fellow subjects are in great danger?\" -- Back cover.", "print 329 pages : chiefly color illustrations ; 22 cm", null, null, [] ] }, "copy": null, "transaction": { "__c": "mbts", "__p": [ "6.40", "???", "System Generated Overdue Fine", "2025-12-23T23:59:59-0500", "Overdue materials", null, null, null, "6.40", "0.0", "patron id but integer", null, "2025-10-22T11:08:14-0400", "circulation" ] }, "circ": { "__c": "circ", "__p": [ "LIBRARY_ID", "???", "2025-12-23T23:59:00-0500", "LIBRARY_ID", "patron id but integer", "f", "2025-11-10T23:59:59-0500", "14 days", "14_days_2_renew", "1 day", "???", "10.00", "overdue_mid", "t", "f", "0.20", "20_cent_per_day", 0, "1 day", "CHECKIN", "2025-12-23T23:59:00-0500", "???", "patron id but integer", null, "2025-10-22T11:08:14-0400", null, null, "???", "2025-12-29T11:56:14-0500", "???", null, null, null, null, null, null, null, "???", null, null, "f", null ] } }, { "record": { "__c": "mvr", "__p": [ "ILL Item: Together in a broken world", "ILL Item: Paul Michael Winters", -1 ] }, "transaction": { "__c": "mbts", "__p": [ "3.40", "???", "System Generated Overdue Fine", "2025-11-17T23:59:59-0500", "Overdue materials", null, null, null, "3.40", "0.0", "patron id but integer", null, "[check out date but iso?]", "circulation" ] }, "copy": null, "circ": { "__c": "circ", "__p": [ "LIBRARY_ID", "???", "[return date but iso?]", "LIBRARY_ID", "???", "f", "2025-10-27T23:59:59-0400", "14 days", "14_days_0_renew", "1 day", "???", "10.00", "overdue_mid", "f", "f", "0.20", "20_cent_per_day", 0, "1 day", "CHECKIN", "[return date but iso?]", "???", "patron id but integer", null, "[check out date but iso?]", null, "???", "???", "[return date but iso?]", null, null, null, null, null, null, null, null, 1, null, null, "f", null ] } } ] ], "status": 200 }