upapi-io Utility API
The Utility API from upapi-io — 4 operation(s) for utility.
The Utility API from upapi-io — 4 operation(s) for utility.
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-utility-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 Utility 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: Utility
paths:
/email-read-verification-code.post:
post:
operationId: email_read_verification_code_post
summary: Read Email Verification Code
description: Connect to an IMAP mailbox and extract a verification code from the SUBJECT of a recent email. Polls with retries. Supports Gmail (with App Password), Outlook, and any IMAP server. Generic — works for any platform that puts its code in the subject line; for a token that only appears in the body, use email-read-verification-link.
tags:
- Utility
x-upapi-unit-weight: 1
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- imapUser
- imapPass
- senderFilter
properties:
imapHost:
type: string
default: imap.gmail.com
description: IMAP server hostname
imapPass:
type: string
description: IMAP password or app password
imapPort:
type: integer
default: 993
description: IMAP server port
imapUser:
type: string
description: IMAP username (email address)
maxRetries:
type: integer
default: 5
description: Number of polling attempts
codePattern:
type: string
default: \b(\d{6})\b
description: Regex to extract a verification code from the email SUBJECT (the body is not fetched — use email-read-verification-link for body tokens)
retryDelayMs:
type: integer
default: 10000
description: Milliseconds between retry attempts
senderFilter:
type: string
description: Filter emails by sender (e.g. noreply@redditmail.com)
maxAgeMinutes:
type: integer
default: 15
description: Only look at emails received within this many minutes
subjectPattern:
type: string
description: Regex pattern to match subject line
recipientFilter:
type: string
description: Filter by recipient address (useful with catch-all domains)
additionalProperties: false
responses:
'200':
description: Success
content:
application/json:
schema:
type: object
required:
- code
- subject
- from
- to
- receivedAt
- fetchedAt
- elapsedMs
properties:
to:
type: string
description: Recipient address
code:
type: string
description: Extracted verification code
from:
type: string
description: Sender address
subject:
type: string
description: Email subject line
elapsedMs:
type: integer
minimum: 0
fetchedAt:
type: string
receivedAt:
type: string
description: When the email was received
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'
/email-read-verification-link.post:
post:
operationId: email_read_verification_link_post
summary: Read Email Verification Link
description: Connect to an IMAP mailbox and extract a link from the BODY of a recent email. Decodes quoted-printable/base64 bodies before matching, so URLs split across lines are returned whole. Polls with retries. Use this for verification mail whose token is a one-time URL rather than a code in the subject.
tags:
- Utility
x-upapi-unit-weight: 1
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- imapUser
- imapPass
- senderFilter
properties:
imapHost:
type: string
default: imap.gmail.com
description: IMAP server hostname
imapPass:
type: string
description: IMAP password or app password
imapPort:
type: integer
default: 993
description: IMAP server port
imapUser:
type: string
description: IMAP username (email address)
mailboxes:
type: array
items:
type: string
description: 'Mailboxes to search, in order. Omit to search INBOX plus whatever the server flags \All and \Junk (Gmail: All Mail and Spam) — providers routinely file one-time verification links as junk, and searching INBOX alone reports them as never sent.'
maxRetries:
type: integer
default: 5
description: Number of polling attempts
linkPattern:
type: string
default: https?://[^\s"'<>)\]]+
description: Regex matched against the DECODED body. The first capture group is returned when present, otherwise the whole match. Default matches any http(s) URL.
retryDelayMs:
type: integer
default: 10000
description: Milliseconds between retry attempts
senderFilter:
type: string
description: Filter emails by sender (e.g. noreply@reddit.com)
maxAgeMinutes:
type: integer
default: 15
description: Only look at emails received within this many minutes
subjectPattern:
type: string
description: Regex matched against the subject, to pick one of several mails from the same sender
recipientFilter:
type: string
description: Filter by recipient address (useful with catch-all domains)
additionalProperties: false
responses:
'200':
description: Success
content:
application/json:
schema:
type: object
required:
- link
- allLinks
- subject
- from
- to
- receivedAt
- mailbox
- fetchedAt
- elapsedMs
properties:
to:
type: string
description: Recipient address
from:
type: string
description: Sender address
link:
type: string
description: First body match — the link to follow
mailbox:
type: string
description: Which mailbox the hit came from. A link found in Spam is still a valid link, but it tells the caller the provider is filtering this sender.
subject:
type: string
description: Email subject line
allLinks:
type: array
items:
type: string
description: Every distinct match in the body, in document order
elapsedMs:
type: integer
minimum: 0
fetchedAt:
type: string
receivedAt:
type: string
description: When the email was received
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'
/email-generate-address.post:
post:
operationId: email_generate_address_post
summary: Email Generate Address
description: Generate a fresh disposable email address for account signup. Supports catch-all domains, plus-addressing, and pre-created Outlook aliases.
tags:
- Utility
x-upapi-unit-weight: 1
requestBody:
required: true
content:
application/json:
schema:
type: object
title: Input
properties:
domain:
title: Domain
default: null
description: Domain for catch_all (e.g. locj.space); plus_address uses baseAddress
type:
- string
- 'null'
platform:
title: Platform
default: null
description: Target platform hint (GITHUB, TIKTOK, INSTAGRAM, LINKEDIN, REDDIT)
type:
- string
- 'null'
strategy:
type: string
title: Strategy
default: catch_all
description: 'Email strategy: catch_all, plus_address, or outlook_alias'
baseAddress:
title: Baseaddress
default: null
description: Base email for plus_address strategy (e.g. julia.sousa938@outlook.com)
type:
- string
- 'null'
aliasAddress:
title: Aliasaddress
default: null
description: Pre-created alias for outlook_alias strategy
type:
- string
- 'null'
responses:
'200':
description: Success
content:
application/json:
schema:
type: object
title: Output
required:
- success
- email
- firstName
- lastName
- username
- strategy
- readTransport
- generatedAt
properties:
email:
type: string
title: Email
success:
type: boolean
title: Success
lastName:
type: string
title: Lastname
strategy:
type: string
title: Strategy
username:
type: string
title: Username
firstName:
type: string
title: Firstname
generatedAt:
type: string
title: Generatedat
readTransport:
type: string
title: Readtransport
'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'
/email-read-verification-code-graph.post:
post:
operationId: email_read_verification_code_graph_post
summary: Email Read Verification Code (Microsoft Graph)
description: Poll an outlook.com mailbox over Microsoft Graph for a verification code. For accounts whose IMAP switch is off. Returns the code or an error.
tags:
- Utility
x-upapi-unit-weight: 1
requestBody:
required: true
content:
application/json:
schema:
type: object
title: Input
required:
- graphClientId
- graphRefreshToken
- senderContains
properties:
codePattern:
title: Codepattern
default: null
description: 'Regex pattern for the code (default: 6-digit number)'
type:
- string
- 'null'
pollSeconds:
type: number
title: Pollseconds
default: 5
maximum: 30
minimum: 1
description: Seconds between polls
graphClientId:
type: string
title: Graphclientid
minLength: 1
description: Microsoft public app client_id
senderContains:
type: string
title: Sendercontains
minLength: 1
description: Substring to match in the From header (e.g. 'tiktok', 'github')
timeoutSeconds:
type: number
title: Timeoutseconds
default: 120
maximum: 300
minimum: 5
description: Max seconds to poll
minEpochSeconds:
title: Minepochseconds
default: null
description: Ignore messages received before this Unix timestamp
type:
- number
- 'null'
graphRefreshToken:
type: string
title: Graphrefreshtoken
minLength: 1
description: OAuth refresh token (Mail.Read offline_access)
recipientContains:
title: Recipientcontains
default: null
description: Substring to match in the To header — REQUIRED to tell plus-addresses (base+alias@outlook.com) apart when many accounts share one inbox
type:
- string
- 'null'
responses:
'200':
description: Success
content:
application/json:
schema:
type: object
title: Output
required:
- success
- elapsedMs
properties:
code:
title: Code
default: null
type:
- string
- 'null'
error:
title: Error
default: null
type:
- string
- 'null'
success:
type: boolean
title: Success
elapsedMs:
type: integer
title: Elapsedms
'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