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/firstsales-io:firstsales-io-analyze-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
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: 3.2.0
info:
title: Firstsales Io Analyze API
version: 1.0.0
contact:
name: FirstSales Support
email: firstsales@support.communicate.so
url: https://firstsales.io
license:
name: Terms of Service
url: https://firstsales.io/terms-of-service/
termsOfService: https://firstsales.io/terms-of-service/
x-apiVersioning:
strategy: url-path
current: v1
pattern: https://firstsales.io/api/v1/{operation}
policyUrl: https://firstsales.io/developers/#versioning
note: A breaking change ships under a new prefix (/api/v2/); v1 keeps its contract. The unprefixed /api/{operation} form is an unversioned alias of the current version and may change without notice - call the /api/v1/ form.
x-deprecationPolicy:
minimumNoticeDays: 180
signalling: 'A deprecated version''s responses carry Deprecation: true and a Sunset header with the retirement date (RFC 8594), plus a Link rel="deprecation" to the migration notes.'
announcement: https://firstsales.io/developers/#deprecation-policy
policyUrl: https://firstsales.io/developers/#deprecation-policy
currentlyDeprecated: []
description: 'Operations tagged Analyze across 2 of this provider''s published API definitions: firstsales-io-openapi.json, openapi.json. Each path carries the servers of the definition it was published in.'
servers:
- url: https://firstsales.io
description: Production
security: []
tags:
- name: Analyze
description: AI-assisted cold-email content analysis.
paths:
/api/v1/analyze/spam:
post:
operationId: analyzeSpamScore
summary: Score email content for spam-trigger risk
description: 'AI-assisted analysis (with a deterministic local fallback when no AI key is configured) that flags spam trigger words, excessive capitalization, urgency language, and misleading claims, returning a 0-100 spam-risk score and improvement suggestions. This POST is side-effect-free and safe to retry with the same body. Content must be 10-10000 characters. Rate limit: 30 requests/minute per IP.'
tags:
- Analyze
security: []
x-rateLimit:
limit: 30
windowSeconds: 60
x-idempotent: true
parameters:
- name: Idempotency-Key
in: header
required: false
description: Optional retry key accepted for agent/client compatibility. This analysis operation is side-effect-free, so repeating the same body is safe even without server-side key storage.
schema:
type: string
minLength: 1
maxLength: 255
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
content:
type: string
minLength: 10
maxLength: 10000
required:
- content
responses:
'200':
description: Spam risk analysis.
content:
application/json:
schema:
$ref: '#/components/schemas/SpamAnalysisResult'
'400':
description: Invalid request — bad input, missing field, or malformed value.
headers:
RateLimit-Limit:
description: Requests allowed in the current window.
schema:
type: integer
RateLimit-Remaining:
description: Requests still available in the current window.
schema:
type: integer
RateLimit-Reset:
description: Seconds until the current window resets.
schema:
type: integer
RateLimit-Policy:
description: Policy in the form "<limit>;w=<window seconds>".
schema:
type: string
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: Rate limit exceeded for this endpoint. Wait Retry-After seconds and retry.
headers:
RateLimit-Limit:
description: Requests allowed in the current window.
schema:
type: integer
RateLimit-Remaining:
description: Requests still available in the current window.
schema:
type: integer
RateLimit-Reset:
description: Seconds until the current window resets.
schema:
type: integer
RateLimit-Policy:
description: Policy in the form "<limit>;w=<window seconds>".
schema:
type: string
Retry-After:
description: Seconds to wait before retrying.
schema:
type: integer
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'500':
description: Unexpected server error.
headers:
RateLimit-Limit:
description: Requests allowed in the current window.
schema:
type: integer
RateLimit-Remaining:
description: Requests still available in the current window.
schema:
type: integer
RateLimit-Reset:
description: Seconds until the current window resets.
schema:
type: integer
RateLimit-Policy:
description: Policy in the form "<limit>;w=<window seconds>".
schema:
type: string
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
servers:
- url: https://firstsales.io
description: Production
/api/v1/analyze/subject-line:
post:
operationId: analyzeSubjectLine
summary: Score and improve a cold-email subject line
description: 'AI-assisted analysis (with local fallback) returning a 0-100 effectiveness score, issues, strengths, improvement suggestions, and an optional rewritten version of the subject line. This POST is side-effect-free and safe to retry with the same body. Rate limit: 30 requests/minute per IP.'
tags:
- Analyze
security: []
x-rateLimit:
limit: 30
windowSeconds: 60
x-idempotent: true
parameters:
- name: Idempotency-Key
in: header
required: false
description: Optional retry key accepted for agent/client compatibility. This analysis operation is side-effect-free, so repeating the same body is safe even without server-side key storage.
schema:
type: string
minLength: 1
maxLength: 255
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
subjectLine:
type: string
required:
- subjectLine
responses:
'200':
description: Subject line analysis.
content:
application/json:
schema:
$ref: '#/components/schemas/ContentAnalysisResult'
'400':
description: Invalid request — bad input, missing field, or malformed value.
headers:
RateLimit-Limit:
description: Requests allowed in the current window.
schema:
type: integer
RateLimit-Remaining:
description: Requests still available in the current window.
schema:
type: integer
RateLimit-Reset:
description: Seconds until the current window resets.
schema:
type: integer
RateLimit-Policy:
description: Policy in the form "<limit>;w=<window seconds>".
schema:
type: string
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: Rate limit exceeded for this endpoint. Wait Retry-After seconds and retry.
headers:
RateLimit-Limit:
description: Requests allowed in the current window.
schema:
type: integer
RateLimit-Remaining:
description: Requests still available in the current window.
schema:
type: integer
RateLimit-Reset:
description: Seconds until the current window resets.
schema:
type: integer
RateLimit-Policy:
description: Policy in the form "<limit>;w=<window seconds>".
schema:
type: string
Retry-After:
description: Seconds to wait before retrying.
schema:
type: integer
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'500':
description: Unexpected server error.
headers:
RateLimit-Limit:
description: Requests allowed in the current window.
schema:
type: integer
RateLimit-Remaining:
description: Requests still available in the current window.
schema:
type: integer
RateLimit-Reset:
description: Seconds until the current window resets.
schema:
type: integer
RateLimit-Policy:
description: Policy in the form "<limit>;w=<window seconds>".
schema:
type: string
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
servers:
- url: https://firstsales.io
description: Production
/api/v1/analyze/cold-email:
post:
operationId: analyzeColdEmail
summary: Grade a full cold-email draft across 8 deliverability/effectiveness dimensions
description: Local rule-based analysis (subject line, personalization, value proposition, CTA, length, tone, research signals, spam triggers) with an optional AI pass layered on top, returning a 0-100 score, letter grade, per-check detail, and per-dimension metrics. This POST is side-effect-free and safe to retry with the same body. Content must be at least 20 characters. Not rate-limited.
tags:
- Analyze
security: []
x-rateLimit:
limit: null
windowSeconds: null
note: No rate limiter on this route.
x-idempotent: true
parameters:
- name: Idempotency-Key
in: header
required: false
description: Optional retry key accepted for agent/client compatibility. This analysis operation is side-effect-free, so repeating the same body is safe even without server-side key storage.
schema:
type: string
minLength: 1
maxLength: 255
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
content:
type: string
minLength: 20
required:
- content
responses:
'200':
description: Cold email grade and analysis.
content:
application/json:
schema:
$ref: '#/components/schemas/ColdEmailAnalysisResult'
'400':
description: Invalid request — bad input, missing field, or malformed value.
headers:
RateLimit-Limit:
description: Requests allowed in the current window.
schema:
type: integer
RateLimit-Remaining:
description: Requests still available in the current window.
schema:
type: integer
RateLimit-Reset:
description: Seconds until the current window resets.
schema:
type: integer
RateLimit-Policy:
description: Policy in the form "<limit>;w=<window seconds>".
schema:
type: string
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: Rate limit exceeded for this endpoint. Wait Retry-After seconds and retry.
headers:
RateLimit-Limit:
description: Requests allowed in the current window.
schema:
type: integer
RateLimit-Remaining:
description: Requests still available in the current window.
schema:
type: integer
RateLimit-Reset:
description: Seconds until the current window resets.
schema:
type: integer
RateLimit-Policy:
description: Policy in the form "<limit>;w=<window seconds>".
schema:
type: string
Retry-After:
description: Seconds to wait before retrying.
schema:
type: integer
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'500':
description: Unexpected server error.
headers:
RateLimit-Limit:
description: Requests allowed in the current window.
schema:
type: integer
RateLimit-Remaining:
description: Requests still available in the current window.
schema:
type: integer
RateLimit-Reset:
description: Seconds until the current window resets.
schema:
type: integer
RateLimit-Policy:
description: Policy in the form "<limit>;w=<window seconds>".
schema:
type: string
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
servers:
- url: https://firstsales.io
description: Production
/api/v1/analyze/email-body:
post:
operationId: analyzeEmailBody
summary: Score and improve a cold-email body
description: 'AI-assisted analysis (with local fallback) of email body copy, returning a 0-100 effectiveness score, issues, strengths, improvement suggestions, and an optional rewritten version. This POST is side-effect-free and safe to retry with the same body. Rate limit: 30 requests/minute per IP.'
tags:
- Analyze
security: []
x-rateLimit:
limit: 30
windowSeconds: 60
x-idempotent: true
parameters:
- name: Idempotency-Key
in: header
required: false
description: Optional retry key accepted for agent/client compatibility. This analysis operation is side-effect-free, so repeating the same body is safe even without server-side key storage.
schema:
type: string
minLength: 1
maxLength: 255
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
emailBody:
type: string
required:
- emailBody
responses:
'200':
description: Email body analysis.
content:
application/json:
schema:
$ref: '#/components/schemas/ContentAnalysisResult'
'400':
description: Invalid request — bad input, missing field, or malformed value.
headers:
RateLimit-Limit:
description: Requests allowed in the current window.
schema:
type: integer
RateLimit-Remaining:
description: Requests still available in the current window.
schema:
type: integer
RateLimit-Reset:
description: Seconds until the current window resets.
schema:
type: integer
RateLimit-Policy:
description: Policy in the form "<limit>;w=<window seconds>".
schema:
type: string
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: Rate limit exceeded for this endpoint. Wait Retry-After seconds and retry.
headers:
RateLimit-Limit:
description: Requests allowed in the current window.
schema:
type: integer
RateLimit-Remaining:
description: Requests still available in the current window.
schema:
type: integer
RateLimit-Reset:
description: Seconds until the current window resets.
schema:
type: integer
RateLimit-Policy:
description: Policy in the form "<limit>;w=<window seconds>".
schema:
type: string
Retry-After:
description: Seconds to wait before retrying.
schema:
type: integer
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'500':
description: Unexpected server error.
headers:
RateLimit-Limit:
description: Requests allowed in the current window.
schema:
type: integer
RateLimit-Remaining:
description: Requests still available in the current window.
schema:
type: integer
RateLimit-Reset:
description: Seconds until the current window resets.
schema:
type: integer
RateLimit-Policy:
description: Policy in the form "<limit>;w=<window seconds>".
schema:
type: string
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
servers:
- url: https://firstsales.io
description: Production
/api/v1/analyze/personalization:
post:
operationId: analyzePersonalization
summary: Detect and score personalization signals in cold-email content
description: Pattern-matches for recipient-name tokens, company references, pain-point mentions, social proof, CTA, and value proposition; layers an optional AI pass on top; returns a 0-100 score plus per-signal booleans, strengths, and suggestions. This POST is side-effect-free and safe to retry with the same body. Content must be at least 20 characters. Not rate-limited.
tags:
- Analyze
security: []
x-rateLimit:
limit: null
windowSeconds: null
note: No rate limiter on this route.
x-idempotent: true
parameters:
- name: Idempotency-Key
in: header
required: false
description: Optional retry key accepted for agent/client compatibility. This analysis operation is side-effect-free, so repeating the same body is safe even without server-side key storage.
schema:
type: string
minLength: 1
maxLength: 255
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
content:
type: string
minLength: 20
required:
- content
responses:
'200':
description: Personalization analysis.
content:
application/json:
schema:
$ref: '#/components/schemas/PersonalizationAnalysisResult'
'400':
description: Invalid request — bad input, missing field, or malformed value.
headers:
RateLimit-Limit:
description: Requests allowed in the current window.
schema:
type: integer
RateLimit-Remaining:
description: Requests still available in the current window.
schema:
type: integer
RateLimit-Reset:
description: Seconds until the current window resets.
schema:
type: integer
RateLimit-Policy:
description: Policy in the form "<limit>;w=<window seconds>".
schema:
type: string
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: Rate limit exceeded for this endpoint. Wait Retry-After seconds and retry.
headers:
RateLimit-Limit:
description: Requests allowed in the current window.
schema:
type: integer
RateLimit-Remaining:
description: Requests still available in the current window.
schema:
type: integer
RateLimit-Reset:
description: Seconds until the current window resets.
schema:
type: integer
RateLimit-Policy:
description: Policy in the form "<limit>;w=<window seconds>".
schema:
type: string
Retry-After:
description: Seconds to wait before retrying.
schema:
type: integer
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'500':
description: Unexpected server error.
headers:
RateLimit-Limit:
description: Requests allowed in the current window.
schema:
type: integer
RateLimit-Remaining:
description: Requests still available in the current window.
schema:
type: integer
RateLimit-Reset:
description: Seconds until the current window resets.
schema:
type: integer
RateLimit-Policy:
description: Policy in the form "<limit>;w=<window seconds>".
schema:
type: string
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
servers:
- url: https://firstsales.io
description: Production
components:
schemas:
Error:
type: object
description: Shared error envelope used by public endpoints and the rate-limit wrapper. Mail-tester handler errors use MailTesterError.
properties:
error:
type: string
description: Machine-readable error code, e.g. `invalid_input`.
message:
type: string
description: Human-readable explanation.
hint:
type: string
description: How to fix the request.
required:
- error
- message
- hint
ContentAnalysisResult:
type: object
description: Shared result shape for subject-line and email-body analysis.
properties:
score:
type: number
minimum: 0
maximum: 100
suggestions:
type: array
items:
type: string
issues:
type: array
items:
type: string
strengths:
type: array
items:
type: string
improvedVersion:
type: string
required:
- score
- suggestions
- issues
- strengths
ColdEmailAnalysisResult:
type: object
properties:
score:
type: number
minimum: 0
maximum: 100
grade:
type: string
enum:
- A
- B
- C
- D
- F
checks:
type: array
items:
type: object
properties:
label:
type: string
passed:
type: boolean
detail:
type: string
scoreImpact:
type: number
required:
- label
- passed
- detail
- scoreImpact
strengths:
type: array
items:
type: string
weaknesses:
type: array
items:
type: string
improvements:
type: array
items:
type: string
metrics:
type: object
properties:
clarity:
type: number
personalization:
type: number
valueProp:
type: number
cta:
type: number
tone:
type: number
source:
type: string
enum:
- ai+local
- local
required:
- score
- grade
- checks
- strengths
- weaknesses
- improvements
- metrics
- source
SpamAnalysisResult:
type: object
properties:
score:
type: number
minimum: 0
maximum: 100
description: 0 = clean, 100 = definitely spam.
triggerWords:
type: array
items:
type: string
suggestions:
type: array
items:
type: string
required:
- score
- triggerWords
- suggestions
PersonalizationAnalysisResult:
type: object
properties:
score:
type: number
minimum: 0
maximum: 100
personalization:
type: object
properties:
recipientName:
type: boolean
companyMention:
type: boolean
painPoint:
type: boolean
socialProof:
type: boolean
cta:
type: boolean
valueProp:
type: boolean
strengths:
type: array
items:
type: string
suggestions:
type: array
items:
type: string
checks:
type: array
items:
type: object
properties:
label:
type: string
status:
type: string
enum:
- pass
- warn
- fail
detail:
type: string
required:
- label
- status
- detail
source:
type: string
enum:
- ai+local
- local
required:
- score
- personalization
- strengths
- suggestions
- checks
- source
x-refined-from:
- firstsales-io-openapi.json
- openapi.json
x-apiVersioning:
strategy: url-path
current: v1
pattern: https://firstsales.io/api/v1/{operation}
policyUrl: https://firstsales.io/developers/#versioning
note: A breaking change ships under a new prefix (/api/v2/); v1 keeps its contract. The unprefixed /api/{operation} form is an unversioned alias of the current version and may change without notice - call the /api/v1/ form.
x-deprecationPolicy:
minimumNoticeDays: 180
signalling: 'A deprecated version''s responses carry Deprecation: true and a Sunset header with the retirement date (RFC 8594), plus a Link rel="deprecation" to the migration notes.'
announcement: https://firstsales.io/developers/#deprecation-policy
policyUrl: https://firstsales.io/developers/#deprecation-policy
currentlyDeprecated: []