Skip to content

Connectors

Connectors fetch external source records and preserve enough metadata for normalization, licensing, evidence, and audit. They are operator capabilities, not an ungoverned data-import shortcut.

Supported source kinds and providers

The registry recognizes security master, market data, fundamentals, news events, regulatory filings, IR materials, corporate actions, market calendar, macro reference, ownership/insider, and sentiment/alternative-event source kinds. Implemented provider families include local files, SEC EDGAR, FRED/ALFRED, OpenFIGI, GDELT, and Polygon aliases.

The supplied config/connectors.yaml enables governed SEC filing/XBRL, FRED, and OpenFIGI sources. Removed providers have no runtime adapter, registry entry, credential requirement, or compatibility route.

Vendor news preserves the supplied title and original summary/body without removing analyst language. Normalized event records label source material with content_type, is_fact, publisher, published_at, original_text, and trust_level. Analyst opinions are explicitly marked is_fact=false and trust_level=third_party_opinion; client Agents decide whether and how to use them.

Registry fields

Field Meaning
source_id Stable operator-facing source identifier
kind Neutral connector domain
provider Supported adapter family
enabled Whether validation and synchronization may use the source
license_id License policy evaluated before use
allowed_uses Purposes declared for this source
endpoint / file_path Exactly one external endpoint or local file location
auth_env_var Name of the environment variable containing the provider credential
rate_limit Requests per minute and burst
parser_version Version of source parsing semantics
field_mapping_version Version of source-to-neutral field mapping

Local-file paths must remain inside the connector registry directory. The registry rejects path traversal, missing files, unsupported providers, missing licenses, empty allowed-use lists, absent secrets, and known placeholder secrets.

Validate before synchronization

argus connector validate \
  --api-key "$ARGUS_MACHINE_API_KEY" \
  --institution-id institution:customer \
  --caller-id service:connector-operator

The current runtime keeps the validation implementation but configures data_license.enforcement_enabled: false and connectors.fail_closed_on_license_error: false. Registry shape, credentials, schemas, bounded requests, normalization, persistence, and audit checks remain active; license and redistribution decisions are recorded but do not block Agent calls. Restore both switches to true to recover fail-closed license behavior.

Synchronize a bounded window

EODHD real-time quote and trade sources use a 240-second capture window by default. A dropped or idle WebSocket is reconnected with bounded exponential backoff; every new connection is re-authorized and re-subscribed before records are accepted. Replayed observations are deduplicated by stable observation ID, and an exhausted reconnect budget after receiving data is reported as a partial window. This is bounded capture, not a permanent consumer or an uninterrupted Quote/Trade tape. Operators can lower capture_seconds for smoke tests. EODHD's trade dp dark-pool flag and ms market-status field are not stored because MarketObservation v1 has no semantically matching fields; adding them requires a versioned contract change rather than overloading venue or condition fields. Reaching max_events before the capture deadline is reported as a partial window, so a resource-capped sample is never described as a complete window.

argus connector sync \
  --source-id sec_edgar_filings \
  --kind regulatory_filings \
  --api-key "$ARGUS_MACHINE_API_KEY" \
  --institution-id institution:customer \
  --caller-id service:connector-operator \
  --from 2026-06-01T00:00:00Z \
  --to 2026-06-30T23:59:59Z \
  --symbols AAPL \
  --company-ids 0000320193 \
  --dry-run

SEC EDGAR filing and XBRL sources require a CIK through --company-ids; a ticker alone is not sufficient. For a single-company request, keep the ticker and CIK lists aligned as shown above.

For SEC XBRL, from and to select the filing's conservative public-known time, including both boundaries. A filing date without a timestamp becomes the end of that day in New York, with daylight-saving time applied. A record without a filing date uses its actual observation time. This window does not filter the measurement period: a new filing can report older periods.

The prepared sec-edgar-xbrl-v2 parser and sec-edgar-xbrl-fields-v2 mapping preserve decimal lexical values and expose numeric .val facts with their actual taxonomy, concept, unit, currency when supplied, and instant or duration period. Quarterly and annual durations, currencies, and companies remain distinct. A later visible filing replaces the same measurement aspect; a late capture does not become visible before ingestion. Cross-source conflicts require matching taxonomy, concept, period, and unit; unknown legacy aspects are not treated as comparable measurements.

Versioned normalization retains existing records. The bounded operator reconciliation tool can verify the published SEC v1 parser/mapping pair against its original capture; it does not enrich old rows with v2 aspects, insert missing facts, or guess unknown historical versions. Migration 0062 stores the actual configured filing-source license snapshot for new ingestion. Historical documents with no snapshot remain explicitly unverified; the current policy is not evidence of their historical terms.

These source changes require deployment and data backfill before they describe production coverage. A sample's successful numeric and evidence checks do not prove the promised company, field, and historical universe. Missing provider concepts remain gaps; they are not replaced with similarly named measures.

Use dry_run to prove selection, provider access, parsing, and policy without committing normalized records. Local CLI execution, and REST execution in local or test, waits for the task to reach a terminal state; the returned task result contains the connector result and its run_id. In staging and production, the REST adapter dispatches the task through Celery and initially returns a task_id. That task_id is not a connector run_id and must not be passed to connector run-status or GET /v1/connector-runs/{run_id}.

