Skip to main content

Overview

Constancia de Situación Fiscal (CSF) is an official document issued by SAT that certifies a taxpayer’s current tax status in Mexico. This certificate is essential for numerous business and legal transactions, serving as proof of tax compliance and good standing with Mexican tax authorities.

What is a Tax Status Certificate?

The CSF is a comprehensive document that provides official verification of:
  • Tax compliance status: Current standing with SAT
  • Business registration details: RFC, legal name, tax regime
  • Address information: Fiscal domicile registration
  • Tax obligations: Active requirements and filing status
  • Economic activities: Registered business activities
CSF certificates have specific validity periods:
  • Standard validity: 30 days from issue date
  • Extended validity: 6 months for specific procedures
  • Real-time verification: Online validation through SAT
  • Automatic expiration: Must be renewed regularly
CSF certificates are issued exclusively in PDF format:
  • Digital signatures: SAT’s official electronic seal
  • QR code verification: Online authentication
  • Security features: Watermarks and encryption
  • Standardized layout: Consistent official format

Information Contained in CSF

Primary Taxpayer Data

Identity Information

  • RFC (Tax ID)
  • Legal business name
  • Commercial name (if different)
  • Taxpayer type (Individual/Entity)

Registration Details

  • Fiscal domicile address
  • Registration date with SAT
  • Current tax regime
  • Economic activity codes

Compliance Status

  • Tax filing status
  • Outstanding obligations
  • Penalty status
  • Good standing confirmation

Contact Information

  • Registered email address
  • Phone numbers on file
  • Legal representative details
  • Authorized third parties

Tax Regime Information

The CSF includes detailed information about the taxpayer’s tax regime:
Regime CodeDescriptionKey Characteristics
601General Legal EntitiesStandard corporate tax regime
603Legal Entities with Non-Profit ActivitiesNon-profit organizations
605Individual with Business ActivitySmall business owners
606Individual with Business and Professional ActivitiesIndependent professionals
608Individual with Rental IncomeProperty rental income
610Individual with Other IncomeMixed income sources
612Legal Entity with Non-Profit ActivitiesAuthorized to receive donations
614Individual with Business ActivitiesSimplified trust regime
616Individual Without Business ActivitiesSalary and investment income

Extracting Tax Status Certificates

Basic Extraction Request

{
  "subject": {
    "identifier": "GACJ841128A87"
  },
  "credentials": {
    "SAT": {
      "type": "USERNAME_PASSWORD",
      "username": "GACJ841128A87", 
      "password": "CIEC_PASSWORD"
    }
  },
  "options": {
    "informationType": "TAX_STATUS",
    "period": {
      "from": "2024-01-01",
      "to": "2024-01-31"
    }
  }
}
Tax status certificates don’t use the direction parameter since they represent the taxpayer’s own status, not transactional documents.

Certificate Types and Filtering

{
  "options": {
    "informationType": "TAX_STATUS",
    "certificateType": "CURRENT_STATUS"
  }
}

Common Use Cases

Banking and Financial Services

Requirements: Current CSF (less than 30 days old)
// Verify CSF is current for banking
function validateCSFForBanking(csf) {
  const issueDate = new Date(csf.issueDate);
  const thirtyDaysAgo = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000);
  
  if (issueDate < thirtyDaysAgo) {
    throw new Error('CSF too old for banking - must be less than 30 days');
  }
  
  if (csf.taxStatus !== 'ACTIVE') {
    throw new Error('Taxpayer must be in active status');
  }
  
  return true;
}
Requirements: CSF plus compliance verification
// Credit evaluation using CSF data
function evaluateCreditworthiness(csf) {
  const evaluation = {
    taxCompliance: csf.outstandingObligations === 0,
    businessAge: calculateBusinessAge(csf.registrationDate),
    taxRegime: csf.taxRegime,
    economicActivity: csf.economicActivities,
    riskScore: calculateRiskScore(csf)
  };
  
  return evaluation;
}

Government Contracting

