Skip to content

cloudlayerio ( - API Library for easy access to our REST based API services using the f# language.


Notifications You must be signed in to change notification settings


Repository files navigation

CloudLayer for F#

This is the CloudLayer API for easy access to our REST based API services using F#.

To read about how to get started using CloudLayer, see documentation here.


You can reference it directly from Nuget or Paket.

PS> Install-Package CloudLayer.FSharp

The assembly targets NetStandard 2.0.


To begin, create an API key from the dashboard.


All API calls take in a Connection:

let connection = 
	{ Connection.Defaults with ApiKey = "ca-644907a519df4f84b0db24b822b37c5e" }

If you are using this from an Asp.Net Core app, you can specify a IHttpClientFactory to be used (this is usually available through Dependency Injection),

let connection' = { connection with ClientFactory = factory }

IHttpClientFactory avoids socket exhaustion problems and maintains a pool of HttpClient instances for reuse. See this article for more.

API calls have, as the last argument a Connection, and they take the shape:

connection |> CloudLayerApi.apiCall : Async<Result<ReturnValue, FailureReason>>

All API calls return the Result type, and they follow the railway-oriented approach.

Account Status

You can check the status of your account with

let status =
    connection |> CloudLayerApi.accountStatus |> Async.RunSynchronously

The results can be pattern matched.

match status with
| Ok status ->
    $"{status.Remaining} of {status.Limit} remaining. " +
    $"Limit resets at {status.ResetsAt.LocalDateTime}"
| Error err ->
    match err with
    | FailureReason.InvalidApiKey -> "Check your api key"
    | FailureReason.InsufficientCredit -> "Buy more credit pls"
    | FailureReason.SubscriptionInactive -> "Please activate your account"
    | FailureReason.Unauthorized -> "Please check your credentials or proxy"
    | other -> $"There was an error: {other}"
|> printfn "%s"

Creating Images

CloudLayer can create images of public URLs:

let image = 
    connection |> CloudLayerApi.fetchImage (Url "")

and raw html:

let image = 
    connection |> CloudLayerApi.fetchImage (Html "<h1>Hello World!</h1>")

and returns either a System.IO.Stream or a FailureReason.

match image with
| Ok (stream, status) ->
    //do something with stream
| Error err -> 
    failwithf "Something went wrong: %A" err

You can save the result to a file with saveToFile, or read directly to memory with toByteArray.

|> CloudLayerApi.fetchImage (Url "") 
|> CloudLayerApi.saveToFile "google.jpg"
|> Async.RunSynchronously


To use more configuration options, use fetchImageWith. Options are specified by the ImageOptions record.

|> CloudLayerApi.fetchImageWith 
    { ImageOptions.Defaults with 
        Source = Url "" 
        Timeout = TimeSpan.FromSeconds 60. 
        Inline = false }
|> CloudLayerApi.saveToFile "eagle-island.jpg"
|> Async.RunSynchronously

Creating PDFs

Creating PDFs is similar to the API for creating images.

connection |> CloudLayerApi.fetchPdf (Url "")
connection |> CloudLayerApi.fetchPdf (Html "<h1>Hello from PDF!</h1>")

For more options, use fetchPdfWith. Options are specified by the PdfOptions record.

|> CloudLayerApi.fetchPdfWith 
    { PdfOptions.Defaults with
        Source = (Url "") 
        PrintBackground = false
        Format = "A4" }
|> CloudLayerApi.saveToFile "snow.pdf"
|> Async.RunSynchronously


This library is specifically for F#, if you are using C# you should use our C# library. We did this because we wanted to give F# developers first class support instead of wrapping a C# library.