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.
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?
| Filer | Requirement |
|---|---|
| New officers | Upon becoming an executive officer |
| New directors | Upon joining the board |
| New 10% owners | Upon crossing the 10% threshold |
| Deadline | Within 10 days of becoming an insider |
Deadlines & coverage
| Aspect | Detail |
|---|---|
| Trigger | On becoming a Section 16 insider |
| Deadline | 10 calendar days |
| Follow-up | Subsequent trades reported on Form 4 |
| Coverage | August 2002 onward |
Key data fields
A sample of the structured fields returned for Form 3 data.
| Field | Description |
|---|---|
reporterName | New insider’s name |
officerTitle | Role at the company |
securityType | Class of security held |
sharesOwned | Initial beneficial ownership |
directOrIndirectOwnership | Ownership nature (D / I) |
Related API endpoints
Deep-link into the interactive reference to try these live.
Frequently asked questions
What is the Form 3 API?
How is Form 3 different from Form 4?
Build with the Form 3 API
Create a free account, grab an API key, and make your first request in under a minute.