seekrit
← all posts

What happened in the APITemplate.io security incident in October 2026?

Incident report

APITemplate.io says malicious templates enabled server-side code execution during October 12–16, 2026. Attackers accessed storage integration credentials, account information, some sign-in passwords, API logs containing keys and document data, and free-PDF-tool submissions from October 7–14. Source: APITemplate's incident notice.

Reviewed October 21, 2026, against the vendor's update dated that day. Seekrit publishes this report. We separate the vendor's findings from our analysis of credential boundaries and the workflow changes Seekrit can support.

Document generation often looks like a narrow task: send structured content, receive a PDF, upload it to storage. In practice, it can bring together sensitive business data, rendering code, public download links, API tokens, and storage permissions. The security question is how much authority the rendering component needs to complete that task.

What did APITemplate report, and when?

The vendor's notice provides this sequence:

DateReported action or finding
October 12–16Intrusion through crafted templates.
October 16Vulnerability fixed, attacker access removed, application servers rebuilt.
October 18Internal credentials replaced; sensitive request logging stopped.
October 19Disclosure published; affected passwords reset and exposed document links removed.
October 20Services moved to rotating, short-lived credentials.
October 21All PDFs generated before October 17 removed from public storage; private backups retained.

Saved post-action storage credentials were affected even for inactive actions. The vendor reported no detected attacker activity after October 16. Its notice also describes one temporarily altered template, no evidence of other customer data changes or deletions, and continuous service availability. These are vendor findings, not an independent forensic assessment. Source: incident notice.

How can a document template become a credential incident?

The disclosed entry point gives us a starting point, but not a complete exploit chain. The notice does not identify a specific template payload, CVE, or every internal permission boundary crossed. We should not invent those missing details.

The following explains the general architecture risk. A document service has to interpret some form of customer-controlled input. Depending on its design, that may include markup, expressions, layout rules, external resources, or other features. If an interpreter permits unintended execution, input that should describe a document can instead influence server behavior.

Code execution matters because a running service has access of its own. It may be able to read configuration, reach internal APIs, query stored records, or request credentials. The precise permissions determine the consequences; code execution does not automatically mean unrestricted control of every system in a company.

That distinction is useful when reviewing your own workflow. Ask what the renderer can reach, rather than stopping at whether the renderer has a bug. A well-contained renderer should not need the same identity that administers your storage account or reads unrelated customer files.

For a hypothetical document pipeline, these are separate boundaries:

ComponentIntended jobAuthority to examine
RendererTurn approved input into a document.Execution permissions, filesystem and network access.
Job controllerTrack requests and completed outputs.Customer identity, job ownership, destination selection.
Upload workerStore an approved output.Permission to write the intended object or prefix.
Logs and diagnosticsExplain failures and performance.Whether they contain keys, document bodies, or access-bearing URLs.

This table is our design analysis, not a diagram of APITemplate's infrastructure. Its purpose is to make each permission reviewable. If the rendering step is compromised, which of the other steps can it impersonate?

Why are storage credentials a different risk from document exposure?

A document file is data. A storage credential is authority to perform actions. Losing a copy of a PDF exposes that PDF's contents. Losing a broadly scoped storage key can authorize additional operations on other objects, depending on the storage provider's policy.

Consider an invoice generator whose upload key can also list, read, overwrite, and delete everything in a shared bucket. The integration may only need to create new invoice objects, but the credential gives a compromised component far more reach. Those possible consequences follow from the example's permissions; they are not claims about what the APITemplate attacker did.

Separate upload identities by workload and destination. Where your storage provider supports it, restrict writes to the intended namespace and remove unneeded read, list, delete, and administrative permissions. Account for overwrite behavior: permission to upload can still damage an existing object if callers can choose its key.

Disabling a workflow is also different from retiring its credentials. A saved value can outlive the job that once used it. Inventory dormant integrations and revoke unused credentials at the issuing provider, rather than treating an inactive toggle as evidence that the underlying access no longer exists.

A request log can become another secret store if it records authentication headers or request bodies. It often has different readers, exports, retention, and access controls from the original application database. Securing the primary credential store does not remove those other copies.

Similarly, a document URL may itself grant access. If possession of a link is sufficient to download a file, the link needs protection even when it does not look like an API key. Removing it from a log does not invalidate copies already downloaded or shared.

When designing diagnostics, decide what evidence you actually need. Request identifiers, status codes, timing, and redacted metadata can explain many failures without retaining credentials or full document contents. If content capture is necessary, make its scope, access, and retention explicit.

This is also why a credential product cannot promise to protect all document data. The rendering service still processes the input you send it. Keeping a storage key elsewhere does not hide invoice contents from the service asked to render them.

What should an affected integration review?

Use APITemplate's current notice for account-specific instructions. The following is our broader response plan, organized by the different kinds of access a document pipeline can hold.

