Freestyle Snapshots API

Capture a VM's exact state, memory and disk, and boot new VMs from it

Operations 10

GET /snapshots List snapshots #
GET /snapshots/{snapshotIdOrSlug} Get snapshot #
DELETE /snapshots/{snapshotIdOrSlug} Delete snapshot #
PATCH /snapshots/{snapshotIdOrSlug} Update snapshot #
GET /v5/snapshots List snapshots #
GET /v5/snapshots/{snapshotIdOrSlug} Get snapshot #
DELETE /v5/snapshots/{snapshotIdOrSlug} Delete snapshot #
PATCH /v5/snapshots/{snapshotIdOrSlug} Update snapshot #
POST /v5/vms/{vmIdOrSlug}/snapshot Snapshot vm #
POST /vms/{vmIdOrSlug}/snapshot Snapshot vm #

Documentation

📖
Documentation
https://docs.freestyle.sh/v2/vms/about
📖
Documentation
https://docs.freestyle.sh/v2/vms/lifecycle
📖
Documentation
https://docs.freestyle.sh/v2/vms/configuration
📖
Documentation
https://docs.freestyle.sh/v2/vms/templates-snapshots
📖
Documentation
https://docs.freestyle.sh/v2/vms/ssh-access
📖
Documentation
https://docs.freestyle.sh/v2/git/about
📖
Documentation
https://docs.freestyle.sh/v2/git/repos
📖
Documentation
https://docs.freestyle.sh/v2/git/search
📖
Documentation
https://docs.freestyle.sh/v2/git/hooks
📖
Documentation
https://docs.freestyle.sh/v2/git/github-sync
📖
Documentation
https://docs.freestyle.sh/v2/git/advanced/database-api
📖
Documentation
https://docs.freestyle.sh/v2/about
📖
Documentation
https://docs.freestyle.sh/v2/domains
📖
Documentation
https://docs.freestyle.sh/v2/domains/deploy-to-custom-domain
📖
Documentation
https://docs.freestyle.sh/v2/serverless/runs/about
📖
Documentation
https://docs.freestyle.sh/v2/serverless/runs/code-playground
📖
Documentation
https://docs.freestyle.sh/v2/serverless/runs/egress
📖
Documentation
https://docs.freestyle.sh/v2/serverless/runs/errors
📖
Documentation
https://docs.freestyle.sh/v2/serverless/deployments/about
📖
Documentation
https://docs.freestyle.sh/v2/serverless/deployments/configuration
📖
Documentation
https://docs.freestyle.sh/v2/serverless/deployments/cron-jobs
📖
Documentation
https://docs.freestyle.sh/v2/serverless/deployments/guides/nextjs
📖
Documentation
https://docs.freestyle.sh/v2/serverless/deployments/guides/vite
📖
Documentation
https://docs.freestyle.sh/v2/serverless/deployments/guides/static

Specifications

Schemas & Data

Other Resources

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/freestyle-sh:freestyle-sh-snapshots-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