Poll the returned Argus task id with connector task-status --task-id <task_id> or GET /v1/connector-tasks/{task_id}. The endpoint requires connectors:read, enforces institution isolation, and only exposes connector synchronization tasks. Do not report a synchronization as complete from the initial queued response. Wait for a terminal task status; on success, read output_payload.run_id and then inspect the persisted connector result with connector run-status --run-id <run_id> or GET /v1/connector-runs/{run_id}. If a run fails or only partially succeeds, its task is terminal failed and retains output_payload.run_id and the connector counts. Inspect that run and its source gaps before a bounded operator retry. A successful worker execution alone does not make an incomplete connector result successful. Celery's separate worker task id is diagnostic metadata and is not accepted by either endpoint.

An operator may provide an optional idempotency_key (1–128 characters, not blank) in the REST sync envelope or --idempotency-key in the CLI. Keep that key stable when repeating a submission: the same identity, key and request return the existing task. Reusing a key for a different request is rejected (REST 409). After a terminal failure has been investigated and corrected, use a new key to submit the same bounded source selection again. The failed task and its audit remain available; a new key does not reset it. Without an explicit key, the existing identity-and-payload deduplication remains unchanged.

The captured SEC ticker/exchange snapshot also registers its source-confirmed CIK and issuer name as a filing parent in the same transaction as the normalized facts. It verifies the stored raw checksum and issuer identity, preserves an existing company, and retains the raw source through a foreign key. Country and industry remain null when the source does not provide them; no security, MIC, industry hierarchy or historical listing interval is inferred. The public source-backed company reader continues to report these coverage gaps. The legacy complete-master reader excludes incomplete parents, which do not qualify as complete entity/security mappings. Direct external-fact repository writes alone do not register company parents.

Migration 0065_partial_company_identities preserves existing complete company rows and permits these explicit missing fields. Downgrading to the old required fields fails while partial parents remain; restore the verified pre-migration backup for rollback rather than inserting invented country or industry values. The key is task metadata, not a provider parameter or an authorization grant.

The REST synchronization payload also accepts a bounded parameters object for source-specific selections such as a macro series, table, year or record limit. For example, the configured no-key bea_nipa_flat_file source accepts {"TableName":"T10105","Year":"2025","Frequency":"A"}. Provider adapters still enforce their allowed parameters and source policies. Credentials, source policy files, URLs and task identity or authorization fields cannot be supplied through this object. Synchronization is an operator function requiring connectors:sync; ordinary public OAuth users do not receive that permission.

Raw and normalized data

In the prepared production connector, sec_edgar_filings also publishes an idempotent copy of a verified official SEC document into the configured OAuth data institution. Source distribution checks follow the server's default-off license switch. Explicitly enabling it requires the captured grant to authorize that institution and factual lookup. The archive URL, issuer CIK and original content SHA256 are always verified. Disabled enforcement leaves unknown rights metadata intact; failed financial-report extraction still fails the record. The ordinary data copy retains the same source bytes, times and license snapshot, and uses the existing governed public projections.

Machine credentials, tasks, connector runs and publication audits retain their original operator owner. Ordinary users receive neither connector permissions nor access to those protected records, and all filing repository tenant filters remain active. The publication target comes from server OAuth configuration, not synchronization parameters. Other sources and private uploads are not published this way. See ADR 0003. This prepared path does not establish full issuer/history coverage or claim that the signed production release and ordinary-user acceptance have completed.

The captured license terms participate in filing ingestion idempotency. A new verified grant for the same source document creates a separate immutable metadata capture, retaining the original bytes, document version and publication time. Earlier captured terms remain unchanged. Re-delivery under identical terms reuses that capture; list ordering in equivalent terms does not create another copy. The new record's creation time still prevents visibility before capture.

Migration 0066_filing_capture_versions preserves existing records, replaces the obsolete byte-only unique constraint with a scoped capture index, and retains the unique idempotency key. Broad fragment searches select the latest visible capture per source document in the caller's data institution. Explicit document IDs retain the original capture and its grant; a later grant never changes historical evidence. Source/recorded times apply to both capture selection and fragments. An unparsed latest capture cannot silently fall back to an old one. Downgrade refuses duplicate byte identities; restore the paired backup rather than delete captured terms.

Public filing_search and filing_evidence_extract return at most ten matching fragments. The prepared readers probe one additional match and return partial with filing_fragment_result_limit and structured_output_flags.filing_fragment_limit_reached=true when more matches exist. Refine the query or use a disclosed document ID with filing_evidence_extract to narrow its scope. There is no public cursor parameter for these tools, and a bounded fragment response does not establish complete filing-history coverage. Captured source-license gaps remain separately visible.

The prepared WDI macro_series reader preserves a finite captured value as Decimal and retains its annual period and evidence. A unit is taken only from the same source capture; an empty unit remains absent, with macro_source_unit_unavailable. Neither the indicator name nor another capture supplies a substitute currency. Current WDI captures contain decoded JSON values rather than the original HTTP number token. Results therefore remain partial with macro_numeric_http_lexical_precision_unverified, and macro_numeric_http_lexical_precision_verified is false. These prepared changes are not a claim of deployed coverage, complete country/history coverage, or verified revision/vintage semantics.

Connectors first produce ConnectorRecord values with source, kind, record number, payload, and observed time. Normalizers then create neutral market, event, filing, corporate-action, or evidence records. Provider-specific restricted fields are removed or masked before a public package is assembled.

Required permissions and secrets

Listing, validation, task status, and run status require connectors:read; synchronization requires connectors:sync. Provider credentials use the configured environment names such as SEC_USER_AGENT, FRED_API_KEY, and OPENFIGI_API_KEY. Never store their values in connectors.yaml.

Live testing

Live tests are off by default and require explicit CONNECTOR_LIVE_TESTS_ENABLED or production/staging test configuration plus real credentials. They can consume provider quota and should run with bounded symbols/time windows. Unit and integration tests otherwise use controlled adapters and do not require the network.