{"id":18081825,"url":"https://github.com/cxxxr/apispec","last_synced_at":"2026-01-18T23:07:36.803Z","repository":{"id":47419989,"uuid":"200196107","full_name":"cxxxr/apispec","owner":"cxxxr","description":"A Common Lisp library for handling Web API requests and responses.","archived":false,"fork":false,"pushed_at":"2024-01-17T07:44:33.000Z","size":233,"stargazers_count":34,"open_issues_count":2,"forks_count":8,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-04-05T22:28:20.015Z","etag":null,"topics":["common-lisp","openapi3","validator","web"],"latest_commit_sha":null,"homepage":"","language":"Common Lisp","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cxxxr.png","metadata":{"files":{"readme":"README.markdown","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2019-08-02T08:23:34.000Z","updated_at":"2025-02-17T07:29:43.000Z","dependencies_parsed_at":"2024-01-17T09:14:07.289Z","dependency_job_id":null,"html_url":"https://github.com/cxxxr/apispec","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/cxxxr/apispec","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cxxxr%2Fapispec","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cxxxr%2Fapispec/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cxxxr%2Fapispec/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cxxxr%2Fapispec/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cxxxr","download_url":"https://codeload.github.com/cxxxr/apispec/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cxxxr%2Fapispec/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28553070,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T20:59:07.572Z","status":"ssl_error","status_checked_at":"2026-01-18T20:59:02.799Z","response_time":98,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["common-lisp","openapi3","validator","web"],"created_at":"2024-10-31T13:16:36.313Z","updated_at":"2026-01-18T23:07:36.785Z","avatar_url":"https://github.com/cxxxr.png","language":"Common Lisp","funding_links":[],"categories":["Interfaces to other package managers"],"sub_categories":["OpenAPI, OData, OpenRPC"],"readme":"# apispec\n\n[![Build Status](https://travis-ci.org/fukamachi/apispec.svg?branch=master)](https://travis-ci.org/fukamachi/apispec)\n[![Coverage Status](https://coveralls.io/repos/fukamachi/apispec/badge.svg?branch=master)](https://coveralls.io/r/fukamachi/apispec)\n\nA Common Lisp library for handling Web API specifications. This allows to validate and parse HTTP request headers, parameters and bodies with OpenAPI3 specification.\n\n## Warning\n\nThis software is still ALPHA quality. The APIs will be likely to change.\n\n## Prerequisite\n\n* [libyaml](http://pyyaml.org/wiki/LibYAML) for loading OpenAPI spec files.\n\n## Usage\n\n### Loading specification file\n\n```common-lisp\n(defvar *spec*\n  (apispec:load-from-file #P\"docs/api.yaml\"))\n\n(apispec:spec-version *spec*)\n;=\u003e \"3.0.2\"\n```\n\n### Getting the operation\n\n```common-lisp\n(defvar *router* (apispec:spec-router *spec*))\n\n(apispec:find-route *router* :GET \"/users/12\")\n;=\u003e #\u003cAPISPEC/CLASSES/OPERATION:OPERATION {1003DDB073}\u003e\n```\n\n### Parsing and Validating HTTP requests\n\n```common-lisp\n(import '(lack.request:request-query-parameters\n          lack.request:request-body-parameters\n          lack.request:request-cookies\n          apispec:request-path-parameters))\n\n;; Clack application\n(defvar *app*\n  (lambda (env)\n    (multiple-value-bind (operation path-parameters)\n        (apispec:find-route (spec-router *spec*)\n                            (getf env :request-method)\n                            (getf env :path-info))\n      ;; Getting Lack.Request\n      (let ((request (apispec:validate-request operation env\n                                               :path-parameters path-parameters)))\n        ;; Write the main application here.\n\n        ;; Accessors for getting each parameters.\n        (request-query-parameters request)  ;=\u003e Query parameters (alist)\n        (request-body-parameters request)   ;=\u003e Body parameters (alist)\n        (request-path-parameters request)   ;=\u003e Path parameters (alist)\n        (request-cookies)                   ;=\u003e Cookie parameters (alist)\n\n        ))))\n\n;; Start the server\n(clack:clackup *app*)\n```\n\n### Validating and Encoding HTTP responses\n\n```common-lisp\n(import 'lack.response:make-response)\n\n(apispec:validate-response operation\n                           (make-response 200\n                                          '(:content-type \"application/json\")\n                                          '((\"id\" . 3)\n                                            (\"name\" . \"初音ミク\")\n                                            (\"is_admin\" . nil))))\n;=\u003e (200 (:CONTENT-TYPE \"application/json\") (\"{\\\"id\\\":3,\\\"name\\\":\\\"初音ミク\\\",\\\"is_admin\\\":false}\"))\n```\n\n### Custom Encoder for standard objects\n\n```common-lisp\n(import 'lack.response:make-response)\n\n;; Custom class\n(defclass user ()\n  ((id :initarg :id)\n   (name :initarg :name)\n   (is-admin :initarg :is-admin)))\n\n;; Define APISPEC:ENCODE-OBJECT for the class\n(defmethod apispec:encode-object ((user user))\n  `((\"id\" . ,(slot-value user 'id))\n    (\"name\" . ,(slot-value user 'name))\n    (\"is_admin\" . ,(slot-value user 'is-admin))))\n\n(defvar *yukari*\n  (make-instance 'user\n                 :id 14\n                 :name \"結月ゆかり\"\n                 :is-admin nil))\n\n(apispec:validate-response operation\n                           (make-response 200\n                                          '(:content-type \"application/json\")\n                                          *yukari*))\n;=\u003e (200 (:CONTENT-TYPE \"application/json\") (\"{\\\"id\\\":14,\\\"name\\\":\\\"結月ゆかり\\\",\\\"is_admin\\\":false}\"))\n```\n\n## Examples\n\nSee [examples/](examples/).\n\n## See Also\n\n* [OpenAPI Specification](https://github.com/OAI/OpenAPI-Specification)\n* [Lack](https://github.com/fukamachi/lack)\n\n## Author\n\n* Eitaro Fukamachi (e.arrows@gmail.com)\n\n## Copyright\n\nCopyright (c) 2019 Eitaro Fukamachi (e.arrows@gmail.com)\n\n## License\n\nLicensed under the BSD 3-Clause License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcxxxr%2Fapispec","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcxxxr%2Fapispec","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcxxxr%2Fapispec/lists"}