freestyle-sh-snapshots-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Freestyle Snapshots API
  description: '# Powerful Virtual Machines


    Documentation: freestyle.sh/docs


    Freestyle VMs are full Linux virtual machines designed for long running, complex tasks. ## Key Features


    - **Instant Startup**: Freestyle VMs provision in milliseconds, with p99s under 400ms. - **Persistence**: Freestyle VMs can run forever, they can be hibernated with their exact memory in place and come back to life weeks later instantly, in that exact state. - **Powerful**: Freestyle VMs go up to 64GB of RAM for public tiers and much further for enterprise. Freestyle does high quality hardware virtualization supporting nested virtualization, FUSE, eBPF, full Linux networking and more. If it can run in an EC2, it can run in a Freestyle VM. - **Cheaply Snapshottable and Branchable**: Freestyle VMs are instantly and cheaply snapshottable (sub 1ms interruption, sub 50ms to snapshot ready). These snapshots can be used to create new VMs in the exact state of the original VM (memory and disk). This enables powerful workflows like branching, cloning, and rapid recovery from failures. ## When to use Freestyle


    - **Long Running Agent Tasks**: When you have tasks that take hours, days, weeks or months to run, Freestyle VMs provide a persistent and powerful environment that your agent can work in to completion. - **Failure Prone/Experimental Exploration**: When your tasks involve branching, cloning or need time travel Freestyle VMs are ideal because of their cheap snapshottability and power that makes them great for experiments. - **Complex Coding Problems**: When you are tackling advanced coding problems in research or production codebases, poor virtualization and small sandboxes will not cut it. Freestyle VMs provide the necessary resources and environment to handle these challenges effectively. - **Multi Tenant Usage Patterns**: Freestyle VMs are intentionally built to be used by agent builders with multiple customers. The slug system allows for keying VMs by their user, the identity system allows for granular acccess control and permissioning, and the VPC system allows for multi-tenant network isolation. ## When not to use it


    - **"Run AI Code"**: If your exclusively executing short lived Python scripts or other ephemeral tasks the benefits above aren''t relevant. Freestyle VMs should still be benchmarked but there may be alternatives better suited. - **CPU Intensive CI/CD**: Freestyle VMs run on bare metal on data center CPUs. We also oversubscribe host resources. For workloads that require sustained high CPU usage like building the Linux Kernel or mining crypto prefer cloud providers that offer consumer CPU performance. - **Short Lived Tasks**: If your tasks are extremely short lived and do not benefit from persistence or powerful hardware. If your average task takes less than 15 minutes to complete then they are likely cheaply retryable and don''t require the reliability and persistence that Freestyle VMs provide. - **Sole Application Hosting**: Freestyle VMs are designed as workbenches for development, experimentation and task execution. Not for hosting production applications. Hosting a minecraft server for some friends will work great on Freestyle, but we do not offer autoscaling, load balancers or CDNs and we don''t plan to. ## Emerging Use Cases


    - **RL Environments**: Freestyle VMs are well-suited for running reinforcement learning environments that require persistent state and complex setups. The ability to snapshot and branch VMs allows researchers to experiment with different strategies and record environment states efficiently. - **Auto Research Climbing**: Freestyle VMs are great for auto research as the snapshotting and fan out allows research agents to explore multiple strategies, review past results and iterate efficiently without ever losing progress.'
  license:
    name: ''
  version: 0.1.0
security:
- apiKey: []
tags:
- name: Snapshots
  description: Capture a VM's exact state, memory and disk, and boot new VMs from it
