{
  "schemaVersion": "1.0",
  "canonicalPage": "https://fileformat.co/ext/arrow",
  "inspectorUrl": "https://fileformat.co/inspect",
  "spec": {
    "slug": "arrow",
    "extension": ".arrow",
    "aliases": [
      ".ipc"
    ],
    "name": "Apache Arrow IPC Random-Access File",
    "shortName": "Arrow IPC",
    "category": "data-lake",
    "tier": 1,
    "summary": "Zero-copy in-memory columnar format serialized to disk with 8-byte aligned `ARROW1\\x00\\x00` framing and FlatBuffers schema/record-batch descriptors.",
    "technicalNotes": "Distinguished from Arrow Streaming IPC (`.arrows`, which starts directly with `0xFFFFFFFF` continuation) by the 8-byte `ARROW1\\x00\\x00` header and trailing `ARROW1` footer.",
    "mimeTypes": [
      "application/vnd.apache.arrow.file"
    ],
    "identifiers": {
      "specUrl": "https://arrow.apache.org/docs/format/Columnar.html#ipc-file-format"
    },
    "binarySignature": {
      "endianness": "little",
      "magicBytes": [
        {
          "offset": 0,
          "hex": "41 52 52 4F 57 31 00 00",
          "ascii": "ARROW1..",
          "description": "6-byte ARROW1 magic padded to 8-byte SIMD alignment"
        }
      ],
      "containerFamily": null,
      "headerLayout": [
        {
          "offset": "0x00 - 0x07",
          "byteOffset": 0,
          "byteLength": 8,
          "lengthLabel": "8 B",
          "dataType": "char[6]+pad",
          "fieldName": "header_magic",
          "description": "'ARROW1' + 2 zero padding bytes"
        },
        {
          "offset": "0x08 - 0x0B",
          "byteOffset": 8,
          "byteLength": 4,
          "lengthLabel": "4 B",
          "dataType": "uint32_le",
          "fieldName": "continuation",
          "description": "0xFFFFFFFF IPC message continuation marker"
        },
        {
          "offset": "EOF-10 .. EOF-7",
          "byteOffset": 16,
          "byteLength": 4,
          "lengthLabel": "4 B",
          "dataType": "int32_le",
          "fieldName": "footer_size",
          "description": "FlatBuffers Footer byte length"
        },
        {
          "offset": "EOF-6 .. EOF-1",
          "byteOffset": 20,
          "byteLength": 6,
          "lengthLabel": "6 B",
          "dataType": "char[6]",
          "fieldName": "footer_magic",
          "description": "Trailing 'ARROW1' magic"
        }
      ]
    },
    "securityProfile": {
      "riskLevel": "low",
      "allowsArbitraryCodeOrMacros": false,
      "xxeRisk": false,
      "polyglotPrependRisk": false,
      "pickleDeserializationRisk": false,
      "uploadValidationNotes": "Verify both leading 'ARROW1\\x00\\x00' and trailing 'ARROW1', and validate FlatBuffer buffer offsets before zero-copy pointer arithmetic."
    },
    "codeSnippets": {
      "python": "import os, struct, sys\nwith open(sys.argv[1], \"rb\") as f:\n    head = f.read(8)\n    f.seek(-10, os.SEEK_END)\n    flen, tail = struct.unpack(\"<i6s\", f.read(10))\n    assert head == b\"ARROW1\\x00\\x00\" and tail == b\"ARROW1\"\n    print(f\"Arrow IPC valid: footer={flen}B\")",
      "typescript": "export async function checkArrowIpc(file: File) {\n  const head = new TextDecoder().decode(await file.slice(0, 6).arrayBuffer());\n  const tail = new TextDecoder().decode(await file.slice(file.size - 6).arrayBuffer());\n  return head === 'ARROW1' && tail === 'ARROW1';\n}",
      "rust": "use std::{fs::File, io::Read};\nfn main() -> std::io::Result<()> {\n    let mut h = [0u8; 8];\n    File::open(std::env::args().nth(1).expect(\"usage: <prog> <file>\"))?.read_exact(&mut h)?;\n    println!(\"Arrow magic: {:?}\", &h[..6]);\n    Ok(())\n}",
      "go": "package main\nimport (\"fmt\"; \"io\"; \"os\")\nfunc main() {\n    f, err := os.Open(os.Args[1])\n    if err != nil {\n        fmt.Fprintln(os.Stderr, \"open:\", err)\n        os.Exit(1)\n    }\n    defer f.Close()\n    b := make([]byte, 6)\n    if _, err := io.ReadFull(f, b); err != nil {\n        fmt.Fprintln(os.Stderr, \"read:\", err)\n        os.Exit(1)\n    }\n    fmt.Println(string(b))\n}"
    },
    "relatedFormats": [
      "feather",
      "parquet",
      "duckdb"
    ],
    "verifiedAt": "2026-11-14T16:09:03Z"
  },
  "samples": [
    {
      "id": "arrow-minimal",
      "filename": "minimal-ipc.arrow",
      "variant": "minimal",
      "title": "Minimal Apache Arrow IPC Random-Access File",
      "description": "Real Arrow IPC file-format output from pyarrow RecordBatchFileWriter with ARROW1 magic + FlatBuffers footer.",
      "localPath": "/fixtures/v1/arrow/minimal-ipc.arrow",
      "cdnUrl": "https://fileformat.co/fixtures/v1/arrow/minimal-ipc.arrow",
      "sizeBytes": 666,
      "sha256": "b86279b7e38e81af141b12db151638fa780d57567b64de10e4a4e1c1610e6b64",
      "expectValid": true
    },
    {
      "id": "arrow-realistic",
      "filename": "record-batch.arrow",
      "variant": "realistic",
      "title": "Arrow IPC RecordBatch Buffer",
      "description": "pyarrow-written 100-row IPC file with int64/float64/string columns in a single record batch.",
      "localPath": "/fixtures/v1/arrow/record-batch.arrow",
      "cdnUrl": "https://fileformat.co/fixtures/v1/arrow/record-batch.arrow",
      "sizeBytes": 3402,
      "sha256": "469652943f52989ed6b08a1ebea08fe5755d9fed2be0a6e9d4ee8f22a8775121",
      "expectValid": true
    },
    {
      "id": "arrow-edge-case",
      "filename": "missing-footer.arrow",
      "variant": "edge-case",
      "title": "Truncated Arrow File (Missing ARROW1 Tail)",
      "description": "Arrow IPC file-format bytes truncated inside the FlatBuffers footer — RecordBatchFileReader must raise.",
      "localPath": "/fixtures/v1/arrow/missing-footer.arrow",
      "cdnUrl": "https://fileformat.co/fixtures/v1/arrow/missing-footer.arrow",
      "sizeBytes": 650,
      "sha256": "2c7855bd0e3ae0dc6aad8260b0c03c8c3aeed62adcd2c5211a7fd6ab98bd6e5d",
      "expectValid": false,
      "edgeCaseTag": "Missing ARROW1 Footer"
    }
  ]
}