Performance Insights
API task

Upload private symbols for your own modules (API)

Upload PDB or ELF symbols with POST /api/v1/symbols, list them, delete them. Module name and hash, size and quota errors, and when frames get named.

Published 2026-11-09 by PerformanceInsights.ai

Short answer: Send the file as multipart form data to POST /api/v1/symbols with your API key, giving the file and its module_name (and, optionally, its module_hash). The response is 201 with the symbol's id. List what you have with GET /api/v1/symbols; remove one with DELETE /api/v1/symbols/{id}. Symbols are isolated per account and used only to name frames in your own modules.

1. Upload a symbol file

The key goes in an Authorization: Bearer header. The file's format is detected from its contents: a PDB for Windows dumps, or an ELF executable or shared object for Linux core dumps.

FieldPDB (Windows)ELF (Linux)
fileThe .pdb file.The binary with its debug info, or the stripped binary plus its separate debug file. Core files and .o files are refused.
module_nameThe PDB file name, e.g. acme.pdb.The file name the core records, e.g. acmed or libacme.so.1. A separate debug file goes under the name its debuglink gives (readelf --debug-dump=links, usually <name>.debug).
module_hashThe PDB's GUID+age, as the debugger spells it.The GNU build ID (readelf -n). Optional: it is read from the file, and an upload whose hash does not match the file's build ID is refused.
curl -X POST https://api.performanceinsights.ai/api/v1/symbols \
  -H "Authorization: Bearer dts_..." \
  -F "file=@acmed" \
  -F "module_name=acmed" \
  -F "module_hash=<GNU build ID>"

A successful upload returns 201:

{"id": "...", "module_name": "acmed", "module_hash": "...", "format": "elf",
 "build_id": "...", "size_bytes": 123456, "scan_status": "...", "uploaded_at": "..."}

format is pdb or elf; build_id is the ELF build ID read from the file (null for a PDB); last_used_at says when an analysis last used the symbol. Uploaded files are scanned for malware, and an upload is refused with 503 while the scanner is unavailable. For Linux you can keep every release uploaded: each core is matched to the exact builds it ran, by build ID. Without the symbols, frames in your own code cannot be named.

2. List and delete

curl https://api.performanceinsights.ai/api/v1/symbols \
  -H "Authorization: Bearer dts_..."

curl -X DELETE https://api.performanceinsights.ai/api/v1/symbols/<id> \
  -H "Authorization: Bearer dts_..."

GET /api/v1/symbols returns your symbols in the same shape as the upload response, and is the way to find the id that delete takes. DELETE returns 204 and withdraws the file at any time. Symbols also expire on their own: 90 days after an analysis last used one, or after upload if none did.

Errors on these calls

StatusWhen
400Invalid module_name or module_hash (on upload).
401Missing or invalid API key.
403The key's scope or the account does not allow it.
404No such symbol upload (on delete).
409The upload raced a concurrent one for the same module: send it again.
413The file is over the plan's per-object limit.
417Expect: 100-continue is not supported: switch that header off in your client.
429Quota exceeded.
503The malware scanner is unavailable and the upload was not accepted: retry later.

Every error body is {"detail": "..."}. During the pilot, upload only symbols for synthetic or sample software (see Signup in the API reference).

Common questions

Which files can I upload as symbols?
A PDB for a Windows dump, or an ELF executable or shared object (with its debug info, or its separate debug file) for a Linux core dump. The format is detected from the file's contents.
What do module_name and module_hash have to be?
For a PDB, module_name is the PDB file name (acme.pdb) and module_hash is its GUID+age. For an ELF file, module_name is the file name the core records (acmed, libacme.so.1) and module_hash is its GNU build ID, which is read from the file when it has one. An upload whose module_hash does not match the build ID is refused.
Can other customers use my symbols?
No. Symbols are isolated per account, never shared across customers, and used to symbolicate your own modules during analysis. You can delete one at any time with DELETE /api/v1/symbols/{id}.

Ready to send a dump?

Upload a minidump to DumpTriage. It runs the debugger, reads the output and sends back the faulting module, the stack and a plain-language root cause (how the analysis works). Except on the Solo plan, cases the automated passes can't settle go to an engineer. Free during the pilot.

Create an account