JouloDocs

Mint a sign-in link for a draft

Mints a single-use sign-in link that opens the claim flow for one draft inside your app. The link is valid for 5 minutes, and a new link invalidates the previous one. An active draft gets a link only to resume an empty account.

POST
/partner/drafts/auth-link
AuthorizationBearer <token>

Partner API key, sent as Authorization: Bearer <key>. Production keys start with jpk_live_ and work only on https://api.joulo.nl. Sandbox keys start with jpk_test_ and work only on https://api-staging.joulo.nl. Sandbox keys minted before September 2026 also start with jpk_live_. A key used on the wrong host returns 401 with a detail. A key is bound to one partner and reaches only the Partner API routes. Any other route returns 404 when it does not exist. A route that needs a scope the key lacks, such as GET /sessions, returns 403 with error: Insufficient scope and a required_scope. Every other route returns 403 with error: partner_api_key_scope. Mint and revoke keys in the partner portal. A partner has one active key at a time.

In: header

draft_id?string

Draft id, from created in the upload response or from GET /partner/drafts.

Formatuuid
email?string

Email address of the draft. Trimmed and lowercased.

return_url?string

Where the flow sends the customer at the end. It must start with the return URL registered in the partner portal, followed by /, ? or nothing. No fragment, at most 500 characters. Without it, the registered URL applies.

Response Body

curl -X POST "https://api.joulo.nl/functions/v1/api/partner/drafts/auth-link" \
  -H "Content-Type: application/json" \
  -d '{
    "draft_id": "8f2c1d4e-5b6a-4c3d-9e8f-0a1b2c3d4e5f",
    "return_url": "bluebird://joulo/done"
  }'
{
  "ok": true,
  "auth_url": "http://example.com",
  "expires_in": 300,
  "resume": true,
  "return_url": "string"
}
{
  "error": "return_url_not_allowed",
  "message": "return_url must start with the return URL registered in the partner portal."
}
{
  "error": "Missing or invalid API token"
}
{
  "error": "draft_not_found"
}
{
  "error": "draft_not_claimable",
  "status": "active",
  "reason": "registration_submitted"
}
{
  "error": "Too many requests",
  "retry_after_seconds": 3
}
{
  "error": "Failed to mint auth link"
}
{
  "error": "Authentication is temporarily unavailable, try again shortly"
}