{"openapi":"3.1.0","info":{"title":"Tumblr (BYOK) API","version":"0.1.0","description":"Tumblr (BYOK) lets an AI assistant read your own Tumblr data through the Tumblr API with a key you supply (OAuth consumer key). Read-only: 8 tools (get_blog_info, list_blog_posts, list_blog_posts_by_type, get_blog_post, list_blog_likes, list_post_notes, list_tagged_posts, get_tumblr_stats). The BYOK key travels with each request, is used for that one call only and is never stored, logged or...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-tumblr.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-tumblr/docs"},"termsOfService":"https://connectorbay.com/byok-tumblr/terms"},"servers":[{"url":"https://byok-tumblr.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-tumblr/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/get_blog_info":{"post":{"operationId":"get_blog_info","summary":"Show a blog's title, short name, URL, description, total post count, last update time and whether it takes questions. Us","description":"Show a blog's title, short name, URL, description, total post count, last update time and whether it takes questions. Use for \"How many posts does the staff.tumblr.com blog have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"blog_identifier":{"description":"Blog to read: its host name such as 'staff.tumblr.com', a custom domain, or the short name 'staff'.","maxLength":200,"title":"Blog Identifier","type":"string"}},"required":["blog_identifier"],"title":"get_blog_infoArguments","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/list_blog_posts":{"post":{"operationId":"list_blog_posts","summary":"List a blog's published posts, newest first, optionally narrowed by one tag or a time window. Each post is returned with","description":"List a blog's published posts, newest first, optionally narrowed by one tag or a time window. Each post is returned with all of the fields the provider sends for its type, so keep the limit small. Use for \"What did staff.tumblr.com post most recently\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"blog_identifier":{"description":"Blog to read: its host name such as 'staff.tumblr.com', a custom domain, or the short name 'staff'.","maxLength":200,"title":"Blog Identifier","type":"string"},"limit":{"anyOf":[{"maximum":20,"minimum":1,"type":"integer"},{"type":"null"}],"default":10,"description":"How many posts to return (1 to 20).","title":"Limit"},"offset":{"anyOf":[{"maximum":100000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Post number to start at, 0 for the newest. Cannot be combined with before.","title":"Offset"},"tag":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only posts carrying this tag.","title":"Tag"},"before":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Only posts published before this Unix time in seconds; best for paging.","title":"Before"},"after":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Only posts published after this Unix time in seconds; best used with sort asc.","title":"After"},"sort":{"anyOf":[{"enum":["asc","desc"],"type":"string"},{"type":"null"}],"default":null,"description":"desc for newest first (default) or asc for oldest first.","title":"Sort"},"filter":{"anyOf":[{"enum":["text","raw"],"type":"string"},{"type":"null"}],"default":null,"description":"Post body format: text for plain text without HTML, raw for what the author typed. Leave out for HTML.","title":"Filter"},"reblog_info":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to include the reblogged_* fields.","title":"Reblog Info"},"notes_info":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to include note counts and note details.","title":"Notes Info"}},"required":["blog_identifier"],"title":"list_blog_postsArguments","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/list_blog_posts_by_type":{"post":{"operationId":"list_blog_posts_by_type","summary":"List a blog's published posts of one type (text, quote, link, answer, video, audio, photo or chat), newest first. Each p","description":"List a blog's published posts of one type (text, quote, link, answer, video, audio, photo or chat), newest first. Each post is returned with all of the fields the provider sends for its type, so keep the limit small. Use for \"Show the latest photo posts of staff.tumblr.com\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"blog_identifier":{"description":"Blog to read: its host name such as 'staff.tumblr.com', a custom domain, or the short name 'staff'.","maxLength":200,"title":"Blog Identifier","type":"string"},"post_type":{"description":"Type of post: text, quote, link, answer, video, audio, photo or chat.","enum":["text","quote","link","answer","video","audio","photo","chat"],"title":"Post Type","type":"string"},"limit":{"anyOf":[{"maximum":20,"minimum":1,"type":"integer"},{"type":"null"}],"default":10,"description":"How many posts to return (1 to 20).","title":"Limit"},"offset":{"anyOf":[{"maximum":100000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Post number to start at, 0 for the newest. Cannot be combined with before.","title":"Offset"},"tag":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only posts carrying this tag.","title":"Tag"},"before":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Only posts published before this Unix time in seconds.","title":"Before"},"filter":{"anyOf":[{"enum":["text","raw"],"type":"string"},{"type":"null"}],"default":null,"description":"Post body format: text for plain text without HTML, raw for what the author typed. Leave out for HTML.","title":"Filter"}},"required":["blog_identifier","post_type"],"title":"list_blog_posts_by_typeArguments","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_blog_post":{"post":{"operationId":"get_blog_post","summary":"Get one published post of a blog by its numeric post id, with its type, tags, note count and content. Use for \"Get post ","description":"Get one published post of a blog by its numeric post id, with its type, tags, note count and content. Use for \"Get post 7504154594 from david.tumblr.com\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"blog_identifier":{"description":"Blog to read: its host name such as 'staff.tumblr.com', a custom domain, or the short name 'staff'.","maxLength":200,"title":"Blog Identifier","type":"string"},"id":{"description":"Numeric id of the post.","minimum":1,"title":"Id","type":"integer"},"notes_info":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to include note counts and note details.","title":"Notes Info"},"filter":{"anyOf":[{"enum":["text","raw"],"type":"string"},{"type":"null"}],"default":null,"description":"Post body format: text for plain text without HTML, raw for what the author typed. Leave out for HTML.","title":"Filter"}},"required":["blog_identifier","id"],"title":"get_blog_postArguments","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/list_blog_likes":{"post":{"operationId":"list_blog_likes","summary":"List posts a blog has publicly liked, newest like first, with the total number of likes. Empty when the blog hides its l","description":"List posts a blog has publicly liked, newest like first, with the total number of likes. Empty when the blog hides its likes. Use for \"What has staff.tumblr.com liked lately\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"blog_identifier":{"description":"Blog to read: its host name such as 'staff.tumblr.com', a custom domain, or the short name 'staff'.","maxLength":200,"title":"Blog Identifier","type":"string"},"limit":{"anyOf":[{"maximum":20,"minimum":1,"type":"integer"},{"type":"null"}],"default":10,"description":"How many posts to return (1 to 20).","title":"Limit"},"offset":{"anyOf":[{"maximum":1000,"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Liked post number to start at; at most 1000. Use only one of offset, before or after.","title":"Offset"},"before":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Likes made before this Unix time in seconds. Use only one of offset, before or after.","title":"Before"},"after":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Likes made after this Unix time in seconds. Use only one of offset, before or after.","title":"After"}},"required":["blog_identifier"],"title":"list_blog_likesArguments","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/list_post_notes":{"post":{"operationId":"list_post_notes","summary":"List the notes (likes, reblogs and replies) on one post of a blog, newest first, with total counts and a link to the nex","description":"List the notes (likes, reblogs and replies) on one post of a blog, newest first, with total counts and a link to the next page. Use for \"Who reblogged post 1234567890000 on staff.tumblr.com\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"blog_identifier":{"description":"Blog to read: its host name such as 'staff.tumblr.com', a custom domain, or the short name 'staff'.","maxLength":200,"title":"Blog Identifier","type":"string"},"id":{"description":"Numeric id of the post.","minimum":1,"title":"Id","type":"integer"},"mode":{"anyOf":[{"enum":["all","likes","conversation","rollup","reblogs_with_tags"],"type":"string"},{"type":"null"}],"default":"all","description":"all, likes, conversation, rollup or reblogs_with_tags: which kinds of notes to return.","title":"Mode"},"before_timestamp":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Only notes created before this Unix time in seconds (page back with it).","title":"Before Timestamp"}},"required":["blog_identifier","id"],"title":"list_post_notesArguments","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/list_tagged_posts":{"post":{"operationId":"list_tagged_posts","summary":"List recent public posts across Tumblr that carry a tag, newest first. The provider does not document the answer fields,","description":"List recent public posts across Tumblr that carry a tag, newest first. The provider does not document the answer fields, so the answer is passed through, capped. Use for \"What is being posted on Tumblr with the tag 'gif'\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"tag":{"description":"Tag to look up, for example 'gif'.","maxLength":200,"title":"Tag","type":"string"},"before":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Only posts before this Unix time in seconds (page back with it).","title":"Before"},"limit":{"anyOf":[{"maximum":20,"minimum":1,"type":"integer"},{"type":"null"}],"default":10,"description":"How many posts to return (1 to 20).","title":"Limit"},"filter":{"anyOf":[{"enum":["text","raw"],"type":"string"},{"type":"null"}],"default":null,"description":"Post body format: text for plain text without HTML, raw for what the author typed. Leave out for HTML.","title":"Filter"}},"required":["tag"],"title":"list_tagged_postsArguments","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_tumblr_stats":{"post":{"operationId":"get_tumblr_stats","summary":"Show the total number of blogs on Tumblr. Use for \"How many blogs exist on Tumblr\".","description":"Show the total number of blogs on Tumblr. Use for \"How many blogs exist on Tumblr\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"get_tumblr_statsArguments","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}}}}