Bug 30588: Add the option to require 2FA setup on first staff login
[koha.git] / api / v1 / swagger / swagger.yaml
1 ---
2 swagger: "2.0"
3 basePath: /api/v1
4 definitions:
5   account_line:
6     $ref: ./definitions/account_line.yaml
7   advancededitormacro:
8     $ref: ./definitions/advancededitormacro.yaml
9   allows_renewal:
10     $ref: ./definitions/allows_renewal.yaml
11   basket:
12     $ref: ./definitions/basket.yaml
13   bundle_link:
14     $ref: ./definitions/bundle_link.yaml
15   cashup:
16     $ref: ./definitions/cashup.yaml
17   checkout:
18     $ref: ./definitions/checkout.yaml
19   checkouts:
20     $ref: ./definitions/checkouts.yaml
21   circ-rule-kind:
22     $ref: ./definitions/circ-rule-kind.yaml
23   city:
24     $ref: ./definitions/city.yaml
25   error:
26     $ref: ./definitions/error.yaml
27   fund:
28     $ref: ./definitions/fund.yaml
29   hold:
30     $ref: ./definitions/hold.yaml
31   holds:
32     $ref: ./definitions/holds.yaml
33   ill_backend:
34     $ref: ./definitions/ill_backend.yaml
35   ill_backends:
36     $ref: ./definitions/ill_backends.yaml
37   import_batch_profile:
38     $ref: ./definitions/import_batch_profile.yaml
39   import_batch_profiles:
40     $ref: ./definitions/import_batch_profiles.yaml
41   import_record_match:
42     $ref: ./definitions/import_record_match.yaml
43   invoice:
44     $ref: ./definitions/invoice.yaml
45   item:
46     $ref: ./definitions/item.yaml
47   item_group:
48     $ref: ./definitions/item_group.yaml
49   job:
50     $ref: ./definitions/job.yaml
51   library:
52     $ref: ./definitions/library.yaml
53   order:
54     $ref: ./definitions/order.yaml
55   patron:
56     $ref: ./definitions/patron.yaml
57   patron_account_credit:
58     $ref: ./definitions/patron_account_credit.yaml
59   patron_balance:
60     $ref: ./definitions/patron_balance.yaml
61   patron_extended_attribute:
62     $ref: ./definitions/patron_extended_attribute.yaml
63   quote:
64     $ref: ./definitions/quote.yaml
65   renewal:
66     $ref: ./definitions/renewal.yaml
67   renewals:
68     $ref: ./definitions/renewals.yaml
69   return_claim:
70     $ref: ./definitions/return_claim.yaml
71   search_filter:
72     $ref: ./definitions/search_filter.yaml
73   smtp_server:
74     $ref: ./definitions/smtp_server.yaml
75   suggestion:
76     $ref: ./definitions/suggestion.yaml
77   transfer_limit:
78     $ref: ./definitions/transfer_limit.yaml
79   vendor:
80     $ref: ./definitions/vendor.yaml
81 paths:
82   /acquisitions/baskets/managers:
83     $ref: paths/acquisitions_baskets.yaml#/~1acquisitions~1baskets~1managers
84   /acquisitions/funds:
85     $ref: ./paths/acquisitions_funds.yaml#/~1acquisitions~1funds
86   /acquisitions/funds/owners:
87     $ref: paths/acquisitions_funds.yaml#/~1acquisitions~1funds~1owners
88   /acquisitions/funds/users:
89     $ref: paths/acquisitions_funds.yaml#/~1acquisitions~1funds~1users
90   /acquisitions/orders:
91     $ref: ./paths/acquisitions_orders.yaml#/~1acquisitions~1orders
92   "/acquisitions/orders/{order_id}":
93     $ref: "./paths/acquisitions_orders.yaml#/~1acquisitions~1orders~1{order_id}"
94   /acquisitions/vendors:
95     $ref: ./paths/acquisitions_vendors.yaml#/~1acquisitions~1vendors
96   "/acquisitions/vendors/{vendor_id}":
97     $ref: "./paths/acquisitions_vendors.yaml#/~1acquisitions~1vendors~1{vendor_id}"
98   /advanced_editor/macros:
99     $ref: ./paths/advancededitormacros.yaml#/~1advanced_editor~1macros
100   /advanced_editor/macros/shared:
101     $ref: ./paths/advancededitormacros.yaml#/~1advanced_editor~1macros~1shared
102   /search_filters:
103     $ref: ./paths/search_filters.yaml#/~1search_filters
104   "/search_filters/{search_filter_id}":
105     $ref: "./paths/search_filters.yaml#/~1search_filters~1{search_filter_id}"
106   "/advanced_editor/macros/shared/{advancededitormacro_id}":
107     $ref: "./paths/advancededitormacros.yaml#/~1advanced_editor~1macros~1shared~1{advancededitormacro_id}"
108   "/advanced_editor/macros/{advancededitormacro_id}":
109     $ref: "./paths/advancededitormacros.yaml#/~1advanced_editor~1macros~1{advancededitormacro_id}"
110   "/article_requests/{article_request_id}":
111     $ref: "./paths/article_requests.yaml#/~1article_requests~1{article_request_id}"
112   /auth/otp/token_delivery:
113     $ref: paths/auth.yaml#/~1auth~1otp~1token_delivery
114   /auth/two-factor/registration:
115     $ref: paths/auth.yaml#/~1auth~1two-factor~1registration
116   /auth/two-factor/registration/verification:
117     $ref: paths/auth.yaml#/~1auth~1two-factor~1registration~1verification
118   "/biblios/{biblio_id}":
119     $ref: "./paths/biblios.yaml#/~1biblios~1{biblio_id}"
120   "/biblios/{biblio_id}/checkouts":
121     $ref: "./paths/biblios.yaml#/~1biblios~1{biblio_id}~1checkouts"
122   "/biblios/{biblio_id}/items":
123     $ref: "./paths/biblios.yaml#/~1biblios~1{biblio_id}~1items"
124   "/biblios/{biblio_id}/pickup_locations":
125     $ref: "./paths/biblios.yaml#/~1biblios~1{biblio_id}~1pickup_locations"
126   "/biblios/{biblio_id}/item_groups":
127     $ref: "./paths/biblios_item_groups.yaml#/~1biblios~1{biblio_id}~1item_groups"
128   "/biblios/{biblio_id}/item_groups/{item_group_id}":
129     $ref: "./paths/biblios_item_groups.yaml#/~1biblios~1{biblio_id}~1item_groups~1{item_group_id}"
130   "/biblios/{biblio_id}/item_groups/{item_group_id}/items":
131     $ref: "./paths/biblios_item_groups.yaml#/~1biblios~1{biblio_id}~1item_groups~1{item_group_id}~1items"
132   "/biblios/{biblio_id}/item_groups/{item_group_id}/items/{item_id}":
133     $ref: "./paths/biblios_item_groups.yaml#/~1biblios~1{biblio_id}~1item_groups~1{item_group_id}~1items~1{item_id}"
134   "/cash_registers/{cash_register_id}/cashups":
135     $ref: "./paths/cash_registers.yaml#/~1cash_registers~1{cash_register_id}~1cashups"
136   "/cashups/{cashup_id}":
137     $ref: "./paths/cash_registers.yaml#/~1cashups~1{cashup_id}"
138   /checkouts:
139     $ref: ./paths/checkouts.yaml#/~1checkouts
140   "/checkouts/{checkout_id}":
141     $ref: "./paths/checkouts.yaml#/~1checkouts~1{checkout_id}"
142   "/checkouts/{checkout_id}/allows_renewal":
143     $ref: "./paths/checkouts.yaml#/~1checkouts~1{checkout_id}~1allows_renewal"
144   "/checkouts/{checkout_id}/renewals":
145     $ref: "./paths/checkouts.yaml#/~1checkouts~1{checkout_id}~1renewals"
146   "/checkouts/{checkout_id}/renewal":
147     $ref: "./paths/checkouts.yaml#/~1checkouts~1{checkout_id}~1renewal"
148   /circulation-rules/kinds:
149     $ref: ./paths/circulation-rules.yaml#/~1circulation-rules~1kinds
150   /cities:
151     $ref: ./paths/cities.yaml#/~1cities
152   "/cities/{city_id}":
153     $ref: "./paths/cities.yaml#/~1cities~1{city_id}"
154   "/clubs/{club_id}/holds":
155     $ref: "./paths/clubs.yaml#/~1clubs~1{club_id}~1holds"
156   /config/smtp_servers:
157     $ref: ./paths/config_smtp_servers.yaml#/~1config~1smtp_servers
158   "/config/smtp_servers/{smtp_server_id}":
159     $ref: "./paths/config_smtp_servers.yaml#/~1config~1smtp_servers~1{smtp_server_id}"
160   /holds:
161     $ref: ./paths/holds.yaml#/~1holds
162   "/holds/{hold_id}":
163     $ref: "./paths/holds.yaml#/~1holds~1{hold_id}"
164   "/holds/{hold_id}/pickup_location":
165     $ref: "./paths/holds.yaml#/~1holds~1{hold_id}~1pickup_location"
166   "/holds/{hold_id}/pickup_locations":
167     $ref: "./paths/holds.yaml#/~1holds~1{hold_id}~1pickup_locations"
168   "/holds/{hold_id}/priority":
169     $ref: "./paths/holds.yaml#/~1holds~1{hold_id}~1priority"
170   "/holds/{hold_id}/suspension":
171     $ref: "./paths/holds.yaml#/~1holds~1{hold_id}~1suspension"
172   /ill_backends:
173     $ref: ./paths/ill_backends.yaml#/~1ill_backends
174   "/ill_backends/{ill_backend_id}":
175     $ref: "./paths/ill_backends.yaml#/~1ill_backends~1{ill_backend_id}"
176   /illrequests:
177     $ref: ./paths/illrequests.yaml#/~1illrequests
178   "/import_batches/{import_batch_id}/records/{import_record_id}/matches/chosen":
179     $ref: "./paths/import_batches.yaml#/~1import_batches~1{import_batch_id}~1records~1{import_record_id}~1matches~1chosen"
180   /import_batch_profiles:
181     $ref: ./paths/import_batch_profiles.yaml#/~1import_batch_profiles
182   "/import_batch_profiles/{import_batch_profile_id}":
183     $ref: "./paths/import_batch_profiles.yaml#/~1import_batch_profiles~1{import_batch_profile_id}"
184   /items:
185     $ref: ./paths/items.yaml#/~1items
186   "/items/{item_id}":
187     $ref: "./paths/items.yaml#/~1items~1{item_id}"
188   "/items/{item_id}/bundled_items":
189     $ref: ./paths/items.yaml#/~1items~1{item_id}~1bundled_items
190   "/items/{item_id}/bundled_items/{bundled_item_id}":
191     $ref: ./paths/items.yaml#/~1items~1{item_id}~1bundled_items~1{bundled_item_id}
192   "/items/{item_id}/pickup_locations":
193     $ref: "./paths/items.yaml#/~1items~1{item_id}~1pickup_locations"
194   /jobs:
195     $ref: ./paths/jobs.yaml#/~1jobs
196   "/jobs/{job_id}":
197     $ref: "./paths/jobs.yaml#/~1jobs~1{job_id}"
198   /libraries:
199     $ref: ./paths/libraries.yaml#/~1libraries
200   "/libraries/{library_id}":
201     $ref: "./paths/libraries.yaml#/~1libraries~1{library_id}"
202   /oauth/token:
203     $ref: ./paths/oauth.yaml#/~1oauth~1token
204   /patrons:
205     $ref: ./paths/patrons.yaml#/~1patrons
206   "/patrons/{patron_id}":
207     $ref: "./paths/patrons.yaml#/~1patrons~1{patron_id}"
208   "/patrons/{patron_id}/account":
209     $ref: "./paths/patrons_account.yaml#/~1patrons~1{patron_id}~1account"
210   "/patrons/{patron_id}/account/credits":
211     $ref: "./paths/patrons_account.yaml#/~1patrons~1{patron_id}~1account~1credits"
212   "/patrons/{patron_id}/extended_attributes":
213     $ref: "./paths/patrons_extended_attributes.yaml#/~1patrons~1{patron_id}~1extended_attributes"
214   "/patrons/{patron_id}/extended_attributes/{extended_attribute_id}":
215     $ref: "./paths/patrons_extended_attributes.yaml#/~1patrons~1{patron_id}~1extended_attributes~1{extended_attribute_id}"
216   "/patrons/{patron_id}/holds":
217     $ref: "./paths/patrons_holds.yaml#/~1patrons~1{patron_id}~1holds"
218   "/patrons/{patron_id}/password":
219     $ref: "./paths/patrons_password.yaml#/~1patrons~1{patron_id}~1password"
220   "/patrons/{patron_id}/password/expiration_date":
221     $ref: "./paths/patrons_password.yaml#/~1patrons~1{patron_id}~1password~1expiration_date"
222   "/public/biblios/{biblio_id}":
223     $ref: "./paths/biblios.yaml#/~1public~1biblios~1{biblio_id}"
224   "/public/biblios/{biblio_id}/items":
225     $ref: "./paths/biblios.yaml#/~1public~1biblios~1{biblio_id}~1items"
226   "/public/biblios/{biblio_id}/ratings":
227     $ref: "./paths/biblios.yaml#/~1public~1biblios~1{biblio_id}~1ratings"
228   /public/libraries:
229     $ref: ./paths/libraries.yaml#/~1public~1libraries
230   "/public/libraries/{library_id}":
231     $ref: "./paths/libraries.yaml#/~1public~1libraries~1{library_id}"
232   "/public/patrons/{patron_id}/article_requests/{article_request_id}":
233     $ref: "./paths/article_requests.yaml#/~1public~1patrons~1{patron_id}~1article_requests~1{article_request_id}"
234   "/public/patrons/{patron_id}/guarantors/can_see_charges":
235     $ref: "./paths/public_patrons.yaml#/~1public~1patrons~1{patron_id}~1guarantors~1can_see_charges"
236   "/public/patrons/{patron_id}/guarantors/can_see_checkouts":
237     $ref: "./paths/public_patrons.yaml#/~1public~1patrons~1{patron_id}~1guarantors~1can_see_checkouts"
238   "/public/patrons/{patron_id}/password":
239     $ref: "./paths/public_patrons.yaml#/~1public~1patrons~1{patron_id}~1password"
240   /quotes:
241     $ref: ./paths/quotes.yaml#/~1quotes
242   "/quotes/{quote_id}":
243     $ref: "./paths/quotes.yaml#/~1quotes~1{quote_id}"
244   /return_claims:
245     $ref: ./paths/return_claims.yaml#/~1return_claims
246   "/return_claims/{claim_id}":
247     $ref: "./paths/return_claims.yaml#/~1return_claims~1{claim_id}"
248   "/return_claims/{claim_id}/notes":
249     $ref: "./paths/return_claims.yaml#/~1return_claims~1{claim_id}~1notes"
250   "/return_claims/{claim_id}/resolve":
251     $ref: "./paths/return_claims.yaml#/~1return_claims~1{claim_id}~1resolve"
252   "/rotas/{rota_id}/stages/{stage_id}/position":
253     $ref: "./paths/rotas.yaml#/~1rotas~1{rota_id}~1stages~1{stage_id}~1position"
254   /suggestions:
255     $ref: ./paths/suggestions.yaml#/~1suggestions
256   "/suggestions/{suggestion_id}":
257     $ref: "./paths/suggestions.yaml#/~1suggestions~1{suggestion_id}"
258   /suggestions/managers:
259     $ref: paths/suggestions.yaml#/~1suggestions~1managers
260   /transfer_limits:
261     $ref: ./paths/transfer_limits.yaml#/~1transfer_limits
262   /transfer_limits/batch:
263     $ref: ./paths/transfer_limits.yaml#/~1transfer_limits~1batch
264   "/transfer_limits/{limit_id}":
265     $ref: "./paths/transfer_limits.yaml#/~1transfer_limits~1{limit_id}"
266 parameters:
267   advancededitormacro_id_pp:
268     description: Advanced editor macro internal identifier
269     in: path
270     name: advancededitormacro_id
271     required: true
272     type: integer
273   biblio_id_pp:
274     description: Record internal identifier
275     in: path
276     name: biblio_id
277     required: true
278     type: integer
279   candidate_match_id_pp:
280     description: Internal import record match identifier
281     in: path
282     name: candidate_match_id
283     required: true
284     type: integer
285   cash_register_id_pp:
286     description: Cash register internal identifier
287     in: path
288     name: cash_register_id
289     required: true
290     type: integer
291   cashup_id_pp:
292     description: Cashup internal identifier
293     in: path
294     name: cashup_id
295     required: true
296     type: integer
297   checkout_id_pp:
298     description: Internal checkout identifier
299     in: path
300     name: checkout_id
301     required: true
302     type: integer
303   city_id_pp:
304     description: City internal identifier
305     in: path
306     name: city_id
307     required: true
308     type: integer
309   club_id_pp:
310     description: Internal club identifier
311     in: path
312     name: club_id
313     required: true
314     type: integer
315   fund_id_pp:
316     description: Fund id
317     in: path
318     name: fund_id
319     required: true
320     type: integer
321   hold_id_pp:
322     description: Internal hold identifier
323     in: path
324     name: hold_id
325     required: true
326     type: integer
327   import_batch_profile_id_pp:
328     description: Internal profile identifier
329     in: path
330     name: import_batch_profile_id
331     required: true
332     type: integer
333   import_record_id_pp:
334     description: Internal import record identifier
335     in: path
336     name: import_record_id
337     required: true
338     type: integer
339   item_id_pp:
340     description: Internal item identifier
341     in: path
342     name: item_id
343     required: true
344     type: integer
345   job_id_pp:
346     description: Job internal identifier
347     in: path
348     name: job_id
349     required: true
350     type: integer
351   library_id_pp:
352     description: Internal library identifier
353     in: path
354     name: library_id
355     required: true
356     type: string
357   match:
358     description: Matching criteria
359     enum:
360       - contains
361       - exact
362       - starts_with
363       - ends_with
364     in: query
365     name: _match
366     required: false
367     type: string
368   order_by:
369     collectionFormat: csv
370     description: Sorting criteria
371     in: query
372     items:
373       type: string
374     name: _order_by
375     required: false
376     type: array
377   order_id_pp:
378     description: Internal order identifier
379     in: path
380     name: order_id
381     required: true
382     type: integer
383   page:
384     description: "Page number, for paginated object listing"
385     in: query
386     name: _page
387     required: false
388     type: integer
389   patron_id_pp:
390     description: Internal patron identifier
391     in: path
392     name: patron_id
393     required: true
394     type: integer
395   patron_id_qp:
396     description: Internal patron identifier
397     in: query
398     name: patron_id
399     type: integer
400   per_page:
401     description: "Page size, for paginated object listing"
402     in: query
403     name: _per_page
404     required: false
405     type: integer
406   q_body:
407     description: Query filter sent through request"s body
408     in: body
409     name: query
410     required: false
411     schema:
412       type: object
413   q_header:
414     description: Query filter sent as a request header
415     in: header
416     name: x-koha-query
417     required: false
418     type: string
419   q_param:
420     description: Query filter sent as a request parameter
421     in: query
422     name: q
423     required: false
424     type: array
425     items:
426       type: string
427     collectionFormat: multi
428   quote_id_pp:
429     description: Quote internal identifier
430     in: path
431     name: quote_id
432     required: true
433     type: integer
434   request_id_header:
435     description: Request id header
436     in: header
437     name: x-koha-request-id
438     required: false
439     type: integer
440   search_filter_id_pp:
441     name: search_filter_id
442     in: path
443     description: Search filter internal identifier
444     required: true
445     type: integer
446   seen_pp:
447     description: Item was seen flag
448     in: query
449     name: seen
450     required: false
451     type: integer
452   smtp_server_id_pp:
453     description: SMTP server internal identifier
454     in: path
455     name: smtp_server_id
456     required: true
457     type: integer
458   suggestion_id_pp:
459     description: Internal suggestion identifier
460     in: path
461     name: suggestion_id
462     required: true
463     type: integer
464   transfer_limit_id_pp:
465     description: Internal transfer limit identifier
466     in: path
467     name: limit_id
468     required: true
469     type: string
470   vendor_id_pp:
471     description: Vendor id
472     in: path
473     name: vendor_id
474     required: true
475     type: integer
476 info:
477   title: Koha REST API
478   version: "1"
479   license:
480     name: "GPL v3,"
481     url: http://www.gnu.org/licenses/gpl.txt
482   contact:
483     name: Koha Development Team
484     url: https://koha-community.org/
485   description: |
486     ## Introduction
487
488     This API is documented in **OpenAPI format**.
489
490     ## Authentication
491
492     The API supports the following authentication mechanisms
493
494     * HTTP Basic authentication
495     * OAuth2 (client credentials grant)
496     * Cookie-based
497
498     Both _Basic authentication_ and the _OAuth2_ flow, need to be enabled
499     by system preferences.
500
501     ## Errors
502
503     The API uses standard HTTP status codes to indicate the success or failure
504     of the API call. The body of the response will be JSON in the following format:
505
506     ```
507     {
508       "error": "Current settings prevent the passed due date to be applied",
509       "error_code": "invalid_due_date"
510     }
511     ```
512
513     Note: Some routes might offer additional attributes in their error responses but that"s
514     subject to change and thus not documented.
515
516     ## Filtering responses
517
518     The API allows for some advanced response filtering using a JSON based query syntax. The
519     query can be added to the requests:
520
521     * as a query parameter `q=`
522     * in the request body
523     * in a special header `x-koha-query`
524
525     For simple field equality matches we can use `{ "fieldname": "value" }` where the fieldname
526     matches one of the fields as described in the particular endpoints response object.
527
528     We can refine that with more complex matching clauses by nesting a the clause into the
529     object; `{ "fieldname": { "clause": "value" } }`.
530
531     Available matching clauses include ">", "<", ">=", "<=", "-like", and "-not_like".
532
533     We can filter on multiple fields by adding them to the JSON respresentation. Adding at `HASH`
534     level will result in an "AND" query, whilst combinding them in an `ARRAY` wilth result in an
535     "OR" query: `{ "field1": "value2", "field2": "value2" }` will filter the response to only those
536     results with both field1 containing value2 AND field2 containing value2 for example.
537
538     Additionally, if you are requesting related data be embedded into the response one can query
539     on the related data using dot notation in the field names.
540
541     ### Examples
542
543     The following request would return any patron with firstname "Henry" and lastname "Acevedo";
544
545     `curl -u koha:koha --request GET "http://127.0.0.1:8081/api/v1/patrons/" --data-raw "{ "surname": "Acevedo", "firstname": "Henry" }"`
546
547     The following request would return any patron whose lastname begins with "Ace";
548
549     `curl -u koha:koha --request GET "http://127.0.0.1:8081/api/v1/patrons/" --data-raw "{ "surname": { "-like": "Ace%" }"`
550
551     The following request would return any patron whose lastname is "Acevedo" OR "Bernardo"
552
553     `curl -u koha:koha --request GET "http://127.0.0.1:8081/api/v1/patrons/" --data-raw "{ "surname": [ "Acevedo", "Bernardo" ] }"`
554
555     The following request embeds the related patron extended attributes data and filters on it.
556
557     `curl -u koha:koha =--request GET 'http://127.0.0.1:8081/api/v1/patrons/' --header 'x-koha-embed: extended_attributes' --data-raw '{ "extended_attributes.code": "internet", "extended_attributes.attribute": "1" }'`
558
559     ## Special headers
560
561     ### x-koha-embed
562
563     This optional header allows the api consumer to request additional related data
564     to be returned in the api response.  It also allows for cross referencing in the
565     queries as described above. It accepts a comma delimited list of relation names.
566
567     Relations may on occasion also support dot delimited nesting to allow traversal.
568
569     ### x-koha-library
570
571     This optional header should be passed to give your api request a library
572     context; If it is not included in the request, then the request context
573     will default to using your api comsumer"s assigned home library.
574 tags:
575   - description: "Handle two factor authentication flows\n"
576     name: 2fa
577     x-displayName: Two factor authentication
578   - description: "Manage article requests\n"
579     name: article_requests
580     x-displayName: Article requests
581   - description: "Manage baskets for the acquisitions module\n"
582     name: baskets
583     x-displayName: Baskets
584   - description: "Manage bibliographic records\n"
585     name: biblios
586     x-displayName: Biblios
587   - description: "Manage cash register cashups\n"
588     name: cashups
589     x-displayName: Cashups
590   - description: "Manage checkouts\n"
591     name: checkouts
592     x-displayName: Checkouts
593   - description: "Manage circulation rules\n"
594     name: circulation_rules
595     x-displayName: Circulation rules
596   - description: "Manage cities\n"
597     name: cities
598     x-displayName: Cities
599   - description: "Manage patron clubs\n"
600     name: clubs
601     x-displayName: Clubs
602   - description: "Manage funds for the acquisitions module\n"
603     name: funds
604     x-displayName: Funds
605   - description: "Manage holds\n"
606     name: holds
607     x-displayName: Holds
608   - description: "Manage ILL module backends\n"
609     name: illbackends
610     x-displayName: ILL backends
611   - description: "Manage ILL requests\n"
612     name: illrequests
613     x-displayName: ILL requests
614   - description: "Manage import batches\n"
615     name: import_batches
616     x-display-name: Import batches
617   - description: "Manage item groups\n"
618     name: item_groups
619     x-displayName: Item groups
620   - description: "Manage items\n"
621     name: items
622     x-displayName: Items
623   - description: "Manage jobs\n"
624     name: jobs
625     x-displayName: Jobs
626   - description: "Manage libraries\n"
627     name: libraries
628     x-displayName: Libraries
629   - description: "Manage macros\n"
630     name: macros
631     x-displayName: Macros
632   - description: "Manage acquisition orders\n"
633     name: orders
634     x-displayName: Orders
635   - description: "Handle OAuth flows\n"
636     name: oauth
637     x-displayName: OAuth
638   - description: "Manage patrons\n"
639     name: patrons
640     x-displayName: Patrons
641   - description: "Manage quotes\n"
642     name: quotes
643     x-displayName: Quotes
644   - description: "Manage return claims\n"
645     name: return_claims
646     x-displayName: Return claims
647   - description: "Manage rotas\n"
648     name: rotas
649     x-displayName: Rotas
650   - description: "Manage SMTP servers configurations\n"
651     name: smtp_servers
652     x-displayName: SMTP servers
653   - description: "Manage transfer limits\n"
654     name: transfer
655     x-displayName: Transfer limits
656   - description: "Manage purchase suggestions\n"
657     name: suggestions
658     x-displayName: Purchase suggestions
659   - description: "Manage vendors for the acquisitions module\n"
660     name: vendors
661     x-displayName: Vendors
662   - description: "Manage batch import profiles\n"
663     name: batch_import_profiles
664     x-displayName: Batch import profiles