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/crevio-co:crevio-co-sms-follow-ups-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: Crevio API V1 SMS follow-ups API
version: 1.0.0
description: 'API for the Crevio creator platform — a multi-tenant SaaS for digital product sales.
Uses snake_case keys following Stripe conventions. All resource IDs are string IDs (e.g., "prod_abc123").
Authentication is a bearer token: `Authorization: Bearer $CREVIO_API_KEY`.
List endpoints are cursor-paginated with `limit` and `starting_after`.
Writes accept an `Idempotency-Key` header and are safe to retry.
Every response carries IETF RateLimit headers (`RateLimit`, `RateLimit-Policy`) so a client can
self-throttle, and `Retry-After` on a 429. The quota is 600 requests per minute per credential.
The API is versioned in the URL path (`/v1`). Nothing is removed without in-band warning: a
deprecated operation is marked `"deprecated": true` here and serves `Deprecation` (RFC 9745),
`Sunset` (RFC 8594) and `Link; rel="deprecation"` headers for at least six months before it
stops answering. See https://crevio.co/docs/developer/guides/versioning.'
contact:
email: support@crevio.co
name: Crevio Support
url: https://crevio.co/docs
license:
name: Apache 2.0
url: http://www.apache.org/licenses/LICENSE-2.0.html
termsOfService: https://crevio.co/legal/terms-of-service
servers:
- url: https://api.crevio.co/v1
description: Production
security:
- ApiKey: []
tags:
- name: SMS follow-ups
description: Texting new leads and past customers until they answer. The email counterpart is Sequences.
paths:
/sms-follow-ups:
get:
summary: List SMS follow-ups
description: 'Lists follow-ups: texting a new lead or a past customer first, then again until they answer. A follow-up ends as replied, booked, opted_out, canceled (by you), completed (no answer after the last text) or failed.'
operationId: listSmsFollowUps
x-crevio-sdk-group: smsFollowUps
x-crevio-sdk-method: list
tags:
- SMS follow-ups
security:
- ApiKey: []
parameters:
- name: status
in: query
description: active, replied, booked, opted_out, canceled, completed or failed.
schema:
type: string
- name: reason
in: query
description: lead or reactivation.
schema:
type: string
enum:
- lead
- reactivation
- name: launch_id
in: query
description: Only the follow-ups of one reactivation launch.
schema:
type: string
responses:
'200':
description: List of follow-ups
content:
application/json:
schema:
$ref: '#/components/schemas/ListResponse_SmsFollowUp'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'422':
$ref: '#/components/responses/UnprocessableEntity'
'429':
$ref: '#/components/responses/TooManyRequests'
'500':
$ref: '#/components/responses/InternalServerError'
x-crevio-approval: allow
x-codeSamples:
- lang: typescript
label: Typescript (SDK)
source: "import { Crevio } from \"@crevio/sdk\";\n\nconst crevio = new Crevio({\n apiKey: process.env[\"CREVIO_API_KEY\"] ?? \"\",\n});\n\nasync function run() {\n const result = await crevio.smsFollowUps.list();\n\n console.log(result);\n}\n\nrun();"
post:
summary: Launch a reactivation
description: 'Texts past customers to win them back: everyone tagged `tag`, or the `customer_ids` given. `message` is the first text; it takes the same variables as an email, e.g. `{{ customer.first_name | default: "there" }}`, and an unknown one is refused with `invalid_variables`. One reminder follows three days later if they don''t answer; any reply hands the conversation to the line''s assistant. Marketing texts need each person''s written consent (checkout or web form opt-in), so anyone without it, without a textable number, or opted out is skipped and counted in `skipped`. Read results with GET /v1/follow-ups/stats?launch_id=.'
operationId: createSmsFollowUpLaunch
x-crevio-sdk-group: smsFollowUps
x-crevio-sdk-method: create
tags:
- SMS follow-ups
security:
- ApiKey: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/SmsFollowUpRequest'
responses:
'201':
description: 'The launch: its id, how many were enrolled, and skips by reason'
content:
application/json:
schema:
type: object
properties:
object:
type: string
launch_id:
type: string
enrolled:
type: integer
skipped:
type: object
additionalProperties:
type: integer
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'422':
$ref: '#/components/responses/UnprocessableEntity'
'429':
$ref: '#/components/responses/TooManyRequests'
'500':
$ref: '#/components/responses/InternalServerError'
x-crevio-approval: ask
x-crevio-locked: true
parameters:
- name: Idempotency-Key
in: header
required: false
description: 'Makes this write safe to retry: a repeat with the same key replays the first response instead of creating a second resource. Scoped to the account, remembered for 24 hours; reusing a key with a different payload is an error.'
schema:
type: string
maxLength: 255
example: 1f7a4c2e-3b19-4a6d-9f0c-2ac81b5d7e33
x-codeSamples:
- lang: typescript
label: Typescript (SDK)
source: "import { Crevio } from \"@crevio/sdk\";\n\nconst crevio = new Crevio({\n apiKey: process.env[\"CREVIO_API_KEY\"] ?? \"\",\n});\n\nasync function run() {\n const result = await crevio.smsFollowUps.create({\n message: \"<value>\",\n });\n\n console.log(result);\n}\n\nrun();"
/sms-follow-ups/stats:
get:
summary: SMS follow-up results
description: 'Counts follow-ups by outcome, for one reactivation launch (`launch_id`) or one reason: how many replied, booked, opted out, were canceled, are still active, completed without an answer, or failed.'
operationId: getSmsFollowUpStats
x-crevio-sdk-group: smsFollowUps
x-crevio-sdk-method: stats
tags:
- SMS follow-ups
security:
- ApiKey: []
parameters:
- name: launch_id
in: query
description: A reactivation launch's id.
schema:
type: string
- name: reason
in: query
description: lead or reactivation.
schema:
type: string
enum:
- lead
- reactivation
responses:
'200':
description: Counts by status
content:
application/json:
schema:
type: object
properties:
total:
type: integer
active:
type: integer
replied:
type: integer
booked:
type: integer
opted_out:
type: integer
canceled:
type: integer
completed:
type: integer
failed:
type: integer
object:
type: string
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'422':
$ref: '#/components/responses/UnprocessableEntity'
'429':
$ref: '#/components/responses/TooManyRequests'
'500':
$ref: '#/components/responses/InternalServerError'
x-crevio-approval: allow
x-codeSamples:
- lang: typescript
label: Typescript (SDK)
source: "import { Crevio } from \"@crevio/sdk\";\n\nconst crevio = new Crevio({\n apiKey: process.env[\"CREVIO_API_KEY\"] ?? \"\",\n});\n\nasync function run() {\n const result = await crevio.smsFollowUps.stats();\n\n console.log(result);\n}\n\nrun();"
/sms-follow-ups/{id}:
get:
summary: Get an SMS follow-up
description: Retrieves a follow-up.
operationId: getSmsFollowUp
x-crevio-sdk-group: smsFollowUps
x-crevio-sdk-method: get
tags:
- SMS follow-ups
security:
- ApiKey: []
parameters:
- name: id
in: path
required: true
description: The resource ID (e.g., "prod_abc123") or slug (e.g., "my-product")
schema:
type: string
responses:
'200':
description: The follow-up
content:
application/json:
schema:
$ref: '#/components/schemas/SmsFollowUp'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'422':
$ref: '#/components/responses/UnprocessableEntity'
'429':
$ref: '#/components/responses/TooManyRequests'
'500':
$ref: '#/components/responses/InternalServerError'
x-crevio-approval: allow
x-codeSamples:
- lang: typescript
label: Typescript (SDK)
source: "import { Crevio } from \"@crevio/sdk\";\n\nconst crevio = new Crevio({\n apiKey: process.env[\"CREVIO_API_KEY\"] ?? \"\",\n});\n\nasync function run() {\n const result = await crevio.smsFollowUps.get({\n id: \"<id>\",\n });\n\n console.log(result);\n}\n\nrun();"
/sms-follow-ups/{id}/cancel:
post:
summary: Cancel an SMS follow-up
description: 'Stops texting this person: its status becomes `canceled`, and a text still held for later (such as one waiting for their 8am) is canceled too, so nothing more is sent. Canceling one that already ended changes nothing. Their replies are still answered.'
operationId: cancelSmsFollowUp
x-crevio-sdk-group: smsFollowUps
x-crevio-sdk-method: cancel
tags:
- SMS follow-ups
security:
- ApiKey: []
parameters:
- name: id
in: path
required: true
description: The resource ID (e.g., "prod_abc123") or slug (e.g., "my-product")
schema:
type: string
- name: Idempotency-Key
in: header
required: false
description: 'Makes this write safe to retry: a repeat with the same key replays the first response instead of creating a second resource. Scoped to the account, remembered for 24 hours; reusing a key with a different payload is an error.'
schema:
type: string
maxLength: 255
example: 1f7a4c2e-3b19-4a6d-9f0c-2ac81b5d7e33
responses:
'200':
description: The canceled follow-up
content:
application/json:
schema:
$ref: '#/components/schemas/SmsFollowUp'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'422':
$ref: '#/components/responses/UnprocessableEntity'
'429':
$ref: '#/components/responses/TooManyRequests'
'500':
$ref: '#/components/responses/InternalServerError'
x-crevio-approval: allow
x-codeSamples:
- lang: typescript
label: Typescript (SDK)
source: "import { Crevio } from \"@crevio/sdk\";\n\nconst crevio = new Crevio({\n apiKey: process.env[\"CREVIO_API_KEY\"] ?? \"\",\n});\n\nasync function run() {\n const result = await crevio.smsFollowUps.cancel({\n id: \"<id>\",\n });\n\n console.log(result);\n}\n\nrun();"
components:
responses:
TooManyRequests:
description: 'Rate limit exceeded — 600 requests per minute per owner on the free tier: every API key and OAuth token one person holds on an account shares one budget, and the account''s team keys share another. Retry after the number of seconds in `Retry-After`.'
headers:
Retry-After:
$ref: '#/components/headers/RetryAfter'
RateLimit:
$ref: '#/components/headers/RateLimit'
RateLimit-Policy:
$ref: '#/components/headers/RateLimitPolicy'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error:
type: invalid_request_error
code: rate_limit_exceeded
message: Too many requests. Please retry later.
Forbidden:
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error:
type: invalid_request_error
code: forbidden
message: You do not have permission to perform this action
headers:
RateLimit:
$ref: '#/components/headers/RateLimit'
RateLimit-Policy:
$ref: '#/components/headers/RateLimitPolicy'
Request-Id:
$ref: '#/components/headers/RequestId'
Deprecation:
$ref: '#/components/headers/Deprecation'
Sunset:
$ref: '#/components/headers/Sunset'
Link:
$ref: '#/components/headers/DeprecationLink'
InternalServerError:
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error:
type: api_error
code: internal_error
message: An unexpected error occurred
headers:
RateLimit:
$ref: '#/components/headers/RateLimit'
RateLimit-Policy:
$ref: '#/components/headers/RateLimitPolicy'
Request-Id:
$ref: '#/components/headers/RequestId'
Deprecation:
$ref: '#/components/headers/Deprecation'
Sunset:
$ref: '#/components/headers/Sunset'
Link:
$ref: '#/components/headers/DeprecationLink'
NotFound:
description: Resource not found
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error:
type: invalid_request_error
code: resource_missing
message: The requested resource was not found
headers:
RateLimit:
$ref: '#/components/headers/RateLimit'
RateLimit-Policy:
$ref: '#/components/headers/RateLimitPolicy'
Request-Id:
$ref: '#/components/headers/RequestId'
Deprecation:
$ref: '#/components/headers/Deprecation'
Sunset:
$ref: '#/components/headers/Sunset'
Link:
$ref: '#/components/headers/DeprecationLink'
Unauthorized:
description: Authentication required
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error:
type: invalid_request_error
code: authentication_required
message: You did not provide an API key.
headers:
RateLimit:
$ref: '#/components/headers/RateLimit'
RateLimit-Policy:
$ref: '#/components/headers/RateLimitPolicy'
Request-Id:
$ref: '#/components/headers/RequestId'
Deprecation:
$ref: '#/components/headers/Deprecation'
Sunset:
$ref: '#/components/headers/Sunset'
Link:
$ref: '#/components/headers/DeprecationLink'
UnprocessableEntity:
description: Validation error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error:
type: validation_error
code: validation_failed
message: Email is required
errors:
email:
- can't be blank
headers:
RateLimit:
$ref: '#/components/headers/RateLimit'
RateLimit-Policy:
$ref: '#/components/headers/RateLimitPolicy'
Request-Id:
$ref: '#/components/headers/RequestId'
Deprecation:
$ref: '#/components/headers/Deprecation'
Sunset:
$ref: '#/components/headers/Sunset'
Link:
$ref: '#/components/headers/DeprecationLink'
BadRequest:
description: Bad request
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error:
type: invalid_request_error
code: bad_request
message: The request was malformed or contained invalid parameters
headers:
RateLimit:
$ref: '#/components/headers/RateLimit'
RateLimit-Policy:
$ref: '#/components/headers/RateLimitPolicy'
Request-Id:
$ref: '#/components/headers/RequestId'
Deprecation:
$ref: '#/components/headers/Deprecation'
Sunset:
$ref: '#/components/headers/Sunset'
Link:
$ref: '#/components/headers/DeprecationLink'
headers:
RetryAfter:
description: Seconds to wait before retrying.
schema:
type: integer
examples:
- 11
Sunset:
description: Present only on a deprecated operation. HTTP-date (RFC 8594) after which the operation stops responding. Always at least six months after `Deprecation`.
schema:
type: string
examples:
- Thu, 01 Oct 2026 00:00:00 GMT
RateLimit:
description: 'Remaining quota for the current window, as an IETF structured field: `"default";r=<remaining>;t=<seconds until reset>`.'
schema:
type: string
examples:
- '"default";r=596;t=11'
RateLimitPolicy:
description: 'The quota this credential is subject to: `"default";q=<requests>;w=<window seconds>`.'
schema:
type: string
examples:
- '"default";q=600;w=60'
RequestId:
description: Unique id for this request. Quote it when reporting a problem.
schema:
type: string
examples:
- 8fe045fe-cb8a-4407-a44d-5df60385e522
DeprecationLink:
description: Present only on a deprecated operation. `<url>; rel="deprecation"` pointing at the migration notes.
schema:
type: string
examples:
- <https://crevio.co/docs/developer/guides/versioning>; rel="deprecation"
Deprecation:
description: Present only on a deprecated operation. Structured-field date (RFC 9745) — `@` followed by the Unix timestamp at which the operation became deprecated.
schema:
type: string
examples:
- '@1775001600'
schemas:
ListResponse_SmsFollowUp:
type: object
properties:
object:
type: string
enum:
- list
data:
type: array
items:
$ref: '#/components/schemas/SmsFollowUp'
has_more:
type: boolean
url:
type: string
required:
- object
- data
- has_more
- url
Error:
type: object
properties:
error:
type: object
properties:
type:
type: string
enum:
- api_error
- invalid_request_error
- validation_error
code:
type: string
message:
type: string
param:
type: string
errors:
type: object
doc_url:
type: string
required:
- type
- message
required:
- error
SmsFollowUpRequest:
type: object
properties:
message:
type: string
description: The first text. {{first_name}} is replaced with each person's first name.
tag:
type: string
description: Text every customer with this tag.
customer_ids:
type: array
items:
type: string
description: Text these customers (cus_...).
phone_number_id:
type: string
description: Which business line sends the texts. Defaults to the first number with texting on.
required:
- message
SmsFollowUp:
type: object
properties:
id:
type: string
object:
type: string
reason:
type: string
enum:
- lead
- reactivation
status:
type: string
enum:
- active
- replied
- booked
- opted_out
- canceled
- failed
- completed
step:
type: integer
next_at:
type:
- string
- 'null'
format: date-time
message:
type:
- string
- 'null'
launch_id:
type:
- string
- 'null'
error:
type:
- string
- 'null'
ended_at:
type:
- string
- 'null'
format: date-time
created_at:
type: string
format: date-time
updated_at:
type: string
format: date-time
counterpart:
type: string
customer:
type:
- string
- 'null'
required:
- id
- object
- reason
- status
- step
- next_at
- message
- launch_id
- error
- ended_at
- created_at
- updated_at
- counterpart
- customer
securitySchemes:
ApiKey:
type: apiKey
in: header
name: Authorization
description: 'API key in the format: Bearer {api_token}'
externalDocs:
description: Crevio developer documentation
url: https://crevio.co/docs/developer
x-mint:
mcp:
enabled: true
x-api-lifecycle:
current_major_version: v1
versioning_scheme: URL path
deprecation_policy_url: https://crevio.co/docs/developer/guides/versioning
minimum_notice_days: 183
deprecation_headers:
- Deprecation
- Sunset
- Link