diff --git a/lib/YAMLScript/FFI.hs b/lib/YAMLScript/FFI.hs
--- a/lib/YAMLScript/FFI.hs
+++ b/lib/YAMLScript/FFI.hs
@@ -2,7 +2,6 @@
 -- This code is licensed under MIT license (See License for details)
 
 {-# LANGUAGE ForeignFunctionInterface #-}
-{-# LANGUAGE CApiFFI #-}
 {-# LANGUAGE ScopedTypeVariables #-}
 
 module YAMLScript.FFI
@@ -17,24 +16,33 @@
 import Control.Exception (bracket)
 
 -- | GraalVM isolate thread type
-type GraalIsolateThread = Ptr ()
+data GraalCreateIsolateParams
+data GraalIsolate
+data GraalIsolateThread
 
+type GraalIsolateThreadPtr = Ptr GraalIsolateThread
+
 -- | Foreign function interface to GraalVM isolate management
-foreign import capi "graal_isolate.h graal_create_isolate"
-  c_graal_create_isolate :: Ptr () -> Ptr () -> Ptr GraalIsolateThread -> IO CInt
+foreign import ccall "graal_create_isolate"
+  c_graal_create_isolate
+    :: Ptr GraalCreateIsolateParams
+    -> Ptr (Ptr GraalIsolate)
+    -> Ptr GraalIsolateThreadPtr
+    -> IO CInt
 
-foreign import capi "graal_isolate.h graal_tear_down_isolate"
-  c_graal_tear_down_isolate :: GraalIsolateThread -> IO CInt
+foreign import ccall "graal_tear_down_isolate"
+  c_graal_tear_down_isolate :: GraalIsolateThreadPtr -> IO CInt
 
 -- | Foreign function interface to load_ys_to_json
-foreign import capi "libys.0.2.8.h load_ys_to_json"
-  c_load_ys_to_json :: GraalIsolateThread -> CString -> IO CString
+foreign import ccall "load_ys_to_json"
+  c_load_ys_to_json :: CLLong -> CString -> IO CString
 
 -- | Create a GraalVM isolate and run an action with it
-withGraalIsolate :: (GraalIsolateThread -> IO a) -> IO a
+withGraalIsolate :: (GraalIsolateThreadPtr -> IO a) -> IO a
 withGraalIsolate action =
-  alloca $ \(isolateThreadPtr :: Ptr GraalIsolateThread) -> do
-    -- Create the isolate (following Python binding pattern: None, None, &isolatethread)
+  alloca $ \(isolateThreadPtr :: Ptr GraalIsolateThreadPtr) -> do
+    -- Create the isolate (following Python binding pattern:
+    -- None, None, &isolatethread).
     rc <- c_graal_create_isolate nullPtr nullPtr isolateThreadPtr
     if rc /= 0
       then error $ "Failed to create GraalVM isolate (code " ++ show rc ++ ")"
@@ -46,7 +54,10 @@
           (\thread -> do
             rc' <- c_graal_tear_down_isolate thread
             if rc' /= 0
-              then error $ "Failed to tear down GraalVM isolate (code " ++ show rc' ++ ")"
+              then
+                error $
+                  "Failed to tear down GraalVM isolate (code " ++
+                  show rc' ++ ")"
               else return ())
           action
 
@@ -55,7 +66,10 @@
 loadYsToJsonFFI input =
   withGraalIsolate $ \isolateThread ->
     BSU.unsafeUseAsCString input $ \cInput -> do
-      cResult <- c_load_ys_to_json isolateThread cInput
+      cResult <- c_load_ys_to_json (threadId isolateThread) cInput
       if cResult == nullPtr
         then return BS.empty
         else BS.packCString cResult
+
+threadId :: GraalIsolateThreadPtr -> CLLong
+threadId = fromIntegral . ptrToIntPtr
diff --git a/yamlscript.cabal b/yamlscript.cabal
--- a/yamlscript.cabal
+++ b/yamlscript.cabal
@@ -1,6 +1,6 @@
 cabal-version:      3.0
 name:               yamlscript
-version:            0.2.8.0
+version:            0.2.12.0
 synopsis:           Haskell bindings for YAMLScript
 description:        Haskell bindings for YAMLScript, a functional
                     programming language with YAML syntax.
