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

Customer API endpoints
MethodPathPurpose
POST/auth/loginEmail and password → session token
POST/auth/api-tokenCreate or rotate your API token
GET/catalog/productsPublic price list (no auth)
POST/ordersSubmit ZIPs (multipart files, authorization_attested=true)
GET/ordersYour orders
GET/orders/:idOrder detail and state
GET/orders/:id/downloadDecoded project ZIP when completed
GET/walletCredit balance
GET/invoicesYour invoices, newest first
POST/invoices/:id/payPay from credits or a payment method
GET/invoices/:id/payment-detailsCrypto address and amount
GET/invoices/:id/statusPayment confirmation status
POST/orders/:id/refund-claimsOpen 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.