paths:
  /snapshots:
    get:
      tags:
      - Snapshots
      description: List your snapshots.
      operationId: list_snapshots
      parameters:
      - name: sourceVmId
        in: query
        description: Only snapshots taken from this VM.
        required: false
        schema:
          type: string
      - name: search
        in: query
        required: false
        schema:
          type: string
      - name: limit
        in: query
        required: false
        schema:
          type: integer
          minimum: 0
      - name: offset
        in: query
        required: false
        schema:
          type: integer
          minimum: 0
      responses:
        '200':
          description: The account's snapshots
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListSnapshotsResponse'
      deprecated: true
      summary: List snapshots
      x-summary-source: derived
  /snapshots/{snapshotIdOrSlug}:
    get:
      tags:
      - Snapshots
      description: Fetch a snapshot by its id or its slug.
      operationId: get_snapshot
      parameters:
      - name: snapshotIdOrSlug
        in: path
        description: Snapshot id, your slug, or `{owner}/{slug}` for a public one
        required: true
        schema:
          type: string
      responses:
        '200':
          description: The snapshot
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Snapshot'
        '404':
          description: 'NOT_FOUND: no such snapshot'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicErrorBody'
      deprecated: true
      summary: Get snapshot
      x-summary-source: derived
    delete:
      tags:
      - Snapshots
      description: Delete a snapshot permanently. VMs already created from it are unaffected — a snapshot is a pointer to the data backing them, not the data itself — and its slug is freed immediately.
      operationId: delete_snapshot
      parameters:
      - name: snapshotIdOrSlug
        in: path
        description: Snapshot id or your slug for it
        required: true
        schema:
          type: string
      responses:
        '204':
          description: Snapshot deleted
        '404':
          description: 'NOT_FOUND: no such snapshot'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicErrorBody'
        '409':
          description: 'CONFLICT: the snapshot is the platform default'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicErrorBody'
      deprecated: true
      summary: Delete snapshot
      x-summary-source: derived
    patch:
      tags:
      - Snapshots
      description: Rename a snapshot or change its slug.
      operationId: update_snapshot
      parameters:
      - name: snapshotIdOrSlug
        in: path
        description: Snapshot id or your slug for it
        required: true
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateSnapshotRequest'
        required: true
      responses:
        '200':
          description: The updated snapshot
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Snapshot'
        '400':
          description: 'BAD_REQUEST: invalid slug'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicErrorBody'
        '404':
          description: 'NOT_FOUND: no such snapshot'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicErrorBody'
        '409':
          description: 'CONFLICT: that slug is already used by another snapshot in your account'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicErrorBody'
      deprecated: true
      summary: Update snapshot
      x-summary-source: derived
  /v5/snapshots:
    get:
      tags:
      - Snapshots
      description: List your snapshots.
      operationId: getV5Snapshots
      parameters:
      - name: sourceVmId
        in: query
        description: Only snapshots taken from this VM.
        required: false
        schema:
          type: string
      - name: search
        in: query
        required: false
        schema:
          type: string
      - name: limit
        in: query
        required: false
        schema:
          type: integer
          minimum: 0
      - name: offset
        in: query
        required: false
        schema:
          type: integer
          minimum: 0
      responses:
        '200':
          description: The account's snapshots
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListSnapshotsResponse'
      summary: List snapshots
      x-summary-source: derived
      x-operation-id-source: normalized
      x-operation-id-original: list_snapshots
  /v5/snapshots/{snapshotIdOrSlug}:
    get:
      tags:
      - Snapshots
      description: Fetch a snapshot by its id or its slug.
      operationId: getV5SnapshotsBySnapshotIdOrSlug
      parameters:
      - name: snapshotIdOrSlug
        in: path
        description: Snapshot id, your slug, or `{owner}/{slug}` for a public one
        required: true
        schema:
          type: string
      responses:
        '200':
          description: The snapshot
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Snapshot'
        '404':
          description: 'NOT_FOUND: no such snapshot'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicErrorBody'
      summary: Get snapshot
      x-summary-source: derived
      x-operation-id-source: normalized
      x-operation-id-original: get_snapshot
    delete:
      tags:
      - Snapshots
      description: Delete a snapshot permanently. VMs already created from it are unaffected — a snapshot is a pointer to the data backing them, not the data itself — and its slug is freed immediately.
      operationId: deleteV5SnapshotsBySnapshotIdOrSlug
      parameters:
      - name: snapshotIdOrSlug
        in: path
        description: Snapshot id or your slug for it
        required: true
        schema:
          type: string
      responses:
        '204':
          description: Snapshot deleted
        '404':
          description: 'NOT_FOUND: no such snapshot'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicErrorBody'
        '409':
          description: 'CONFLICT: the snapshot is the platform default'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicErrorBody'
      summary: Delete snapshot
      x-summary-source: derived
      x-operation-id-source: normalized
      x-operation-id-original: delete_snapshot
    patch:
      tags:
      - Snapshots
      description: Rename a snapshot or change its slug.
      operationId: patchV5SnapshotsBySnapshotIdOrSlug
      parameters:
      - name: snapshotIdOrSlug
        in: path
        description: Snapshot id or your slug for it
        required: true
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateSnapshotRequest'
        required: true
      responses:
        '200':
          description: The updated snapshot
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Snapshot'
        '400':
          description: 'BAD_REQUEST: invalid slug'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicErrorBody'
        '404':
          description: 'NOT_FOUND: no such snapshot'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicErrorBody'
        '409':
          description: 'CONFLICT: that slug is already used by another snapshot in your account'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicErrorBody'
      summary: Update snapshot
      x-summary-source: derived
      x-operation-id-source: normalized
      x-operation-id-original: update_snapshot
  /v5/vms/{vmIdOrSlug}/snapshot:
    post:
      tags:
      - Snapshots
      description: Capture the VM's exact state, memory and disk, so a VM booted from it resumes exactly where this one was. The VM must be running or paused. New snapshots are private. This call returns once the state is captured; VMs can be created from the snapshot immediately.
      operationId: snapshot_vm
      parameters:
      - name: vmIdOrSlug
        in: path
        description: VM id, or your slug for it
        required: true
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateSnapshotRequest'
        required: true
      responses:
        '200':
          description: Snapshot created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SnapshotCreated'
        '404':
          description: 'NOT_FOUND: no such VM in this account'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicErrorBody'
        '409':
          description: 'CONFLICT: the VM is neither running nor paused'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicErrorBody'
      summary: Snapshot vm
      x-summary-source: derived
  /vms/{vmIdOrSlug}/snapshot:
    post:
      tags:
      - Snapshots
      description: Capture the VM's exact state, memory and disk, so a VM booted from it resumes exactly where this one was. The VM must be running or paused. New snapshots are private. This call returns once the state is captured; VMs can be created from the snapshot immediately.
      operationId: postVmsByVmIdOrSlugSnapshot
      parameters:
      - name: vmIdOrSlug
        in: path
        description: VM id, or your slug for it
        required: true
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateSnapshotRequest'
        required: true
      responses:
        '200':
          description: Snapshot created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SnapshotCreated'
        '404':
          description: 'NOT_FOUND: no such VM in this account'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicErrorBody'
        '409':
          description: 'CONFLICT: the VM is neither running nor paused'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicErrorBody'
      deprecated: true
      summary: Snapshot vm
      x-summary-source: derived
      x-operation-id-source: normalized
      x-operation-id-original: snapshot_vm
