{"files":{"SKILL.md":"---\nname: they-said-so-quotes-api\ndescription: \"They Said So Quotes API skill. Use when working with They Said So Quotes for qod, quote, qshow. Covers 45 endpoints.\"\nversion: 1.0.0\ngenerator: lapsh\n---\n\n# They Said So Quotes API\nAPI version: 5.1\n\n## Auth\nBearer bearer\n\n## Base URL\nhttps://quotes.rest\n\n## Setup\n1. Set Authorization header with Bearer token\n2. GET /qod -- gets `quote of the day` (qod). optional `category` param determines the category of returned quote of the day\n3. POST /quote -- create first quote\n\n## Endpoints\n45 endpoints across 3 groups. See references/api-spec.lap for full details.\n\n### Qod\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /qod | Gets `Quote of the Day` (QOD). Optional `category` param determines the category of returned quote of the day |\n| PUT | /qod | Create a private `Quote of the Day` service. |\n| PATCH | /qod | Update an existing private `Quote of the Day` definition. |\n| GET | /qod/categories | Gets a list of `Quote of the Day` Categories. |\n| GET | /qod/languages | Gets a list of supported languages for `Quote of the Day`. |\n\n### Quote\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /quote/random | Gets a `Random Quote`. When you are in a hurry this is what you call to get a random famous quote. |\n| GET | /quote/search | Search for a `Quote` in They Said So platform. Optional `category` , `author`, `minlength`, `maxlength` params determines the filters applied while searching for the quote. |\n| GET | /quote/categories/popular | Gets a list of popular `Quote` Categories. |\n| GET | /quote/categories/search | Gets a list of `Quote` Categories matching the query string. |\n| GET | /quote/authors/popular | Gets a list of popular author names in the system. |\n| GET | /quote/authors/search | Gets a list of author names in the system. |\n| PUT | /quote | Add a new quote to your private collection. |\n| POST | /quote | Add a new quote to your private collection. Same as 'PUT' but added since some clients don't handle PUT well. |\n| PATCH | /quote | Update a quote |\n| GET | /quote | Gets a `Quote` with a given `id`. |\n| DELETE | /quote | Delete a quote. The user needs to be the owner of the quote to be able to delete it. |\n| GET | /quote/list | Get the list of quotes in your private collection. |\n| POST | /quote/tags/add | Add a tag to a given Quote. |\n| POST | /quote/tags/remove | Remove a tag from a given quote. |\n| GET | /quote/like/toggle | Toggle the user like of the given Quote as a user of the API Key. |\n| GET | /quote/bookmark/toggle | Toggle the user bookmark of the given Quote as a user of the API Key. |\n| PUT | /quote/image | Create a new quote image for a given quote. Choose background colors/images , choose different font styles and generate a beautiful quote image. Did you just had a feeling of being a god or what?! |\n| GET | /quote/image | Gets a Quote image for a given id. Response can be an image file as a binary or a base64 encoded contents wrapped in json. `TODO` |\n| DELETE | /quote/image | Delete a quote image. The user needs to be the owner of the quote image to be able to delete it. |\n| GET | /quote/image/search | Gets a Random Quote image. Optional `category` param determines the category of quote used in the image. Optional `author` param gets the quote image of a given author. |\n| POST | /quote/image/background | Add an image for use later as a quote background image. |\n| DELETE | /quote/image/background | Delete a background image file. The user needs to be the owner of the background image to be able to delete it. |\n| GET | /quote/image/background/search | Searches for a background image with a given tag. |\n| GET | /quote/image/background/list | Lists background images in your private collection. |\n| POST | /quote/image/background/tags/add | Add a tag to a given Image. |\n| POST | /quote/image/background/tags/remove | Remove a tag from a given Image. |\n| POST | /quote/image/font | Add a font file for use later in creating a quote image. This is essentially a `PUT` but not many clients handle PUT with binary stream i.e. a file, gracefully. |\n| DELETE | /quote/image/font | Delete a font file. The user needs to be the owner of the font to be able to delete it. |\n| GET | /quote/image/font/search | Searches for a font with a given tag. |\n| GET | /quote/image/font/list | Lists background images in your private collection. |\n| POST | /quote/image/font/tags/add | Add a tag to a given font. |\n| POST | /quote/image/font/tags/remove | Remove a tag from a given Font. |\n\n### Qshow\n| Method | Path | Description |\n|--------|------|-------------|\n| PUT | /qshow | Create and add a new qshow to your private collection. |\n| GET | /qshow | Gets a details about a qshow. |\n| PATCH | /qshow | Update an existing qshow. |\n| DELETE | /qshow | Delete a qshow. |\n| POST | /qshow/quotes/add | Add a quote to a given Qshow. |\n| POST | /qshow/quotes/remove | Remove a quote to a given Qshow. |\n| GET | /qshow/quotes | Get the quotes in a given Qshow. |\n| GET | /qshow/list | Get the list of Qshows in They Said So platform. |\n\n## Common Questions\nMatch user requests to endpoints in references/api-spec.lap. Key patterns:\n- \"List all qod?\" -> GET /qod\n- \"List all categories?\" -> GET /qod/categories\n- \"List all languages?\" -> GET /qod/languages\n- \"List all random?\" -> GET /quote/random\n- \"Search search?\" -> GET /quote/search\n- \"List all popular?\" -> GET /quote/categories/popular\n- \"Create a quote?\" -> POST /quote\n- \"List all quote?\" -> GET /quote\n- \"List all list?\" -> GET /quote/list\n- \"Create a add?\" -> POST /quote/tags/add\n- \"Create a remove?\" -> POST /quote/tags/remove\n- \"List all toggle?\" -> GET /quote/like/toggle\n- \"List all qshow?\" -> GET /qshow\n- \"List all quotes?\" -> GET /qshow/quotes\n- \"List all image?\" -> GET /quote/image\n- \"List all search?\" -> GET /quote/image/search\n- \"Create a background?\" -> POST /quote/image/background\n- \"Create a font?\" -> POST /quote/image/font\n- \"How to authenticate?\" -> See Auth section above\n\n## Response Tips\n- Check response schemas in references/api-spec.lap for field details\n- Paginated endpoints accept limit/offset or cursor parameters\n- Create/update endpoints return the modified resource on success\n- Error responses include status codes and descriptions in the spec\n\n## References\n- Full spec: See references/api-spec.lap for complete endpoint details, parameter tables, and response schemas\n\n> Generated from the official API spec by [LAP](https://lap.sh)\n","references/api-spec.lap":"@lap v0.3\n# Machine-readable API spec. Each @endpoint block is one API call.\n@api They Said So Quotes API\n@base https://quotes.rest\n@version 5.1\n@auth Bearer bearer\n@endpoints 45\n@hint download_for_search\n@toc qod(5), quote(32), qshow(8)\n\n@group qod\n@endpoint GET /qod\n@desc Gets `Quote of the Day` (QOD). Optional `category` param determines the category of returned quote of the day\n@optional {category: str(string) # QOD Category (Used in public QOD only), language: str(string)=en # Language of the QOD. The language must be supported in our QOD system., id: str(string) # QOD defition id (Used in private QOD only)}\n@returns(200) {success: str, contents: any} # 200  response\n@errors {400: 400  response}\n\n@endpoint PUT /qod\n@desc Create a private `Quote of the Day` service.\n@required {title: str(string) # Title of the Quote of the day category}\n@optional {repeat_after: int(integer)=30 # How many days after the quotes can repeat? If you are setting this up from your private collection make sure you have more quotes that meet the filter conditions than the days you specify here., authors: str(array) # Comma seperated author names. Quotes will be chosen from one of these authors., private: bool=false # Should apply the filters to the private collection. Default is public quotes in the platform., language: str(string)=en # Quotes language., sfw: bool=false # Consider only quotes marked as \"sfw\" (Safe for work).}\n@returns(200) {success: str, contents: [any]} # 200  response\n@errors {400: 400  response, 403: 403  No access response}\n\n@endpoint PATCH /qod\n@desc Update an existing private `Quote of the Day` definition.\n@required {title: str(string) # Title of the Quote of the day category}\n@optional {repeat_after: int(integer)=30 # How many days after the quotes can repeat? If you are setting this up from your private collection make sure you have more quotes that meet the filter conditions than the days you specify here., authors: str(array) # Comma seperated author names. Quotes will be chosen from one of these authors., private: bool=false # Should apply the filters to the private collection. Default is public quotes in the platform., language: str(string)=en # Quotes language., sfw: bool=false # Consider only quotes marked as \"sfw\" (Safe for work).}\n@returns(200) {success: str, contents: any} # 200  response\n@errors {400: 400  response, 403: 403  No access response}\n\n@endpoint GET /qod/categories\n@desc Gets a list of `Quote of the Day` Categories.\n@optional {language: str(string)=en # Language of the QOD category. The language must be supported in our QOD system., detailed: bool=false # Return detailed information of the categories. Note the data format changes between the two values of this switch.}\n@returns(200) 200  response\n@errors {400: 400  response}\n\n@endpoint GET /qod/languages\n@desc Gets a list of supported languages for `Quote of the Day`.\n@returns(200) 200  response\n\n@endgroup\n\n@group quote\n@endpoint GET /quote/random\n@desc Gets a `Random Quote`. When you are in a hurry this is what you call to get a random famous quote.\n@optional {language: str(string)=en # Language of the Quote. The language must be supported in our system., limit: int(integer)=1 # No of quotes to return. The max limit depends on the subscription level.}\n@returns(200) {success: str, contents: any} # 200  response\n@errors {401: 401  response}\n\n@endpoint GET /quote/search\n@desc Search for a `Quote` in They Said So platform. Optional `category` , `author`, `minlength`, `maxlength` params determines the filters applied while searching for the quote.\n@optional {category: str(string) # Quote Category, author: str(string) # Quote Author, minlength: int(int32)=100 # Quote minimum Length, maxlength: int(int32)=300 # Quote maximum Length, query: str(string) # keyword to search for in the quote, private: bool=false # Should search private collection? Default searches public collection., language: str(string)=en # Language of the Quote. The language must be supported in our system., limit: int(integer)=1 # No of quotes to return. The max limit depends on the subscription level., sfw: bool=false # Should search only SFW (Safe For Work) quotes?}\n@returns(200) {success: str, contents: any} # 200  response\n@errors {401: 401  response, 404: 404  response}\n\n@endpoint GET /quote/categories/popular\n@desc Gets a list of popular `Quote` Categories.\n@optional {start: int(int32)=0 # Response is paged. This parameter controls where response starts the listing at, limit: int(int32)=5 # Response is paged. This parameter controls how many is returned in the result. The maximum depends on the subscription level.}\n@returns(200) 200  response\n\n@endpoint GET /quote/categories/search\n@desc Gets a list of `Quote` Categories matching the query string.\n@optional {query: str(string)=0 # Text string to search for in the categories, start: int(int32)=0 # Response is paged. This parameter controls where response starts the listing at, limit: int(int32)=2 # Response is paged. This parameter controls how many is returned in the result. The maximum depends on the subscription level.}\n@returns(200) 200  response\n\n@endpoint GET /quote/authors/popular\n@desc Gets a list of popular author names in the system.\n@optional {language: str(string)=en # Language. A same author may have quotes in two or more different languages. So for example 'Mahatma Gandhi' may be returned for language \"en\"(English), and \"மஹாத்மா காந்தி\" may be returned when the language is \"ta\" (Tamil)., detailed: bool=false # Should return detailed author information such as `birthday`, `death date`, `occupation`, `description` etc. Only available at certain subscription levels., start: int(int32)=0 # Response is paged. This parameter controls where response starts the listing at, limit: int(int32)=5 # Response is paged. This parameter controls how many is returned in the result. The maximum depends on the subscription level.}\n@returns(200) 200  response\n@errors {400: 400  response}\n\n@endpoint GET /quote/authors/search\n@desc Gets a list of author names in the system.\n@optional {query: str(string) # Text string to search for in author names, language: str(string)=en # Language. A same author may have quotes in two or more different languages. So for example 'Mahatma Gandhi' may be returned for language \"en\"(English), and \"மஹாத்மா காந்தி\" may be returned when the language is \"ta\" (Tamil)., detailed: bool=false # Should return detailed author information such as `birthday`, `death date`, `occupation`, `description` etc. Only available at certain subscription levels., start: int(int32)=0 # Response is paged. This parameter controls where response starts the listing at, limit: int(int32)=1 # Response is paged. This parameter controls how many is returned in the result. The maximum depends on the subscription level.}\n@returns(200) 200  response\n@errors {400: 400  response}\n\n@endpoint PUT /quote\n@desc Add a new quote to your private collection.\n@required {quote: str(string) # Quote}\n@optional {author: str(string) # Quote Author, tags: str(string) # Comma Separated tags, language: str(string)=en # Language. If not supplied an auto detection mechanism will be used to detect a language.}\n@returns(200) 200  response\n@errors {401: 401  response}\n\n@endpoint POST /quote\n@desc Add a new quote to your private collection. Same as 'PUT' but added since some clients don't handle PUT well.\n@required {quote: str(string) # Quote}\n@optional {author: str(string) # Quote Author, tags: str(string) # Comma Separated tags, language: str(string)=en # Language. If not supplied an auto detection mechanism will be used to detect a language.}\n@returns(200) 200  response\n@errors {401: 401  response}\n\n@endpoint PATCH /quote\n@desc Update a quote\n@required {id: str(string) # Quote ID}\n@optional {quote: str(string) # Quote, author: str(string) # Quote Author, language: str(string)=en # Language. If not supplied an auto detection mechanism will be used to detect a language., tags: str # Comma Separated tags}\n@returns(200) 200  response\n@errors {401: 401  response}\n\n@endpoint GET /quote\n@desc Gets a `Quote` with a given `id`.\n@optional {id: str(string) # Quote ID}\n@returns(200) {success: str, contents: any} # 200  response\n@errors {401: 401  response}\n\n@endpoint DELETE /quote\n@desc Delete a quote. The user needs to be the owner of the quote to be able to delete it.\n@required {id: str(string) # Quote ID}\n@returns(200) 200  response\n@errors {401: 401  response, 404: 404  response}\n\n@endpoint GET /quote/list\n@desc Get the list of quotes in your private collection.\n@optional {start: int(int32)=0 # Response is paged. This parameter controls where response starts the listing at, limit: int(int32)=10 # Response is paged. This parameter controls how many is returned in the result.}\n@returns(200) 200  response\n@errors {401: 401  response}\n\n@endpoint POST /quote/tags/add\n@desc Add a tag to a given Quote.\n@required {id: str(string) # Quote ID, tags: str(string) # Comma Separated tags}\n@returns(200) 200  response\n@errors {401: 401  response, 404: 404  response}\n\n@endpoint POST /quote/tags/remove\n@desc Remove a tag from a given quote.\n@required {id: str(string) # Quote ID, tags: str(string) # Comma Separated tags}\n@returns(200) 200  response\n@errors {401: 401  response, 404: 404  response}\n\n@endpoint GET /quote/like/toggle\n@desc Toggle the user like of the given Quote as a user of the API Key.\n@required {quote_id: str(string) # Quote ID}\n@returns(200) 200  response\n@errors {401: 401  response, 404: 404  response}\n\n@endpoint GET /quote/bookmark/toggle\n@desc Toggle the user bookmark of the given Quote as a user of the API Key.\n@required {quote_id: str(string) # Quote ID}\n@returns(200) 200  response\n@errors {401: 401  response, 404: 404  response}\n\n@endgroup\n\n@group qshow\n@endpoint PUT /qshow\n@desc Create and add a new qshow to your private collection.\n@required {title: str(string) # Qshow title}\n@optional {description: str(string) # Qshow description, tags: [str] # Tags for the qshow}\n@returns(200) 200  response\n@errors {401: 401  response}\n\n@endpoint GET /qshow\n@desc Gets a details about a qshow.\n@required {id: str(string) # Qshow ID}\n@returns(200) 200  response\n@errors {401: 401  response, 404: 404  response}\n\n@endpoint PATCH /qshow\n@desc Update an existing qshow.\n@required {id: str(string) # Qshow ID}\n@optional {title: str(string) # Qshow title, description: str(string) # Qshow description, tags: [str] # Tags for the qshow}\n@returns(200) 200  response\n@errors {401: 401  response, 404: 404  response}\n\n@endpoint DELETE /qshow\n@desc Delete a qshow.\n@required {id: str(string) # Qshow ID}\n@returns(200) 200  response\n@errors {401: 401  response, 404: 404  response}\n\n@endpoint POST /qshow/quotes/add\n@desc Add a quote to a given Qshow.\n@required {id: str(string) # Qshow ID, quoteid: str(string) # Quote ID to add the qshow collection}\n@returns(200) 200  response\n@errors {401: 401  response, 404: 404  response}\n\n@endpoint POST /qshow/quotes/remove\n@desc Remove a quote to a given Qshow.\n@required {id: str(string) # Qshow ID, quoteid: str(string) # Quote ID to remove from the qshow collection}\n@returns(200) 200  response\n@errors {401: 401  response, 404: 404  response}\n\n@endpoint GET /qshow/quotes\n@desc Get the quotes in a given Qshow.\n@required {id: str(string) # Qshow ID}\n@returns(200) 200  response\n@errors {401: 401  response, 404: 404  response}\n\n@endpoint GET /qshow/list\n@desc Get the list of Qshows in They Said So platform.\n@optional {start: int(int32)=0 # Response is paged. This parameter controls where response starts the listing at, public: bool=false # Should include public qshows or not in the list}\n@returns(200) 200  response\n@errors {401: 401  response}\n\n@endgroup\n\n@group quote\n@endpoint PUT /quote/image\n@desc Create a new quote image for a given quote. Choose background colors/images , choose different font styles and generate a beautiful quote image. Did you just had a feeling of being a god or what?!\n@required {quote_id: str(string) # Quote id}\n@optional {bgimage_id: str(string)=theysaidso_default_background_image # Background Image id ( Will override bgcolor if supplied), bg_color: str(string) # Background Color(if background image id is not supplied), font_id: str(string)=theysaidso_default_font # Font id, text_color: str(string) # Text Color, text_size: str(string) # Text/font size, halign: str(string)=center # Horizontal text Alignment Value, valign: str(string)=center # Vertical text Alignment Value, width: int(integer) # Image Width(By default this takes the width of the background image), height: int(integer) # Image Height(By default this takes the height of the background image), branding: bool=false # Disable They Said So branding (Only available in certain subscription levels. Ignored in other levels), include_transparent_layer: bool=true # Should include a transparent layer between the text and the background image? This helps when the background image is bright and obscures the text.}\n@returns(200) 200  response\n@errors {401: 401  response, 404: 404  response}\n\n@endpoint GET /quote/image\n@desc Gets a Quote image for a given id. Response can be an image file as a binary or a base64 encoded contents wrapped in json. `TODO`\n@required {id: str(string) # Quote Image id}\n@optional {binary: bool=true # Should the response be a direct file download of the image or a base64 encoded image file wrapped in json?}\n@returns(200) 200  response\n@errors {401: 401  response, 404: 404  response}\n\n@endpoint DELETE /quote/image\n@desc Delete a quote image. The user needs to be the owner of the quote image to be able to delete it.\n@required {id: str(string) # Quote Image ID}\n@returns(200) 200  response\n@errors {401: 401  response, 404: 404  response}\n\n@endpoint GET /quote/image/search\n@desc Gets a Random Quote image. Optional `category` param determines the category of quote used in the image. Optional `author` param gets the quote image of a given author.\n@optional {category: str(string) # Quote Category, author: str(string) # Quote Author, private: bool=false # Should search private collection. Default searches public image collection.}\n@returns(200) 200  response\n@errors {401: 401  response, 404: 404  response}\n\n@endpoint POST /quote/image/background\n@desc Add an image for use later as a quote background image.\n@returns(200) 200  response\n@errors {401: 401  response}\n\n@endpoint DELETE /quote/image/background\n@desc Delete a background image file. The user needs to be the owner of the background image to be able to delete it.\n@required {id: str(string) # Font ID}\n@returns(200) 200  response\n@errors {401: 401  response, 404: 404  response}\n\n@endpoint GET /quote/image/background/search\n@desc Searches for a background image with a given tag.\n@optional {query: str(string) # Tag string}\n@returns(200) 200  response\n@errors {401: 401  response, 404: 404  response}\n\n@endpoint GET /quote/image/background/list\n@desc Lists background images in your private collection.\n@optional {start: int(integer) # Response is paged. This parameter determines where the response should start.}\n@returns(200) 200  response\n@errors {401: 401  response, 404: 404  response}\n\n@endpoint POST /quote/image/background/tags/add\n@desc Add a tag to a given Image.\n@required {id: str(string) # Image ID, tags: str(string) # Comma Separated tags}\n@returns(200) 200  response\n@errors {401: 401  response, 404: 404  response}\n\n@endpoint POST /quote/image/background/tags/remove\n@desc Remove a tag from a given Image.\n@required {id: str(string) # Image ID, tags: str(string) # Comma Separated tags}\n@returns(200) 200  response\n@errors {401: 401  response, 404: 404  response}\n\n@endpoint POST /quote/image/font\n@desc Add a font file for use later in creating a quote image. This is essentially a `PUT` but not many clients handle PUT with binary stream i.e. a file, gracefully.\n@returns(200) 200  response\n@errors {401: 401  response}\n\n@endpoint DELETE /quote/image/font\n@desc Delete a font file. The user needs to be the owner of the font to be able to delete it.\n@required {id: str(string) # Font ID}\n@returns(200) 200  response\n@errors {401: 401  response, 404: 404  response}\n\n@endpoint GET /quote/image/font/search\n@desc Searches for a font with a given tag.\n@optional {query: str(string) # Tag string}\n@returns(200) 200  response\n@errors {401: 401  response, 404: 404  response}\n\n@endpoint GET /quote/image/font/list\n@desc Lists background images in your private collection.\n@optional {start: int(integer) # Response is paged. This parameter determines where the response should start.}\n@returns(200) 200  response\n@errors {401: 401  response, 404: 404  response}\n\n@endpoint POST /quote/image/font/tags/add\n@desc Add a tag to a given font.\n@required {id: str(string) # Font ID, tags: str(string) # Comma Separated tags}\n@returns(200) 200  response\n@errors {401: 401  response, 404: 404  response}\n\n@endpoint POST /quote/image/font/tags/remove\n@desc Remove a tag from a given Font.\n@required {id: str(string) # Font ID, tags: str(string) # Comma Separated tags}\n@returns(200) 200  response\n@errors {401: 401  response, 404: 404  response}\n\n@endgroup\n\n@end\n"}}