Storage access: identify every key or connection string the integration received, including credentials from retired configurations. Replace and revoke at the storage provider. Review available access records and the credential's actual scope, rather than assuming a key named “upload” was limited to uploads.

API access: identify legitimate consumers of each document-service key, switch them to replacements, and invalidate old values. Retain enough request metadata to investigate unexpected use without putting keys into tickets or incident notes. Verify that background jobs use the replacement too.

Accounts: secure the identities that administer templates and integrations. Review access, reset compromised authentication, and investigate unexpected configuration changes. Credential rotation and account recovery address different routes into the same workflow.

Documents: identify sensitive material and links that may have escaped. Assess whether access can be invalidated and whether downstream recipients need new links. Removing a hosted file cannot recall a copy already retrieved.

Evidence: preserve useful logs before retention expires, record which credentials were revoked and when, and distinguish missing telemetry from proof that access did not occur.

How would Seekrit help with this workflow?

The strongest customer-side change is to stop giving the document renderer reusable credentials for your storage account. Keep rendering and storage upload as separate jobs, with the upload running in infrastructure you control.

Seekrit can supply credentials to that trusted upload worker. It does not patch the renderer, remove data you already sent to a vendor, or automatically change APITemplate's post-action implementation.

Keep upload authority in your own service

An architecture your team could implement looks like this:

  1. Your backend creates a document job and records its owner and intended storage destination in trusted application state.
  2. The document service performs rendering. Your backend obtains the result through the service's supported API flow.
  3. Your own upload worker verifies the job and retrieves the expected output.
  4. That worker resolves its authorized storage credentials from Seekrit and uses the storage provider's SDK to upload to the destination your backend selected.
  5. Your application records completion and applies its document-retention policy.

This is an architectural proposal, not a built-in Seekrit–APITemplate connector. Validate the vendor's API and your storage SDK before implementing it. If a callback is involved, authenticate it and look up the job server-side; do not trust a callback to choose an arbitrary bucket, object key, or download URL.

Likewise, bound output retrieval to expected destinations, sizes, and redirects. An upload worker that accepts arbitrary URLs can introduce a new network-access problem. An upload worker that accepts arbitrary object paths can become an unrestricted storage writer. Moving the credential only helps when the new component has a deliberately narrow interface.

Resolve credentials only in the trusted worker

Seekrit's language SDKs retrieve encrypted values and decrypt them locally using a service token. Alternatively, seekrit-run can inject values into the worker's environment at startup. Both approaches give that worker plaintext; the worker is therefore trusted with those credentials.

Keep its SEEKRIT_TOKEN outside the rendering service and outside untrusted rendering jobs. A service token contains decryption material. Saving it in a post action or otherwise handing it to the same vendor would undermine the boundary you were trying to create.

Use separate Seekrit environments and grants so the uploader receives only what it needs. Avoid composing unrelated production secrets into the same resolve scope. The ordinary storage model keeps ciphertext in Seekrit and decryption keys with authorized clients. Optional third-party sync explicitly changes that custody by decrypting and copying values to a destination; it is not the design described here.

Use the right mechanism for storage authentication

Do not assume a generic API-key placeholder proxy can perform an S3 upload. Storage protocols may require request signing, including authentication tied to the request content. In the proposed worker, use the storage provider's supported SDK for signing and transport. Seekrit supplies the stored secret; your worker and SDK perform the storage operation.

Where the runtime supports suitable short-lived workload credentials, prefer those over introducing a long-lived storage key solely to use a secrets manager. Seekrit remains useful for credentials that the workflow actually needs to store; it does not replace the storage provider's authorization model.

Another option, where the integration supports it, is a limited upload grant. For example, Amazon S3 presigned URLs can permit a specific object upload without sharing the underlying AWS credentials. They remain bearer capabilities, can be reused until expiry, and can replace an existing object at the same key. They are not inherently single-use. Do not assume APITemplate's post actions support this pattern without checking the integration.

Which exposure would this avoid, and which would remain?

RiskEffect of the proposed design
Renderer stores your reusable storage keyAvoided if that key and its Seekrit token never enter the renderer's systems.
Renderer can request arbitrary writesRequires job authorization and destination restrictions in your own worker.
Upload worker is compromisedStill serious: it holds or can obtain its granted credentials.
Rendering inputs or outputs are exposedStill possible; credential separation does not conceal documents from their renderer.
APITemplate logs its own API authenticationNot prevented by putting that API key behind a proxy.

The last row is easy to overlook. A proxy authenticating to APITemplate still has to send APITemplate a credential it recognizes. The receiving service can observe that credential. Seekrit cannot make a provider unable to log its own incoming authentication, even if the calling application never sees the key.

The meaningful prevention claim is narrower: a compromise of the document vendor would not extract your storage-upload key from that vendor if you had kept the key, its decryption token, and upload execution in a separate trusted system. That would reduce the credential exposure without claiming to stop the template exploit or undo document disclosure.

For a related look at separating credential storage from use, read our Railway incident report and OpenCode incident report.