REST API quickstart
Everything the portal does goes through the same API, at https://decoder.securiace.com/backend. Authenticate with Authorization: Bearer <token>, using either a session token or an API token starting with ety_. Never put tokens in URLs.
1. Sign in and create an API token
Log in once to get a session token, then create a long-lived API token. Creating a new API token replaces the previous one.
curl -s https://decoder.securiace.com/backend/auth/login \
-H 'Content-Type: application/json' \
-d '{"email":"you@example.com","password":"…"}'
# → {"token":"<jwt>","user_id":"…","role":"user"}
curl -s -X POST https://decoder.securiace.com/backend/auth/api-token -H 'Authorization: Bearer <jwt>'
# → {"api_token":"ety_…"}2. Submit a ZIP
Send one or more ZIP packages as multipart field files and confirm you are authorized to decode them. Each ZIP may be up to 2 GB, and the order up to 2 GB in total. The response contains the quote and an open invoice.
curl -s https://decoder.securiace.com/backend/orders \
-H 'Authorization: Bearer ety_…' \
-F 'files=@project.zip' \
-F 'authorization_attested=true'
# → {"id":"<order>","state":"awaiting_payment","invoice_id":"<invoice>", …}3. Pay the invoice from credits
Top up credits in the portal first. Crypto invoices can also be paid at the address returned by the payment-details endpoint.
curl -s -X POST https://decoder.securiace.com/backend/invoices/<invoice>/pay \
-H 'Authorization: Bearer ety_…' \
-H 'Content-Type: application/json' \
-d '{"use_credits":true}'4. Poll the order and download
Poll until state is completed, then download the decoded project as a ZIP with the original folder structure.
curl -s https://decoder.securiace.com/backend/orders/<order> -H 'Authorization: Bearer ety_…' # state: paid → queued → processing → completed | failed curl -s -o decoded.zip https://decoder.securiace.com/backend/orders/<order>/download -H 'Authorization: Bearer ety_…'
Order states
- awaiting_payment
- Quote issued; invoice open
- expired
- Invoice not paid in time; submit again
- paid
- Payment confirmed; job being created
- queued / processing
- Decoding
- completed
- Download available
- failed
- Decode failed; refunds follow the refund policy
- refunded
- Refunded to credits
Customer endpoints
| Method | Path | Purpose |
|---|---|---|
| POST | /auth/login | Email and password → session token |
| POST | /auth/api-token | Create or rotate your API token |
| GET | /catalog/products | Public price list (no auth) |
| POST | /orders | Submit ZIPs (multipart files, authorization_attested=true) |
| GET | /orders | Your orders |
| GET | /orders/:id | Order detail and state |
| GET | /orders/:id/download | Decoded project ZIP when completed |
| GET | /wallet | Credit balance |
| GET | /invoices | Your invoices, newest first |
| POST | /invoices/:id/pay | Pay from credits or a payment method |
| GET | /invoices/:id/payment-details | Crypto address and amount |
| GET | /invoices/:id/status | Payment confirmation status |
| POST | /orders/:id/refund-claims | Open a refund claim |
Errors return JSON with an error field. Before submitting, you can check files locally with the free ionCube checker; limits are on the compatibility page.