Frank API

Frank API as documented publicly: 15 operations. Contract generated from the documentation by API Evangelist (2026-11-05); not the provider's own document.

Operations 15

GET /v1/interviews/{id} Get an interview + transcript #
GET /v1/products GET /v1/products #
POST /v1/products POST /v1/products #
GET /v1/products/{id} Get a product #
PUT /v1/products/{id} Update a product #
GET /v1/researches List researches #
POST /v1/researches POST /v1/researches #
PUT /v1/researches/{id}/product Link a product #
PUT /v1/researches/{id}/publish Publish (activate) #
GET /v1/researches/{researchid}/embeds List widget formats #
GET /v1/researches/{researchid}/embeds/{type} Get a widget format #
PUT /v1/researches/{researchid}/embeds/{type} Change a widget format #
GET /v1/researches/{researchid}/interviews List a research's interviews #
DELETE /v1/researches/{researchid}/participants Remove a participant #
PUT /v1/researches/{researchid}/participants Add or update a participant #

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/hifrank-ai:hifrank-ai-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

hifrank-ai-openapi-generated.yml Raw ↑
openapi: 3.1.0
info:
  title: Frank API
  version: '2026-11-05'
  description: 'GENERATED FROM DOCUMENTATION by API Evangelist on 2026-11-05: 15 operation(s) read from 1 public documentation page(s) (each operation
    names its page in x-source). This is not the provider''s published contract; Frank has published no machine-readable contract that the pipeline
    could find. Engine: local.'
  x-evidence-tiers:
    code-example: 10
    documentation: 5
    pages-with-code: 1
    pages-read: 1
  x-generated-from: documentation
  x-provenance: generated
  x-authored-by: API Evangelist
  x-generated: '2026-11-05'
  x-generator: generate-contract-from-docs.py
  x-engine: local
  x-sources:
  - https://www.hifrank.ai/docs/frank-public-api-developer-guide
