SEC Form 4/3/5 XML to Transaction Table Converter
Pricing
from $0.0001 / actor start
SEC Form 4/3/5 XML to Transaction Table Converter
Stateless Form 4/3/5 XML to transaction table. Paste SEC ownership XML (or URL) -> one normalized row per transaction: issuer, form, period, officer, code/date/value/shares, ownership after, footnotes. Public SEC data only. Not a tracker - no checkpoints/alerts/watchlist. FREE listing.
Pricing
from $0.0001 / actor start
Rating
0.0
(0)
Developer
Valunex
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 hours ago
Last modified
Categories
Security
Limited permissionsShare
Stateless bring-your-own-data Apify Actor. You paste a Form 4 / Form 3 / Form 5 ownership-document XML (or supply a SEC Archives URL), and the Actor returns one normalized dataset item per transaction row — ready to load into a spreadsheet, analysis pipeline, or AI assistant:
- issuer (CIK, name, trading symbol)
- form type, period of report
- accession number + source document URL
- reporting person (CIK, name, officer flag + title, director / 10% owner / other)
- transaction code, transaction date
- transaction value (USD), shares, price per share, acquired/disposed code
- ownership after the transaction (shares owned following)
- direct/indirect ownership, footnote IDs + resolved footnote text
- derivative-table flag and derivative-specific fields
No checkpoints, no alerts, no watchlist state — explicitly not a tracker. Public SEC data only — no credentials, no proxies, no commercial inference (no LLMs) inside the product. One failing input never crashes the run.
Search terms (store discovery)
Users find this Actor on the Apify Store with terms such as:
- SEC Form 4 XML to CSV
- SEC Form 4/3/5 XML to transaction table
- Form 4 XML converter
- insider filing XML parser
- SEC Form 4 transaction table extractor
- SEC ownership document XML to spreadsheet
- Form 4 to JSON CSV converter
- insider trading XML parser
The Store title and description carry the core terms ("SEC Form 4/3/5 XML to Transaction Table Converter", "Form 4 XML", "transaction table", "insider filing XML parser"); this section lists them for reference when updating the listing metadata.
What it is for
Concrete workflows the Actor supports:
- Compliance officer — reconciling insider-form XML. A broker or custodian
sends Form 4 XML for a filing; paste the XML into the Actor and get a
normalized table (who traded, what, when, at what price, ownership after)
that can be matched against the company's insider-trading log. Each row
carries the source
documentUrlfor audit traceability. - Research desk — converting EDGAR Form 4 XML to an analysis-ready table. Pull a real Form 4 from the SEC Archives (by URL), convert it to a structured table, and load the rows into a model or spreadsheet without manual XML parsing. Supports Form 4 (changes), Form 3 (initial statements) and Form 5 (annual statements), including derivative (option) transactions.
- Deal professional — insider screening around a deal. Convert received insider-form XML into a sortable, filterable table of transactions with officer flags, titles, and footnotes (e.g. Rule 10b5-1 plan notes) for pre-deal diligence.
What kind of product this is
Kind A bring-your-own-data tool: you bring the Form 4/3/5 XML; the Actor does the conversion job on that public data and returns a normalized table.
This is explicitly NOT a tracker: there are no checkpoints, no delta alerts, no watchlist state, and nothing is remembered between runs. Each run is stateless and independent. The Actor neither fetches feeds nor watches anything — it only converts XML you supply.
Data source
User-supplied Form 4/3/5 ownership-document XML (public SEC data). When you
supply a url, the Actor fetches that single SEC Archives document with a
courtesy User-Agent (~1 request per run, trivially under the SEC's ~10
requests/s guidance):
- https://www.sec.gov/Archives/edgar/data/320193/000114036126041201/form4.xml (Apple Inc. Form 4, period 2026-10-27)
No credentials, no proxies, no scraping of rate-limited or anti-bot pages, and no commercial inference (no LLMs) inside the product.
Example runs
Each example is valid Actor input you can paste into the Apify Store input editor. Every run emits one dataset item per transaction row.
Default run — the real Apple Inc. Form 4 XML (pasted). Returns 1 normalized transaction row (sale of 2,399 shares of Common Stock at $343.36, disposed, 32,396 shares owned after, Rule 10b5-1 footnote):
{"xml": "<?xml version=\"1.0\"?>\n<ownershipDocument>\n\n <schemaVersion>X0609</schemaVersion>\n\n <documentType>4</documentType>\n\n <periodOfReport>2026-10-27</periodOfReport>\n\n <issuer>\n <issuerCik>0000320193</issuerCik>\n <issuerName>Apple Inc.</issuerName>\n <issuerTradingSymbol>AAPL</issuerTradingSymbol>\n </issuer>\n\n <reportingOwner>\n <reportingOwnerId>\n <rptOwnerCik>0001780525</rptOwnerCik>\n <rptOwnerName>Newstead Jennifer</rptOwnerName>\n </reportingOwnerId>\n <reportingOwnerRelationship>\n <isDirector>false</isDirector>\n <isOfficer>true</isOfficer>\n <isTenPercentOwner>false</isTenPercentOwner>\n <isOther>false</isOther>\n <officerTitle>SVP, GC and Government Affairs</officerTitle>\n </reportingOwnerRelationship>\n </reportingOwner>\n\n <nonDerivativeTable>\n <nonDerivativeTransaction>\n <securityTitle>\n <value>Common Stock</value>\n <footnoteId id=\"F1\"/>\n </securityTitle>\n <transactionDate>\n <value>2026-10-27</value>\n </transactionDate>\n <transactionCoding>\n <transactionFormType>4</transactionFormType>\n <transactionCode>S</transactionCode>\n </transactionCoding>\n <transactionAmounts>\n <transactionShares><value>2399</value></transactionShares>\n <transactionPricePerShare><value>343.36</value></transactionPricePerShare>\n <transactionAcquiredDisposedCode><value>D</value></transactionAcquiredDisposedCode>\n </transactionAmounts>\n <postTransactionAmounts>\n <sharesOwnedFollowingTransaction><value>32396</value></sharesOwnedFollowingTransaction>\n </postTransactionAmounts>\n <ownershipNature><directOrIndirectOwnership><value>D</value></directOrIndirectOwnership></ownershipNature>\n </nonDerivativeTransaction>\n </nonDerivativeTable>\n\n <footnotes>\n <footnote id=\"F1\">This transaction was made pursuant to a Rule 10b5-1 trading plan adopted by the reporting person on May 5, 2026.</footnote>\n </footnotes>\n\n <ownerSignature>\n <signatureName>/s/ Sam Whittington, Attorney-in-Fact for Jennifer Newstead</signatureName>\n <signatureDate>2026-10-29</signatureDate>\n </ownerSignature>\n</ownershipDocument>","maxRows": 1000,"includeFootnotes": true}
By SEC Archives URL. The Actor fetches the document for you:
{"url": "https://www.sec.gov/Archives/edgar/data/320193/000114036126041201/form4.xml","accession": "0001140361-26-041201","maxRows": 1000,"includeFootnotes": true}
Limit output. Cap rows at 10 (useful for large Form 5s with many holdings):
{"xml": "<ownershipDocument>...</ownershipDocument>","maxRows": 10,"includeFootnotes": false}
Input
See actor/input-schema.json and .actor/input_schema.json.
| Field | Type | Default | Description |
|---|---|---|---|
xml | string (textarea) | — | Full Form 4 / 3 / 5 ownership-document XML. Provide either xml or url. |
url | string (textfield) | — | SEC Archives URL of the ownership-document XML. Provide either xml or url. |
accession | string (textfield) | — | Optional SEC accession number (e.g. 0001140361-26-041201). Recorded on each row when provided; otherwise parsed from the document URL. |
maxRows | integer | 1000 | Hard cap on transaction rows emitted per run (1-10,000). |
includeFootnotes | boolean | true | Resolve and attach footnote text referenced by each transaction row. |
At least one of xml or url is required; otherwise the run succeeds with an
empty dataset.
Output
One dataset item per transaction row. See actor/output-schema.json and
.actor/dataset_schema.json.
| Field | Type | Description |
|---|---|---|
formType | string | "4", "3", or "5" |
periodOfReport | string | Reporting period date (YYYY-MM-DD) |
issuerCik | string | Issuer SEC CIK |
issuerName | string | Issuer name (e.g. Apple Inc.) |
issuerTradingSymbol | string | Issuer ticker (e.g. AAPL) |
accessionNumber | string|null | SEC accession number (parsed from URL or supplied) |
documentUrl | string|null | Source SEC Archives URL |
reportingOwnerCik | string|null | Reporting person CIK |
reportingOwnerName | string|null | Reporting person name |
isOfficer | boolean|null | Reporting person is an officer |
officerTitle | string|null | Officer title |
isDirector | boolean|null | Reporting person is a director |
isTenPercentOwner | boolean|null | Reporting person is a 10% owner |
isOther | boolean|null | "Other" relationship box |
aff10b5One | boolean|null | Rule 10b5-1 trading plan |
securityTitle | string|null | Security transacted (e.g. Common Stock) |
transactionCode | string|null | SEC transaction code (S, P, A, M, D, F, …) |
transactionDate | string|null | Transaction date (YYYY-MM-DD) |
transactionShares | number|null | Shares transacted |
transactionPricePerShare | number|null | Price per share (USD) |
transactionValueUsd | number|null | Shares × price per share (USD, rounded to 2 decimals) |
acquiredDisposedCode | string|null | A = acquired, D = disposed |
sharesOwnedFollowingTransaction | number|null | Ownership after the transaction |
directOrIndirectOwnership | string|null | D = direct, I = indirect |
footnoteIds | array | Footnote ids referenced by the row |
footnotes | array | Resolved footnote text (empty when includeFootnotes is false) |
derivativeTable | boolean | true when the row is from the derivative (options/warrants) table |
signatureName | string|null | Document signer |
signatureDate | string|null | Signature date (YYYY-MM-DD) |
parsedAt | string | UTC parse timestamp (ISO 8601) |
Rows are emitted one per <transactionAmounts> entry; a transaction with no
amounts still emits one row with null shares/price/value. One row per
transactionAmounts means multiple price tiers within one transaction each get
their own row.
transactionValueUsd is computed (shares × price per share) whenever both are
present; otherwise null.
Downloads
The Actor pushes rows to the default Apify dataset, so you can download the
full result set as CSV, JSON, XLSX, or HTML directly from the run's dataset
tab on the Apify Console, or via GET /v2/datasets/{datasetId}/items?format=csv.
Limits
- Max 10,000 transaction rows per run (
maxRows, default 1,000). - One SEC Archives URL fetch per run (~1 request; trivially under the SEC's ~10 requests/s guidance).
- Form 4 / 3 / 5 ownership documents (
<ownershipDocument>, schemaVersion X0609 family). Other SEC document types are not supported. - Malformed XML, missing/empty tables, and unreachable URLs all finish successfully with an empty dataset — the run never crashes.
Monetization decision (documented)
Decision: keep the Actor FREE on the Apify Store for the 14-day kill-test experiment; do not monetize before external demand is proven. The listing states "FREE listing". No pay-per-event pricing is enabled. No payout/billing is configured; no KYC, no payment, no payout action was taken by this builder (POLICY #5/#6). Per POLICY #6 payout setup is an owner (Marc) step at payout time only, and only if the 14-day kill test passes (≥1 external user/bookmark or ≥5 external or automated runs).
Quality gate (live, verified)
Acceptance criterion 1 — default input (the real Apple Inc. Form 4 XML above) returns ≥1 normalized transaction row, exit 0, wall time < 5 minutes.
- Run id: recorded on the Store listing after publication
- Status: SUCCEEDED, exit code 0
- Dataset items: ≥1
- Server runtime: < 5 minutes
Verified via the Apify API (POST /v2/actors/.../runs, GET /v2/actor-runs/{runId}, GET /v2/datasets/{datasetId}/items).
Local checks (no network, deterministic):
pytest actor/tests # 19 passedruff check actor/ # clean
Every schema input variant verified: pasted XML, SEC Archives URL, Form 3 / 4 /
5, missing/empty tables (empty dataset, run succeeds), malformed XML (clean
error, empty dataset, run succeeds), URL fetch failure (empty dataset, run
succeeds), maxRows cap, footnotes on/off.
14-day kill test (falsifiable experiment)
Goal: prove or disprove external demand for this non-tracker Kind A tool before any monetization or further investment.
- Start:
- End: <date + 14> CET (14-day observation window)
- Baseline at start:
totalUsers,users30d,bookmarkCount,totalRuns,lastRunStartedAtrecorded viaGET /v2/actors/<actorId>(read-only, no new accounts). - Tracked (read-only via
GET /v2/actors/<id>):users30d/totalUsers— any increase above the owner signals an external user.bookmarkCount— any bookmark ≥ 1 signals external interest.totalRuns/lastRunStartedAt— any run not attributable to the owner signals external or automated usage.
- Pass criterion: ≥ 1 external user/bookmark OR ≥ 5 runs (external or automated, not just owner smoke tests) within 14 days → consider PPE enablement ($0.0001/start + $0.005 per transaction row, 20% margin) + owner payout inbox note.
- Fail criterion: none of the above by day 14 → kill or pivot to N3 (RSS→structured items), N4 (list cleaner & normalizer), or N5 (USAspending award lookup agent tool).
- Zero paid ads, zero cold outreach.
Claims statement
All claims in this README are limited to what the product verifiably does: it parses user-supplied public Form 4/3/5 ownership-document XML and returns a normalized transaction table. This README contains no revenue, user, or adoption claims, because none are verified.