Flowidly Public API (v1)

The Flowidly API lets you create proposals programmatically from templates, using tokens (substitutions) and a limited set of safe block operations. This mirrors the core model popularized by tools like Qwilr: templates + blocks + tokens.

What you can do in v1
  • List templates
  • Create a proposal from a template
  • Pass substitutions to fill tokens
  • Apply limited block operations (insert/remove/replace/reorder)

Authentication

API requests are authenticated using a bearer API key:

Authorization: Bearer flow_live_************.****************

API keys are managed in the app at Settings → Integrations → Developer API. Access is gated per account by an entitlement.

Templates

Templates are the starting point for proposal creation.

GET /api/v1/templates
GET /api/v1/templates/:templateId

Tokens (Substitutions)

Tokens are placeholders in template content. In v1, tokens use a mustache-style syntax:

{{company_name}}
{{client_name}}
{{contacts[0].name}}
{{contacts[].name}}

Substitution values are strings. Missing values resolve to an empty string.

Repeating Tokens

Repeating tokens are arrays of objects, useful for lists and repeating rows.

{
  "substitutions": {
    "contacts": [
      { "name": "Allison Reynolds", "location": "Chicago, IL" },
      { "name": "Boba Fett", "location": "Kamino" }
    ]
  }
}

Create Proposal

Create a proposal from a template. Use the Idempotency-Key header if you want retries to return the same response.

POST /api/v1/proposals
Idempotency-Key: 2d31a5f4-0c2d-4a8c-9a1f-0a4c8c3f2a10
curl -X POST "https://YOUR_DOMAIN/api/v1/proposals" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 2d31a5f4-0c2d-4a8c-9a1f-0a4c8c3f2a10" \
  -d '{
    "templateId": "google-ads-proposal",
    "substitutions": {
      "client_name": "Acme Inc",
      "company_name": "Flowidly"
    }
  }'

Block Operations

Apply safe block operations to an existing proposal.

PATCH /api/v1/proposals/:proposalId/blocks
{
  "operations": [
    { "op": "reorder", "sectionIds": ["uuid-1", "uuid-2", "uuid-3"] }
  ]
}

Errors & Status Codes

401 Unauthorized
Missing/invalid API key
403 Forbidden
Missing scopes or API not enabled
409 Conflict
Idempotency key reuse with different body
429 Too Many Requests
Rate limit exceeded

OpenAPI

The OpenAPI specification describes the API in a machine-readable format for documentation and SDK generation.

GET /api/v1/openapi
Need help? Email support or message us with your use case and we’ll help you wire it up.