{"openapi":"3.1.0","info":{"title":"Pexels (BYOK) API","version":"0.1.0","description":"Pexels (BYOK) lets an AI assistant read your own Pexels data through the Pexels API with a key you supply (API key). Read-only: 8 tools (search_photos, curated_photos, get_photo, search_videos, popular_videos, featured_collections, my_collections, get_collection_media). The BYOK key travels with each request, is used for that one call only and is never stored, logged or cached; it is only ever...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-pexels.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-pexels/docs"},"termsOfService":"https://connectorbay.com/byok-pexels/terms"},"servers":[{"url":"https://byok-pexels.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-pexels/docs"},"security":[{"upstreamKey":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."},"upstreamKey":{"type":"apiKey","in":"header","name":"X-Upstream-Key","description":"Your own key for the service this connector wraps (bring your own key). Used for that one call only; never stored, logged or cached."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/search_photos":{"post":{"operationId":"search_photos","summary":"Search Pexels photos by keyword with optional orientation, size and colour filters. Returns photographer credit, page li","description":"Search Pexels photos by keyword with optional orientation, size and colour filters. Returns photographer credit, page link and image URLs. Up to 80 results per page. Use for \"Find landscape photos of the sea on Pexels\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"query":{"description":"What to look for, for example 'ocean waves'.","maxLength":200,"title":"Query","type":"string"},"orientation":{"anyOf":[{"enum":["landscape","portrait","square"],"type":"string"},{"type":"null"}],"default":null,"description":"Photo shape: landscape, portrait or square.","title":"Orientation"},"size":{"anyOf":[{"enum":["large","medium","small"],"type":"string"},{"type":"null"}],"default":null,"description":"Minimum size: large (24 MP), medium (12 MP) or small (4 MP).","title":"Size"},"color":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"A colour name or a hex colour code to filter by.","title":"Color"},"locale":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Language of the search query as a locale code such as en-US or ja-JP.","title":"Locale"},"per_page":{"anyOf":[{"maximum":80,"minimum":1,"type":"integer"},{"type":"null"}],"default":15,"description":"How many results to return (1 to 80).","title":"Per Page"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"}},"required":["query"],"title":"search_photosArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/curated_photos":{"post":{"operationId":"curated_photos","summary":"List the photos Pexels curates, refreshed regularly, with photographer credit and image URLs. Up to 80 per page. Use for","description":"List the photos Pexels curates, refreshed regularly, with photographer credit and image URLs. Up to 80 per page. Use for \"Show me today's curated Pexels photos\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"per_page":{"anyOf":[{"maximum":80,"minimum":1,"type":"integer"},{"type":"null"}],"default":15,"description":"How many results to return (1 to 80).","title":"Per Page"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"}},"title":"curated_photosArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_photo":{"post":{"operationId":"get_photo","summary":"Get one Pexels photo by its numeric id: size, photographer, average colour, alt text and image URLs. Use for \"Get Pexels","description":"Get one Pexels photo by its numeric id: size, photographer, average colour, alt text and image URLs. Use for \"Get Pexels photo 2014422\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"id":{"description":"Numeric Pexels photo id, for example 2014422.","title":"Id","type":"integer"}},"required":["id"],"title":"get_photoArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/search_videos":{"post":{"operationId":"search_videos","summary":"Search Pexels videos by keyword with orientation and size filters. Returns duration, page link, preview image, creator a","description":"Search Pexels videos by keyword with orientation and size filters. Returns duration, page link, preview image, creator and downloadable file variants. Up to 80 per page. Use for \"Find short Pexels videos of city traffic\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"query":{"description":"What to look for, for example 'city traffic'.","maxLength":200,"title":"Query","type":"string"},"orientation":{"anyOf":[{"enum":["landscape","portrait","square"],"type":"string"},{"type":"null"}],"default":null,"description":"Video shape: landscape, portrait or square.","title":"Orientation"},"size":{"anyOf":[{"enum":["large","medium","small"],"type":"string"},{"type":"null"}],"default":null,"description":"Minimum size: large (4K), medium (Full HD) or small (HD).","title":"Size"},"locale":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Language of the search query as a locale code such as en-US.","title":"Locale"},"per_page":{"anyOf":[{"maximum":80,"minimum":1,"type":"integer"},{"type":"null"}],"default":15,"description":"How many results to return (1 to 80).","title":"Per Page"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"}},"required":["query"],"title":"search_videosArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/popular_videos":{"post":{"operationId":"popular_videos","summary":"List currently popular Pexels videos, optionally limited by minimum width, height or duration. Up to 80 per page. Use fo","description":"List currently popular Pexels videos, optionally limited by minimum width, height or duration. Up to 80 per page. Use for \"What are the popular videos on Pexels right now\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"min_width":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only videos at least this many pixels wide.","title":"Min Width"},"min_height":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only videos at least this many pixels tall.","title":"Min Height"},"min_duration":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only videos at least this many seconds long.","title":"Min Duration"},"max_duration":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only videos at most this many seconds long.","title":"Max Duration"},"per_page":{"anyOf":[{"maximum":80,"minimum":1,"type":"integer"},{"type":"null"}],"default":15,"description":"How many results to return (1 to 80).","title":"Per Page"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"}},"title":"popular_videosArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/featured_collections":{"post":{"operationId":"featured_collections","summary":"List the collections Pexels features, with title, description and photo and video counts. Up to 80 per page. Use for \"Wh","description":"List the collections Pexels features, with title, description and photo and video counts. Up to 80 per page. Use for \"Which collections is Pexels featuring\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"per_page":{"anyOf":[{"maximum":80,"minimum":1,"type":"integer"},{"type":"null"}],"default":15,"description":"How many results to return (1 to 80).","title":"Per Page"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"}},"title":"featured_collectionsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/my_collections":{"post":{"operationId":"my_collections","summary":"List the collections that belong to the account behind the key, with title and photo and video counts. Up to 80 per page","description":"List the collections that belong to the account behind the key, with title and photo and video counts. Up to 80 per page. Use for \"List my own Pexels collections\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"per_page":{"anyOf":[{"maximum":80,"minimum":1,"type":"integer"},{"type":"null"}],"default":15,"description":"How many results to return (1 to 80).","title":"Per Page"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"}},"title":"my_collectionsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_collection_media":{"post":{"operationId":"get_collection_media","summary":"List the photos and videos inside one collection, optionally only photos or only videos and in ascending or descending o","description":"List the photos and videos inside one collection, optionally only photos or only videos and in ascending or descending order. Up to 80 per page. Use for \"Show the photos in Pexels collection 8xntnhb\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"id":{"description":"Collection id as returned by the collection listings, for example '8xntnhb'.","maxLength":200,"title":"Id","type":"string"},"type":{"anyOf":[{"enum":["photos","videos"],"type":"string"},{"type":"null"}],"default":null,"description":"Limit to photos or videos (default: both).","title":"Type"},"sort":{"anyOf":[{"enum":["asc","desc"],"type":"string"},{"type":"null"}],"default":"asc","description":"Order of the media: asc or desc.","title":"Sort"},"per_page":{"anyOf":[{"maximum":80,"minimum":1,"type":"integer"},{"type":"null"}],"default":15,"description":"How many results to return (1 to 80).","title":"Per Page"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"}},"required":["id"],"title":"get_collection_mediaArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}