Developers
Application API reference.
Quick answer
Write a company's application from your CRM, your spreadsheet or your own agent, under exactly the rules the portal's form applies: every answer lands on a named step, a blank never overwrites what is saved, every call tells you what is still open, and nothing is submitted without a named person at the company confirming.
How it fits together
Three ways to fill a company's application from outside the form, the one journey every path follows, and the rules that hold on all of them. Pick the path that fits what you have; the rest of this page is the API in detail.
Three ways in
Upload from template
Download the inventory template, fill it in a spreadsheet, upload it. The answers land on the form and every gap is listed before anything is saved. A sheet in another layout is read by AI and marked for your confirmation.
Open Upload from template →Application API
Five endpoints behind a key. Write answers from your CRM or your own script, read what is still open, and submit with a named member of the company. Built for tens or hundreds of applications.
Read the API reference →An AI agent over MCP
Point Claude, your CRM's assistant or your own agent at sourcex.si/mcp. It signs in as you, reads the schema, drafts and validates the application, and hands a person the link to submit.
Connect an assistant →The journey, on every path
- 1
Get access
An owner creates a key, or you sign in.
portal sign-inAPI keyapprove the agent - 2
Write what you have
Answers by key; a blank never overwrites.
upload the workbookPOST / PATCHdraft_application - 3
Read the list
What the form would still stop on.
review tablereadinessvalidate_application - 4
Fill the gaps
By field key, until the list is empty.
edit in the formPATCH by keydraft_application - 5
A person submits
Named, and a member of the company.
Review & submitconfirmed_byrequest_submission → link
templateAPIMCPEach step names what it looks like on the three paths.
What never changes
Same rules as the form
Every path writes into the one draft the application wizard edits, under the checks its Submit button applies.
Nothing invented, nothing lost
A blank answer never overwrites a saved one, and a system already listed is updated rather than added twice.
A person always submits
Review & submit in the portal, confirmed_by on the API, the link an agent hands over. Never a tool on its own.
Authentication
An owner creates an API key under Company & account › Integrations in the portal. The secret is shown once. Send it as a bearer token on every call; the key acts as the company that created it and can reach only that company's application.
Authorization: Bearer sx_live_… Content-Type: application/json
Endpoints
A company has one open application at a time. Every call answers with the application and its readiness, the same list the portal's Submit button checks, so you always know what is still open.
| Method | Path | What it does | Body | Answer |
|---|---|---|---|---|
| POST | /api/v1/applications | Opens the company's one open draft (or reuses it) and writes the answers, systems, data profile and statements you send. | ApplicationInput | 201, the application with its readiness |
| GET | /api/v1/applications/{id} | The draft as saved, with its readiness. | none | 200, the application |
| PATCH | /api/v1/applications/{id} | Writes more answers into the draft. A blank never overwrites a saved answer; a system already listed is updated, not added twice. | ApplicationInput | 200, the application |
| POST | /api/v1/applications/{id}/validate | The readiness list, exactly as the portal's Submit button judges it. Nothing is written. | none | 200, the application |
| POST | /api/v1/applications/{id}/submit | Submits, with a named member of the company confirming. Refused with the list while anything is still open. | { "confirmed_by": "<member email>" } | 200, the application; 409 not_ready with readiness |
Example
Send what you have; leave out what you do not know. The answer tells you what the application still needs, by step and by field key, and where a person finishes it.
curl -X POST https://sourcex.si/api/v1/applications \
-H "Authorization: Bearer sx_live_…" \
-H "Content-Type: application/json" \
-d '{
"source": "Acme CRM",
"answers": {
"company": "Cardinal Air & Plumbing",
"country": "United States",
"website": "cardinalair.example",
"status": "Operating",
"revenue": "$25M–$50M"
},
"systems": [
{ "tool_name": "QuickBooks Online", "purpose": "Accounting", "approx_size": "3 GB",
"data_start": "2015-01", "data_end": "2026-10", "contents": "Invoices and the ledger",
"exportable": "yes", "export_method": "CSV", "owned_attested": "yes", "records_english": "yes" }
],
"dataset": { "title": "Cardinal operations archive", "categories": ["Operational documentation"] }
}'Answer
{
"id": "6f1c…",
"company_id": "b2a9…",
"status": "draft",
"title": "Cardinal operations archive",
"updated_at": "2026-11-03T10:12:04.511Z",
"edit_url": "https://sourcex.si/app/data/6f1c…/edit",
"readiness": {
"status": "needs_input",
"percent": 23,
"systems": { "listed": 1, "incomplete": 0 },
"blockers": [
{ "key": "answers-company", "step": "company", "stepLabel": "Company details",
"label": "11 answers on Company details",
"message": "Answer every question marked Required on Company details first: What does the company do?; Your name; Work email and 8 more." },
{ "key": "systems", "step": "systems", "stepLabel": "Systems", "label": "At least 3 systems", "message": "…" }
],
"missing": [
{ "field": "whatCompanyDoes", "step": "company", "label": "What does the company do?" },
{ "field": "contactName", "step": "company", "label": "Your name" }
]
}
}Where each field lands
answers is an object keyed by field. Each key below is one question on the application, on the step and in the section named. A dropdown accepts its options exactly, or plain words that clearly mean one of them (for example "about 30 million" for revenue, "closed in 2023" for status), and is normalised to the option.
Step: Company details (company)
| Key | Question on the application | Section | Required | Options |
|---|---|---|---|---|
| company | Company name | Company information | Yes | Free text |
| website | WebsiteYour company's site, e.g. northwind.com | Company information | Yes | Free text |
| country | CountryPick the country; add a state or region if it helps. | Company information | Yes | Free text |
| whatCompanyDoes | What does the company do?What you sell or do, and who your customers are. One or two sentences is enough. | Company information | Yes | Free text |
| contactName | Your name | Contact & company details | Yes | Free text |
| contactEmail | Work email | Contact & company details | Yes | Free text |
| contactPhone | PhoneA direct number for the partner form. | Contact & company details | Yes | Free text |
| yearFounded | Year founded | Contact & company details | Yes | Free text |
| status | Is the company still operating? | Operating profile | Yes | Operating · No longer operating · Partially operating / winding down · Not sure |
| closedWhen | Last month operating | Operating profile | Only when status is No longer operating | Free text |
| yearsOperating | Years operating | Operating profile | Yes | Free text |
| revenue | Approx. annual revenue | Operating profile | Yes | Under $1M · $1M–$5M · $5M–$10M · $10M–$25M · $25M–$50M · $50M–$100M · $100M+ · Not sure / prefer not to say |
| licensingReadiness | How ready are you to license data? | Licensing & language | Yes | Ready to discuss licensing · Interested; internal review needed · Exploring / not sure · Not available for licensing |
| fteCurrent | Full-time employees today | Team size | Yes | 0 · 1–49 · 50–99 · 100–249 · 250–999 · 1,000+ |
| ftePeak | Full-time employees at peakContractors don't count toward this. | Team size | Yes | Under 50 · 50–99 · 100–249 · 250–999 · 1,000+ |
| contractorsCurrent | Contractors today | Team size | Yes | 0 · 1–9 · 10–49 · 50–99 · 100–249 · 250+ |
| contractorsPeak | Contractors at peak | Team size | Yes | 0 · 1–9 · 10–49 · 50–99 · 100–249 · 250+ |
| headcountNotes | Seasonality or big changes in headcount (optional) | Team size | No | Free text |
Step: Data overview (headline)
| Key | Question on the application | Section | Required | Options |
|---|---|---|---|---|
| language | What language are your records in? | Licensing & language | Yes | English · Spanish · French · German · Portuguese · Japanese · Chinese · Other |
| totalTb | Total data, all storage combined (TB)A rough number is fine, e.g. “~18 TB, mostly photos and call recordings”. | Headline numbers | Yes | Free text |
| historyCovered | Years of history covered | Headline numbers | Yes | Free text |
| whereDataLives | Where does the data live?Name the products. We fill this from your systems table if you leave it blank. | Headline numbers | Yes | Free text |
| exportSpeed | How fast could you provide an export? | Headline numbers | Yes | Free text; suggestions: Within a week · 2–4 weeks · 1–3 months · Longer / not sure |
| canUpload | Can your team export and upload it? | Headline numbers | Yes | Yes · Yes, with some guidance · No, we need help · Not sure |
Step: Privacy & restrictions (privacy)
| Key | Question on the application | Section | Required | Options |
|---|---|---|---|---|
| restrictions | Privacy & restrictionsPII, voice recordings, partner-held data, contractual restrictions, or records you'd prefer to exclude. Write “None known” if there aren't any. | Headline numbers | Yes | Free text |
| privacy | Does any of it include… | Headline numbers | No | An array of: pii (Personal information (PII)) · voice (Voice or call recordings) · partner_held (Data held by a partner) · contractual (Contractual restrictions) · exclusions (Records we'd prefer to exclude) · none (None of these) |
Step: Data profile (files)
| Key | Question on the application | Section | Required | Options |
|---|---|---|---|---|
| standout | What would we find in your files?What would someone learn from reading your files? Think about the decisions, trade-offs and know-how in emails, docs, decks, tickets and analyses — not just the finished reports. What is unusual about your company, and where is your institutional knowledge deepest? | What would we find in your files? | Yes | Free text |
Systems
systems is an array, one row per system that holds the records, and fills the table on the Systems step. At least 3 to submit, and each needs a name, what it is used for, what is in it, a start and end month (YYYY-MM), a size, and how it exports. A row whose tool_name matches a system already listed updates that row; the draft's own rows are never removed.
| Key | Column on the application | Takes |
|---|---|---|
| tool_name | System / tool | The system's name, required for every row. |
| purpose | What you use it for | Free text. |
| approx_size | Approx. Export Size (GB/TB) | Free text, for example "120 GB" or "40,000 records". |
| years | Years of data | A whole number; worked out from the months when left out. |
| data_start | Start Date (YYYY-MM) | A month as YYYY-MM. |
| data_end | End Date (YYYY-MM) | A month as YYYY-MM. |
| contents | What's in it (examples) | Free text. |
| exportable | Can it export? | yes, partial, no or unsure. |
| export_method | Can it export? (the method) | Free text, for example "CSV" or "Admin export". |
| ownership | Notes (owned by the company) | yes, no or unsure. |
| third_party | Notes (third-party data) | yes, no or unsure. |
| notes | Notes | Free text. |
| owned_attested | Company-owned statement (per system, asked in the portal) | yes or no; "yes" is needed to submit. |
| records_english | Records in English (per system, asked in the portal) | yes or no. |
The application's columns, in its order: System / tool · What you use it for · Approx. Export Size (GB/TB) · Years of data · Start Date (YYYY-MM) · End Date (YYYY-MM) · What's in it (examples) · Can it export? · Notes.
Data profile
dataset holds the three answers of the Data profile step that the template does not carry.
| Key | On the application | Takes |
|---|---|---|
| dataset.title | Dataset title | Free text, required. |
| dataset.description | Description | Free text, required, at least 20 characters. |
| dataset.categories | Data categories | An array of: Operational documentation · Knowledge bases · Customer support workflows · Engineering documentation · Sales operations · Industry-specific records |
Statements
The Review & submit step asks the company to confirm four statements and its authority to apply. Send them only when the person at the company has confirmed them; each is kept as given, and a "no" stops the submission exactly as it does in the portal.
| Key | Statement on the application |
|---|---|
| attestations.owns_rights | Your company owns all rights in the listed assets and has the rights and authority to license them. |
| attestations.no_third_party_rights | No third party has rights in the listed assets that would restrict licensing them, and licensing them doesn't infringe anyone's intellectual property or other rights. |
| attestations.no_contract_bar | No contract, NDA, or client agreement prohibits licensing them, and you haven't already sold or licensed them to others for AI training. |
| attestations.authority | You are authorized to bind the company, and any required owner, board or cofounder approvals can be obtained before signing. |
| authorized_confirmed | The sender is authorised to apply on the company's behalf (true or false). |
Readiness
readiness on every answer is what the portal's Continue and Submit buttons would still stop on. blockers is that list in step order; missing names the required answers still blank by field key, so you can fill them by key; percent is the application's own progress meter.
| Status | Meaning |
|---|---|
| ready | Submit would be accepted now. |
| needs_input | The listed blockers first; each names the step and what to do. |
| in_review | Already submitted; the draft is read-only until SourceX asks for more. |
| Blocker key | Step | What is still open |
|---|---|---|
| answers-company | Company details | Required company answers still blank (answers.*). |
| answers-headline | Data overview | Required data-overview answers still blank (answers.*). |
| answers-privacy | Privacy & restrictions | Required privacy answers still blank (answers.*). |
| answers-files | Data profile | Required data-profile answers still blank (answers.*). |
| systems | Systems | Fewer systems listed than the minimum (systems[]). |
| systemDetails | Systems | A listed system lacks its size, start and end month, contents or how it exports (systems[]). |
| ownership | Systems | A listed system lacks its company-owned answer (systems[].owned_attested "yes"); a code system also needs its code-ownership answers, which the portal asks. |
| title | Data profile | dataset.title is blank. |
| description | Data profile | dataset.description is blank or under 20 characters. |
| categories | Data profile | dataset.categories is empty. |
| authorization | Review & submit | authorized_confirmed is not true. |
| attestations | Review & submit | An ownership statement is missing or answered "no" (attestations.*). |
Errors
An error answers { "error": "<code>", "message": "…" }; not_ready also carries readiness.
| Status | Code | When |
|---|---|---|
| 401 | missing_key | No Authorization: Bearer sx_live_… header. |
| 401 | invalid_key | The key is unknown or has been revoked. |
| 403 | wrong_company | company_id names a company the key does not belong to. |
| 403 | confirmer_not_member | confirmed_by is not the email of a member of the company (Company & account › Team). |
| 404 | not_found | No application with that id belongs to the key's company. |
| 400 | bad_request | The body does not fit the schema; the message names the first field and what is wrong with it. |
| 409 | in_review | The company's application is already submitted; nothing is changed. |
| 409 | not_ready | Submit was asked while the readiness list is not empty; the answer carries readiness. |
| 409 | conflict | The draft changed while the request ran (someone saved in the portal); read it again and retry. |
| 422 | rejected | A rule on the server refused the write; the message says which. |
| 500 | server_error | Something failed on our side; retry later. |
The same over MCP
An AI assistant connected at https://sourcex.si/mcp signs in as you and has the same four steps as tools. It drafts and validates; a person submits. Setup is on Agent integrations.
| Tool | Does |
|---|---|
| get_application_schema | This page's field list as data: every key, question, step, requirement and option. |
| draft_application | Writes answers into the signed-in account's draft under the same rules as POST and PATCH. |
| validate_application | The readiness list, like POST …/validate. |
| request_submission | Returns the link where a person at the company confirms and submits. An agent never submits by itself. |
Rules that always hold
- Use only what the person or their records state; leave unknown answers out rather than guessing.
- A draft is never submitted by a tool: request_submission returns the link where a person confirms and submits.
- A blank answer never overwrites one already saved in the draft.
- The machine-readable version of this page is the OpenAPI 3.1 specification, raw JSON for Postman, code generators and agents: View raw OpenAPI JSON (https://sourcex.si/api/v1/openapi.json). To browse the endpoints, request fields and responses, and to try a call with your key, open the interactive API documentation.