Skip to content
Pinner.xyz

Pinata Code Examples

Side-by-side code for every common operation. For setup instructions, see the Migration Guide. For the full adapter method reference, see Adapter Reference.

Pinata SDK 2.x

File Upload

// Pinata SDK 2.x
import { PinataSDK } from "pinata";
 
const pinata = new PinataSDK({
  pinataJwt: process.env.PINATA_JWT
});
 
const file = new File(["Hello!"], "hello.txt", { type: "text/plain" });
const upload = await pinata.upload.public.file(file);
 
console.log("CID:", upload.cid);
console.log("Name:", upload.name);
// Pinner with Adapter
import { Pinner, pinataAdapter } from "@lumeweb/pinner";
 
const pinner = new Pinner({ jwt: process.env.PINNER_AUTH_TOKEN });
const adapter = pinataAdapter(pinner);
 
const file = new File(["Hello!"], "hello.txt", { type: "text/plain" });
const upload = await adapter.upload.public.file(file)
  .name("hello.txt")
  .execute();
 
console.log("CID:", upload.cid);
console.log("Name:", upload.name);

JSON Upload

// Pinata SDK 2.x
const data = { name: "test", value: 123 };
const upload = await pinata.upload.public.json(data);
// Pinner with Adapter
const data = { name: "test", value: 123 };
const upload = await adapter.upload.public.json(data)
  .name("data.json")
  .execute();

Base64 Upload

// Pinata SDK 2.x
const base64String = "SGVsbG8gV29ybGQh";
const upload = await pinata.upload.public.base64(base64String);
// Pinner with Adapter
const base64String = "SGVsbG8gV29ybGQh";
const upload = await adapter.upload.public.base64(base64String)
  .name("file.txt")
  .execute();

Pin by CID

// Pinata SDK 2.x
const pin = await pinata.upload.public.cid("QmXoypizjW3WknFiJnKLwHCnL72vedxjQkDDP1mXWo6uco");
// Pinner with Adapter
const pin = await adapter.upload.public.cid("QmXoypizjW3WknFiJnKLwHCnL72vedxjQkDDP1mXWo6uco")
  .execute();

List Files

// Pinata SDK 2.x
const files = await pinata.files.public.list()
  .limit(10)
  .all();
 
for (const file of files) {
  console.log(file.name, file.cid);
}
// Pinner with Adapter
const files = await adapter.files.public.list()
  .limit(10)
  .all();
 
for (const file of files) {
  console.log(file.name, file.cid);
}

Directory Upload

// Pinata SDK 2.x
const files = [
  new File(["content"], "file1.txt"),
  new File(["content"], "file2.txt"),
];
const upload = await pinata.upload.public.fileArray(files);
// Pinner with Adapter
const files = [
  new File(["content"], "file1.txt"),
  new File(["content"], "file2.txt"),
];
const upload = await adapter.upload.public.fileArray(files)
  .name("my-directory")
  .execute();

Delete Files

// Pinata SDK 2.x
await pinata.files.public.delete(["QmXoypizjW3WknFiJnKLwHCnL72vedxjQkDDP1mXWo6uco"]);
// Pinner with Adapter
await adapter.files.public.delete(["QmXoypizjW3WknFiJnKLwHCnL72vedxjQkDDP1mXWo6uco"]);

Pinata SDK 1.x Legacy

File Upload

// Pinata SDK 1.x
const file = new File(["Hello!"], "hello.txt", { type: "text/plain" });
const upload = await pinata.pinFileToIPFS(file);
 
console.log("IpfsHash:", upload.IpfsHash);
// Pinner with Legacy Adapter
import { Pinner, pinataLegacyAdapter } from "@lumeweb/pinner";
 
const pinner = new Pinner({ jwt: process.env.PINNER_AUTH_TOKEN });
const adapter = pinataLegacyAdapter(pinner);
 
const file = new File(["Hello!"], "hello.txt", { type: "text/plain" });
const upload = await adapter.pinFileToIPFS(file);
 
console.log("CID:", upload.cid);

JSON Upload

// Pinata SDK 1.x
const data = { name: "test", value: 123 };
const upload = await pinata.pinJSONToIPFS(data);
// Pinner with Legacy Adapter
const data = { name: "test", value: 123 };
const upload = await adapter.pinJSONToIPFS(data);

Pin by CID

// Pinata SDK 1.x
const pin = await pinata.pinByHash("QmXoypizjW3WknFiJnKLwHCnL72vedxjQkDDP1mXWo6uco");
// Pinner with Legacy Adapter
const pin = await adapter.pinByHash("QmXoypizjW3WknFiJnKLwHCnL72vedxjQkDDP1mXWo6uco");

List Pins

// Pinata SDK 1.x
const pins = await pinata.pinList({ limit: 10 });
 
for (const pin of pins.files) {
  console.log(pin.ipfs_pin_hash);
}
// Pinner with Legacy Adapter
const pins = await adapter.pinList({ limit: 10 });
 
for (const pin of pins.files) {
  console.log(pin.cid);
}

Unpin

// Pinata SDK 1.x
await pinata.unpin("QmXoypizjW3WknFiJnKLwHCnL72vedxjQkDDP1mXWo6uco");
// Pinner with Legacy Adapter
await adapter.unpin("QmXoypizjW3WknFiJnKLwHCnL72vedxjQkDDP1mXWo6uco");

Update Metadata

// Pinata SDK 1.x
await pinata.hashMetadata("QmXoypizjW3WknFiJnKLwHCnL72vedxjQkDDP1mXWo6uco", {
  project: "my-app",
  version: "2.0"
});
// Pinner with Legacy Adapter
await adapter.hashMetadata("QmXoypizjW3WknFiJnKLwHCnL72vedxjQkDDP1mXWo6uco", {
  project: "my-app",
  version: "2.0"
});

Native Pinner API

Skip the adapter and use Pinner directly for the best experience.

File Upload

import { Pinner } from "@lumeweb/pinner";
 
const pinner = new Pinner({ jwt: process.env.PINNER_AUTH_TOKEN });
 
const file = new File(["Hello!"], "hello.txt", { type: "text/plain" });
const result = await pinner.uploadAndWait(file);
 
console.log("CID:", result.cid);

Upload with Progress

const operation = await pinner.upload(file, {
  name: "hello.txt",
  keyvalues: { project: "demo" },
  onProgress: (progress) => {
    console.log(`Progress: ${progress.percentage.toFixed(1)}%`);
    console.log(`Uploaded: ${progress.bytesUploaded} / ${progress.bytesTotal} bytes`);
  }
});
 
const result = await operation.result;
console.log("CID:", result.cid);
console.log("Final progress:", operation.progress.percentage);

Pin Management

// Pin by CID
for await (const cid of pinner.pinByHash("QmXoypizjW3WknFiJnKLwHCnL72vedxjQkDDP1mXWo6uco")) {
  console.log("Pinned:", cid.toString());
}
 
// List pins
const pins = await pinner.listPins();
for (const pin of pins) {
  console.log(pin.cid.toString(), pin.name);
}
 
// Unpin
await pinner.unpin("QmXoypizjW3WknFiJnKLwHCnL72vedxjQkDDP1mXWo6uco");

Error Handling

// Pinata SDK
try {
  const upload = await pinata.upload.public.file(file);
} catch (error) {
  console.error("Pinata error:", error.message);
}
// Pinner SDK
import { PinnerError } from "@lumeweb/pinner";
 
try {
  const result = await pinner.upload(file);
} catch (error) {
  if (error instanceof PinnerError) {
    console.error("Code:", error.code);
    console.error("Message:", error.message);
  }
}