Authorization: Bearer zk_live_… or anX-API-Key header. Keys are minted in /dashboard/api-keys and draw down the same credit balance you top up through billing.
Swift Content
This is the default content for Swift. Use slot="tab-swift" to provide custom content.
Kotlin Content
This is the default content for Kotlin. Use slot="tab-kotlin" to provide custom content.
TypeScript Content
This is the default content for TypeScript. Use slot="tab-typescript" to provide custom content.
Python Content
This is the default content for Python. Use slot="tab-python" to provide custom content.
Rust Content
This is the default content for Rust. Use slot="tab-rust" to provide custom content.
C Content
This is the default content for C. Use slot="tab-c" to provide custom content.
curl Content
This is the default content for curl. Use slot="tab-curl" to provide custom content.
Swift Package Manager · import ArclodeSDKQuickstart.swift
swift
import ArclodeSDK // One pooled client — build it once, reuse it for every call.let client = try ArclodeClient( baseUrl: "https://api.arclode.com", credential: .bearer(secret: ProcessInfo.processInfo.environment["ARCLODE_API_KEY"]!), timeoutSecs: nil) // Submit an inference job. inputJson is forwarded verbatim to the worker.let submitted = try await client.submitJob( kind: "inference:image:generate", inputJson: #"{ "prompt": "a red fox on a basalt cliff", "model": "fal-ai/flux-2-pro" }"#) // Poll until the run reaches a terminal state.var status = try await client.jobStatus(runId: submitted.runId)while !status.terminal { try await Task.sleep(for: .seconds(1)) status = try await client.jobStatus(runId: submitted.runId)}print(status.rawJson) // the finished job carries output.urlsMaven · com.blackleafdigital.arclode:sdkQuickstart.kt
kotlin
import com.blackleafdigital.arclode.*import kotlinx.coroutines.delay // Every network call is a suspend fn — run it inside a coroutine.val client = ArclodeClient( baseUrl = "https://api.arclode.com", credential = Credential.Bearer(System.getenv("ARCLODE_API_KEY")), timeoutSecs = null,) // Submit an inference job. inputJson is forwarded verbatim to the worker.val submitted = client.submitJob( kind = "inference:image:generate", inputJson = """{ "prompt": "a red fox on a basalt cliff", "model": "fal-ai/flux-2-pro" }""",) // Poll until the run reaches a terminal state.var status = client.jobStatus(runId = submitted.runId)while (!status.terminal) { delay(1000) status = client.jobStatus(runId = submitted.runId)}println(status.rawJson) // the finished job carries output.urlsnpm i @arclode/sdkquickstart.ts
typescript
import { ArclodeClient, Credential } from '@arclode/sdk'; // One pooled client — construct it once, reuse it.const client = new ArclodeClient( 'https://api.arclode.com', Credential.bearer(process.env.ARCLODE_API_KEY!),); // Submit an inference job — the input crosses the addon as a JSON string.const submitted = await client.submitJob( 'inference:image:generate', JSON.stringify({ prompt: 'a red fox on a basalt cliff', model: 'fal-ai/flux-2-pro' }),); // Poll until the run reaches a terminal state.let status = await client.jobStatus(submitted.runId);while (!status.terminal) { await new Promise((r) => setTimeout(r, 1000)); status = await client.jobStatus(submitted.runId);}console.log(status.rawJson); // the finished job carries output.urlspip install arclode-sdkquickstart.py
python
import asyncioimport jsonimport os import arclode_sdk async def main(): # One pooled client — construct it once, reuse it. client = arclode_sdk.ArclodeClient( "https://api.arclode.com", arclode_sdk.Credential.bearer(os.environ["ARCLODE_API_KEY"]), ) # Submit an inference job (input is a JSON string). submitted = await client.submit_job( "inference:image:generate", json.dumps({"prompt": "a red fox on a basalt cliff", "model": "fal-ai/flux-2-pro"}), ) # Poll until the run reaches a terminal state. status = await client.job_status(submitted.run_id) while not status.terminal: await asyncio.sleep(1) status = await client.job_status(submitted.run_id) print(status.raw_json) # the finished job carries output.urls asyncio.run(main())cargo add arclode-sdkmain.rs
rust
use arclode_sdk::{Client, Credential};use serde_json::json;use std::time::Duration; #[tokio::main]async fn main() -> arclode_sdk::Result<()> { // One pooled, keep-alive client — build it once, reuse it for every call. let client = Client::builder("https://api.arclode.com") .credential(Credential::bearer(std::env::var("ARCLODE_API_KEY").unwrap())) .build()?; // Submit an inference job; input is forwarded verbatim to the worker. let submitted = client .submit_job( "inference:image:generate", json!({ "prompt": "a red fox on a basalt cliff", "model": "fal-ai/flux-2-pro" }), ) .await?; // Poll until the run reaches a terminal state. let mut status = client.job_status(submitted.run_id).await?; while !status.is_terminal() { tokio::time::sleep(Duration::from_secs(1)).await; status = client.job_status(submitted.run_id).await?; } // The finished job's output carries the durable artifact urls. println!("{:?}", status.output()); Ok(())}cargo build --release -p arclode_sdk_ffi-c · #include "arclode_sdk_ffi.h"quickstart.c
c
#include <stdio.h>#include <stdlib.h>#include "arclode_sdk_ffi.h" int main(void) { // One client handle — construct it, then configure the base URL + Arclode key. arclode_sdk_ffi_ArclodeSdk *client = arclode_sdk_ffi_ArclodeSdk_new_client(); if (arclode_sdk_ffi_ArclodeSdk_configure( client, "https://api.arclode.com", getenv("ARCLODE_API_KEY")) != 0) { fprintf(stderr, "configure: %s\n", arclode_sdk_ffi_last_error_message()); return 1; } // Submit an inference job — input is a JSON string, forwarded to the worker. // The out-param is an owned JSON string you must release with string_free. char *out = NULL; const char *input = "{\"prompt\":\"a red fox on a basalt cliff\",\"model\":\"fal-ai/flux-2-pro\"}"; if (arclode_sdk_ffi_ArclodeSdk_submit_job( client, "inference:image:generate", input, &out) != 0) { fprintf(stderr, "submit: %s\n", arclode_sdk_ffi_last_error_message()); arclode_sdk_ffi_ArclodeSdk_free(client); return 1; } printf("submitted: %s\n", out); // { "run_id": "...", "class": "...", "priority": ... } arclode_sdk_ffi_string_free(out); out = NULL; // Poll GET /v1/jobs/{id} until terminal (parse run_id from the submit JSON // with your JSON library of choice). A finished job carries output.urls. if (arclode_sdk_ffi_ArclodeSdk_job_status(client, "<run-id>", &out) == 0) { printf("status: %s\n", out); arclode_sdk_ffi_string_free(out); } arclode_sdk_ffi_ArclodeSdk_free(client); return 0;}any HTTP client — no SDK requiredquickstart.sh
bash
# 1. Submit a job — a 202 with { run_id, class, priority }.RUN=$(curl -sS -X POST "https://api.arclode.com/v1/jobs" \ -H "Authorization: Bearer $ARCLODE_API_KEY" \ -H 'Content-Type: application/json' \ -d '{ "kind": "inference:image:generate", "input": { "prompt": "a red fox on a basalt cliff", "model": "fal-ai/flux-2-pro" } }' | jq -r .run_id) # 2. Fetch the result — poll GET /v1/jobs/{id} until terminal.# A finished job carries output.urls (the durable artifact URLs).curl -sS "https://api.arclode.com/v1/jobs/$RUN" \ -H "Authorization: Bearer $ARCLODE_API_KEY"
POST /v1/jobs with a body of{ kind, input, version?, class? } —input is the per-kind payload, forwarded verbatim to the worker. A successful submit returns202 with{ run_id, class, priority }.submit.sh
bash
curl -sS -X POST "https://api.arclode.com/v1/jobs" \ -H "Authorization: Bearer $ARCLODE_API_KEY" \ -H 'Content-Type: application/json' \ -d '{ "kind": "inference:image:generate", "input": { "prompt": "A lighthouse on a basalt cliff at dusk, volumetric fog, cinematic", "model": "fal-ai/flux-2-pro", "imageSize": { "width": 1024, "height": 1024 } }}'inference:image:generate
submit.sh
bash
curl -sS -X POST "https://api.arclode.com/v1/jobs" \ -H "Authorization: Bearer $ARCLODE_API_KEY" \ -H 'Content-Type: application/json' \ -d '{ "kind": "inference:image:generate", "input": { "prompt": "A lighthouse on a basalt cliff at dusk, volumetric fog, cinematic", "model": "fal-ai/flux-2-pro", "imageSize": { "width": 1024, "height": 1024 } }}'inference:3d:image-to-mesh
submit.sh
bash
curl -sS -X POST "https://api.arclode.com/v1/jobs" \ -H "Authorization: Bearer $ARCLODE_API_KEY" \ -H 'Content-Type: application/json' \ -d '{ "kind": "inference:3d:image-to-mesh", "input": { "imageUrl": "https://assets.example.com/renders/chair-front.png", "model": "fal-ai/hunyuan3d/v2", "textured": true }}'inference:3d:text-to-mesh
submit.sh
bash
curl -sS -X POST "https://api.arclode.com/v1/jobs" \ -H "Authorization: Bearer $ARCLODE_API_KEY" \ -H 'Content-Type: application/json' \ -d '{ "kind": "inference:3d:text-to-mesh", "input": { "prompt": "A low-poly wooden treasure chest with brass fittings", "model": "fal-ai/hunyuan-3d/v3.1/pro/text-to-3d" }}'inference:video:generate
submit.sh
bash
curl -sS -X POST "https://api.arclode.com/v1/jobs" \ -H "Authorization: Bearer $ARCLODE_API_KEY" \ -H 'Content-Type: application/json' \ -d '{ "kind": "inference:video:generate", "input": { "prompt": "Slow dolly-in on a rain-soaked neon alley at night, cinematic", "model": "fal-ai/kling-video/v2.1/pro/image-to-video", "imageUrl": "https://assets.example.com/frames/alley-start.png", "duration": 5 }}'inference:texture:generate
submit.sh
bash
curl -sS -X POST "https://api.arclode.com/v1/jobs" \ -H "Authorization: Bearer $ARCLODE_API_KEY" \ -H 'Content-Type: application/json' \ -d '{ "kind": "inference:texture:generate", "input": { "meshUrl": "https://assets.example.com/meshes/crate.glb", "prompt": "Weathered shipping-crate wood with stenciled markings, PBR" }}'inference:rig
submit.sh
bash
curl -sS -X POST "https://api.arclode.com/v1/jobs" \ -H "Authorization: Bearer $ARCLODE_API_KEY" \ -H 'Content-Type: application/json' \ -d '{ "kind": "inference:rig", "input": { "meshUrl": "https://assets.example.com/meshes/character.glb" }}'inference:llm:text-generate
submit.sh
bash
curl -sS -X POST "https://api.arclode.com/v1/jobs" \ -H "Authorization: Bearer $ARCLODE_API_KEY" \ -H 'Content-Type: application/json' \ -d '{ "kind": "inference:llm:text-generate"}'inference:audio:music-generate
submit.sh
bash
curl -sS -X POST "https://api.arclode.com/v1/jobs" \ -H "Authorization: Bearer $ARCLODE_API_KEY" \ -H 'Content-Type: application/json' \ -d '{ "kind": "inference:audio:music-generate"}'inference:audio:sfx-generate
submit.sh
bash
curl -sS -X POST "https://api.arclode.com/v1/jobs" \ -H "Authorization: Bearer $ARCLODE_API_KEY" \ -H 'Content-Type: application/json' \ -d '{ "kind": "inference:audio:sfx-generate"}'inference:audio:text-to-speech
submit.sh
bash
curl -sS -X POST "https://api.arclode.com/v1/jobs" \ -H "Authorization: Bearer $ARCLODE_API_KEY" \ -H 'Content-Type: application/json' \ -d '{ "kind": "inference:audio:text-to-speech"}'inference:audio:transcribe
submit.sh
bash
curl -sS -X POST "https://api.arclode.com/v1/jobs" \ -H "Authorization: Bearer $ARCLODE_API_KEY" \ -H 'Content-Type: application/json' \ -d '{ "kind": "inference:audio:transcribe"}'
GET /v1/jobs/{run_id} until the run reaches a terminal state. A finished job carriesoutput.urls — durable URLs to every generated artifact (images, meshes, video files), ready to download or hand to the next job.poll.sh
bash
curl -sS "https://api.arclode.com/v1/jobs/$RUN_ID" \ -H "Authorization: Bearer $ARCLODE_API_KEY"
GET /v1/jobs/{run_id}/events — a server-sent-events (SSE) stream that follows the run fromqueued → started →done and closes on the terminal event.events.sh
bash
curl -N "https://api.arclode.com/v1/jobs/$RUN_ID/events" \ -H "Authorization: Bearer $ARCLODE_API_KEY" \ -H 'Accept: text/event-stream'401
402
400
GET /v1/capabilities returns the kinds the network currently routes — use it to discover new generators without a client update.
fetch is all you need — no SDK required to submit a job.submit.ts
ts
const res = await fetch('https://api.arclode.com/v1/jobs', { method: 'POST', headers: { authorization: `Bearer ${process.env.ARCLODE_API_KEY}`, 'content-type': 'application/json', }, body: JSON.stringify({ "kind": "inference:image:generate", "input": { "prompt": "A lighthouse on a basalt cliff at dusk, volumetric fog, cinematic", "model": "fal-ai/flux-2-pro", "imageSize": { "width": 1024, "height": 1024 } }}),}); if (!res.ok) throw new Error(`submit failed (${res.status})`);const { run_id } = await res.json();console.log('run:', run_id);