servers:
- url: https://api.hifrank.ai
paths:
  /v1/interviews/{id}:
    get:
      operationId: get_v1_interviews_id
      tags:
      - Interviews
      summary: Get an interview + transcript
      x-source: https://www.hifrank.ai/docs/frank-public-api-developer-guide
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetV1InterviewsIdResponse'
      x-evidence:
        kind: documentation
  /v1/products:
    get:
      operationId: get_v1_products
      tags:
      - Products
      summary: GET /v1/products
      x-source: https://www.hifrank.ai/docs/frank-public-api-developer-guide
      responses:
        '200':
          description: Success (shape read from the example response on the page)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetV1ProductsResponse'
      x-evidence:
        kind: code-example
        language: curl
        snippet: "curl https://api.hifrank.ai/v1/products  -H \"Authorization: Bearer frank_sk_live_...\" \n Typical flow \n POST /v1/products\
          \ — describe what you're researching. \n POST /v1/researches — goals + topics/questions. Comes back as a draft. \n PUT /v1/researches/{id}/product\
          \ — attach the product (optional). \n PUT /v1/researches/{id}/publish — pick interviewer + language; becomes active and can take interviews"
    post:
      operationId: post_v1_products
      tags:
      - Products
      summary: POST /v1/products
      x-source: https://www.hifrank.ai/docs/frank-public-api-developer-guide
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostV1ProductsRequest'
      responses:
        '201':
          description: Success (shape read from the example response on the page)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PostV1ProductsResponse'
      x-evidence:
        kind: code-example
        language: curl
        snippet: "curl -X POST https://api.hifrank.ai/v1/products  -H \"Authorization: Bearer frank_sk_live_...\"  -H \"Content-Type: application/json\"\
          \  -d '{\n \"name\": \"Acme Notes\",\n \"description\": \"A note-taking app for teams\",\n \"category\": \"saas_software\",\n \"urls\"\
          : [\"https://acme.example\"]\n }' \n Response · 201 Created \n Field Type Notes \n productId always present string (uuid) Use this to\
          \ link the product to a resea"
  /v1/products/{id}:
    get:
      operationId: get_v1_products_id
      tags:
      - Products
      summary: Get a product
      x-source: https://www.hifrank.ai/docs/frank-public-api-developer-guide
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetV1ProductsIdResponse'
      x-evidence:
        kind: documentation
    put:
      operationId: put_v1_products_id
      tags:
      - Products
      summary: Update a product
      x-source: https://www.hifrank.ai/docs/frank-public-api-developer-guide
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PutV1ProductsIdRequest'
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PutV1ProductsIdResponse'
      x-evidence:
        kind: documentation
  /v1/researches:
    get:
      operationId: get_v1_researches
      tags:
      - Researches
      summary: List researches
      x-source: https://www.hifrank.ai/docs/frank-public-api-developer-guide
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetV1ResearchesResponse'
      x-evidence:
        kind: documentation
    post:
      operationId: post_v1_researches
      tags:
      - Researches
      summary: POST /v1/researches
      x-source: https://www.hifrank.ai/docs/frank-public-api-developer-guide
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostV1ResearchesRequest'
      responses:
        '201':
          description: Success (shape read from the example response on the page)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PostV1ResearchesResponse'
      x-evidence:
        kind: code-example
        language: curl
        snippet: "curl -X POST https://api.hifrank.ai/v1/researches  -H \"Authorization: Bearer frank_sk_live_...\"  -H \"Content-Type: application/json\"\
          \  -d '{\n \"name\": \"Trial churn discovery\",\n \"description\": \"Why trial users do not upgrade\",\n \"researchType\": \"discovery\"\
          ,\n \"goals\": [\"Understand upgrade blockers\"],\n \"topics\": [\n {\n \"name\": \"Onboarding\",\n \"message\": \"Let us start with\
          \ your first few days.\",\n \"question"
  /v1/researches/{id}/product:
    put:
      operationId: put_v1_researches_id_product
      tags:
      - Researches
      summary: Link a product
      x-source: https://www.hifrank.ai/docs/frank-public-api-developer-guide
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PutV1ResearchesIdProductRequest'
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PutV1ResearchesIdProductResponse'
      x-evidence:
        kind: documentation
  /v1/researches/{id}/publish:
    put:
      operationId: put_v1_researches_id_publish
      tags:
      - Researches
      summary: Publish (activate)
      x-source: https://www.hifrank.ai/docs/frank-public-api-developer-guide
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PutV1ResearchesIdPublishRequest'
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PutV1ResearchesIdPublishResponse'
      x-evidence:
        kind: documentation
  /v1/researches/{researchid}/embeds:
    get:
      operationId: get_v1_researches_researchid_embeds
      tags:
      - Researches
      summary: List widget formats
      x-source: https://www.hifrank.ai/docs/frank-public-api-developer-guide
      parameters:
      - name: researchid
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetV1ResearchesResearchidEmbedsResponse'
      x-evidence:
        kind: documentation
  /v1/researches/{researchid}/embeds/{type}:
    get:
      operationId: get_v1_researches_researchid_embeds_type
      tags:
      - Researches
      summary: Get a widget format
      x-source: https://www.hifrank.ai/docs/frank-public-api-developer-guide
      parameters:
      - name: researchid
        in: path
        required: true
        schema:
          type: string
      - name: type
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetV1ResearchesResearchidEmbedsTypeResponse'
      x-evidence:
        kind: documentation
    put:
      operationId: put_v1_researches_researchid_embeds_type
      tags:
      - Researches
      summary: Change a widget format
      x-source: https://www.hifrank.ai/docs/frank-public-api-developer-guide
      parameters:
      - name: researchid
        in: path
        required: true
        schema:
          type: string
      - name: type
        in: path
        required: true
        schema:
          type: string
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PutV1ResearchesResearchidEmbedsTypeRequest'
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PutV1ResearchesResearchidEmbedsTypeResponse'
      x-evidence:
        kind: documentation
  /v1/researches/{researchid}/interviews:
    get:
      operationId: get_v1_researches_researchid_interviews
      tags:
      - Researches
      summary: List a research's interviews
      x-source: https://www.hifrank.ai/docs/frank-public-api-developer-guide
      parameters:
      - name: researchid
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetV1ResearchesResearchidInterviewsResponse'
      x-evidence:
        kind: documentation
  /v1/researches/{researchid}/participants:
    delete:
      operationId: delete_v1_researches_researchid_participants
      tags:
      - Researches
      summary: Remove a participant
      x-source: https://www.hifrank.ai/docs/frank-public-api-developer-guide
      parameters:
      - name: researchid
        in: path
        required: true
        schema:
          type: string
      responses:
        '204':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
    put:
      operationId: put_v1_researches_researchid_participants
      tags:
      - Researches
      summary: Add or update a participant
      x-source: https://www.hifrank.ai/docs/frank-public-api-developer-guide
      parameters:
      - name: researchid
        in: path
        required: true
        schema:
          type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PutV1ResearchesResearchidParticipantsRequest'
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PutV1ResearchesResearchidParticipantsResponse'
      x-evidence:
        kind: documentation
