upapi-io SEO tools API
The SEO tools API from upapi-io — 5 operation(s) for seo tools.
The SEO tools API from upapi-io — 5 operation(s) for seo tools.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/upapi-io:upapi-io-seo-tools-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: up SEO tools API
description: 'Browser-powered API marketplace. 103 of 103 APIs included (capped at 449 for RapidAPI compatibility).
Billing: a call spends WEIGHTED UNITS against your plan''s monthly quota — not a flat one call = one unit. A light HTTP relay costs 1 unit; heavy work costs more, up to 25 (search-engine result pages 25, headless-browser renders and page scrapes 20, residential-proxy social reads 15, LLM completions 10, datacenter social/media reads 4). Every operation declares its own price as `x-upapi-unit-weight`, so a workload can be costed before it is run. Quota state rides on every response in the `RateLimit` / `RateLimit-Policy` headers.'
version: 1.0.0
servers:
- url: https://api.upapi.io
security:
- ApiKeyAuth: []
tags:
- name: SEO tools
paths:
/bing-serp.get:
post:
operationId: bing_serp_get
summary: Get Bing Search Results
description: Get Bing search results (title, URL, snippet) for a query, fetched through a real headless browser.
tags:
- SEO tools
x-upapi-unit-weight: 25
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- query
properties:
limit:
type: integer
default: 10
maximum: 50
minimum: 1
description: Max results
query:
type: string
maxLength: 200
minLength: 1
description: Search query
country:
type: string
default: us
maxLength: 2
minLength: 2
description: Country code (ISO 3166-1 alpha-2)
additionalProperties: false
responses:
'200':
description: Success
content:
application/json:
schema:
type: object
required:
- query
- totalCount
- results
- fetchedAt
properties:
query:
type: string
results:
type: array
items:
type: object
required:
- position
- title
- url
- displayUrl
- snippet
properties:
url:
type: string
format: uri
title:
type: string
snippet:
type: string
position:
type: integer
exclusiveMinimum: 0
displayUrl:
type: string
additionalProperties: false
fetchedAt:
type: string
totalCount:
type: integer
minimum: 0
additionalProperties: false
'400':
description: Invalid input
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'401':
description: Missing or invalid API key
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'403':
description: 'FORBIDDEN — the key is valid but not allowed to make this call. Three causes: the key belongs to a different organization than the one in the path; the key was minted without the scope this endpoint requires (the message names the missing scope); or the operation is not included in the organization''s plan — a plan gate, which no retry clears. Upgrade the plan or mint a key with the right scope.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: Unknown marketplace API
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'422':
description: Missing required field(s)
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: 'Two DIFFERENT conditions share this status, told apart by `error.code`. `RATE_LIMITED` — the per-minute burst window is full; it refills on its own, so back off and retry (`Retry-After` is seconds, typically 60) and nothing was spent. `QUOTA_EXCEEDED` — a BUDGET is gone: the monthly weighted-unit quota, a trial''s unit cap, or the plan''s hosted-function compute seconds. Retrying on a short backoff will never succeed; `Retry-After` points at the real refill (the next UTC month, or the end of the trial), and upgrading the plan is usually the intended fix.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'502':
description: Upstream execution error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'503':
description: Data store temporarily unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'504':
description: Request timed out
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
/duckduckgo-search.get:
post:
operationId: duckduckgo_search_get
summary: Get DuckDuckGo Search Results
description: Get DuckDuckGo search results (title, URL, snippet) for a query, fetched through a real headless browser.
tags:
- SEO tools
x-upapi-unit-weight: 25
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- query
properties:
limit:
type: integer
default: 10
maximum: 50
minimum: 1
description: Max results
query:
type: string
maxLength: 200
minLength: 1
description: Search query
safeSearch:
enum:
- strict
- moderate
- 'off'
type: string
default: moderate
description: Safe-search level; invalid values are rejected by the gateway
additionalProperties: false
responses:
'200':
description: Success
content:
application/json:
schema:
type: object
required:
- query
- totalCount
- results
- fetchedAt
- engine
- elapsedMs
properties:
query:
type: string
engine:
type: string
enum:
- duckduckgo-html
results:
type: array
items:
type: object
required:
- position
- title
- url
- displayUrl
- snippet
properties:
url:
type: string
format: uri
title:
type: string
snippet:
type: string
position:
type: integer
exclusiveMinimum: 0
displayUrl:
type: string
additionalProperties: false
elapsedMs:
type: integer
minimum: 0
fetchedAt:
type: string
totalCount:
type: integer
minimum: 0
additionalProperties: false
'400':
description: Invalid input
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'401':
description: Missing or invalid API key
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'403':
description: 'FORBIDDEN — the key is valid but not allowed to make this call. Three causes: the key belongs to a different organization than the one in the path; the key was minted without the scope this endpoint requires (the message names the missing scope); or the operation is not included in the organization''s plan — a plan gate, which no retry clears. Upgrade the plan or mint a key with the right scope.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: Unknown marketplace API
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'422':
description: Missing required field(s)
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: 'Two DIFFERENT conditions share this status, told apart by `error.code`. `RATE_LIMITED` — the per-minute burst window is full; it refills on its own, so back off and retry (`Retry-After` is seconds, typically 60) and nothing was spent. `QUOTA_EXCEEDED` — a BUDGET is gone: the monthly weighted-unit quota, a trial''s unit cap, or the plan''s hosted-function compute seconds. Retrying on a short backoff will never succeed; `Retry-After` points at the real refill (the next UTC month, or the end of the trial), and upgrading the plan is usually the intended fix.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'502':
description: Upstream execution error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'503':
description: Data store temporarily unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'504':
description: Request timed out
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
/google-serp.get:
post:
operationId: google_serp_get
summary: Get Google Search Results
description: Get Google search results (title, URL, snippet) for a query, fetched through a real headless browser.
tags:
- SEO tools
x-upapi-unit-weight: 25
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- query
properties:
limit:
type: integer
default: 10
maximum: 50
minimum: 1
description: Max results
query:
type: string
maxLength: 200
minLength: 1
description: Search query
country:
type: string
default: us
maxLength: 2
minLength: 2
description: Country code (ISO 3166-1 alpha-2)
language:
type: string
default: en
maxLength: 5
minLength: 2
description: Language code
additionalProperties: false
responses:
'200':
description: Success
content:
application/json:
schema:
type: object
required:
- query
- totalCount
- results
- fetchedAt
properties:
query:
type: string
results:
type: array
items:
type: object
required:
- position
- title
- url
- displayUrl
- snippet
properties:
url:
type: string
format: uri
title:
type: string
snippet:
type: string
position:
type: integer
exclusiveMinimum: 0
displayUrl:
type: string
additionalProperties: false
fetchedAt:
type: string
totalCount:
type: integer
minimum: 0
additionalProperties: false
'400':
description: Invalid input
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'401':
description: Missing or invalid API key
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'403':
description: 'FORBIDDEN — the key is valid but not allowed to make this call. Three causes: the key belongs to a different organization than the one in the path; the key was minted without the scope this endpoint requires (the message names the missing scope); or the operation is not included in the organization''s plan — a plan gate, which no retry clears. Upgrade the plan or mint a key with the right scope.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: Unknown marketplace API
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'422':
description: Missing required field(s)
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: 'Two DIFFERENT conditions share this status, told apart by `error.code`. `RATE_LIMITED` — the per-minute burst window is full; it refills on its own, so back off and retry (`Retry-After` is seconds, typically 60) and nothing was spent. `QUOTA_EXCEEDED` — a BUDGET is gone: the monthly weighted-unit quota, a trial''s unit cap, or the plan''s hosted-function compute seconds. Retrying on a short backoff will never succeed; `Retry-After` points at the real refill (the next UTC month, or the end of the trial), and upgrading the plan is usually the intended fix.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'502':
description: Upstream execution error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'503':
description: Data store temporarily unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'504':
description: Request timed out
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
/opengraph-parse.get:
post:
operationId: opengraph_parse_get
summary: Parse Open Graph Metadata
description: Fetch a URL and extract its Open Graph, Twitter Card, , description, canonical, and favicon metadata - everything needed to render a rich link preview.
tags:
- SEO tools
x-upapi-unit-weight: 1
requestBody:
required: true
content:
application/json:
schema:
type: object
title: Input
required:
- url
properties:
url:
type: string
title: Url
format: uri
maxLength: 2083
minLength: 1
description: URL to fetch + parse for social preview metadata
responses:
'200':
description: Success
content:
application/json:
schema:
type: object
title: Output
required:
- url
- finalUrl
- status
- title
- description
- ogTitle
- ogDescription
- ogImage
- ogType
- ogSiteName
- twitterTitle
- twitterDescription
- twitterImage
- canonical
- favicon
- fetchedAt
properties:
url:
type: string
title: Url
title:
type: string
title: Title
ogType:
title: Ogtype
type:
- string
- 'null'
status:
type: integer
title: Status
favicon:
title: Favicon
type:
- string
- 'null'
ogImage:
title: Ogimage
type:
- string
- 'null'
ogTitle:
title: Ogtitle
type:
- string
- 'null'
finalUrl:
type: string
title: Finalurl
canonical:
title: Canonical
type:
- string
- 'null'
fetchedAt:
type: string
title: Fetchedat
ogSiteName:
title: Ogsitename
type:
- string
- 'null'
description:
title: Description
type:
- string
- 'null'
twitterImage:
title: Twitterimage
type:
- string
- 'null'
twitterTitle:
title: Twittertitle
type:
- string
- 'null'
ogDescription:
title: Ogdescription
type:
- string
- 'null'
twitterDescription:
title: Twitterdescription
type:
- string
- 'null'
'400':
description: Invalid input
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'401':
description: Missing or invalid API key
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'403':
description: 'FORBIDDEN — the key is valid but not allowed to make this call. Three causes: the key belongs to a different organization than the one in the path; the key was minted without the scope this endpoint requires (the message names the missing scope); or the operation is not included in the organization''s plan — a plan gate, which no retry clears. Upgrade the plan or mint a key with the right scope.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: Unknown marketplace API
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'422':
description: Missing required field(s)
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: 'Two DIFFERENT conditions share this status, told apart by `error.code`. `RATE_LIMITED` — the per-minute burst window is full; it refills on its own, so back off and retry (`Retry-After` is seconds, typically 60) and nothing was spent. `QUOTA_EXCEEDED` — a BUDGET is gone: the monthly weighted-unit quota, a trial''s unit cap, or the plan''s hosted-function compute seconds. Retrying on a short backoff will never succeed; `Retry-After` points at the real refill (the next UTC month, or the end of the trial), and upgrading the plan is usually the intended fix.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'502':
description: Upstream execution error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'503':
description: Data store temporarily unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'504':
description: Request timed out
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
/sitemap-parse.get:
post:
operationId: sitemap_parse_get
summary: Parse Sitemap
description: Fetch and parse an XML sitemap, sitemap index, or plaintext URL list. Returns URL entries (with lastmod/changefreq/priority) or child sitemap locations.
tags:
- SEO tools
x-upapi-unit-weight: 1
requestBody:
required: true
content:
application/json:
schema:
type: object
title: Input
required:
- url
properties:
url:
type: string
title: Url
format: uri
maxLength: 2083
minLength: 1
description: Sitemap URL (usually /sitemap.xml or a sitemap index)
limit:
type: integer
title: Limit
default: 500
maximum: 5000
minimum: 1
description: Max URLs to return
responses:
'200':
description: Success
content:
application/json:
schema:
type: object
title: Output
required:
- sitemapUrl
- type
- totalFound
- returned
- urls
- childSitemaps
- fetchedAt
properties:
type:
type: string
title: Type
urls:
type: array
items:
type: object
title: UrlEntry
required:
- loc
- lastmod
- changefreq
- priority
properties:
loc:
type: string
title: Loc
lastmod:
title: Lastmod
type:
- string
- 'null'
priority:
title: Priority
type:
- number
- 'null'
changefreq:
title: Changefreq
type:
- string
- 'null'
title: Urls
returned:
type: integer
title: Returned
fetchedAt:
type: string
title: Fetchedat
sitemapUrl:
type: string
title: Sitemapurl
totalFound:
type: integer
title: Totalfound
childSitemaps:
type: array
items:
type: string
title: Childsitemaps
'400':
description: Invalid input
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'401':
description: Missing or invalid API key
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'403':
description: 'FORBIDDEN — the key is valid but not allowed to make this call. Three causes: the key belongs to a different organization than the one in the path; the key was minted without the scope this endpoint requires (the message names the missing scope); or the operation is not included in the organization''s plan — a plan gate, which no retry clears. Upgrade the plan or mint a key with the right scope.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: Unknown marketplace API
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'422':
description: Missing required field(s)
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: 'Two DIFFERENT conditions share this status, told apart by `error.code`. `RATE_LIMITED` — the per-minute burst window is full; it refills on its own, so back off and retry (`Retry-After` is seconds, typically 60) and nothing was spent. `QUOTA_EXCEEDED` — a BUDGET is gone: the monthly weighted-unit quota, a trial''s unit cap, or the plan''s hosted-function compute seconds. Retrying on a short backoff will never succeed; `Retry-After` points at the real refill (the next UTC month, or the end of the trial), and upgrading the plan is usually the intended fix.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'502':
description: Upstream execution error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'503':
description: Data store temporarily unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'504':
description: Request timed out
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
components:
schemas:
Error:
type: object
required:
- error
properties:
error:
type: object
required:
- code
- message
properties:
code:
type: string
message:
type: string
functionId:
type: string
securitySchemes:
ApiKeyAuth:
type: apiKey
in: header
name: x-api-key