Some submissions should never require a human to open a form. A partner’s own portal writes a deal into your system, an internal tool has the lead already, a script backfills 400 registrations, an agent has just gathered the details. The API makes those a first-class submission: same automation, same attribution, same approval queue as a partner filling in the form by hand.This guide takes you from a form you already built to your first API submission, and shows you where the ids come from so you never have to guess them.
What you’ll achieve
Any of your systems able to submit an Introw form over HTTP, from anywhere, with no browser and no portal login. The submission is attributed to the right partner, runs through the form’s CRM automation, and, when the form has an approval step, waits in your submissions inbox exactly like a portal submission.Before you start
Build and publish the form
Know your credit allowance
Create a key with forms:write
Watch it
- Video
- Click through
Steps
Get the form id and its field ids
You have two ways to discover a form’s fields: fetch its schema from the API (recommended when your code needs to react to form changes), or copy them out of the Share dialog (fine for a one-off script).Option A: fetch the schema from the API
Grab the form id

Call GET /api/v1/forms/{formId}/schema
forms:read scope (or forms:write), and call GET /api/v1/forms/{formId}/schema to read the field ids.id (the key to use in the submission’s fields map), label, isRequired, dataType (what value shape to send: STRING, NUMBER, EMAIL, DATE, DROPDOWN, PARTNER_SELECT, and so on), and, for DROPDOWN, DROPDOWN_MULTI, and PARTNER_SELECT, the resolved options you can send as value. Field ids are opaque strings like qkzv8h2m4t6r1yc9pd3sxf70 and stable across form edits. The full value-shape table is in Form submissions.The Share dialog spells out this call for the form you are looking at, so you can copy the exact path:
The API tab ends with the schema call for this form.
Re-fetch when the form may have changed
DROPDOWN has been synced from the CRM. Both change what a valid submission looks like.Option B: copy from the Share dialog
Open the form's Share dialog

Switch to the API tab

The API tab: endpoint, authentication, and a snippet pre-filled with this form's field ids.

Read the Fields table
GET /api/v1/forms/{formId}/schema for the same list in code, with value types and allowed dropdown values.
Copy cURL, the partnerId note, and the Fields table with each field's id and required flag.

Optionally pick a partner first
partnerId already filled in. Handy for testing against a real partner.Post your first submission
Copy the snippet and add your key
INTROW_API_KEY to the key you created. Swap the placeholder values for real ones.Attribute it to the right partner
partnerId whenever your system knows which partner it is acting for. It takes the Introw partner id or the partner’s CRM external id, so pass whichever you already store; an unknown value comes back as 404 instead of quietly landing unattributed. With only email, Introw resolves the submitter and applies the form’s identification automations. With neither, the submission is accepted but unattributed, just like a general share link.Read the status you get back
201 returns the submission id and its status. AUTO_ACCEPTED means the form has no approval step and the automation has already run. PENDING means it is waiting in your inbox for review. Keep the returned id if you want to comment on the submission later.Link the partner’s own CRM records
Send partnerObjects
Verify it worked
Open Submissions. The submission appears under Form submissions with the partner you attributed it to, indistinguishable from a portal submission apart from its source. If the form auto-accepts, the mapped record already exists in your CRM. If it has an approval step, the submission sits as Pending and your reviewers are notified as usual.Limits & gotchas
- 120 requests per minute per key. Every response carries
x-ratelimit-remaining-minute; over the limit you get429. For a backfill, submit sequentially with a small delay and retry after the minute rolls over. - One request per submission. A batch upload field is the portal’s bulk-CSV control and carries no value over the API, so loop instead. See Bulk upload multiple records for the partner-facing path.
- Picklist labels are tolerated.
"Qualified to buy"resolves toqualifiedtobuycase-insensitively, and aPARTNER_SELECTfield accepts a partner name, but sendvaluewhen you have it. A value matching no option is passed through as sent. - Nothing is deduplicated by the API. Keep the returned submission id against your source record so a retried run does not submit twice.
Troubleshooting
403 Forbidden- the key is valid but lacksforms:write, or the submitter is not allowed to process quotes on this form.404 FORM_NOT_FOUND- the id is wrong, or the form has no automation configured.404 PARTNER_NOT_FOUND-partnerIdmatched neither an Introw id nor a CRM external id.422 VALIDATION_ERROR- a value failed the form’s own validation, or a required field was missing. Re-check the Fields table.422 MDF_FUND_EXPIRED- the marketing fund behind this form is no longer active.429 RATE_LIMIT_EXCEEDED- more than 120 requests in the current minute on this key.- The submission arrived unattributed - you sent neither
partnerIdnor a resolvableemail.