components:
  schemas:
    GetV1InterviewsIdResponse:
      type: object
      properties:
        interviewId:
          type: string
          description: Always present.
        researchId:
          type: string
          description: Always present.
        status:
          type: string
          description: Always present.
        type:
          type: string
          description: Always present.
        participant:
          type: object
          description: Always present.
        startedAt:
          type: string
          description: Always present.
        endedAt:
          type: string
          description: Always present.
        duration:
          type: integer
          description: Always present.
        transcript:
          type: array
          description: Array of turns.
    GetV1ProductsResponse:
      type: object
      properties:
        productId:
          type: string
        name:
          type: string
        description:
          type: string
        category:
          type: string
        brief:
          type: string
        urls:
          type: array
          items:
            type: string
        createdAt:
          type: string
          format: date-time
    PostV1ProductsRequest:
      type: object
      properties:
        name:
          type: string
        description:
          type: string
        category:
          type: string
        urls:
          type: array
          items:
            type: string
    PostV1ProductsResponse:
      type: object
      properties:
        productId:
          type: string
        name:
          type: string
        description:
          type: string
        category:
          type: string
        brief:
          type: string
        urls:
          type: array
          items:
            type: string
        createdAt:
          type: string
          format: date-time
    GetV1ProductsIdResponse:
      type: object
      properties:
        productId:
          type: string
          description: Always present.
        name:
          type: string
          description: Always present.
        description:
          type: string
          description: Always present.
        category:
          type: string
          description: Always present.
        brief:
          type: string
          description: Always present.
        urls:
          type: string
          description: Always present.
        createdAt:
          type: string
          description: Always present.
    PutV1ProductsIdRequest:
      type: object
      properties:
        name:
          type: string
          description: Max 60 characters.
        description:
          type: string
          description: Max 1500 characters.
        category:
          type: string
          description: One of the 16 values.
        brief:
          type: string
          description: Context for interviewer.
        urls:
          type: string
          description: Up to 10 URLs.
    PutV1ProductsIdResponse:
      type: object
      properties:
        productId:
          type: string
          description: Always present.
        name:
          type: string
          description: Always present.
        description:
          type: string
          description: Always present.
        category:
          type: string
          description: Always present.
        brief:
          type: string
          description: Always present.
        urls:
          type: string
          description: Always present.
        createdAt:
          type: string
          description: Always present.
    GetV1ResearchesResponse:
      type: object
      properties:
        researchId:
          type: string
          description: Always present.
        name:
          type: string
          description: Always present.
        status:
          type: string
          description: Always present.
        type:
          type: string
          description: Always present.
        goals:
          type: string
          description: Always present.
        productId:
          type: string
          description: Always present.
        createdAt:
          type: string
          description: Always present.
    PostV1ResearchesRequest:
      type: object
      properties:
        name:
          type: string
        description:
          type: string
        researchType:
          type: string
        goals:
          type: array
          items:
            type: string
        topics:
          type: array
          items:
            type: object
            properties:
              name:
                type: string
              message:
                type: string
              questions:
                type: array
                items:
                  type: object
                  properties:
                    text:
                      type: string
                    followUpDepth:
                      type: string
                    probing:
                      type: string
                    tags:
                      type: string
    PostV1ResearchesResponse:
      type: object
      properties:
        researchId:
          type: string
        name:
          type: string
        status:
          type: string
        type:
          type: string
        goals:
          type: array
          items:
            type: string
        productId:
          type:
          - string
          - 'null'
        createdAt:
          type: string
          format: date-time
    PutV1ResearchesIdProductRequest:
      type: object
      properties:
        productId:
          type: string
          description: UUID of a product you own.
      required:
      - productId
    PutV1ResearchesIdProductResponse:
      type: object
      properties:
        researchId:
          type: string
          description: Always present.
        name:
          type: string
          description: Always present.
        status:
          type: string
          description: Always present.
        type:
          type: string
          description: Always present.
        productId:
          type: string
          description: Always present.
        createdAt:
          type: string
          description: Always present.
    PutV1ResearchesIdPublishRequest:
      type: object
      properties:
        language:
          type: string
          description: ISO 639-1 code.
        persona:
          type: string
          description: olivia (default) or frank.
        duration:
          type: integer
          description: Target interview length in minutes. Minimum 1.
        prompts:
          type: object
          description: Same shape as on create; overrides generated prompts.
      required:
      - language
    PutV1ResearchesIdPublishResponse:
      type: object
      properties:
        researchId:
          type: string
          description: Always present.
        status:
          type: string
          description: Always present. Set to active.
        language:
          type: string
          description: Always present.
        persona:
          type: string
          description: Always present.
        duration:
          type: integer
          description: Always present.
    GetV1ResearchesResearchidEmbedsResponse:
      type: object
      properties:
        researchId:
          type: string
          description: The research.
        protectedDomains:
          type: array
          description: The sites the widget may run on.
        activated:
          type: boolean
          description: Whether the widget is switched on.
        formats:
          type: array
          description: One entry each for floating, inline and popup. Each object contains type and embedId.
    GetV1ResearchesResearchidEmbedsTypeResponse:
      type: object
      properties:
        embedId:
          type: string
          description: This format's key; it only works with this format's snippet.
        settings:
          type: object
          description: Intro copy, button labels, launcher position (floating only), identity mode and fields, consent options and appearance.
        snippet:
          type: string
          description: The install snippet.
        install:
          type: object
          description: Where the snippet goes, what the page needs, what single-page apps must do, the identity placeholders to replace, and a
            link to the setup guide.
        runnable:
          type: boolean
          description: Whether participants can take an interview once it's installed.
        blockers:
          type: array
          description: 'What stops them: research_draft, research_stopped, embed_revoked, widget_off, no_protected_domain, out_of_credits.'
    PutV1ResearchesResearchidEmbedsTypeRequest:
      type: object
      properties:
        floatingAlign:
          type: string
          description: Alignment for floating widget (example field).
        startingContent:
          type: object
          description: Initial content such as title.
    PutV1ResearchesResearchidEmbedsTypeResponse:
      type: object
      properties:
        snippetChanged:
          type: boolean
          description: True only when the identify call in the snippet changed — replace the installed snippet then.
        snippetChangedNote:
          type: string
          description: The same, in a sentence.
    GetV1ResearchesResearchidInterviewsResponse:
      type: object
      properties:
        interviewId:
          type: string
          description: Always present.
        researchId:
          type: string
          description: Always present.
        status:
          type: string
          description: Always present. scheduled, in_progress, completed, incomplete or dropped.
        type:
          type: string
          description: Always present. audio, video or chat.
        participant:
          type: object
          description: Always present. name and email strings or null.
        startedAt:
          type: string
          description: Always present. ISO 8601 or null.
        endedAt:
          type: string
          description: Always present. ISO 8601 or null.
        duration:
          type: integer
          description: Always present. Length in seconds or null.
    PutV1ResearchesResearchidParticipantsRequest:
      type: object
      properties:
        email:
          type: string
          description: Matched trimmed and case-insensitive.
        name:
          type: string
          description: Participant's name.
        context:
          type: string
          description: Private interviewer notes, up to 1,000 characters.
      required:
      - email
      - context
    PutV1ResearchesResearchidParticipantsResponse:
      type: object
      properties:
        researchId:
          type: string
          description: Always present.
        email:
          type: string
          description: Always present. Normalized.
        name:
          type: string
          description: Always present. | null.
        hasContext:
          type: boolean
          description: Always present.
        createdAt:
          type: string
          description: Always present.
        updatedAt:
          type: string
          description: Always present.
  securitySchemes:
    bearer:
      type: http
      scheme: bearer
security:
- bearer: []
tags:
- name: Interviews
- name: Products
- name: Researches