F Finsider
SEC Form 3 API

Form 3 API (Initial Ownership)

Know who’s an insider before they trade. The Form 3 API delivers initial statements of beneficial ownership — the first filing a new insider makes — as JSON.

JSON responsesOpenAPI documentedcURL / Python / JS / GoFree tier available

What is Form 3?

Form 3 is the initial statement of beneficial ownership. New officers, directors, and 10% owners must file it within 10 days of becoming an insider, establishing their starting holdings.

It is the baseline for insider tracking: Form 3 tells you who the insiders are, and Form 4 tracks their trades from there.

The Finsider Form 3 API indexes these initial filings so you can build a complete roster of company insiders.

Fetch Form 3 filings

List recent Form 3 filings, filterable by company, ticker, and date.

curl -s "https://api.secapi.dev/v1/filings?formTypes=3&limit=20" \
  -H "x-api-key: $SECAPI_KEY"
import requests

resp = requests.get(
    "https://api.secapi.dev/v1/filings?formTypes=3&limit=20",
    headers={"x-api-key": "YOUR_API_KEY"},
    timeout=30,
)
resp.raise_for_status()
data = resp.json()
print(data)
const res = await fetch("https://api.secapi.dev/v1/filings?formTypes=3&limit=20", {
  method: "GET",
  headers: { "x-api-key": process.env.SECAPI_KEY },
});
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const data = await res.json();
console.log(data);
package main

import (
	"fmt"
	"io"
	"log"
	"net/http"
	"os"
)

func main() {
	req, _ := http.NewRequest("GET", "https://api.secapi.dev/v1/filings?formTypes=3&limit=20", nil)
	req.Header.Set("x-api-key", os.Getenv("SECAPI_KEY"))

	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()

	body, _ := io.ReadAll(resp.Body)
	fmt.Println(string(body))
}

List new insider filings

Stream recent Section 16 insider activity, including initial ownership.

curl -s "https://api.secapi.dev/v1/insiders/transactions?insiderRole=officer&limit=50" \
  -H "x-api-key: $SECAPI_KEY"
import requests

resp = requests.get(
    "https://api.secapi.dev/v1/insiders/transactions?insiderRole=officer&limit=50",
    headers={"x-api-key": "YOUR_API_KEY"},
    timeout=30,
)
resp.raise_for_status()
data = resp.json()
print(data)
const res = await fetch("https://api.secapi.dev/v1/insiders/transactions?insiderRole=officer&limit=50", {
  method: "GET",
  headers: { "x-api-key": process.env.SECAPI_KEY },
});
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const data = await res.json();
console.log(data);
package main

import (
	"fmt"
	"io"
	"log"
	"net/http"
	"os"
)

func main() {
	req, _ := http.NewRequest("GET", "https://api.secapi.dev/v1/insiders/transactions?insiderRole=officer&limit=50", nil)
	req.Header.Set("x-api-key", os.Getenv("SECAPI_KEY"))

	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()

	body, _ := io.ReadAll(resp.Body)
	fmt.Println(string(body))
}

Who files Form 3?

FilerRequirement
New officersUpon becoming an executive officer
New directorsUpon joining the board
New 10% ownersUpon crossing the 10% threshold
DeadlineWithin 10 days of becoming an insider

Deadlines & coverage

AspectDetail
TriggerOn becoming a Section 16 insider
Deadline10 calendar days
Follow-upSubsequent trades reported on Form 4
CoverageAugust 2002 onward

Key data fields

A sample of the structured fields returned for Form 3 data.

FieldDescription
reporterNameNew insider’s name
officerTitleRole at the company
securityTypeClass of security held
sharesOwnedInitial beneficial ownership
directOrIndirectOwnershipOwnership nature (D / I)

Frequently asked questions

What is the Form 3 API?
An endpoint that returns SEC Form 3 initial statements of beneficial ownership — the first filing made by a new insider — as structured JSON.
How is Form 3 different from Form 4?
Form 3 establishes an insider’s initial holdings when they first become an insider; Form 4 reports each subsequent transaction.

Build with the Form 3 API

Create a free account, grab an API key, and make your first request in under a minute.