Requirements: Valid CSF with specific compliance status
// Validate CSF for government contracting
function validateCSFForGovernmentContract(csf) {
  const requiredFields = [
    'rfc', 'legalName', 'fiscalAddress', 
    'taxRegime', 'economicActivities'
  ];
  
  for (const field of requiredFields) {
    if (!csf[field]) {
      throw new Error(`Missing required field: ${field}`);
    }
  }
  
  if (csf.penalties && csf.penalties.length > 0) {
    throw new Error('Taxpayer has outstanding penalties');
  }
  
  return true;
}
Requirements: Ongoing compliance monitoring
// Monitor CSF status during contract
async function monitorContractorCompliance(rfc) {
  const currentCSF = await extractTaxStatus(rfc);
  
  const complianceReport = {
    contractorRFC: rfc,
    lastVerification: new Date(),
    complianceStatus: currentCSF.taxStatus,
    issues: [],
    recommendedActions: []
  };
  
  if (currentCSF.outstandingObligations > 0) {
    complianceReport.issues.push('Outstanding tax obligations');
    complianceReport.recommendedActions.push('Request compliance plan');
  }
  
  return complianceReport;
}

Business Operations

Supplier Verification

// Automated supplier verification using CSF
class SupplierVerificationService {
  async verifySupplier(supplierRFC) {
    try {
      // Extract latest CSF
      const extraction = await this.createTaxStatusExtraction(supplierRFC);
      const csf = await this.waitForExtraction(extraction.publicId);
      
      // Perform verification checks
      const verification = {
        rfc: supplierRFC,
        verificationDate: new Date(),
        checks: {
          activeStatus: this.checkActiveStatus(csf),
          validRegime: this.checkTaxRegime(csf),
          complianceStatus: this.checkCompliance(csf),
          addressVerification: this.checkAddress(csf)
        },
        riskAssessment: this.assessRisk(csf),
        approved: false
      };
      
      // Calculate overall approval
      verification.approved = Object.values(verification.checks)
        .every(check => check.passed);
      
      return verification;
    } catch (error) {
      return {
        rfc: supplierRFC,
        error: error.message,
        approved: false
      };
    }
  }
  
  checkActiveStatus(csf) {
    return {
      passed: csf.taxStatus === 'ACTIVE',
      message: csf.taxStatus === 'ACTIVE' 
        ? 'Taxpayer is active' 
        : `Taxpayer status: ${csf.taxStatus}`
    };
  }
  
  checkTaxRegime(csf) {
    const validRegimes = ['601', '603', '605', '606', '612'];
    return {
      passed: validRegimes.includes(csf.taxRegime),
      message: `Tax regime: ${csf.taxRegime}`
    };
  }
  
  checkCompliance(csf) {
    return {
      passed: csf.outstandingObligations === 0 && 
              (!csf.penalties || csf.penalties.length === 0),
      message: csf.outstandingObligations > 0 
        ? 'Has outstanding obligations' 
        : 'Compliant'
    };
  }
}

Processing CSF Data

Data Extraction from PDF

// Extract key information from CSF PDF
class CSFProcessor {
  async processTaxStatusCertificate(pdfBuffer) {
    try {
      // Parse PDF content
      const pdfText = await this.extractTextFromPDF(pdfBuffer);
      
      // Extract structured data
      const csfData = {
        rfc: this.extractRFC(pdfText),
        legalName: this.extractLegalName(pdfText),
        commercialName: this.extractCommercialName(pdfText),
        taxRegime: this.extractTaxRegime(pdfText),
        fiscalAddress: this.extractFiscalAddress(pdfText),
        economicActivities: this.extractEconomicActivities(pdfText),
        registrationDate: this.extractRegistrationDate(pdfText),
        issueDate: this.extractIssueDate(pdfText),
        taxStatus: this.extractTaxStatus(pdfText),
        outstandingObligations: this.extractOutstandingObligations(pdfText)
      };
      
      // Validate extracted data
      this.validateCSFData(csfData);
      
      return csfData;
    } catch (error) {
      throw new Error(`CSF processing failed: ${error.message}`);
    }
  }
  
  extractRFC(text) {
    const rfcPattern = /RFC:\s*([A-ZÑ&]{3,4}\d{6}[A-V1-9][A-Z1-9][0-9A])/;
    const match = text.match(rfcPattern);
    return match ? match[1] : null;
  }
  
