Magnetic Integrations API

Send us documents through our API, we prepare the tax return, and you get the finished documents back.

The API is client-centric: you create a client, attach documents to it, then create a submission for prep. You track the submission until it's completed and download the output documents.

  • Base URL: https://api.magnetictax.com
  • Support: reach us through your Magnetic support channel (partners: your shared Slack channel) — for paused access, a submission you need stopped, or anything the docs don't answer.
  • Interactive API reference (Swagger): /v1/docs · OpenAPI spec at /v1/openapi.json
  • Authentication: a per-organization API key, sent as Authorization: Bearer mag_... (see Authentication)
  • Every integration can test against a sandbox — a sandbox API key (self-managed firms) or a sandbox org (partners) — so submissions never reach a real preparer (see Sandbox testing).

Who uses this API

Same API, two audiences:

  • A firm using its own API ("self-managed API") — a firm that wants to send its own clients to Magnetic programmatically. A firm admin creates an API key for the firm in the portal and integrates against it. That key only ever acts for that one firm. Standard pricing applies — it's the same whether you submit in the app or through the API.
  • A partner — an integrator that manages multiple firms on their behalf (e.g. a software vendor). A partner is a multi-firm user with the extra ability to create/manage firm organizations and issue keys for the firms it manages. Creating firms is done in the console; listing them and managing their keys can also be done through the Partner API. See Partners.

The endpoints below are the same for both; what differs is the key: a firm's own key acts for that firm, and a partner-issued key carries partner attribution. If you manage more than one firm, become a partner.

The flow at a glance

sequenceDiagram
    autonumber
    participant App as Your application
    participant API as Magnetic API
    participant Prep as Tax prep
    App->>API: POST /v1/clients
    API-->>App: client (id: 812)
    App->>API: upload documents (presigned)
    API-->>App: documents (ids: 456, …)
    App->>API: POST /v1/clients/{id}/submissions
    API-->>App: submission (id: 789) + expected_completion_at
    API->>Prep: queue for preparation (async, ~3 days)
    Prep-->>API: output documents ready
    Note over App,API: Recommended: register a webhook, we notify you
    API-->>App: POST webhook: submission.updated (status: completed)
    opt Fallback when you can't receive webhooks
        App->>API: GET /v1/submissions/{id}
        API-->>App: status: completed + output_documents[]
    end
    App->>API: GET download_url → finished return

Processing is asynchronous (typical turnaround ~3 days). Each submission returns an expected_completion_at. Webhooks are the recommended way to track a submission's status — register a callback URL and we sign and POST a submission.updated event on every status change, so you're notified the moment a return is ready. Polling GET /v1/submissions/{id} is a supported fallback for when you can't receive webhooks.

New here? Start with the Quickstart.

results matching ""

    No results matching ""