Skip to main content
This guide covers the full flow: you upload a candidate’s academic documents, request a quote, approve it, and download the finished evaluation report. Webhooks tell you when each step happens, so you don’t need to poll.

Before you begin

You need:
  • An Internal app API key (sk-...). See Authentication. The flow uses the files:write, quotes:write, quotes:approve, orders:read, documents:read, and webhooks:manage scopes.
  • Net-terms invoicing on your account if you want to approve quotes through the API. Contact support to turn it on. Without it, you can still create quotes through the API and approve them in the Customer Portal.
  • An HTTPS endpoint that can receive webhooks.

Choose an evaluation type

Set evaluation_type on the quote to one of these values: Most employment and H-1B cases need a diploma_evaluation. Licensing boards, universities, and credit transfers usually need a course_by_course_evaluation. If you’re not sure, add a question in notes and our team will confirm before pricing the quote.
1

Register a webhook endpoint

Register your endpoint once and reuse it for every order. Subscribe to the quote, order, and file events:
The response contains the endpoint’s signing secret (whsec_...). Store it somewhere safe. You need it to verify signatures.
2

Upload the candidate's documents

Upload each diploma, transcript, or mark sheet with the files API:
Keep each id. If your documents are already hosted somewhere, skip this step and pass their URLs in document_urls when you create the quote.
Send the diploma and the transcript or mark sheets for every degree. A missing transcript is the most common reason a quote is delayed.
3

Create the quote

The API responds with 201 and the new quote in status requested:
Evaluation fields:The API reference has the full list of visa_type values.
4

Wait for quote.ready

Our team reviews the documents and prices the quote. When it’s ready, the quote moves to awaiting_payment and your endpoint receives quote.ready:
Check total_cents and items before you approve. If the quote is cancelled, you receive quote.cancelled.
5

Approve the quote

Approval creates the order and adds it to your open invoice. The response (201) is the new order:
You also receive quote.approved and order.created. If approval fails, the API returns 422 with an error_code. See Approving quotes for the full list.
6

Track the order

The order sends an event each time its status changes:Use PUT /v1/orders/{id} to attach your own custom_reference or custom_metadata to the order at any point.
7

Download the report

Order events don’t include documents, so fetch the order when you receive order.completed:
The order’s documents include the files you uploaded (document_role: "source") and the deliverables. Evaluation reports have document_role set to evaluation or course_evaluation. Request a download URL for each one:
The URL expires after one hour. Download the file right away and store your own copy.

Put it together

This Express handler verifies each event, then approves quotes under a budget and downloads reports when orders complete. It uses the verifyFortisSignature function from the webhooks guide.
Node.js
Deliveries can arrive out of order or more than once. Deduplicate on the X-Fortis-Delivery header. When you need the current state, fetch the resource from the API.

Without webhooks

If you can’t receive webhooks, poll instead:
  • GET /v1/quotes/{id} until status is awaiting_payment.
  • GET /v1/orders/{id} until status is completed.
Poll no more than once a minute. Evaluations take hours to days, depending on the turnaround you choose.