upapi-io Utility API

The Utility API from upapi-io — 4 operation(s) for utility.

Operations 4

POST /email-read-verification-code.post Read Email Verification Code #
POST /email-read-verification-link.post Read Email Verification Link #
POST /email-generate-address.post Email Generate Address #
POST /email-read-verification-code-graph.post Email Read Verification Code (Microsoft Graph) #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • 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.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/upapi-io:upapi-io-utility-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

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 Specification

upapi-io-utility-api-openapi.yml Raw ↑
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