  extractTaxRegime(text) {
    const regimePattern = /Régimen:\s*(\d{3})\s*-\s*([^\.]+)/;
    const match = text.match(regimePattern);
    return match ? {
      code: match[1],
      description: match[2].trim()
    } : null;
  }
  
  validateCSFData(data) {
    const required = ['rfc', 'legalName', 'taxRegime', 'issueDate'];
    const missing = required.filter(field => !data[field]);
    
    if (missing.length > 0) {
      throw new Error(`Missing required fields: ${missing.join(', ')}`);
    }
  }
}

Integration with Business Systems

// Update customer/supplier records with CSF data
async function updateBusinessPartnerStatus(rfc) {
  try {
    // Get latest CSF
    const csf = await extractAndProcessCSF(rfc);
    
    // Update in CRM/ERP system
    await updateBusinessPartner(rfc, {
      legalName: csf.legalName,
      commercialName: csf.commercialName,
      fiscalAddress: csf.fiscalAddress,
      taxRegime: csf.taxRegime.code,
      taxStatus: csf.taxStatus,
      lastVerification: csf.issueDate,
      complianceStatus: csf.outstandingObligations === 0 ? 'COMPLIANT' : 'NON_COMPLIANT',
      economicActivities: csf.economicActivities
    });
    
    // Create compliance alert if needed
    if (csf.outstandingObligations > 0) {
      await createComplianceAlert({
        partnerRFC: rfc,
        issue: 'Outstanding tax obligations detected',
        severity: 'HIGH',
        actionRequired: 'Review business relationship'
      });
    }
    
    console.log(`Updated business partner ${rfc} with latest CSF data`);
  } catch (error) {
    console.error(`Failed to update partner ${rfc}:`, error.message);
  }
}

Compliance and Best Practices

Certificate Management

Automated Compliance Monitoring

// Schedule regular CSF updates for critical suppliers
class ComplianceMonitor {
  constructor() {
    this.criticalSuppliers = [];
    this.monitoringSchedule = new Map();
  }
  
  async scheduleCriticalSupplierMonitoring(rfc, frequency = 'weekly') {
    this.criticalSuppliers.push(rfc);
    
    const schedule = {
      rfc: rfc,
      frequency: frequency,
      lastCheck: null,
      nextCheck: this.calculateNextCheck(frequency),
      status: 'active'
    };
    
    this.monitoringSchedule.set(rfc, schedule);
    
    // Set up automated checking
    this.scheduleCSFCheck(rfc, frequency);
  }
  
  async performScheduledCheck(rfc) {
    try {
      const csf = await extractAndProcessCSF(rfc);
      const schedule = this.monitoringSchedule.get(rfc);
      
      schedule.lastCheck = new Date();
      schedule.nextCheck = this.calculateNextCheck(schedule.frequency);
      
      // Check for compliance issues
      const issues = this.identifyComplianceIssues(csf);
      
      if (issues.length > 0) {
        await this.alertComplianceTeam(rfc, issues);
      }
      
      // Update schedule
      this.monitoringSchedule.set(rfc, schedule);
      
    } catch (error) {
      console.error(`Scheduled CSF check failed for ${rfc}:`, error.message);
    }
  }
}

Troubleshooting Common Issues

Problem: CSF extraction returns no resultsPossible Causes:
  • Taxpayer not registered with SAT
  • RFC format incorrect
  • Recent registration (processing delay)
Solutions:
  • Verify RFC format and spelling
  • Check SAT’s public database for registration
  • Wait 24-48 hours for new registrations
  • Contact taxpayer to confirm RFC
Problem: CSF is older than required validity periodSolutions:
  • Request new CSF extraction
  • Implement automatic renewal processes
  • Set up expiration alerts
  • Use real-time verification when possible
Problem: Cannot extract data from CSF PDFPossible Causes:
  • Corrupted PDF download
  • Changed PDF format by SAT
  • Security restrictions on PDF
Solutions:
  • Re-download certificate
  • Update PDF parsing libraries
  • Implement OCR fallback
  • Manual data entry for critical cases

Next Steps