Crevio SMS follow-ups API

Texting new leads and past customers until they answer. The email counterpart is Sequences.

Operations 5

GET /sms-follow-ups List SMS follow-ups #
POST /sms-follow-ups Launch a reactivation #
GET /sms-follow-ups/stats SMS follow-up results #
GET /sms-follow-ups/{id} Get an SMS follow-up #
POST /sms-follow-ups/{id}/cancel Cancel an SMS follow-up #

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/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 Specification

crevio-co-sms-follow-ups-api-openapi.yml Raw ↑
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