components:
  schemas:
    PublicErrorBody:
      type: object
      description: 'The shape of every error response: a stable machine-readable `code` and a

        human-readable `message`. The HTTP status carries the class of failure.


        Some errors add fields alongside these two; `code` and `message` are always

        present.'
      required:
      - code
      - message
      properties:
        code:
          type: string
          description: 'A stable identifier for the failure, in `SCREAMING_SNAKE_CASE`. Branch

            on this; `message` is prose and may be reworded at any time.'
          example: NOT_FOUND
        message:
          type: string
          description: 'A human-readable explanation of what went wrong. A fault inside the

            platform is always reported as `INTERNAL_ERROR` with no further detail.'
          example: vm vm-1234 not found
    ListSnapshotsResponse:
      type: object
      required:
      - snapshots
      - totalCount
      properties:
        snapshots:
          type: array
          items:
            $ref: '#/components/schemas/Snapshot'
        totalCount:
          type: integer
          minimum: 0
    SnapshotId:
      type: string
      description: Identifies a snapshot. Minted as `"sh-<uuid>"`.
    Snapshot:
      type: object
      description: 'A snapshot as its owner sees it. The disk/memory layer tree, replication

        targets, and originating manager are storage internals and are not exposed.'
      required:
      - id
      - createdAt
      - updatedAt
      properties:
        autoDeleteFromPlan:
          type: boolean
          description: 'Whether `autoDeleteSeconds` above is your plan''s doing rather than

            yours, under the same rule as on a VM.'
        autoDeleteSeconds:
          type:
          - integer
          - 'null'
          format: int64
          description: 'Delete the snapshot once this long has passed without a VM being

            created from it. Absent means never. Some plans cap this and the cap

            shows up here.'
          minimum: 0
        createdAt:
          type: string
          format: date-time
        displayName:
          type:
          - string
          - 'null'
        id:
          $ref: '#/components/schemas/SnapshotId'
        lastUsedAt:
          type:
          - string
          - 'null'
          format: date-time
          description: 'When a VM was last created from this snapshot. Absent if none ever has

            been — which is not the same as never having been touched, since

            renaming a snapshot is not using it.'
        public:
          type: boolean
          description: Public snapshots are bootable by any account.
        slug:
          type:
          - string
          - 'null'
        sourceVmDisplayName:
          type:
          - string
          - 'null'
          description: The source VM's display name now, under the same rules.
        sourceVmId:
          oneOf:
          - type: 'null'
          - $ref: '#/components/schemas/VmId'
        sourceVmSlug:
          type:
          - string
          - 'null'
          description: 'What the source VM is called *now*; absent when it has no slug and

            when it is gone.'
        ttlSeconds:
          type:
          - integer
          - 'null'
          format: int64
          description: 'Delete the snapshot this long after it was taken, however recently

            anything booted it.'
          minimum: 0
        updatedAt:
          type: string
          format: date-time
    UpdateSnapshotRequest:
      type: object
      properties:
        autoDeleteSeconds:
          type:
          - integer
          - 'null'
          format: int64
          description: 'Seconds of nothing being created from it before the snapshot is

            deleted; -1 removes the window. On a plan that caps it, -1 puts you

            back on the cap rather than off it.'
        displayName:
          type:
          - string
          - 'null'
        slug:
          type:
          - string
          - 'null'
        ttlSeconds:
          type:
          - integer
          - 'null'
          format: int64
          description: 'Seconds from when the snapshot was taken — not from now — before it is

            deleted; -1 removes the deadline.'
      additionalProperties: false
    SnapshotCreated:
      type: object
      required:
      - snapshotId
      - snapshot
      properties:
        snapshot:
          $ref: '#/components/schemas/Snapshot'
        snapshotId:
          $ref: '#/components/schemas/SnapshotId'
        sourceVmId:
          oneOf:
          - type: 'null'
          - $ref: '#/components/schemas/VmId'
    CreateSnapshotRequest:
      type: object
      properties:
        autoDeleteSeconds:
          type:
          - integer
          - 'null'
          format: int64
          description: 'Delete the snapshot once this many seconds pass without a VM being

            created from it. Every create from it resets the clock. -1 (or

            omitting this) means never; some plans cap this, and on those omitting

            it (or sending -1) gets you the cap.'
        displayName:
          type:
          - string
          - 'null'
        slug:
          type:
          - string
          - 'null'
        ttlSeconds:
          type:
          - integer
          - 'null'
          format: int64
          description: 'Delete the snapshot this many seconds after it is taken, whatever has

            booted it since. -1 (or omitting this) means no deadline.'
      additionalProperties: false
    VmId:
      type: string
      description: Identifies a VM. Minted as `"vm-<uuid>"`.
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer
      description: 'Your Freestyle API key, sent as `Authorization: Bearer <api key>`. Every request needs one unless it is authenticated with an identity access token instead.'
    identityAccessToken:
      type: apiKey
      in: header
      name: x-freestyle-identity-access-token
      description: An access token belonging to an identity you created. It reaches only the VMs that identity has been granted, and only their exec and terminal routes. Hand one to an end user instead of your API key.
x-provenance:
  method: harvested
  publisher: Freestyle
  source: https://www.freestyle.sh/openapi.json
  note: split by refine-openapis from the provider's own published document, verified by fetch (openapi/_original/*.fetch.json);
    stamped by stamp-openapi-provenance.py (roadmap#793)