Skip to main content

Documentation Index

Fetch the complete documentation index at: https://developers.circle.com/llms.txt

Use this file to discover all available pages before exploring further.

Walk through the full application lifecycle: create a client, populate its sections, upload a document, and submit for review.
The Partner Onboarding API base URL is https://api-sandbox.circle.com for sandbox and https://api.circle.com for production. All requests require a Bearer token obtained via Circle key exchange in the Authorization header. All POST requests require an X-Idempotency-Key header with a client-generated UUID v4.

Prerequisites

Before you begin this quickstart, ensure you’ve:
  • Obtained an API key for the Partner Onboarding API from the Circle Mint Console (Developer > API Keys). Use this key to obtain a Bearer token through the Circle key exchange.
  • (Recommended) Set up a webhook subscription for application status changes in the Console (Developer > Subscriptions) to receive real-time updates instead of polling.

Step 1: Create a client and initialize the application

Create a client and start an onboarding application in one request:
curl --request POST \
  --url https://api-sandbox.circle.com/v1/partner/clients \
  --header "Authorization: Bearer ${YOUR_API_KEY}" \
  --header "Content-Type: application/json" \
  --header "Accept: application/json" \
  --data '{
    "clientName": "Acme Trust Co.",
    "country": "US",
    "clientType": "business",
    "businessDetails": {
      "natureOfBusiness": "trust",
      "institutionType": "trust"
    }
  }'
For the full request schema, see Create Partner Client. Example response:
{
  "data": {
    "clientEntityId": "880e8400-e29b-41d4-a716-446655440099",
    "applicationId": "550e8400-e29b-41d4-a716-446655440000"
  }
}
Save the applicationId. You’ll use it in all subsequent steps.
Using the same clientName and country combination returns a 409 Conflict error. Use a different clientName to create another client in the same country.

Step 2: Confirm the draft application

Confirm the application exists and check its sections:
curl --request GET \
  --url https://api-sandbox.circle.com/v1/onboarding/partner/applications/${APPLICATION_ID} \
  --header "Authorization: Bearer ${YOUR_API_KEY}"
You should see a DRAFT application with a list of sections in not_started status:
{
  "data": {
    "applicationId": "550e8400-e29b-41d4-a716-446655440000",
    "status": "DRAFT",
    "sections": [
      { "sectionName": "basicBusinessInfo", "status": "not_started" },
      { "sectionName": "physicalBusinessAddress", "status": "not_started" }
    ]
  }
}

Step 3: Save section data

Populate the basicBusinessInfo section:
curl --request PUT \
  --url https://api-sandbox.circle.com/v1/onboarding/partner/applications/${APPLICATION_ID}/sections/basicBusinessInfo \
  --header "Authorization: Bearer ${YOUR_API_KEY}" \
  --header 'Content-Type: application/json' \
  --data '{
    "businessWebsite": "https://example.com",
    "businessWebsiteProvided": true
  }'
The response confirms the section status changed to complete:
{
  "data": {
    "data": {
      "businessWebsite": "https://example.com",
      "businessWebsiteProvided": true
    },
    "sections": [
      { "sectionName": "basicBusinessInfo", "status": "complete" },
      { "sectionName": "physicalBusinessAddress", "status": "not_started" }
    ],
    "sectionsChanged": false
  }
}
Repeat for each remaining section. See Create and populate applications for details on the schema, bulk save, and conditional sections.

Step 4: Upload a document

Upload a supporting document and link it to a schema field:
curl --request POST \
  --url https://api-sandbox.circle.com/v1/onboarding/partner/applications/${APPLICATION_ID}/documents \
  --header "Authorization: Bearer ${YOUR_API_KEY}" \
  --header 'X-Idempotency-Key: ${IDEMPOTENCY_KEY}' \
  --form 'fileContent=@passport.pdf' \
  --form 'fileName=passport.pdf' \
  --form 'datumName=passport_document' \
  --form 'issuedCountry=US'
The response returns the new document ID:
{
  "data": {
    "documentId": "550e8400-e29b-41d4-a716-446655440002"
  }
}
See Upload documents for details on required fields and linking documents to array entities.

Step 5: Submit the application

After all sections are complete and required documents are uploaded, submit the application:
curl --request POST \
  --url https://api-sandbox.circle.com/v1/onboarding/partner/applications/${APPLICATION_ID}/submit \
  --header "Authorization: Bearer ${YOUR_API_KEY}" \
  --header 'Content-Type: application/json' \
  --header 'X-Idempotency-Key: ${IDEMPOTENCY_KEY}' \
  --data '{
    "endUserIpAddress": "203.0.113.42",
    "endUserAgreesToTermsOfService": true
  }'
The application moves to SUBMITTED:
{
  "data": {
    "applicationId": "550e8400-e29b-41d4-a716-446655440000",
    "status": "SUBMITTED"
  }
}

Step 6: Check application status

Poll for the current status or use webhook notifications (if you set up a subscription in the prerequisites) for real-time updates:
curl --request GET \
  --url https://api-sandbox.circle.com/v1/onboarding/partner/applications/${APPLICATION_ID} \
  --header "Authorization: Bearer ${YOUR_API_KEY}"
The application progresses through IN_REVIEW and reaches a terminal status of APPROVED or DENIED. If the compliance team needs more information, the status changes to PENDING_CUSTOMER_INFORMATION. See Application states for the full lifecycle and Submit and track applications for the submission workflow and Handle requests for information if the compliance team needs more data.